zoukankan      html  css  js  c++  java
  • Kubernetes探索学习005--Kubernetes的Controller模型和ReplicaSet伸缩

    1.Kubernetes的controller pattern

    需要认识到Kubernetes操作Pod的逻辑,都是由控制器来完成的。

    查看之前写过的nginx-deployment的YAML文件
    [root@kubernetes01 ~]# cat nginx-deployment.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels: 
        app: nginx
    spec:
      replicas: 2
      selector: 
        matchLabels:
          app: nginx
          
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.8.1
            ports:
            - containerPort: 80
    
    Kubernetes中的kube-controller-manager组件执行了上面的Deployment定义的编排动作。
    Deployment定义的template字段,这种字段在Kubernetes中叫做PodTemplate(Pod模版)。
    而这个YAML文件描述的就是Deployment这样一个控制器,template以上的部分是对控制器的定义,template以下的部分属于对被控制的对象的定义。
    

    2.Kubernetes Pod 的自动伸缩

    Pod水平扩展和水平收缩的能力依赖于Kubernetes中一个非常重要的API对象,ReplicaSet也就是副本集。

    2.1.Pod的水平扩展和伸缩

    查看例子的YAML文件
    [root@kubernetes01 ~]# cat nginx-replicaset.yaml 
    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: nginx-replicaset
      labels: 
        app: nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.8.0
    上面这个例子中,ReplicaSet对象是由一个Pod模版和副本数目的多少定义组成的。
    
    再看这个YAML文件
    [root@kubernetes01 ~]# cat nginx-deployment.yaml 
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
      labels: 
        app: nginx
    spec:
      replicas: 3
      selector: 
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.8.1
            ports:
            - containerPort: 80
    Deployment控制器实际操作的是ReplicaSet对象,而不是Pod对象。
    这个定义replicas=3的Deployment与他的ReplicaSet以及Pod的关系可以理解成是一种分层控制层层控制的关系,replicas的值决定是扩展还是收缩,当你去扩展或是收缩的时候还伴随着滚动更新。
    

    2.2.Pod的滚动更新

    1.首先修改镜像版本
    kubectl edit deployment/nginx-deployment
    spec:
          containers:
          - image: nginx:1.9.1
            imagePullPolicy: IfNotPresent
            name: nginx
            ports:
            - containerPort: 80
              protocol: TCP
            resources: {}
            terminationMessagePath: /dev/termination-log
            terminationMessagePolicy: File
          dnsPolicy: ClusterFirst
          restartPolicy: Always
          schedulerName: default-scheduler
          securityContext: {}
          terminationGracePeriodSeconds: 30
    这块儿直接把image中nginx的版本改成了1.9.1然后保存退出,文件有了新的变动会触发更新。
    
    2.查看滚动更新的效果
    [root@kubernetes01 ~]# kubectl describe deployment nginx-deployment | tail -n 10
    Events:
      Type    Reason             Age    From                   Message
      ----    ------             ----   ----                   -------
      Normal  ScalingReplicaSet  30m    deployment-controller  Scaled up replica set nginx-deployment-7f987f7889 to 3
      Normal  ScalingReplicaSet  8m55s  deployment-controller  Scaled up replica set nginx-deployment-6987cdb55b to 1
      Normal  ScalingReplicaSet  8m54s  deployment-controller  Scaled down replica set nginx-deployment-7f987f7889 to 2
      Normal  ScalingReplicaSet  8m54s  deployment-controller  Scaled up replica set nginx-deployment-6987cdb55b to 2
      Normal  ScalingReplicaSet  8m33s  deployment-controller  Scaled down replica set nginx-deployment-7f987f7889 to 1
      Normal  ScalingReplicaSet  8m33s  deployment-controller  Scaled up replica set nginx-deployment-6987cdb55b to 3
      Normal  ScalingReplicaSet  8m12s  deployment-controller  Scaled down replica set nginx-deployment-7f987f7889 to 0
    首先通过Events输出的内容我们可以看到这个deployment滚动更新的Message。
    
    [root@kubernetes01 ~]# kubectl get rs
    NAME                               DESIRED   CURRENT   READY   AGE
    nginx-deployment-5c689d88bb        0         0         0       14d
    nginx-deployment-5cd6d46846        0         0         0       14d
    nginx-deployment-67d57d6df9        0         0         0       9d
    nginx-deployment-6987cdb55b        3         3         3       10m
    nginx-deployment-7f987f7889        0         0         0       9d
    nginx-replicaset                   0         0         0       37m
    然后查看这个Deployment控制的ReplicaSet的最终状态,这里等待了一会儿所以已经是最终的状态了,配合前边Events的信息,nginx-deployment-6987cdb55b up to 1,旧的nginx-deployment-7f987f7889 down to 2,通过交替的逐一的升级和降级“滚动更新”,最终
    nginx-deployment-6987cdb55b 的DESIRED,CURRENT,READY都变成了期望值3!
    
    状态字段的含义:
    DESIRED:用户期望的Pod副本个数
    CURRENT:当前处于Running状态的Pod的个数
    UP-TO-DATE:当前处于最新版本的Pod的个数
    READY:处于健康检查正确状态的Pod的个数,Running状态的新版本
    
    我们还可以通过 kubectl rollout status deployment/nginx-deployment这条命令实时的查看Deployment对象的状态变化。应用的版本和ReplicaSet是一一对应的,这也是Kubernetes实现对多个应用版本描述的设计思想。
    

    3.Kubernetes Deployment对应用的版本控制

    1.首先通过命令直接这个Deployment的镜像修改成错误的
    [root@kubernetes01 ~]# kubectl set image deployment/nginx-deployment nginx=nginx:1.99
    deployment.extensions/nginx-deployment image updated
    
    2.查看Deployment的状态
    [root@kubernetes01 ~]# kubectl get rs
    NAME                               DESIRED   CURRENT   READY   AGE
    nginx-deployment-5476c5bdd         1         1         0       12s
    nginx-deployment-5c689d88bb        0         0         0       15d
    nginx-deployment-5cd6d46846        0         0         0       14d
    nginx-deployment-67d57d6df9        0         0         0       10d
    nginx-deployment-6987cdb55b        3         3         3       46m
    nginx-deployment-7f987f7889        0         0         0       10d
    nginx-replicaset                   0         0         0       73m
    nginx-staticwebsite-648bc64544     2         2         2       9d
    nginx-staticwebsite-8479f8997f     0         0         0       9d
    tomcat-deployment-001-84d957dc97   2         2         2       6d1h
    tomcat-test-6cc4d85cf6             2         2         2       6d18h
    可以看到nginx-deployment-5476c5bdd这个有问题的Deployment的状态。
    
    3.回退到上个版本
    [root@kubernetes01 ~]# kubectl rollout undo deployment/nginx-deployment
    deployment.extensions/nginx-deployment
    
    4.回退之后查看Deployment的状态
    [root@kubernetes01 ~]# kubectl get rs
    NAME                               DESIRED   CURRENT   READY   AGE
    nginx-deployment-5476c5bdd         0         0         0       90s
    nginx-deployment-5c689d88bb        0         0         0       15d
    nginx-deployment-5cd6d46846        0         0         0       14d
    nginx-deployment-67d57d6df9        0         0         0       10d
    nginx-deployment-6987cdb55b        3         3         3       47m
    nginx-deployment-7f987f7889        0         0         0       10d
    nginx-replicaset                   0         0         0       74m
    nginx-staticwebsite-648bc64544     2         2         2       9d
    nginx-staticwebsite-8479f8997f     0         0         0       9d
    tomcat-deployment-001-84d957dc97   2         2         2       6d1h
    tomcat-test-6cc4d85cf6             2         2         2       6d18h
    
    5.查看这个Deployment的历史版本记录
    [root@kubernetes01 ~]# kubectl rollout history deployment/nginx-deployment
    deployment.extensions/nginx-deployment 
    REVISION  CHANGE-CAUSE
    1         <none>
    2         <none>
    3         <none>
    4         <none>
    6         <none>
    7         <none>
    
    6.查看第一个版本的信息
    [root@kubernetes01 ~]# kubectl rollout history deployment/nginx-deployment --revision=1
    deployment.extensions/nginx-deployment with revision #1
    Pod Template:
      Labels:       app=nginx
            pod-template-hash=5c689d88bb
      Containers:
       nginx:
        Image:      nginx:1.7.9
        Port:       80/TCP
        Host Port:  0/TCP
        Environment:        <none>
        Mounts:     <none>
      Volumes:      <none>
    
    7.切换到第一个版本
    [root@kubernetes01 ~]# kubectl rollout undo deployment/nginx-deployment --to-revision=1
    deployment.extensions/nginx-deployment
    
    8.查看Deployment的状态
    [root@kubernetes01 ~]# kubectl get rs
    NAME                               DESIRED   CURRENT   READY   AGE
    nginx-deployment-5476c5bdd         0         0         0       19m
    nginx-deployment-5c689d88bb        3         3         3       15d
    nginx-deployment-5cd6d46846        0         0         0       14d
    nginx-deployment-67d57d6df9        0         0         0       10d
    nginx-deployment-6987cdb55b        0         0         0       65m
    nginx-deployment-7f987f7889        0         0         0       10d
    nginx-replicaset                   0         0         0       92m
    nginx-staticwebsite-648bc64544     2         2         2       9d
    nginx-staticwebsite-8479f8997f     0         0         0       9d
    tomcat-deployment-001-84d957dc97   2         2         2       6d1h
    tomcat-test-6cc4d85cf6             2         2         2       6d18h
    这块儿可以看到副本集nginx-deployment-5c689d88bb已经变成了我们期望的状态。
    

    4.总结

    Deployment是一个俩层控制器,首先通过控制ReplicaSet来控制版本,ReplicaSet则控制Pod。我们可以通过使用kubectl rollout命令控制应用的版本。
    PS:文中服务器使用的是国内某☁️的机器
    欢迎大家留言讨论哦,欢迎大家和我一起学习Kubernetes~~~

  • 相关阅读:
    百度之星资格赛1001——找规律——大搬家
    HDU1025——LIS——Constructing Roads In JGShining's Kingdom
    DP(递归打印路径) UVA 662 Fast Food
    递推DP UVA 607 Scheduling Lectures
    递推DP UVA 590 Always on the run
    递推DP UVA 473 Raucous Rockers
    博弈 HDOJ 4371 Alice and Bob
    DFS(深度) hihoCoder挑战赛14 B 赛车
    Codeforces Round #318 [RussianCodeCup Thanks-Round] (Div. 2)
    DP(DAG) UVA 437 The Tower of Babylon
  • 原文地址:https://www.cnblogs.com/jason007/p/10718358.html
Copyright © 2011-2022 走看看