三. controller介绍

1. 什么是Controller Manager

Controller Manager作为集群内部的管理控制中心,负责集群内的Node、Pod副本、服务端点(Endpoint)、命名空间(Namespace)、服务账号(ServiceAccount)、资源定额(ResourceQuota)的管理,当某个Node意外宕机时,Controller Manager会及时发现并执行自动化修复流程,确保集群始终处于预期的工作状态。
在这里插入图片描述
controller manager起什么作用?

k8s内部几乎每种特定资源都有特定的 Controller 维护管理,而 Controller Manager 的职责便是把所有的 Controller 聚合起来:

提供基础设施降低 Controller 的实现复杂度
启动和维持 Controller 的正常运行,watch api-server,然后对不同的 Controller 分发事件通知。
在这里插入图片描述
controller manager的工作流程
Controller Manager 主要提供了一个分发事件的能力,而不同的 Controller 只需要注册对应的 Handler 来等待接收和处理事件。
在这里插入图片描述

  • List & Watch:
  1. Controller manager与api-server的通信主要通过两种方式:List 和 Watch。
  2. List是短连接实现,用于获取该资源的所有object;
  3. Watch是长连接实现,用于监听在List中获取的资源的变换。
  4. api-server检测到资源产生变更时,会主动通知到Controller manager(利用分块传输编码)。
  5. 也可以说,List获取的是全量数据,Watch获取的是增量数据。
  • client-go:
  1. client-go实现统一管理每种 Controller 的List和Watch。
  2. 将收到的event事件放到缓存中,异步分发给每个 Controller 的注册的eventHandler。

什么是Controller
Controller Manager 是在集群上管理和运行容器的对象。

Kubertenes中Controller有几种,比较常用的ReplicationController、ReplicaSet和deployment都可以用来维护Pod。DaemonSet和StatefulSet也可以维护Pod,但并不常用。

每个Controller通过API Server提供的接口实时监控整个集群的每个资源对象的当前状态,当发生各种故障导致系统状态发生变化时,会尝试将系统状态修复到“期望状态”。

k8s中有几十种 Controller,这里列举一些相对重要的Controller:

  • 部署控制器(Deployment Controller):负责pod的滚动更新、回滚以及支持副本的水平扩容等。
  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。
  • 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。
  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌
2. Pod和Controller关系
  • Pod通过Controller实现应用的运维,比如伸缩,滚动升级等等
  • pod和Controller的关系建立是通过label标签和selector选择器
3. deployment应用场景

Deployment 是 Kubenetes v1.2 引入的新概念,引入的目的是为了更好的解决 Pod 的编排 问题,Deployment 内部使用了 Replica Set 来实现。Deployment 的定义与 Replica Set 的 定义很类似

  • 部署无状态应用
  • 管理pod和ReplicaSet
  • 部署,滚动升级等功能

使用deployment部署应用(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: {}

  • 导出yaml文件
# web:自定义名称, --dry-run:试运行,不生成pod, -o yaml > web.yaml : 导出yml文件
kubectl create deployment web --image=nginx --dry-run -o yaml > web.yaml
  • 对外发布(暴露对外端口)
#port 用于集群内部访问, target-port 表示容器自身对外提供服务的端口, nodePort 表示随机生成的集群外部访问的端口
kubectl expose deployment web --port=80 --type=NodePort --target-port=80 --name=web-out -o yaml ->web1.yaml
  • 使用yml文件发布
kubectl apply -f web.yaml
  • 查看pod,service
kubectl get pods,svc

应用升级回滚和弹性伸缩

  • 升级回滚
#应用升级
kubectl set image deployment web nginx=nginx:1.15
#查看升级状态
kubectl rollout status deployment web
#查看升级的历史版本
kubectl rollout history deployment web
#回滚到上一版本
kubectl rollout undo deployment web
#回滚到指定版本
kubectl rollout undo deployment web --to-revision=2
  • 弹性伸缩
#修改web 副本数
kubectl scale deployment web --replicas=3
#自动扩展复制控制器“web”,pod 数量在 1 到 5 之间,目标 CPU 利用率为 80%
kubectl autoscale rc foo --max=5 --cpu-percent=80
#自动扩展部署“web”, pod 数量在 2 到 10 之间,未指定目标 CPU 利用率,因此将使用默认的自动缩放策略
kubectl autoscale deployment foo --min=2 --max=10
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐