Kubernetes-Deployments控制器
概念
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 控制器,开发人员和运维团队可以更轻松地管理应用程序的生命周期,从部署到升级再到回滚。这提高了应用程序的可靠性、可维护性和可伸缩性。
参考文档
https://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/deployment/
使用Deployments控制器创建资源对象
[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 # 端口号
# 创建并查看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>
# 查看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
扩容及缩容
# 命令行方式
# 扩容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
# 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
滚动更新
# 修改容器镜像为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
# 查看更新过程
[root@kubernetes-master controller]# kubectl describe -n nginx-deploy deployment nginx-deployment
根据此日志可以看出当发生更新镜像时,deploy会创建一个该版本的镜像,当镜像运行起来后,deploy会把原版本的pod依次缩容一个,并创建新版本的pod直到完全更新。
版本回滚
# 查看当前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
# 命令行方式
# 查看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
评论区