zoukankan      html  css  js  c++  java
  • Kubernetes Deployment

    Deployment为Pod和Replica Set提供声明式更新。

    创建Deployment

    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.7.9
            ports:
            - containerPort: 80
    

    创建nginx pod:

    $ kubectl create -f nginx-deployment.yaml --record
    

    将kubectl的 --record 的 flag 设置为 true可以在 annotation 中记录当前命令创建或者升级了该资源。
    查看状态:

    $ kubectl get deployments
    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   3         3         3            3           18s
    $ kubectl get rs
    NAME                          DESIRED   CURRENT   READY   AGE
    nginx-deployment-2035384211   3         3         0       18s
    $ kubectl get pods --show-labels
    NAME                                READY     STATUS    RESTARTS   AGE       LABELS
    nginx-deployment-2035384211-7ci7o   1/1       Running   0          18s       app=nginx,pod-template-hash=2035384211
    nginx-deployment-2035384211-kzszj   1/1       Running   0          18s       app=nginx,pod-template-hash=2035384211
    nginx-deployment-2035384211-qqcnn   1/1       Running   0          18s       app=nginx,pod-template-hash=2035384211
    

    Deployment已经创建了3个 replica,ReplicaSet 的名字总是

    Pod-template-hash label

    当 Deployment 创建或者接管 ReplicaSet 时,Deployment controller 会自动为 Pod 添加 pod-template-hash label。这样做的目的是防止 Deployment 的子ReplicaSet 的 pod 名字重复。通过将 ReplicaSet 的 PodTemplate 进行哈希散列,使用生成的哈希值作为 label 的值,并添加到 ReplicaSet selector 里、 pod template label 和 ReplicaSet 管理中的 Pod 上。

    更新Deployment

    Deployment 的 rollout 当且仅当 Deployment 的 pod template(例如.spec.template)中的label更新或者镜像更改时被触发。
    nginx pod 使用nginx:1.9.1的镜像来代替原来的nginx:1.7.9的镜像:

    $ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
    deployment "nginx-deployment" image updated
    

    使用edit命令来编辑 Deployment,修改 .spec.template.spec.containers[0].image ,将nginx:1.7.9 改写成 nginx:1.9.1:

    $ kubectl edit deployment/nginx-deployment
    deployment "nginx-deployment" edited
    

    查看状态:

    $ kubectl rollout status deployment/nginx-deployment
    Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
    deployment "nginx-deployment" successfully rolled out
    $ kubectl get deployments
    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   3         3         3            3           36s
    $ kubectl get rs
    NAME                          DESIRED   CURRENT   READY   AGE
    nginx-deployment-1564180365   3         3         0       6s
    nginx-deployment-2035384211   0         0         0       36s
    $ kubectl get pods
    NAME                                READY     STATUS    RESTARTS   AGE
    nginx-deployment-1564180365-khku8   1/1       Running   0          14s
    nginx-deployment-1564180365-nacti   1/1       Running   0          14s
    nginx-deployment-1564180365-z9gth   1/1       Running   0          14s
    

    Deployment 可以保证在升级时只有一定数量的 Pod 是 down 的。默认的,它会确保至少有比期望的Pod数量少一个是up状态(最多一个不可用)。
    Deployment 同时也可以确保只创建出超过期望数量的一定数量的 Pod。默认的,它会确保最多比期望的Pod数量多一个的 Pod 是 up 的(最多1个 surge )。
    开始创建一个新的 Pod,然后删除一些旧的 Pod 再创建一个新的。当新的Pod创建出来之前不会杀掉旧的Pod。

    回退Deployment

    若更新 Deployment 的时候出现拼写错误,Rollout 将会卡住。查看pod会看到新的 ReplicaSet 创建的 Pod 处于 ImagePullBackOff 状态,循环拉取镜像。

    $ kubectl set image deployment/nginx-deployment nginx=nginx:1.91
    deployment "nginx-deployment" image updated
    $ kubectl rollout status deployments nginx-deployment
    Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
    $ kubectl get rs
    NAME                          DESIRED   CURRENT   READY   AGE
    nginx-deployment-1564180365   2         2         0       25s
    nginx-deployment-2035384211   0         0         0       36s
    nginx-deployment-3066724191   2         2         2       6s
    $ kubectl get pods
    NAME                                READY     STATUS             RESTARTS   AGE
    nginx-deployment-1564180365-70iae   1/1       Running            0          25s
    nginx-deployment-1564180365-jbqqo   1/1       Running            0          25s
    nginx-deployment-3066724191-08mng   0/1       ImagePullBackOff   0          6s
    nginx-deployment-3066724191-eocby   0/1       ImagePullBackOff   0          6s
    

    为了修复这个问题,我们需要回退到稳定的 Deployment revision。

    检查 Deployment 升级的历史记录

    检查下 Deployment 的 revision:

    $ kubectl rollout history deployment/nginx-deployment
    deployments "nginx-deployment":
    REVISION    CHANGE-CAUSE
    1           kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml--record
    2           kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
    3           kubectl set image deployment/nginx-deployment nginx=nginx:1.91
    

    创建 Deployment 的时候使用了--recored参数可以记录命令,我们可以很方便的查看每次 revision 的变化。
    查看单个revision 的详细信息:

    $ kubectl rollout history deployment/nginx-deployment --revision=2
    deployments "nginx-deployment" revision 2
      Labels:       app=nginx
              pod-template-hash=1159050644
      Annotations:  kubernetes.io/change-cause=kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
      Containers:
       nginx:
        Image:      nginx:1.9.1
        Port:       80/TCP
         QoS Tier:
            cpu:      BestEffort
            memory:   BestEffort
        Environment Variables:      <none>
      No volumes.
    

    回退到历史版本

    回退当前的 rollout 到之前的版本:

    $ kubectl rollout undo deployment/nginx-deployment
    deployment "nginx-deployment" rolled back
    $ kubectl rollout undo deployment/nginx-deployment --to-revision=2
    (指定版本回滚)
    deployment "nginx-deployment" rolled back
    

    再次查看正常:

    $ kubectl get deployment
    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   3         3         3            3           30m
    
    $ kubectl describe deployment
    

    可以通过设置.spec.revisonHistoryLimit项来指定 deployment 最多保留多少 revision 历史记录。默认的会保留所有的 revision;如果将该项设置为0,Deployment就不允许回退了。

    Deployment 扩容

    扩容为10个:

    $ kubectl scale deployment nginx-deployment --replicas 10
    deployment "nginx-deployment" scaled
    

    编写 Deployment Spec

    在所有的 Kubernetes 配置中,Deployment 也需要apiVersion,kind和metadata这些配置项。
    Pod Template
    .spec.template 是 .spec中唯一要求的字段。
    另外为了划分Pod的范围,Deployment中的pod template必须指定适当的label和适当的重启策略。
    Replicas
    .spec.replicas 是可以选字段,指定期望的pod数量,默认是1。
    Selector
    .spec.selector是可选字段,用来指定 label selector ,圈定Deployment管理的pod范围。
    如果被指定, .spec.selector 必须匹配 .spec.template.metadata.labels,否则它将被API拒绝。如果 .spec.selector 没有被指定, .spec.selector.matchLabels 默认是 .spec.template.metadata.labels。
    策略
    .spec.strategy 指定新的Pod替换旧的Pod的策略。 .spec.strategy.type 可以是"Recreate"或者是 "RollingUpdate"。"RollingUpdate"是默认值。
    Recreate Deployment
    .spec.strategy.type==Recreate时,在创建出新的Pod之前会先杀掉所有已存在的Pod。

    Rolling Update Deployment
    .spec.strategy.type==RollingUpdate时,Deployment使用rolling update 的方式更新Pod 。您可以指定maxUnavailable 和 maxSurge 来控制 rolling update 进程。
    MAX UNAVAILABLE
    .spec.strategy.rollingUpdate.maxSurge 是可选配置项,用来指定可以超过期望的Pod数量的最大个数。该值可以是一个绝对值(例如5)或者是期望的Pod数量的百分比(例如10%)。当MaxUnavailable为0时该值不可以为0。通过百分比计算的绝对值向上取整。默认值是1。
    Progress Deadline Seconds
    .spec.progressDeadlineSeconds 是可选配置项,用来指定在系统报告Deployment的failed progressing——表现为resource的状态中type=Progressing、Status=False、 Reason=ProgressDeadlineExceeded前可以等待的Deployment进行的秒数。
    如果设置该参数,该值必须大于 .spec.minReadySeconds。

    Min Ready Seconds
    .spec.minReadySeconds是一个可选配置项,用来指定没有任何容器crash的Pod并被认为是可用状态的最小秒数。默认是0(Pod在ready后就会被认为是可用状态)。
    Rollback To
    .spec.rollbackTo 是一个可以选配置项,用来配置Deployment回退的配置。设置该参数将触发回退操作,每次回退完成后,该值就会被清除。

    Revision
    .spec.rollbackTo.revision是一个可选配置项,用来指定回退到的revision。默认是0,意味着回退到历史中最老的revision。
    Revision History Limit
    Deployment revision history存储在它控制的ReplicaSets中。
    .spec.revisionHistoryLimit 是一个可选配置项,用来指定可以保留的旧的ReplicaSet数量。该理想值取决于心Deployment的频率和稳定性。如果该值没有设置的话,默认所有旧的Replicaset或会被保留,将资源存储在etcd中,是用kubectl get rs查看输出。
    Paused
    .spec.paused是可以可选配置项,boolean值。用来指定暂停和恢复Deployment。Paused和没有paused的Deployment之间的唯一区别就是,所有对paused deployment中的PodTemplateSpec的修改都不会触发新的rollout。Deployment被创建之后默认是非paused。

  • 相关阅读:
    (ubuntu ufw)My firewall is blocking network connections from the docker container to outside
    nginx repos
    Xvfb新建虚拟X窗口,通过x11vnc启动VNC Server并转发Xvfb启动的虚拟窗口
    xdotool xdotool模拟击键和鼠标移动--CutyCapt是一个截图工具,xvfb-run
    zabbix debug and vulnerability https://www.zabbix.com/documentation/3.0/manual/concepts/sender
    初探 Nginx 架构
    Nginx缓存
    Nginx代理功能与负载均衡详解
    CentOS 7 部署 nginx-1.14.2
    LDAP第三天 MySQL+LDAP 安装
  • 原文地址:https://www.cnblogs.com/aresxin/p/Kubernetes-Deployment.html
Copyright © 2011-2022 走看看