内容
- 什么是 Controller
- Pod 和 Controller 的关系
- Deployment 控制器应用场景
- yaml 文件字段说明
- Deployment 控制器部署应用
- 升级回滚
- 弹性伸缩
什么是 Controller
Controller 是在集群上管理和运行容器的对象,Controller 是实际存在的,Pod 是虚拟机的
Pod 和 Controller 的关系
Pod 是通过 Controller 实现应用的运维,比如弹性伸缩,滚动升级等
Pod 和 Controller 之间是通过label标签
来建立关系,同时 Controller 又被称为控制器工作负载
Deployment 控制器应用
- Deployment 控制器可以部署无状态应用
- 管理 Pod 和 ReplicaSet
- 部署,滚动升级等功能
- 应用场景:web 服务,微服务
Deployment 表示用户对 K8S 集群的一次更新操作。Deployment 是一个比 RS( Replica Set, RS) 应用模型更广的 API 对象,可以是创建一个新的服务,更新一个新的服务,也可以是滚动升级一个服务。滚动升级一个服务,实际是创建一个新的 RS,然后逐渐将新 RS 中副本数增加到理想状态,将旧 RS 中的副本数减少到 0 的复合操作。
这样一个复合操作用一个 RS 是不好描述的,所以用一个更通用的 Deployment 来描述。以 K8S 的发展方向,未来对所有长期伺服型的业务的管理,都会通过 Deployment 来管理。
Deployment 部署应用
之前我们也使用 Deployment 部署过应用,如下代码所示
1 | kubectrl create deployment web --image=nginx |
但是上述代码不是很好的进行复用,因为每次我们都需要重新输入代码,所以我们都是通过 YAML 进行配置
但是我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会运行】
1 | kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml |
然后输出一个 yaml 配置文件 nginx.yml
,配置文件如下所示
1 | apiVersion: apps/v1 |
我们看到的 selector 和 label 就是我们 Pod 和 Controller 之间建立关系的桥梁
使用 YAML 创建 Pod
通过刚刚的代码,我们已经生成了 YAML 文件,下面我们就可以使用该配置文件快速创建 Pod 镜像了
1 | kubectl apply -f nginx.yaml |
但是因为这个方式创建的,我们只能在集群内部进行访问,所以我们还需要对外暴露端口
1 | kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 |
关于上述命令,有几次参数
- –port:就是我们内部的端口号
- –target-get-port:就是暴露外面访问的端口号
- –name:名称
- –type:类型
同理,我们一样可以导出对应的配置文件
1 | kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml |
得到的 web1.yaml 如下所示
1 | apiVersion: v1 |
然后我们可以通过下面的命令来查看对外暴露的服务
1 | kubectl get pods,svc |
然后我们访问对应的 url,即可看到 nginx 了 http://192.168.177.130:32639/
升级回滚和弹性伸缩
- 升级: 假设从版本为 1.14 升级到 1.15 ,这就叫应用的升级【升级可以保证服务不中断】
- 回滚:从版本 1.15 变成 1.14,这就叫应用的回滚
- 弹性伸缩:我们根据不同的业务场景,来改变 Pod 的数量对外提供服务,这就是弹性伸缩
应用升级和回滚
首先我们先创建一个 1.14 版本的 Pod
1 | apiVersion: apps/v1 |
我们先指定版本为 1.14,然后开始创建我们的 Pod
1 | kubectl apply -f nginx.yaml |
同时,我们使用 docker images 命令,就能看到我们成功拉取到了一个 1.14 版本的镜像
我们使用下面的命令,可以将 nginx 从 1.14 升级到 1.15
1 | kubectl set image deployment web nginx=nginx:1.15 |
在我们执行完命令后,能看到升级的过程
- 首先是开始的 nginx 1.14 版本的 Pod 在运行,然后 1.15 版本的在创建
- 然后在 1.15 版本创建完成后,就会暂停 1.14 版本
- 最后把 1.14 版本的 Pod 移除,完成我们的升级
我们在下载 1.15 版本,容器就处于 ContainerCreating 状态,然后下载完成后,就用 1.15 版本去替换 1.14 版本了,这么做的好处就是:升级可以保证服务不中断
我们到我们的 node2 节点上,查看我们的 docker images;
能够看到,我们已经成功拉取到了 1.15 版本的 nginx 了
查看升级状态
下面可以,查看升级状态
1 | kubectl rollout status deployment web |
查看历史版本
我们还可以查看历史版本
1 | kubectl rollout history deployment web |
应用回滚
我们可以使用下面命令,完成回滚操作,也就是回滚到上一个版本
1 | kubectl rollout undo deployment web |
然后我们就可以查看状态
1 | kubectl rollout status deployment web |
同时我们还可以回滚到指定版本
1 | kubectl rollout undo deployment web --to-revision=2 |
弹性伸缩
弹性伸缩,也就是我们通过命令一下创建多个副本
1 | kubectl scale deployment web --replicas=10 |
能够清晰看到,我们一下创建了 10 个副本
发布时间: 2021-01-13
最后更新: 2024-06-24
本文标题: Kubernetes学习之核心技术Controller
本文链接: https://blog-yilia.xiaojingge.com/posts/3badb2d5.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可。转载请注明出处!
