kubernetes Deployment dm
Deployment -> ReplicaSet -> Pod
创建
deployment必选字段:
spec.replicas
spec.selector.matchLables
spec.template
API版本:apps/v1
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx-dm name: nginx-dm spec: replicas: 3 selector: matchLabels: app: nginx-dm template: metadata: labels: app: nginx-dm spec: containers: - image: nginx name: nginx ports: - containerPort: 80 name: http
命令创建方式:
kubectl create deployment nginx-dm --image=nginx --dry-run -o yaml
Deployment 创建 ReplicaSet 来控制 Pod,使用,命令可以查看到 RS。
kubectl get replicasets -l app=nginx-dm NAME DESIRED CURRENT READY AGE nginx-dm-f6b9d478b 3 3 3 13m
查看创建的Pod:
kubectl get pods -l app=nginx-dm
更新策略
滚动更新(rolling update):
新旧版本要同时可以工作。滚动更新期间是在新旧两个ReplicaSet的控制下,旧控制器的Pod在减少,新控制器的Pod在增加。
超出的Pod数:
deployments.spec.strategy.rollingUpdate.maxSurge:升级期间Pod数量可超过预期数量的个数,值为0以上的正整数或百分比。
不可用的Pod数:
deployments.spec.strategy.rollingUpdate.maxUnavailable:最大不达可数目,Pod处于不可用的状态的个数。
maxSurge 和 maxUnavailable 这两个值不可同时为零。
spec: strategy: rollingUpdate: maxSurge: 2 maxUnavailable: 0 type: RollingUpdate
重新创建(recreate):
这种方式为删除现有的Pod,然后创建新Pod,常用于对数据库结构有改动的应用。
就绪等待时间:
deployments.spec.minReadySeconds:Pod创建好后等待多长的时间才视为就绪,给应用一些初始化的时间。
保留历史版本数:
deployments.spec.revisionHistoryLimit:保留旧ReplicaSet 版本的个数,用来回滚。
更新
kubectl patch:打补丁
kubectl patch deployments nginx-dm -p '{"spec":{"minReadySeconds":5}}'
修改镜像:kubectl set image
其中 nginx=nginx:1.16-alpine 等号前面的是containers 中name字段的值,等号后面的是镜像名称。
使用 --record=true 选项可以记录此条更新,以便后续回滚。
kubectl set image deployments nginx-dm nginx=nginx:1.16-alpine
查看更新过程:
更新镜像时可以使用 --watch 选项来查看更新过程:
kubectl get pods --watch Waiting for deployment "nginx-dm" rollout to finish: 1 out of 3 new replicas have been updated... kubectl get deployments nginx-dm --watch nginx-dm 4/3 1 4 26h
使用 kubectl rollout status 可以查看更新过程的状态信息:
kubectl rollout status deployments nginx-dm
滚动更新是用新的RS去替换旧的RS,可以看到更新过后留下的 ReplicaSet:
kubectl get replicaset -l app=nginx-dm
金丝雀发布
1、设置 maxSurge: 1 和 maxUnavailable: 0 值:
使用kubectl edit 或 patch 的方式都可以。
kubectl patch deployments nginx-dm -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge" :1,"maxUnavailable": 0 }}}}'
2、更新镜像并立即暂停更新:kubectl rollout pause
kubectl set image deployments nginx-dm nginx=nginx:latest && kubectl rollout pause deployments nginx-dm
查看状态:kubectl rollout status
此时的更新状态为暂停,如果查看Pod可以看到新版本的 ReplicaSet 控制的Pod只有一个,剩下的都是老版本的。此时可以通过 Service 或 Ingress 等资源的路由策略将一部分流量引入这个Pod。
kubectl rollout status deployments nginx-dm Waiting for deployment "nginx-dm" rollout to finish: 1 out of 3 new replicas have been updated...
3、继续滚动更新:kubectl rollout resume
如果新Pod没有问题则继续滚动更新。
kubectl rollout resume deployments nginx-dm && kubectl rollout status deployment nginx-dm
回滚deployment
回滚:kubectl rollout undo
这样就可以回滚到之前的版本了。
kubectl rollout undo deployments nginx-dm
查看之前的版本:kubectl rollout history
kubectl rollout history deployments nginx-dm
回滚到指定的版本:--to-revision=8
kubectl rollout undo deployments nginx-dm --to-revision=8
扩容和缩容
手动扩缩容:
使用 kubectl scale 命令修改ReplicaSet 来扩容:
kubectl scale replicaset --replicas=2 nginx-dm-74754b979
使用 kubectl edit 来修改replicas 字段进行扩容:
kubectl edit deployments nginx-dm
修改资源文件的方式来扩容:
kubectl apply -f dm.yaml
自动扩缩容:
根据cpu的指标自动扩缩容:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
也可以根据内存或其他指标进行自动扩缩容,详情:https://www.scriptjc.com/article/1136
示例
更新回滚示例:
kubectl run nginx-app --image=nginx:1.11.9-alpine --replicas=3 kubectl set image deployment/nginx-app nginx-app=nginx:1.12.0-alpine --record=true kubectl rollout undo deployment/nginx-app kubectl rollout history deployment nginx-app # 查看历史 kubectl rollout undo deployment nginx-app --to-revision=2 # 回滚到指定版本 kubectl rollout status deployment nginx-app
滚动更新流量不丢失的配置示例:
apiVersion: apps/v1 kind: Deployment metadata: labels: service: springboot name: springboot namespace: default spec: replicas: 3 selector: matchLabels: service: springboot strategy: rollingUpdate: maxSurge: 3 maxUnavailable: 0 # 需要设置为0 type: RollingUpdate template: metadata: labels: service: springboot spec: containers: - image: springboot:0.1 imagePullPolicy: IfNotPresent lifecycle: preStop: exec: command: - sleep - "60" # 防止已经进入到旧Pod中的请求没有处理完成就关闭了旧Pod,给剩余的请求预留足够的时间。(这步是保证流量不丢失的关键) livenessProbe: failureThreshold: 3 httpGet: path: /health-check port: 80 scheme: HTTP initialDelaySeconds: 180 # 根据readinessProbe时间对应即可 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 5 name: springboot ports: - containerPort: 80 hostPort: 80 protocol: TCP readinessProbe: failureThreshold: 3 httpGet: path: /health-check port: 80 scheme: HTTP initialDelaySeconds: 180 # 这个时间要足够长,等待程序充分启动完成 periodSeconds: 5 successThreshold: 1 timeoutSeconds: 3 resources: limits: memory: 3Gi requests: memory: 2Gi terminationGracePeriodSeconds: 60
deployment官方文档:
https://kubernetes.io/zh/docs/concepts/workloads/controllers/deployment/