创建和管理多个Pod--Deployment

  1. 说明
    Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationController 来方便的管理应用。
    你只需要在 Deployment 中描述想要的目标状态是什么,Deployment controller 就会帮你将 Pod 和ReplicaSet 的实际状态改变到你的目标状态。你可以定义一个全新的 Deployment 来创建 ReplicaSet 或者删除已有的 Deployment 并创建一个新的来替换。
  2. 复制控制器(Replication Controller,RC)
    RC是K8s集群中最早的保证Pod高可用的API对象。通过监控运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod副本。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可以发挥它高可用的能力,保证永远有1个Pod在运行。RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制小机器人提供高可用的Web服务。
  3. 副本集(Replica Set,RS)
    RS是新一代RC,提供同样的高可用能力,区别主要在于RS后来居上,能支持更多种类的匹配模式。副本集对象一般不单独使用,而是作为Deployment的理想状态参数使用。
  4. Deployment典型的应用场景包括
    (1)定义Deployment来创建Pod和ReplicaSet
    (2)滚动升级和回滚应用;如果当前状态不稳定,回滚到之前的Deployment revision。每次回滚都会更新Deployment的revision。
    (3)扩容和缩容,扩容Deployment以满足更高的负载。
    (4)暂停和继续Deployment,暂停Deployment来应用PodTemplateSpec的多个修复,然后恢复上线。
  5. 实战Deployment
    ##定义一个简单的nginx应用
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
        name: nginx-test
        namespace: test
    spec:
        replicas: 3
        template:
            metadata:
                labels:
                    app: nginx
            spec:
                containers:
                  - name: nginx
                    image: nginx:1.7.9
                    ports:
                    - containerPort: 80
    ##创建deploy(部署)
    kubectl create -f nginx-deployment
    deployment.extensions "nginx-test" created
    ##查看deploy(部署)
    kubectl get deploy --namespace=test
    NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-test   3         3         3            3           12m
    ##查看rs(副本集)
    kubectl get rs --namespace=test
    NAME                    DESIRED   CURRENT   READY     AGE
    nginx-test-75675f5897   3         3         3         11m
    ##查看pods(容器组)
    kubectl get po --namespace=test
    NAME                          READY     STATUS    RESTARTS   AGE
    nginx-test-75675f5897-9fcrs   1/1       Running   0          13m
    nginx-test-75675f5897-gnc8z   1/1       Running   0          13m
    nginx-test-75675f5897-qbsvm   1/1       Running   0          13m
  6. 实战扩容
    ##扩容
    将容器组的个数扩容至5个
    "replicas": 5
    #语法格式
    kubectl scale deployment + [deploy的name] + --replicas [count] + --namespace=命名空间
    #命令
    kubectl scale deployment nginx-test --replicas 5 --namespace=test
    deployment.extensions "nginx-test" scaled
    ##说明
    如果集群支持 horizontal pod autoscaling 的话,还可以为Deployment设置自动扩展:
    kubectl autoscale deployment nginx-test --min=10 --max=15 --cpu-percent=80 --namespace=test
    #查看deploy(部署)
    kubectl get deploy --namespace=test
    NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-test   5         5         5            5           17m
    #查看rs(副本集)
    kubectl get rs --namespace=test
    NAME                    DESIRED   CURRENT   READY     AGE
    nginx-test-75675f5897   5         5         5         18m
    #查看pods(容器组)
    kubectl get po --namespace=test
    NAME                          READY     STATUS    RESTARTS   AGE
    nginx-test-75675f5897-9fcrs   1/1       Running   0          19m
    nginx-test-75675f5897-gnc8z   1/1       Running   0          19m
    nginx-test-75675f5897-hjvjw   1/1       Running   0          3m
    nginx-test-75675f5897-hszs8   1/1       Running   0          3m
    nginx-test-75675f5897-qbsvm   1/1       Running   0          19m
  7. 实战缩容
    ##缩容
    将容器组的个数缩容至2个
    "replicas": 2
    #命令
    kubectl scale deployment nginx-test --replicas 2 --namespace=test
    deployment.extensions "nginx-test" scaled
    #查看deploy(部署)
    kubectl get deploy --namespace=test
    NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-test   2         2         2            2           25m
    #查看rs(副本集)
    kubectl get rs --namespace=test
    NAME                    DESIRED   CURRENT   READY     AGE
    nginx-test-75675f5897   2         2         2         25m
    #查看pods(容器组)
    kubectl get po --namespace=test
    NAME                          READY     STATUS    RESTARTS   AGE
    nginx-test-75675f5897-gnc8z   1/1       Running   0          26m
    nginx-test-75675f5897-qbsvm   1/1       Running   0          26m
  8. 实战滚动升级
    将image: nginx:1.7.9升级为nginx:1.9.1
    #语法格式
    kubectl scale deployment/[deploy的name] + [升级镜像] + --namespace=命名空间
    #命令
    kubectl set image deployment/nginx-test  nginx=nginx:1.9.1 --namespace=test
    deployment.apps "nginx-test" image updated
    #查看rs(副本集)
    kubectl get rs --namespace=test
    NAME                    DESIRED   CURRENT   READY     AGE
    nginx-test-75675f5897   0         0         0         48m
    nginx-test-c4747d96c    2         2         2         19m
    #查看pods(容器组)
    kubectl get po --namespace=test
    NAME                         READY     STATUS    RESTARTS   AGE
    nginx-test-c4747d96c-cqnqs   1/1       Running   0          21m
    nginx-test-c4747d96c-fpjrk   1/1       Running   0          21m
    #查看nginx版本
    kubectl describe po nginx-test-c4747d96c-cqnqs --namespace=test
    可看到版本信息:
    Image:          nginx:1.9.1
  9. 实战回滚应用
    #命令
    kubectl rollout undo deployment/nginx-test --namespace=test
    deployment.apps "nginx-test"
    #查看rs(副本集)
    kubectl get rs --namespace=test
    NAME                    DESIRED   CURRENT   READY     AGE
    nginx-test-75675f5897   2         2         2         28m
    nginx-test-c4747d96c    0         0         0         3m
    #查看pods(容器组)
    kubectl get po --namespace=test
    NAME                          READY     STATUS    RESTARTS   AGE
    nginx-test-75675f5897-rqnhb   1/1       Running   0          1m
    nginx-test-75675f5897-zhwgn   1/1       Running   0          1m
    #查看nginx版本
    kubectl describe po nginx-test-75675f5897-rqnhb --namespace=test
    可看到版本信息:
    Image:          nginx:1.7.9
  10. 说明
    以上操作都是在linux终端上进行的,命令有些繁琐的,我们实际上可以直接登入web界面的kubernetes进行deployment的创建和更改的,如下图所示:
    创建和管理多个Pod--Deployment
    创建和管理多个Pod--Deployment