• Kuberbetes的Controller


    内容

    • 什么是Controller
    • Pod和Controller的关系
    • Deployment控制器应用场景
    • yaml文件字段说明
    • Deployment控制器部署应用
    • 升级回滚
    • 弹性伸缩

    什么是Controller

    Controller是在集群上管理和运行容器的对象,Controller是实际存在的,Pod是虚拟机的

    Pod和Controller的关系

    Pod是通过Controller实现应用的运维,比如弹性伸缩,滚动升级等

    Pod 和 Controller之间是通过label标签来建立关系,同时Controller又被称为控制器工作负载

     Deployment控制器应用

    • Deployment控制器可以部署无状态应用
    • 管理Pod和ReplicaSet
    • 部署,滚动升级等功能
    • 应用场景:web服务,微服务

    Deployment部署应用

    之前我们也使用Deployment部署过应用,如下代码所示

    kubectrl create deployment web --image=nginx

    但是上述代码不是很好的进行复用,因为每次我们都需要重新输入代码,所以我们都是通过YAML进行配置

    但是我们可以尝试使用上面的代码创建一个镜像【只是尝试,不会创建】

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

    然后输出一个yaml配置文件 nginx.yml ,配置文件如下所示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: web
      name: web
    spec:
      replicas: 2 
      selector:
        matchLabels:
          app: web
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: web
        spec:
          containers:
          - image: nginx:1.14
            name: nginx
            resources: {}
    status: {}

    我们看到的 selector 和 label 就是我们Pod 和 Controller之间建立关系的桥梁

     使用YAML创建Pod

    通过刚刚的代码,我们已经生成了YAML文件,下面我们就可以使用该配置文件快速创建Pod镜像了

    kubectl apply -f web.yaml

    但是因为这个方式创建的,我们只能在集群内部进行访问,所以我们还需要对外暴露端口

    kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web1

    关于上述命令,有几次参数

    • --port:就是我们内部的端口号
    • --target-get-port:就是暴露外面访问的端口号
    • --name:名称
    • --type:类型

    同理,我们一样可以导出对应的配置文件

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

    得到的web1.yaml如下所示

    apiVersion: v1
    kind: Service
    metadata:
      creationTimestamp: "2020-11-16T02:26:53Z"
      labels:
        app: web
      managedFields:
      - apiVersion: v1
        fieldsType: FieldsV1
        fieldsV1:
          f:metadata:
            f:labels:
              .: {}
              f:app: {}
          f:spec:
            f:externalTrafficPolicy: {}
            f:ports:
              .: {}
              k:{"port":80,"protocol":"TCP"}:
                .: {}
                f:port: {}
                f:protocol: {}
                f:targetPort: {}
            f:selector:
              .: {}
              f:app: {}
            f:sessionAffinity: {}
            f:type: {}
        manager: kubectl
        operation: Update
        time: "2020-11-16T02:26:53Z"
      name: web2
      namespace: default
      resourceVersion: "113693"
      selfLink: /api/v1/namespaces/default/services/web2
      uid: d570437d-a6b4-4456-8dfb-950f09534516
    spec:
      clusterIP: 10.104.174.145
      externalTrafficPolicy: Cluster
      ports:
      - nodePort: 32639
        port: 80
        protocol: TCP
        targetPort: 80
      selector:
        app: web
      sessionAffinity: None
      type: NodePort
    status:
      loadBalancer: {}

    然后我们可以通过下面的命令来查看对外暴露的服务

    kubectl get pods,svc

     然后我们访问对应的url,即可看到 nginx了 http://192.168.177.130:32639/

    image-20201116104131968

    升级回滚和弹性伸缩

    • 升级: 假设从版本为1.14 升级到 1.15 ,这就叫应用的升级【升级可以保证服务不中断】
    • 回滚:从版本1.15 变成 1.14,这就叫应用的回滚
    • 弹性伸缩:我们根据不同的业务场景,来改变Pod的数量对外提供服务,这就是弹性伸缩

    应用升级和回滚

    首先我们先创建一个 1.14版本的Pod

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      creationTimestamp: null
      labels:
        app: web
      name: web
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: web
      strategy: {}
      template:
        metadata:
          creationTimestamp: null
          labels:
            app: web
        spec:
          containers:
          - image: nginx:1.14
            name: nginx
            resources: {}
    status: {}

    我们先指定版本为1.14,然后开始创建我们的Pod

    kubectl apply -f nginx.yaml

    同时,我们使用docker images命令,就能看到我们成功拉取到了一个 1.14版本的镜像

    image-20201116105710966

    我们使用下面的命令,可以将nginx从 1.14 升级到 1.15

    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;

    image-20201116111315000

    能够看到,我们已经成功拉取到了 1.15版本的nginx了

    查看升级状态

    下面可以,查看升级状态

    kubectl rollout status deployment web

    查看历史版本

    我们还可以查看历史版本

    kubectl rollout history deployment web

    应用回滚

    我们可以使用下面命令,完成回滚操作,也就是回滚到上一个版本

    kubectl rollout undo deployment web

    然后我们就可以查看状态

    kubectl rollout status deployment web

    image-20201116112524601

    同时我们还可以回滚到指定版本

    kubectl rollout undo deployment web --to-revision=2

    弹性伸缩

    弹性伸缩,也就是我们通过命令一下创建多个副本

    kubectl scale deployment web --replicas=10

    能够清晰看到,我们一下创建了10个副本

  • 相关阅读:
    MySQL主从复制-指定数据库复制
    linux下如何添加一个用户并且让用户获得root权限
    vim加密文件
    nginx_upstream_check_module-master对nginx的后端机器进行健康状态检查报403错误【转】
    Nginx配置SSL证书部署HTTPS网站
    MySQL数据备份之mysqldump使用
    nginx location语法使用说明
    Linux 使用 iptables屏蔽IP段
    nginx中获取真实ip
    在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解
  • 原文地址:https://www.cnblogs.com/fat-girl-spring/p/14117192.html
Copyright © 2020-2023  润新知