Kubernetes Deployment & Service
1. Deployment
Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的 ReplicationController 来方便的管理应用。
典型的应用场景包括:
- 定义 Deployment 来创建 Pod 和 ReplicaSet
- 滚动升级和回滚应用
- 扩容和缩容
- 暂停和继续 Deployment
下面以 nginx 镜像来演示。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deploy spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80
上面定义了 nginx 有 2个副本。
2. 外网访问
定义 service,使其在集群外可以访问
apiVersion: v1 kind: Service metadata: name: my-nginx spec: selector: app: nginx type: NodePort ports: - port: 80 targetPort: 80 protocol: TCP name: http nodePort: 30088
这样就可以访问了: http://192.168.137.91:30088/ (我用的自己电脑开了3个虚拟机装 kubernetes,等了蛮久后才可以访问的), 这里的 30088 是上面 nodePort 定义的。文档建议不要自己定义,由 kubernetes 自己生成一个随机端口。可以通过下面的命令查看。
3. 扩容/缩容
运行下面的命令, 可以增加/减少 副本数,从而达到扩容/缩容的目的
kubectl scale deployment nginx-deploy --replicas=4
4. 滚动更新
使用下面的命令去创建 deployment。--record 参数的作用,是记录下你每次操作所执行的命令,以方便后面查看。
kubectl create -f nginx-deployment.yaml --record
下面的命令可以实时查看deployment 的状态
kubectl rollout status deployment/nginx-deploy
在用户提交了一个 Deployment 对象后,Deployment Controller 就会立即创建一个 Pod 副本个数为 3 的 ReplicaSet。这个 ReplicaSet 的名字,则是由 Deployment 的名字和
一个随机字符串共同组成。
可以直接编辑 deployment 进行滚动更新,命令为:
kubectl edit deployment/nginx-deploy
kubectl edit 并不神秘,它不过是把 API 对象的内容下载到了本地文件,让你修改完成后再提交上去(此处,我们可以把 nginx 的版本改成 1.9.1 ,模拟应用版本升级) 。编辑完成后再查看状态,可以看到滚动更新的过程。
在升级刚开始的时候,集群里只有 1 个新版本的 Pod。如果这时,新版本 Pod 有问题启动不起来,那么“滚动更新”就会停止 。为了进一步保证服务的连续性,Deployment Controller 还会确保,在任何时间窗口内,只
有指定比例的 Pod 处于离线状态。同时,它也会确保,在任何时间窗口内,只有指定比例的新Pod 被创建出来。这两个比例的值都是可以配置的,默认都是 DESIRED 值的 25%
滚动更新完成后:
可以看到 Deployment 是对应多个 ReplicaSet 的。滚动更新时,会创建新的 ReplicaSet,逐步减少旧的 ReplicaSet 里的 pod 的数量,并逐步增加新的 ReplicaSet 里的 pod 的数量。
5. 回滚
先设置一个不存在的 nginx 版本,进行更新
kubectl set image deployment/nginx-deploy nginx=nginx:1.91
这时会发现多了一个 ReplicaSet,但是只有一个,一直不是 Ready 状态(因为拉取不到镜像)
可以执行下面的命令进行回滚
kubectl rollout undo deployment/nginx-deploy
可以看到:每次更新都会创建一个新的 ReplicaSet,旧的会保留。Deployment 对象有一个字段,叫作 spec.revisionHistoryLimit,就是 Kubernetes 为 Deployment 保留的“历史版本”个数。所以,如果把它设置为 0,你就再也不能做回滚操作了。
6. 如何回退至某个历史版本?
(1)可以先查看历史版本
kubectl rollout history deployment/nginx-deploy
然后运行下面的命令查看某个版本的具体细节
kubectl rollout history deployment/nginx-deploy --revision=3
确定是要回退的版本后,运行下面的命令进行回退
kubectl rollout undo deployment/nginx-deploy --to-revision=1