美文网首页
Replication Controller

Replication Controller

作者: Robin92 | 来源:发表于2022-03-21 22:35 被阅读0次

    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
    
    回滚操作

    相关文章

      网友评论

          本文标题:Replication Controller

          本文链接:https://www.haomeiwen.com/subject/aqkxjrtx.html