Replication Controller

2022-03-21  本文已影响0人  Robin92

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.selectorrc.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
回滚操作
上一篇下一篇

猜你喜欢

热点阅读