Kubernetes-Deployments控制器

Kubernetes-Deployments控制器

概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Deployments控制器 简写(deploy)

- 副本集 (ReplicaSet): Deployments 使用副本集来确保在集群中运行指定数量的 Pod 实例。副本集定义了 Pod 的模板,并指定要运行的副本数。Deployments 控制器通过与副本集交互来实现应用程序的水平扩展和收缩。

- 声明性配置: 使用 Deployments 控制器时,您只需定义所需的应用程序状态,而不需要指定如何达到这种状态。Kubernetes 将负责执行必要的步骤以确保集群中的实际状态与定义的状态匹配。

- 滚动升级 (Rolling Updates): Deployments 支持滚动升级,这意味着您可以轻松地更新应用程序而不会中断服务。滚动升级通过逐步替换旧的 Pod 实例来实现。这确保了在升级期间应用程序一直可用。

- 回滚 (Rollbacks): 如果升级后出现问题,Deployments 允许您回滚到先前的版本。这是通过恢复以前的副本集来实现的。这提供了一种容错机制,确保即使在升级过程中出现问题,系统也能够回到正常状态。

- 版本标签 (Version Labels): Deployments 控制器使用标签来跟踪应用程序的不同版本。每个副本集和 Pod 都可以被标记,以便进行版本控制和跟踪。

- 持久性存储: Deployments 控制器通过使用持久卷 (Persistent Volumes) 和持久卷声明 (Persistent Volume Claims) 支持应用程序的持久性存储需求。这对于需要持久性数据的应用程序非常重要。

- 自愈 (Self-healing): 如果某个 Pod 失败或被删除,Deployments 控制器将负责启动新的 Pod 实例,以确保所需的副本数保持不变。

- 通过使用 Deployments 控制器,开发人员和运维团队可以更轻松地管理应用程序的生命周期,从部署到升级再到回滚。这提高了应用程序的可靠性、可维护性和可伸缩性。

参考文档

1
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/

使用Deployments控制器创建资源对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@kubernetes-master controller]# cat nginx-deploy.yaml 
---
apiVersion: v1
kind: Namespace # 资源对象命名空间
metadata:
name: nginx-deploy # 命名空间名为 nginx-deploy
---
apiVersion: apps/v1 # deploment控制器版本为 apps/v1
kind: Deployment # 创建的资源对象为 deploy 控制器
metadata: # 元数据
name: nginx-deployment # deploy控制器名
namespace: nginx-deploy # 所在命名空间
labels: # 创建标签
  app: nginx # 标签键值
spec: # 属性
replicas: 3 # 预期副本数量
selector:
  matchLabels: # 选择带有下面标签的pod进行管理
    app: nginx # 该标签会被上面deploy的控制器进行管理
template: # 定义Pod信息
  metadata: # 元数据
    labels: # 使用标签
      app: nginx # 使用deploy控制器标签
  spec:
    containers:
      - name: nginx-web # 容器名
        image: daocloud.io/library/nginx # 容器镜像
        ports: # 容器内暴漏端口
          - containerPort: 80 # 端口号
1
2
3
4
5
6
7
8
9
10
# 创建并查看pod信息
[root@kubernetes-master controller]# kubectl apply -f nginx-deploy.yaml
namespace/nginx-deploy created
deployment.apps/nginx-deployment created

[root@kubernetes-master controller]# kubectl get pod -n nginx-deploy -o wide
NAME                               READY   STATUS   RESTARTS   AGE   IP             NODE               NOMINATED NODE   READINESS GATES
nginx-deployment-76f54754cf-5sbfj   1/1     Running   0         12s   10.10.20.215   kubernetes-node1   <none>           <none>
nginx-deployment-76f54754cf-gmnxs   1/1     Running   0         12s   10.10.20.209   kubernetes-node1   <none>           <none>
nginx-deployment-76f54754cf-t4ls7   1/1     Running   0         12s   10.10.20.122   kubernetes-node2   <none>           <none>
1
2
3
4
# 查看deploy控制器详细信息
[root@kubernetes-master controller]# kubectl get deploy -n nginx-deploy -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                     SELECTOR
nginx-deployment   3/3     3           3           92s   nginx-web   daocloud.io/library/nginx   app=nginx

image-20231109131313001

扩容及缩容

1
2
3
4
5
6
7
8
9
10
11
12
# 命令行方式
# 扩容pod副本为4个
[root@kubernetes-master controller]# kubectl scale -n nginx-deploy deployment nginx-deployment --replicas 4
deployment.apps/nginx-deployment scaled

# 查看
[root@kubernetes-master controller]# kubectl get pod -n nginx-deploy
NAME                               READY   STATUS   RESTARTS   AGE
nginx-deployment-76f54754cf-5sbfj   1/1     Running   0         6m38s
nginx-deployment-76f54754cf-gmnxs   1/1     Running   0         6m38s
nginx-deployment-76f54754cf-hff9m   1/1     Running   0         15s
nginx-deployment-76f54754cf-t4ls7   1/1     Running   0         6m38s
1
2
3
4
5
6
7
8
9
10
11
# yaml方式
[root@kubernetes-master controller]# kubectl apply -f nginx-deploy.yaml
namespace/nginx-deploy unchanged
deployment.apps/nginx-deployment configured

# 查看到又变回3个
[root@kubernetes-master controller]# kubectl get pod -n nginx-deploy  
NAME                               READY   STATUS   RESTARTS   AGE
nginx-deployment-76f54754cf-5sbfj   1/1     Running   0         9m27s
nginx-deployment-76f54754cf-gmnxs   1/1     Running   0         9m27s
nginx-deployment-76f54754cf-t4ls7   1/1     Running   0         9m27s

image-20231109131833082

滚动更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 修改容器镜像为daocloud.io/library/nginx:1.13.2-alpine-per这个版本
[root@kubernetes-master controller]# kubectl set image deployment/nginx-deployment nginx-web=daocloud.io/library/nginx:1.13.2-apline-perl -n nginx-deploy
deployment.apps/nginx-deployment image updated

# 查看deployment中pod信息 看到版本已经变更
[root@kubernetes-master controller]# kubectl get deployment -n nginx-deploy -o wide
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                         SELECTOR
nginx-deployment   3/3     3           3           29m   nginx-web   daocloud.io/library/nginx:1.13.2-alpine-perl   app=nginx

注: 命令解释
-- kubectl set image :设置镜像
-- deployment/nginx-deployment :deployment资源控制器中的名为nginx-deployment管理器
-- nginx-web=daocloud.io/library/nginx:1.13.2-apline-perl :nginx-web是pod中的容器名 =后面是镜像地址
-- -n nginx-deploy 指定命名空间为 nginx-deploy
1
2
3
4
# 查看更新过程
[root@kubernetes-master controller]# kubectl describe -n nginx-deploy deployment nginx-deployment

根据此日志可以看出当发生更新镜像时,deploy会创建一个该版本的镜像,当镜像运行起来后,deploy会把原版本的pod依次缩容一个,并创建新版本的pod直到完全更新。

image-20231109134041959

版本回滚

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看当前pod镜像版本为daocloud.io/library/nginx:1.13.2-alpine-perl
[root@kubernetes-master controller]# kubectl get deployment -n nginx-deploy -o wide  
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                                         SELECTOR
nginx-deployment   3/3     3           3           30m   nginx-web   daocloud.io/library/nginx:1.13.2-alpine-perl   app=nginx

# 版本回滚到上个版本
[root@kubernetes-master controller]# kubectl rollout undo -n nginx-deploy deployment/nginx-deployment
deployment.apps/nginx-deployment rolled back

# 查看版本,已经回退到上个版本
[root@kubernetes-master controller]# kubectl get deployment -n nginx-deploy -o wide  
NAME               READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES                     SELECTOR
nginx-deployment   3/3     3           3           36s   nginx-web   daocloud.io/library/nginx   app=nginx

删除Pod

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 命令行方式
# 查看deploy控制器名称
[root@kubernetes-master controller]# kubectl get deployment -n nginx-deploy
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3           3           8m53s
# 删除deploy控制器
[root@kubernetes-master controller]# kubectl delete deployment -n nginx-deploy nginx-deployment
deployment.apps "nginx-deployment" deleted


# yaml方式
# 因为上面已经删除 所以先创建出来再删除
[root@kubernetes-master controller]# kubectl apply -f nginx-deploy.yaml
namespace/nginx-deploy unchanged
deployment.apps/nginx-deployment created
# 查看pod
[root@kubernetes-master controller]# kubectl get pod -n nginx-deploy
NAME                               READY   STATUS   RESTARTS   AGE
nginx-deployment-76f54754cf-8h9km   1/1     Running   0         10s
nginx-deployment-76f54754cf-9b52q   1/1     Running   0         10s
nginx-deployment-76f54754cf-rw8qw   1/1     Running   0         10s
# 通过yaml文件删除
[root@kubernetes-master controller]# kubectl delete -f nginx-deploy.yaml
namespace "nginx-deploy" deleted
deployment.apps "nginx-deployment" deleted

注: 通常删除都使用yaml文件进行pod的创建及删除,若yaml文件找不到了,也可通过命令删除控制器方式删除pod