zoukankan      html  css  js  c++  java
  • 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)程序运行时配置错误
  • 相关阅读:
    Linux 下的类似Windows下Everything的搜索工具
    windows和linux环境下制作U盘启动盘
    程序调试手段之gdb, vxworks shell
    LeetCode 1021. Remove Outermost Parentheses (删除最外层的括号)
    LeetCode 1047. Remove All Adjacent Duplicates In String (删除字符串中的所有相邻重复项)
    LeetCode 844. Backspace String Compare (比较含退格的字符串)
    LeetCode 860. Lemonade Change (柠檬水找零)
    LeetCode 1221. Split a String in Balanced Strings (分割平衡字符串)
    LeetCode 1046. Last Stone Weight (最后一块石头的重量 )
    LeetCode 746. Min Cost Climbing Stairs (使用最小花费爬楼梯)
  • 原文地址:https://www.cnblogs.com/weiBlog/p/10463736.html
Copyright © 2011-2022 走看看