• Kubernetes 系列(二):Deployment 扩容


    (1)首先我们创建一个nginx的Deployment,采用官方的yaml:

    kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record

    将kubectl的 --record 的 flag 设置为 true可以在 annotation 中记录当前命令创建或者升级了该资源。这在未来会很有用,例如,查看在每个 Deployment revision 中执行了哪些命令。

    创建完成后查看下状态:

    kubectl get deployments
    kubectl get rs
    kubectl get pods

    OK,现在我们有了一个3各Pod的deployment。

    我们使用以下命令进行扩容:

    kubectl scale deployment nginx-deployment --replicas 10

    假设您的集群中启用了horizontal pod autoscaling,您可以给 Deployment 设置一个 autoscaler,基于当前 Pod的 CPU 利用率选择最少和最多的 Pod 数。

    kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80

    如果使用了自动扩容,我们可以通过运行来检查autoscaler的当前状态:

    kubectl get hpa
    NAME               REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    nginx-deployment   Deployment/nginx-deployment   <unknown>/20%   3         5         3          21m

    通过Kubectl get pods查看最新状态:

    比例扩容

    RollingUpdate Deployment 支持同时运行一个应用的多个版本。或者 autoscaler 扩 容 RollingUpdate Deployment 的时候,正在中途的 rollout(进行中或者已经暂停的),为了降低风险,Deployment controller 将会平衡已存在的活动中的 ReplicaSet(有 Pod 的 ReplicaSet)和新加入的 replica。这被称为比例扩容。

    例如,您正在运行中含有10个 replica 的 Deployment。maxSurge=3,maxUnavailable=2。

    $ kubectl get deploy
    NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment     10        10        10           10          50s

    您更新了一个镜像,而在集群内部无法解析。

    kubectl set image deploy/nginx-deployment nginx=nginx:sometag
    deployment "nginx-deployment" image updated

    镜像更新启动了一个包含ReplicaSet nginx-deployment-1989198191的新的rollout,但是它被阻塞了,因为我们上面提到的maxUnavailable。

    kubectl get rs
    NAME                          DESIRED   CURRENT   READY     AGE
    nginx-deployment-1989198191   5         5         0         9s
    nginx-deployment-618515232    8         8         8         1m

    然后发起了一个新的Deployment扩容请求。autoscaler将Deployment的repllica数目增加到了15个。Deployment controller需要判断在哪里增加这5个新的replica。如果我们没有谁用比例扩容,所有的5个replica都会加到一个新的ReplicaSet中。如果使用比例扩容,新添加的replica将传播到所有的ReplicaSet中。大的部分加入replica数最多的ReplicaSet中,小的部分加入到replica数少的ReplciaSet中。0个replica的ReplicaSet不会被扩容。

    在我们上面的例子中,3个replica将添加到旧的ReplicaSet中,2个replica将添加到新的ReplicaSet中。rollout进程最终会将所有的replica移动到新的ReplicaSet中,假设新的replica成为健康状态。

    kubectl get deploy
    NAME                 DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment     15        18        7            8           7m
    kubectl get rs
    NAME                          DESIRED   CURRENT   READY     AGE
    nginx-deployment-1989198191   7         7         0         7m
    nginx-deployment-618515232    11        11        11        7m


    检查 Deployment 升级的历史记录

    因为我们创建 Deployment 的时候使用了--recored参数可以记录命令,我们可以很方便的查看每次 revision 的变化。

    首先,检查下 Deployment 的 revision:

    PS G:k8s-for-dockerk8s-for-docker-desktop> kubectl rollout history deployment/nginx-deployment
    deployments "nginx-deployment"
    REVISION  CHANGE-CAUSE
    1         kubectl.exe create --filename=https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record=true
    2         kubectl.exe scale deployment nginx-deployment --replicas=10
    3         kubectl.exe set image deploy/nginx-deployment nginx=nginx:sometag

    我们还可以查看版本的具体信息:

    PS G:k8s-for-dockerk8s-for-docker-desktop> kubectl rollout history deployment/nginx-deployment --revision=2
    deployments "nginx-deployment" with revision #2
    Pod Template:
      Labels:       app=nginx
            pod-template-hash=703038527
      Annotations:  kubernetes.io/change-cause=kubectl.exe scale deployment nginx-deployment --replicas=10
      Containers:
       nginx:
        Image:      nginx:1.9.1
        Port:       80/TCP
        Host Port:  0/TCP
        Environment:        <none>
        Mounts:     <none>
      Volumes:      <none>

    回退到历史版本

    我们可以看到包括创建在内一共有3各版本,我们可以指定回退到某个版本,比如回退到2版本:

    kubectl rollout undo deployment/nginx-deployment --to-revision=2

    查看回滚状态:

    kubectl get deploy
    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   10        10        10           10          3h
    kubectl rollout history deployment/nginx-deployment
    deployments "nginx-deployment"
    REVISION  CHANGE-CAUSE
    1         kubectl.exe create --filename=https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record=true
    3         kubectl.exe set image deploy/nginx-deployment nginx=nginx:sometag
    4         kubectl.exe scale deployment nginx-deployment --replicas=10

    可以看到版本历史记录里多了一个4版本,10个副本的历史记录。

    暂停和恢复Deployment

    您可以在发出一次或多次更新前暂停一个 Deployment,然后再恢复它。这样您就能多次暂停和恢复 Deployment,在此期间进行一些修复工作,而不会发出不必要的 rollout。

    例如使用刚刚创建 Deployment:

    kubectl get deploy
    NAME               DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
    nginx-deployment   10        10        10           10          3h

    使用以下命令暂停 Deployment:

    kubectl rollout pause deployment/nginx-deployment
    deployment.apps "nginx-deployment" paused

    然后更新 Deplyment中的镜像,最后,恢复这个 Deployment,观察完成更新的 ReplicaSet 已经创建出来了:

    kubectl rollout resume deploy nginx

    Deployment 状态

    Deployment 在生命周期中有多种状态。在创建一个新的 ReplicaSet 的时候它可以是 progressing 状态, complete 状态,或者 fail to progress 状态。

    进行中的 Deployment

    Kubernetes 将执行过下列任务之一的 Deployment 标记为 progressing 状态:

    • Deployment 正在创建新的ReplicaSet过程中。
    • Deployment 正在扩容一个已有的 ReplicaSet。
    • Deployment 正在缩容一个已有的 ReplicaSet。
    • 有新的可用的 pod 出现。

    您可以使用kubectl rollout status命令监控 Deployment 的进度。

    kubectl rollout status deployment/nginx-deployment
    deployment "nginx-deployment" successfully rolled out
    PS G:k8s-for-dockerk8s-for-docker-desktop> echo $?
    True

    完成的 Deployment

    Kubernetes 将包括以下特性的 Deployment 标记为 complete 状态:
    
    Deployment 最小可用。最小可用意味着 Deployment 的可用 replica 个数等于或者超过 Deployment 策略中的期望个数。
    所有与该 Deployment 相关的replica都被更新到了您指定版本,也就说更新完成。
    该 Deployment 中没有旧的 Pod 存在。

    您可以用kubectl rollout status命令查看 Deployment 是否完成。如果 rollout 成功完成,kubectl rollout status将返回一个0值的 Exit Code。

    失败的 Deployment

    您的 Deployment 在尝试部署新的 ReplicaSet 的时候可能卡住,用于也不会完成。这可能是因为以下几个因素引起的:

    • (1)无效的引用
    • (2)不可读的 probe failure
    • (3)镜像拉取错误
    • (4)权限不够
    • (5)范围限制
    • (6)程序运行时配置错误
  • 相关阅读:
    USACO 2019 January Contest Platinum T2: Exercise Route
    USACO 2016 December Contest Gold T3: Lasers and Mirrors
    USACO 2016 December Contest Gold T2: Cow Checklist
    USACO 2016 December Contest Gold T1: Moocast
    USACO 2016 US Open Contest Gold T3: 248
    洛谷p5369[PKUSC2018]最大前缀和
    洛谷p5465 [PKUSC2018]星际穿越
    洛谷p3778[APIO2017]商旅
    NOIP2018提高组题解
    NOIP2017提高组题解
  • 原文地址:https://www.cnblogs.com/weiBlog/p/10463736.html
Copyright © 2020-2023  润新知