二、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最核心的功能就是编排,而编排操作都是依靠控制器对象来完成的,高级的控制器对象控制基础的控制器对象,基础的控制器对象再去控制PodPod里面再包容器。Kubernetes项目里API对象的层级结构大概就是这样。(此处引用知乎:https://zhuanlan.zhihu.com/p/191191906

  套用到这里就是deployment控制器对replicaset控制器进行控制,replicaset(副本集)控制器用来控制副本数量,一个副本就是一个pod,pod再生成Container,也就是 deployment ==> replicaset ==> pod ==> container (实体)

  那上层控制器是如何控制下层控制器的呢,使用的就是标签选择器(Label-Selector),回头看deployment资源配置文件:

 

  1. kind        要创建的资源类型,这里是Deployment
  2. replicas   生成的副本数
  3. selector  标签选择器,用来定位被控制的下层控制器
  4. template 定义POD的模板
  5. 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

 

  总结一下:

  1. deployment是高层控制器,通过控制replicaset来控制pod,最终通过pod生成对应的container实体,有如此关系:deployment ==> replicaset ==> pod ==> container (实体);
  2. 高层控制器通过标签选择器来定位下一层控制器,所以对于高层控制器selector是必填字段,对于底层控制器 label是必填字段;
  3. label标签由kye/value键值对组成。

 

posted @ 2021-07-18 12:49  梦君子  阅读(687)  评论(0编辑  收藏  举报