kubernetes的Controller

92 阅读2分钟

2022 年什么会火?什么该学?本文正在参与“聊聊 2022 技术趋势”征文活动 」

Controller是kubernetes集群中管理和运行容器的对象,pod通过Controller进行应用的操作,Controller与pod通过label标签来对应,Controller可以进行负载

deployment是pod控制器的一种,部署无状态的应用,它用来管理pod和replicaSet,它支持滚动升级等功能

使用yaml来创建应用

首先我们使用命令创建一个yaml文件

kubectl create deployment web --image=nginx --dry-run -o yaml > nginx.yaml

其中web表示应用的名字

这样我们就可以生成一个Nginx的yaml文件,然后可以基于这个文件做修改,使用这个文件的话使用命令

kubectl apply -f nginx.yaml

然后对外暴露端口:

kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1 -o yaml > web1.yaml

其中port是内部端口,target-port是对外暴露的端口

完成之后可以使用下面的命令查看服务的状态

kubectl get pods,svc

我们刚才说它支持应用的升级、回滚和弹性伸缩

升级

使用命令

kubectl set image deployment web nginx=nginx:1.16

通过设置应用的版本号来让应用升级

升级的过程在应用容器创建完成后旧版本的应用才会暂停

查看升级状态

kubectl rollout status deployment webname

回滚上一版本命令:

kubectl rollout undo deployment web

也可以回滚到指定的版本,加入参数- -to revision=3

查看历史版本

kubectl rollout history deployment web

deployment可以保证支撑服务的pod数量,动态伸缩,弹性扩缩容,但是它没有解决如何进行服务访问的问,当新的节点以新的ip启动的时候,不能确定它的ip和端口,从而不能进行服务的发现和负载均衡,这就需要service对象了。service就像个注册中心,通过service拿到提供的ip和port,service还可以进行负载均衡,pod和service的关联是通过label和selector进行关联的。Service三种常用的类型有ClusterIp,NodePort和LoadBalancer,默认是ClusterIp,LoadBalancer可以在对外访问的时候。可以添加yaml文件中type字段的属性值更改service类型。