02 Kubernetes核心技术-Controller

内容

  • 什么是 Controller
  • Pod 和 Controller的关系
  • Controller 的种类和应用场景
  • Deployment控制器应用场景
  • 升级回滚
  • 弹性伸缩

一、什么是 Controller?

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

二、Pod 和 Controller的关系

  • Pod 是通过 Controller 实现应用的运维,比如弹性伸缩、滚动升级等;
  • Pod 和 Controller 之间是通过Label 标签来建立关系、同时 Controller 又被称为控制器工作负载。
    在这里插入图片描述

三、Controller 的种类和应用场景

  • Deployment ---- 适合无状态的服务部署

  • ReplicaSet ---- ReplicaSet不支持滚动更新,但是Deployment支持 不推荐使用,建议直接使用 Deployment

  • DaemonSet ---- 一次部署,所有的node节点都会部署

    运行集群存储 daemon,例如在每个Node上运行 glusterd、ceph
    在每个Node上运行日志收集 daemon,例如 fluentd、 logstash
    在每个Node上运行监控 daemon,例如 Prometheus Node Exporter

  • StatefuleSet ----- 适合有状态的服务部署

    应用的场景:
    1.需要稳定的持久化存储;
    2.需要稳定的网络标志(即Pod被重新调度时网络访问不变);
    3.有序部署和有序扩展;
    4.有序收缩和删除。
    使用的服务有:MySQL集群、MongoDB集群、Akka集群、ZooKeeper集群等。

  • Job ---- 一次性的执行任务

  • CronJob ---- 周期性的执行任务


四、Deployment控制器应用场景

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

kubectrl create deployment web --image=nginx

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

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

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

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

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
        name: nginx
        resources: {}
status: {}

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

在这里插入图片描述

使用YAML创建Pod

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

kubectl apply -f nginx.yaml
在这里插入图片描述

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

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

关于上述命令,参数说明:

--port:就是我们内部的端口号
--target-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://{当前机器IP}:32639/
在这里插入图片描述

五、升级回滚和弹性伸缩

  • 升级:假设从版本为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 版本的镜像
在这里插入图片描述
我们使用下面的命令,可以将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;
在这里插入图片描述
能够看到,我们已经成功拉取到了 1.15版本的nginx了

查看升级状态
下面可以,查看升级状态

kubectl rollout status deployment web

在这里插入图片描述
查看历史版本

kubectl rollout history deployment web

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

kubectl rollout undo deployment web

然后我们可以查看状态

kubectk rollout status deployment web

在这里插入图片描述

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

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

弹性伸缩

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

kubectl scale deployment web --replicas=10

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

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尼古拉斯-kq

支持一下,感谢!!!!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值