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

 

posted @ 2021-07-23 14:14  一剑侵心  阅读(477)  评论(0编辑  收藏  举报