Kubernetes Deployment资源基础操作

351 阅读5分钟

前言

本文主要记录 Kubernetes Deployment 资源的相关操作,包括 Deployment 的创建、更新、回滚、扩缩容、状态查看、上线暂停与恢复,以及金丝雀部署方式。

创建Deployment

创建Deployment资源并上线ReplicaSet
Deployment资源提供了对Pod和ReplicaSet的更新定义

创建Deployment

1.编辑示例Deployment资源描述文件

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

2.执行命令创建Deployment
指定--record,记录Deployment修改历史,用于查看历史记录或回滚等操作

kubectl apply -f nginx-deployment.yaml --record

查看Deployemnt状态

执行命令kubectl get deployments,查看deployment状态

kubectl get deployments

### 输出
NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment        3/3     3            3           46s

查看Deployment上线状态

查看Deployment上线状态
命令形如:kubectl rollout status deployment/<.metadata.name>

kubectl rollout status deployment/nginx-deployment

### 输出
deployment "nginx-deployment" successfully rolled out

查看 Deployment 创建的 ReplicaSet

执行命令kubectl get rs,查看 Deployment 创建的 ReplicaSet

kubectl get rs

### 输出
NAME                               DESIRED   CURRENT   READY   AGE
nginx-deployment-66b6c48dd5        3         3         3       8m29s

查看Pod及标签

查看每个 Pod 自动生成的标签

kubectl get pods --show-labels

### 输出
NAME                                     READY   STATUS    RESTARTS   AGE    LABELS
nginx-deployment-66b6c48dd5-8rmj2        1/1     Running   0          10m    app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-9x8gg        1/1     Running   0          10m    app=nginx,pod-template-hash=66b6c48dd5
nginx-deployment-66b6c48dd5-dxwwg        1/1     Running   0          10m    app=nginx,pod-template-hash=66b6c48dd5

更新Deployment

仅当 Deployment Pod 模板(即 .spec.template)发生改变时,例如模板的标签或容器镜像被更新, 才会触发 Deployment 上线。 其他更新(如对 Deployment 执行扩缩容的操作)不会触发上线动作

更新镜像

更新nginx使用镜像从nginx:1.14.2nginx:1.16.1
命令形如:
kubectl --record deployment.apps/<.metadata.name> set image deployment.v1.apps/<.metadata.name> <.spec.containers[0].name>=<.spec.containers[0].image> <.metadata.name>
<.metadata.name>,.metadata.name,deployment资源的唯一名称
<.spec.containers[0].name>,.spec.template.spec.containers[0].name,容器名
<.spec.containers[0].image>,.spec.template.spec.containers[0].image,容器镜像

kubectl --record deployment.apps/nginx-deployment set image \
   deployment.v1.apps/nginx-deployment nginx=nginx:1.16.1

或者使用以下命令:
kubectl --record set image deployment/<.metadata.name> <.spec.containers[0].name>=<.spec.containers[0].image>

kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record

查看ReplicaSet

Deployment 通过创建新的 ReplicaSet 并将其扩容到 3 个副本
旧 ReplicaSet 缩容到 0 个副本完成了 Pod 的更新操作

kubectl get rs

### 输出
NAME                               DESIRED   CURRENT   READY   AGE
nginx-deployment-559d658b74        3         3         3       6m32s
nginx-deployment-66b6c48dd5        0         0         0       32m

查看Pod

通过NAME字段可以看到新的Pod

kubectl get pods

### 输出
NAME                                     READY   STATUS    RESTARTS   AGE
nginx-deployment-559d658b74-9n6mz        1/1     Running   0          8m22s
nginx-deployment-559d658b74-cww5k        1/1     Running   0          7m58s
nginx-deployment-559d658b74-f4gmg        1/1     Running   0          8m45s

回滚Deployment版本

回滚到先前版本的Deployment

仅当 Deployment 的 Pod 模板(.spec.template)发生更改时,才会创建新修订版本;因此回滚到较早的修订版本时,只有 Deployment 的 Pod 模板部分会被回滚

查看Deployment上线历史

查看Deployment上线历史 命令形如:kubectl rollout history deployment.v1.apps/<.metadata.name>

kubectl rollout history deployment.v1.apps/nginx-deployment

### 输出
deployment.apps/nginx-deployment 
REVISION  CHANGE-CAUSE
1         kubectl apply --filename=nginx-deployment.yaml --record=true
2         kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 --record=true

查看REVISION详情

查看修订历史的详细信息 命令形如:kubectl rollout history deployment.v1.apps/<.metadata.name> --revision=

kubectl rollout history deployment.v1.apps/nginx-deployment --revision=2

回滚到上个版本

1.撤消当前上线版本并回滚到上个修订版本
命令形如:kubectl rollout undo deployment.v1.apps/<.metadata.name>

kubectl rollout undo deployment.v1.apps/nginx-deployment

2.回滚到指定版本
命令形如:kubectl rollout undo deployment.v1.apps/<.metadata.name> --to-revision=

kubectl rollout undo deployment.v1.apps/nginx-deployment --to-revision=1

扩缩Deployment

扩容Deployment以实现更多服务负载

按数量扩缩

按数量副本扩缩
命令形如:kubectl scale deployment.v1.apps/<.metadata.name> --replicas=

kubectl scale deployment.v1.apps/nginx-deployment --replicas=10

按比例扩缩

按比例扩缩是Deployment滚动更新的一种策略
Deployment在扩缩过程中可能会同时存在新旧版本
通过指定maxUnavailable(最大不可用)和maxSurge(最大峰值)来控制副本数量变化幅度

  • maxUnavailable:.spec.strategy.rollingUpdate.maxUnavailable,指定更新过程中不可用的 Pod 的个数上限;正整数,或期望Pod数量的百分比(向下取整),默认值25%
  • maxSurge:.spec.strategy.rollingUpdate.maxSurge,指定可以创建的超出期望 Pod 个数的 Pod 数量上限;正整数,或期望Pod数量的百分比(向上取整),默认值25%

暂停、恢复Deployment

暂停与恢复Deployment上线

暂停Deployment

暂停Deployment,Deployment的上线操作将会不可用,包括回滚操作
命令形如:kubectl rollout pause deployment.v1.apps/<.metadata.name>

kubectl rollout pause deployment.v1.apps/nginx-deployment

恢复Deployment

命令形如:kubectl rollout resume deployment.v1.apps/<.metadata.name>

kubectl rollout resume deployment.v1.apps/nginx-deployment

清理策略

清理旧ReplicaSets
设置.spec.revisionHistoryLimit指定此 Deployment 保留的旧有 ReplicaSet 个数 其余的 ReplicaSet 将在后台被垃圾回收,显示指定值为0即可清空,默认值为10

金丝雀部署

金丝雀部署在保持旧版本Pod运行同时,上线新版本Pod
当新版本Pod应用验证之后,将旧版本替换为新版本
在Kubernetes中通常以标签release=stablerelease=canary来标记版本

稳定版本

.metadata.name=nginx-deployment,当前版本的Deployment资源名称
.spec.replicas=3,旧版本的上线数量
.spec.template.metadata.labels.release=stable,当前版本的Pod标签
.spec.template.spec.containers[0].image=nginx:1.14.2,当前版本容器镜像

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        release: stable
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

金丝雀版本

.metadata.name=nginx-canary-deployment,新版本的Deployment资源名称
.spec.replicas=1,新版本的上线数量
.spec.template.metadata.labels.release=canary,新版本的Pod标签
.spec.template.spec.containers[0].image=nginx:1.16.1,新版本容器镜像

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-canary
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
        release: canary
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        ports:
        - containerPort: 80

服务资源

.spec.selector.app=nginx,以新旧版本Pod的共有标签匹配,这样服务请求都可达到新旧版本

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  nodePort: 32000

当金丝雀版本验证符合预期后,更改旧版本的镜像并更新上线,随后可将金丝雀版本下线

参考

[1] Kubernetes Deployments
[2] 金丝雀部署