Replication Controller,用于一直监控 pod 资源运行状态,一旦异常,控制在其它节点启动新的 Pod,以实现高可用。RC 还支持滚动升级、回滚操作。
创建 RC
创建 RC 配置文件
# ./k8s/rc/rc.yaml
apiVersion: v1
kind: ReplicationController # 资源类型
metadata: # 定义属性
name: myweb # 定义名字(必须)
spec: # 详细属性
replicas: 2 # 副本数
selector: # 选择器
app: myweb
template: # 模版信息和 pod 一般一致,只是没有名字,因为 Pod 不能重名,RC 要控制多个,所以不能设置
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: 172.16.156.128:5000/nginx:1.13
ports:
- containerPort: 80
kubectl create -f k8s/rc/rc.yaml # 创建 rc 资源
kubectl get rc # 获取 rc
kubectl get pods # 获取创建的 pod 列表
kubectl describe rc myweb # 查看 rc 资源详细信息(如果创建 pod 没成功,用此调查)
describe 信息
不知道什么原因,总是创建不成功,做了一系列操作(期间把 rc 名字改成了 myweb2),最后一次是重启了 apiserver 和 controller-manager 之后成功了。
启动后可以看到 rc 的资源 pod 开头都是 myweb2,然后有个随机的后缀。
当使用 kubectl delete pod myweb2-wprm5
删除一个时,会立即创建出一个新的资源。
rc 是通过标签与 pod 相关联的,即 rc.spec.selector
与 rc.spec.template.metadata.labels
,通过 describe rc
可看到 selector 是 app=myweb2
当添加一个新的 app=myweb2 的 Pod 资源时,k8s 会把最年轻的一个(就是启动时间短的)干掉。(下面通过修改 nginx Pod 的标签来达到新增一个的目的)
kubectl edit pod nginx # 会打开配置文件,来修改内容,一旦保存就会生效
Untitled.png
滚动升级
将原来的 rc.yaml 复制一份 rc-v2.yaml,myweb2 都变更为 myweb3(vim 通过 :%s#myweb2#myweb3#g
),nginx 从 1.13 变更为 1.15。
# cat k8s/rc/rc-v2.yaml
piVersion: v1
kind: ReplicationController
metadata:
name: myweb3
spec:
replicas: 2
selector:
app: myweb3
template:
metadata:
labels:
app: myweb3
spec:
containers:
- name: myweb3
image: 172.16.156.128:5000/nginx:1.15
ports:
- containerPort: 80
由于本地还没有镜像 nginx:1.15 ,所以先用 docker pull nginx:1.15
然后通过打 tag 更改 tag,并上传(push)到私有仓库中。
滚动升级:
kubectl rolling-update myweb2 -f k8s/rc/rc-v2.yaml --update-period=30s
# 需要指定之前到 rc 名字 myweb2
# 指定 file
# 可以指定升级间隔,如 30s 升级一个,没有指定默认是 1分钟
可从日志中看到升级步骤:先调整已启动的 rc pod 资源数量减 1,然后是新启动的 rc pod资源数量加 1,确保启动 30s 后准备重复以上步骤,直到完成升级。
滚动升级步骤回滚操作
将两个版本的信息反过来就是回滚操作,如以下命令:
kubectl rolling-update myweb3 -f k8s/rc/rc.yaml --update-period=1s # 时间变短
当升级过程中发现需要回滚的时候,可以通过 ctrl+C 终止升级过程,此时两个版本(当前是 myweb2 和 myweb3 )共存,然后通过以下命令回滚(注意,这里一定是两个版本共存 k8s 才能认识这两个名字):
kubectl rolling-update myweb2 myweb3 --update-period=20s --rollback # myweb3 回滚成 myweb2
回滚操作
网友评论