二、k8s入门系列----deployment、replicaset、label
前面讲了一个抽象概念pod,这里先引出另外两个抽象概念,deployment和replicaset(副本集),它们之间的关系如下:
deployment ==> replicaset ==> pod ==> container (实体)
先删除前面创建的pod:
[root@ylserver10686071 ~]# kubectl delete pod app002 pod "app002" deleted [root@ylserver10686071 ~]#
编辑创建deployment的资源配置文件:
[root@ylserver10686071 ~]# cat deployment.yml apiVersion: apps/v1 kind: Deployment metadata: name: app003 spec: replicas: 1 selector: matchLabels: app: web template: metadata: labels: app: web spec: containers: - name: tomcat image: tomcat:8.0
应用配置文件,创建deployment:
[root@ylserver10686071 ~]# kubectl apply -f deployment.yml deployment.apps/app003 created [root@ylserver10686071 ~]#
查看该配置文件创建的deployment:
[root@ylserver10686071 ~]# kubectl get deployment -o wide NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR app003 1/1 1 1 105s tomcat tomcat:8.0 app=web [root@ylserver10686071 ~]#
查看该配置文件创建的replicaset:
[root@ylserver10686071 ~]# kubectl get replicaset -o wide NAME DESIRED CURRENT READY AGE CONTAINERS IMAGES SELECTOR app003-646bdcbd54 1 1 1 2m36s tomcat tomcat:8.0 app=web,pod-template-hash=646bdcbd54 [root@ylserver10686071 ~]#
查看该配置文件创建的pod:
[root@ylserver10686071 ~]# kubectl get pod -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES app003-646bdcbd54-tzlpv 1/1 Running 0 3m15s 10.233.75.51 ylserver10686071 <none> <none> [root@ylserver10686071 ~]#
查看该配置文件创建的Container:
[root@ylserver10686071 ~]# docker ps|grep app003 1a6708863ecd ef6a7c98d192 "catalina.sh run" 8 minutes ago Up 8 minutes k8s_tomcat_app003-646bdcbd54-tzlpv_default_92d5aa5e-f9be-4a39-9afc-7f9aa51e07af_0 f7123510af50 k8s.gcr.io/pause:3.3 "/pause" 8 minutes ago Up 8 minutes k8s_POD_app003-646bdcbd54-tzlpv_default_92d5aa5e-f9be-4a39-9afc-7f9aa51e07af_0 [root@ylserver10686071 ~]#
到这里可以发现通过创建deployment资源后相继创建了replicaset、pod资源,最近再创建了实体container,其实这也是k8s的设计思路:
Kubernetes最核心的功能就是编排,而编排操作都是依靠控制器对象来完成的,高级的控制器对象控制基础的控制器对象,基础的控制器对象再去控制Pod
,Pod
里面再包容器。Kubernetes
项目里API
对象的层级结构大概就是这样。(此处引用知乎:https://zhuanlan.zhihu.com/p/191191906)
套用到这里就是deployment控制器对replicaset控制器进行控制,replicaset(副本集)控制器用来控制副本数量,一个副本就是一个pod,pod再生成Container,也就是 deployment ==> replicaset ==> pod ==> container (实体)
那上层控制器是如何控制下层控制器的呢,使用的就是标签选择器(Label-Selector),回头看deployment资源配置文件:
- kind 要创建的资源类型,这里是Deployment
- replicas 生成的副本数
- selector 标签选择器,用来定位被控制的下层控制器
- template 定义POD的模板
- labels POD资源的标签,由key,value组成
通过kubectl describe 命令可以看到已经创建资源的详细信息,可以看到deployment app003 的标签选择器为 app=web:
[root@ylserver10686071 ~]# kubectl describe deployment app003 Name: app003 Namespace: default CreationTimestamp: Sun, 18 Jul 2021 11:06:45 +0800 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 Selector: app=web Replicas: 2 desired | 2 updated | 2 total | 2 available | 0 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=web Containers: tomcat: Image: tomcat:8.0 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none>
查看replicaset 资源的详细信息,可以看到Controlled By Deployment/app003,即由deployment控制器app003创建,标签为app-web,跟deployment的标签选择器匹配,标签选择器为 app=web,pod-template-hash=646bdcbd54 :
[root@ylserver10686071 ~]# kubectl describe replicaset app003 Name: app003-646bdcbd54 Namespace: default Selector: app=web,pod-template-hash=646bdcbd54 Labels: app=web pod-template-hash=646bdcbd54 Annotations: deployment.kubernetes.io/desired-replicas: 2 deployment.kubernetes.io/max-replicas: 3 deployment.kubernetes.io/revision: 1 Controlled By: Deployment/app003 Replicas: 2 current / 2 desired Pods Status: 2 Running / 0 Waiting / 0 Succeeded / 0 Failed Pod Template: Labels: app=web pod-template-hash=646bdcbd54 Containers: tomcat: Image: tomcat:8.0 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none>
查看pod资源的详细信息,可以看到Controlled By: ReplicaSet/app003-646bdcbd54,即由replicaset控制器创建,标签为app=web,pod-template-hash=646bdcbd54 ,跟 replicaset 的标签选择器匹配:
[root@ylserver10686071 ~]# kubectl describe pod app003 Name: app003-646bdcbd54-tzlpv Namespace: default Priority: 0 Node: ylserver10686071/10.68.60.71 Start Time: Sun, 18 Jul 2021 11:06:46 +0800 Labels: app=web pod-template-hash=646bdcbd54 Annotations: cni.projectcalico.org/podIP: 10.233.75.51/32 cni.projectcalico.org/podIPs: 10.233.75.51/32 Status: Running IP: 10.233.75.51 IPs: IP: 10.233.75.51 Controlled By: ReplicaSet/app003-646bdcbd54
pod的副本数也是可以修改的,修改副本数为3:
[root@ylserver10686071 ~]# kubectl scale deployment app003 --replicas=3 deployment.apps/app003 scaled [root@ylserver10686071 ~]#
通过replicaset控制器也是可以修改副本数,修改副本数为4:
[root@ylserver10686071 ~]# kubectl scale replicaset app003-646bdcbd54 --replicas=4 replicaset.apps/app003-646bdcbd54 scaled [root@ylserver10686071 ~]#
查看生成的pod:
[root@ylserver10686071 ~]# kubectl get pods NAME READY STATUS RESTARTS AGE app003-646bdcbd54-9h9bl 1/1 Running 0 89s app003-646bdcbd54-tzlpv 1/1 Running 0 3h57m app003-646bdcbd54-w682f 1/1 Running 0 3h43m [root@ylserver10686071 ~]#
同理,pod使用的images也是可以修改的,将deployment app003下Container名为tomcat的image 修改为 nginx:1.21 :
[root@ylserver10686071 ~]# kubectl set image deployment app003 tomcat=nginx:1.21 deployment.apps/app003 image updated [root@ylserver10686071 ~]#
查看pod使用的image:
[root@ylserver10686071 ~]# kubectl describe pod app003|grep -3 Image Containers: tomcat: Container ID: docker://a22d3137e114752e3a8b6667d769faf7d2f56c0d91c9a96df92094da0b95344a Image: nginx:1.21 Image ID: docker-pullable://nginx@sha256:353c20f74d9b6aee359f30e8e4f69c3d7eaea2f610681c4a95849a2fd7c497f9 Port: <none> Host Port: <none> State: Running
总结一下:
- deployment是高层控制器,通过控制replicaset来控制pod,最终通过pod生成对应的container实体,有如此关系:deployment ==> replicaset ==> pod ==> container (实体);
- 高层控制器通过标签选择器来定位下一层控制器,所以对于高层控制器selector是必填字段,对于底层控制器 label是必填字段;
- label标签由kye/value键值对组成。