kubernetes—五个概念入门(二)

简介: kubernetes—五个概念入门(二)

kubernetes—五个概念入门(一):https://developer.aliyun.com/article/1417667

Deployment

介绍

在kubernetes中,Pod是最小的控制单元,但是kubernetes很少直接控制Pod,一般都是通过Pod控制器来完成的。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。

 在kubernetes中Pod控制器的种类有很多,本章节只介绍一种:Deployment,别的Pod控制器预计在下下篇博文进行详细介绍。Deployment和pod关系的建立是通过标签label进行建立的,如下图:

操作

命令操作

# 创建deployment
# 命令格式: kubectl create deployment 名称 [参数] 
# --image  指定pod的镜像
# --port   指定端口
# --replicas  指定创建pod数量
# --namespace  指定namespace
[root@master k8sYamlForCSDN]# kubectl create deployment deploy-nginx --image=nginx --port=80 --replicas=3 --namespace=dev
deployment.apps/deploy-nginx created
# 查看创建的Pod
```bash
[root@master k8sYamlForCSDN]# kubectl get pods -n dev
NAME                           READY   STATUS    RESTARTS   AGE
deploy-nginx-fb669cc4f-5xd5j   1/1     Running   0          3m32s
deploy-nginx-fb669cc4f-69pln   1/1     Running   0          3m32s
deploy-nginx-fb669cc4f-tpfhp   1/1     Running   0          3m32s
# 查看deployment的信息
[root@master k8sYamlForCSDN]# kubectl get deployment -n dev
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   3/3     3            3           4m21s
# UP-TO-DATE:成功升级的副本数量
# AVAILABLE:可用副本的数量
# 查看deployment和pod的详细信息
[root@master k8sYamlForCSDN]# kubectl get deployment,pods -n dev --show-labels 
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE     LABELS
deployment.apps/deploy-nginx   3/3     3            3           5m42s   app=deploy-nginx
NAME                               READY   STATUS    RESTARTS   AGE     LABELS
pod/deploy-nginx-fb669cc4f-5xd5j   1/1     Running   0          5m42s   app=deploy-nginx,pod-template-hash=fb669cc4f
pod/deploy-nginx-fb669cc4f-69pln   1/1     Running   0          5m42s   app=deploy-nginx,pod-template-hash=fb669cc4f
pod/deploy-nginx-fb669cc4f-tpfhp   1/1     Running   0          5m42s   app=deploy-nginx,pod-template-hash=fb669cc4f
[root@master k8sYamlForCSDN]# kubectl get deployment -n dev -o wide
NAME           READY   UP-TO-DATE   AVAILABLE   AGE     CONTAINERS   IMAGES   SELECTOR
deploy-nginx   3/3     3            3           5m58s   nginx        nginx    app=deploy-nginx
# 查看deployment的详细信息
[root@master k8sYamlForCSDN]# kubectl describe deployment -n dev 
Name:                   deploy-nginx
Namespace:              dev
CreationTimestamp:      Mon, 28 Feb 2022 21:10:32 +0800
Labels:                 app=deploy-nginx
Annotations:            deployment.kubernetes.io/revision: 1
Selector:               app=deploy-nginx
Replicas:               3 desired | 3 updated | 3 total | 3 available | 0 unavailable
StrategyType:           RollingUpdate
MinReadySeconds:        0
RollingUpdateStrategy:  25% max unavailable, 25% max surge
Pod Template:
  Labels:  app=deploy-nginx
  Containers:
   nginx:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Conditions:
  Type           Status  Reason
  ----           ------  ------
  Available      True    MinimumReplicasAvailable
  Progressing    True    NewReplicaSetAvailable
OldReplicaSets:  <none>
NewReplicaSet:   deploy-nginx-fb669cc4f (3/3 replicas created)
Events:
  Type    Reason             Age    From                   Message
  ----    ------             ----   ----                   -------
  Normal  ScalingReplicaSet  6m29s  deployment-controller  Scaled up replica set deploy-nginx-fb669cc4f to 3
# # 删除deployment Pod控制器,删除了pod对应的deployment,则pod也会被删除
[root@master k8sYamlForCSDN]# kubectl delete deployments.apps deploy-nginx -n dev
deployment.apps "deploy-nginx" deleted
[root@master k8sYamlForCSDN]# kubectl get deployment,pods -n dev 
No resources found in dev namespace.

配置操作

# 创建一个deploy-nginx.yaml
vi deploy-nginx.yaml


apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    matchLabels:
      run: "nginx"
  template:
    metadata:
      labels:
        run: "nginx"
    spec:
      containers:
        - name: pod
          image: nginx
          ports:
            - containerPort: 80
              protocol: TCP
# 创建
[root@master k8sYamlForCSDN]# kubectl apply -f deploy-nginx.yaml 
deployment.apps/deploy-nginx created
# 查看
[root@master k8sYamlForCSDN]# kubectl get deployments.apps -n dev
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
deploy-nginx   0/3     3            0           11s
[root@master k8sYamlForCSDN]# kubectl get deployments.apps,pods -n dev
NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-nginx   0/3     3            0           15s
NAME                                READY   STATUS              RESTARTS   AGE
pod/deploy-nginx-579f68df74-pn2c8   0/1     ContainerCreating   0          15s
pod/deploy-nginx-579f68df74-sv9nz   0/1     ContainerCreating   0          15s
pod/deploy-nginx-579f68df74-wpndc   0/1     ContainerCreating   0          15s
# 删除
[root@master k8sYamlForCSDN]# kubectl delete -f deploy-nginx.yaml 
deployment.apps "deploy-nginx" deleted

Service

介绍

目前已经能够利用Deployment来创建一组Pod来提供具有高可用性的服务。

虽然每个Pod都会分配一个单独的Pod IP,然而却存在如下两问题:

  • Pod IP 会随着Pod的重建产生变化
  • Pod IP 仅仅是集群内可见的虚拟IP,外部无法访问

这样对于访问这个服务带来了难度。因此,kubernetes设计了Service来解决这个问题。

Service可以看作是一组同类Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡。

操作

操作一:创建集群内部可访问的Service

这里先简单介绍一下–type=ClusterIP,意思是只有集群内部ip可以访问这个service

# 暴露Service
[root@master k8sYamlForCSDN]# kubectl expose deployment deploy-nginx -n dev \
--name=svc-deploy-nginx --type=ClusterIP --port=80 --target-port=80 
service/svc-deploy-nginx exposed
# 查看service
[root@master k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE   SELECTOR
svc-deploy-nginx   ClusterIP   10.99.101.216   <none>        80/TCP    47s   run=nginx
# 这里产生了一个CLUSTER-IP,这就是service的IP,在Service的生命周期中,这个地址是不会变动的
# 可以通过这个IP访问当前service对应的POD
[root@master k8sYamlForCSDN]# curl 10.99.101.216:80
<!DOCTYPE html>
  ...
  ...
</html>

操作二:创建集群外部也可访问的Service

# 上面创建的Service的type类型为ClusterIP,这个ip地址只用集群内部可访问
# 如果需要创建外部也可以访问的Service,需要修改type为NodePort
[root@master k8sYamlForCSDN]# kubectl expose deployment deploy-nginx -n dev \
> --name=svc-deploy-nginx --type=NodePort --port=80 --target-port=80
service/svc-deploy-nginx exposed
# # 此时查看,会发现出现了NodePort类型的Service,而且有一对Port(80:31928/TC)
[root@master k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE   SELECTOR
svc-deploy-nginx   NodePort   10.99.149.210   <none>        80:30945/TCP   10s   run=nginx
# 接下来就可以通过集群外的主机访问 节点IP:30945访问服务了
# 例如在的电脑主机上通过浏览器访问下面的地址
http://192.168.109.100:30945/

删除Service

[root@master k8sYamlForCSDN]# kubectl delete svc svc-deploy-nginx -n dev
service "svc-deploy-nginx" deleted

配置方式

不论是ClusterIP还是NodePort,yaml文件中的clusterIP: 10.109.68.72可以不配,不配置就是自动分配

# 创建一个svc-nginx.yaml
vi svc-deploy-nginx.yaml
apiVersion: v1
kind: Service
metadata:
  name: svc-deploy-nginx
  namespace: dev
spec:
  type: ClusterIP
  clusterIP: 10.109.68.72
  selector:
    run: "nginx"
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
[root@master k8sYamlForCSDN]# kubectl apply -f svc-deploy-nginx.yaml 
service/svc-deploy-nginx created
[root@master k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE   SELECTOR
svc-deploy-nginx   ClusterIP   10.109.68.72   <none>        80/TCP    10s   run=nginx
[root@master k8sYamlForCSDN]# kubectl delete -f svc-deploy-nginx.yaml 
service "svc-deploy-nginx" deleted
apiVersion: v1
kind: Service
metadata:
  name: svc-deploy-nginx
  namespace: dev
spec:
  type: NodePort
  clusterIP: 10.109.68.72
  selector:
    run: "nginx"
  ports:
    - port: 6872
      targetPort: 80
      protocol: TCP
apiVersion: v1
kind: Service
metadata:
  name: svc-deploy-nginx
  namespace: dev
spec:
  type: NodePort
  clusterIP: 10.109.68.72
  selector:
    run: "nginx"
  ports:
    - port: 6872
      targetPort: 80
      protocol: TCP
[root@master k8sYamlForCSDN]# kubectl apply -f svc-deploy-nginx.yaml 
service/svc-deploy-nginx created
[root@master k8sYamlForCSDN]# kubectl get service svc-deploy-nginx -n dev -o wide
NAME               TYPE       CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE   SELECTOR
svc-deploy-nginx   NodePort   10.105.26.121   <none>        6872:31758/TCP   4s    run=nginx
[root@master k8sYamlForCSDN]# kubectl delete -f svc-deploy-nginx.yaml 
service "svc-deploy-nginx" deleted


相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
Kubernetes Cloud Native Docker
云原生时代的容器化实践:Docker和Kubernetes入门
【10月更文挑战第37天】在数字化转型的浪潮中,云原生技术成为企业提升敏捷性和效率的关键。本篇文章将引导读者了解如何利用Docker进行容器化打包及部署,以及Kubernetes集群管理的基础操作,帮助初学者快速入门云原生的世界。通过实际案例分析,我们将深入探讨这些技术在现代IT架构中的应用与影响。
99 2
|
13天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
74 24
|
15天前
|
关系型数据库 MySQL Docker
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose核心概念、Compose使用三个步骤、Compose常用命令、Compose编排微服务
91 6
|
29天前
|
Kubernetes Cloud Native 微服务
云原生入门与实践:Kubernetes的简易部署
云原生技术正改变着现代应用的开发和部署方式。本文将引导你了解云原生的基础概念,并重点介绍如何使用Kubernetes进行容器编排。我们将通过一个简易的示例来展示如何快速启动一个Kubernetes集群,并在其上运行一个简单的应用。无论你是云原生新手还是希望扩展现有知识,本文都将为你提供实用的信息和启发性的见解。
|
1月前
|
Kubernetes Cloud Native 开发者
云原生入门:Kubernetes的简易指南
【10月更文挑战第41天】本文将带你进入云原生的世界,特别是Kubernetes——一个强大的容器编排平台。我们将一起探索它的基本概念和操作,让你能够轻松管理和部署应用。无论你是新手还是有经验的开发者,这篇文章都能让你对Kubernetes有更深入的理解。
|
1月前
|
运维 Kubernetes Cloud Native
云原生技术入门:Kubernetes和Docker的协同工作
【10月更文挑战第43天】在云计算时代,云原生技术成为推动现代软件部署和运行的关键力量。本篇文章将带你了解云原生的基本概念,重点探讨Kubernetes和Docker如何协同工作以支持容器化应用的生命周期管理。通过实际代码示例,我们将展示如何在Kubernetes集群中部署和管理Docker容器,从而为初学者提供一条清晰的学习路径。
|
1月前
|
Kubernetes 关系型数据库 MySQL
Kubernetes入门:搭建高可用微服务架构
【10月更文挑战第25天】在快速发展的云计算时代,微服务架构因其灵活性和可扩展性备受青睐。本文通过一个案例分析,展示了如何使用Kubernetes将传统Java Web应用迁移到Kubernetes平台并改造成微服务架构。通过定义Kubernetes服务、创建MySQL的Deployment/RC、改造Web应用以及部署Web应用,最终实现了高可用的微服务架构。Kubernetes不仅提供了服务发现和负载均衡的能力,还通过各种资源管理工具,提升了系统的可扩展性和容错性。
121 3
|
1月前
|
Kubernetes Cloud Native 开发者
云原生技术入门:Kubernetes和Docker的协作之旅
【10月更文挑战第22天】在数字化转型的浪潮中,云原生技术成为推动企业创新的重要力量。本文旨在通过浅显易懂的语言,引领读者步入云原生的世界,着重介绍Kubernetes和Docker如何携手打造弹性、可扩展的云环境。我们将从基础概念入手,逐步深入到它们在实际场景中的应用,以及如何简化部署和管理过程。文章不仅为初学者提供入门指南,还为有一定基础的开发者提供实践参考,共同探索云原生技术的无限可能。
55 3
|
1月前
|
Kubernetes Cloud Native 云计算
云原生入门:Kubernetes 和容器化基础
在这篇文章中,我们将一起揭开云原生技术的神秘面纱。通过简单易懂的语言,我们将探索如何利用Kubernetes和容器化技术简化应用的部署和管理。无论你是初学者还是有一定经验的开发者,本文都将为你提供一条清晰的道路,帮助你理解和运用这些强大的工具。让我们从基础开始,逐步深入了解,最终能够自信地使用这些技术来优化我们的工作流程。
|
1月前
|
运维 Kubernetes Cloud Native
云原生入门:Kubernetes和容器化的未来
【10月更文挑战第23天】本文将带你走进云原生的世界,探索Kubernetes如何成为现代软件部署的心脏。我们将一起揭开容器化技术的神秘面纱,了解它如何改变软件开发和运维的方式。通过实际的代码示例,你将看到理论与实践的结合,感受到云原生技术带来的革命性影响。无论你是初学者还是有经验的开发者,这篇文章都将为你开启一段新的旅程。让我们一起踏上这段探索之旅,解锁云原生技术的力量吧!