k8s实践(四):Controller

环境说明:

主机名 操作系统版本 ip docker version kubelet version 配置 备注
master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G 备注
node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G 备注
node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2 2C2G 备注

k8s集群部署详见:Centos7.6部署k8s(v1.14.2)集群
k8s学习资料详见:基本概念、kubectl命令和资料分享

一、Kubernetes核心组件

1. 核心组件概述

Kubernetes主要由以下几个核心组件组成:

  • etcd 保存了整个集群的状态;
  • apiserver 提供了资源操作的唯一入口,并提供认证、授权、访问控制、API 注册和发现等机制;
  • controller manager 负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;
  • scheduler 负责资源的调度,按照预定的调度策略将 Pod 调度到相应的机器上;
  • kubelet 负责维护容器的生命周期,同时也负责 Volume(CVI)和网络(CNI)的管理;
  • Container runtime 负责镜像管理以及 Pod 和容器的真正运行(CRI);
  • kube-proxy 负责为 Service 提供 cluster 内部的服务发现和负载均衡

部署流程

2. 查看核心组件

Kubelet是唯一一直作为常规系统组件来运行的组件,它把其他组件作为pod来运行。

2.1 查看Kubelet

master和node节点都可查看

[[email protected] ~]# systemctl status kubelet

2.2 查看其他组件

[[email protected] ~]# kubectl get po -o custom-columns=POD:metadata.name,NODE:spec.nodeName --sort-by spec.nodeName -n kube-system

!

本文重点介绍核心组件controller manager
?
各资源简写查看:

[[email protected] ~]# kubectl api-resources 

二、Controller Manager

1. 简介

? ? Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控维护整个集群的状态,比如故障检测、自动扩展、滚动更新等并确保集群处于预期的工作状态。

? ? cloud-controller-manager 在 Kubernetes 启用 Cloud Provider 的时候才需要,用来配合云服务提供商的控制,如:Node Controller、Route Controller、Service Controller。

2. 原理

? ? Controller Manager是Kubernetes集群内部的管理控制中心, 负责Kubernetes集群内的Node、 Pod、服务端点、 服务、 资源配额、 命名空间 、服务账号等资源的管理 、 自动化部署、健康监测, 并对异常资源执行自动化修复, 确保集群各资源始终处于预期的工作状态 。 比如, 当某个Node意外若机时,Controller Manager会根据资源调度策略选择集群内其他节点自动部署原右机节点上的Pod副本 。
? ? Controller Manager是 一 个控制器集合, 包含Replication Controller、Deployment Controller、RelicaSet、StatefulSet Controller、Daemon Controller、CronJob Controller、Node Controller、Resourcequota Controller 、Namespace Controller 、ServiceAccount Controller 、Token Controller、Service Controller及Endpoint Controller等多个控制器,Controller Manager是这些控制器的核心管理者。 一般来说, 智能系统和自动系统通常会通过一个操纵系统来不断修正系统的状态。 在Kubernetes集群中, 每个控制器的核心工作原理就是:每个控制器通过API服务器来查看系统的运行状态, 并尝试着将系统状态从“ 现有状态 ”修正到“期望状态”。

三、ReplicationController

1. 简介

ReplicationController会持续监控正在运行的pod列表,确保pod的数量始终与其标签选择器匹配,ReplicationController由三部分组成:

  • label selector(标签选择器),用于确定ReplicationController作用域中有哪些pod
  • replica count(副本个数),指定应运行的pod 数量
  • pod template(pod模板),用于创建新的pod 副本

2. 创建ReplicationController

[[email protected] ~]# more nginx-rc.yaml
apiVersion: v1
kind: ReplicationController    #类型为ReplicationController
metadata:
  name: nginx        #ReplicationController名字
spec:
  replicas: 3        #pod实例数目
  selector:          #pod选择器
    app: nginx
  template:          #pod模板
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

3. 查看ReplicationController

[[email protected] ~]# kubectl get rc
[[email protected] ~]# kubectl describe rc nginx 

4. 扩缩容

扩缩容可以采用修改pod模板和直接命令方式

扩容

[[email protected] ~]# kubectl edit rc nginx 

缩容

[[email protected] ~]# kubectl scale rc nginx --replicas=4

5. 删除pod

[[email protected] ~]# kubectl delete po nginx-2twcf


删除pod nginx-2twcf,发现该pod被删除的同时k8s自动新增一个pod nginx-vtmt4,这也印证了之前简介中讲的"ReplicationController会持续监控正在运行的pod列表,确保pod的数量始终与其标签选择器匹配"

6. 删除ReplicationController

[[email protected] ~]# kubectl delete rc nginx 

删除ReplicationController会将其管理的pod一并删除,如果想保留pod,可以添加参数"--cascade = false"

7. 标签

7.1 新增标签

[[email protected] ~]# kubectl label po nginx-28d4k env=prod

7.2 查看标签

[[email protected] ~]# kubectl get po --show-labels 

7.3 更改标签

[[email protected] ~]# kubectl label po nginx-28d4k app=test --overwrite

更改app=nginx的标签,这将使该pod不再与ReplicationController的标签选择器匹配,只剩两个匹配的pod,ReplicationController会启动一个新的pod nginx-64w44将总数量恢复为3个。

四、ReplicaSet

1. 简介

ReplicaSet的行为与ReplicationController完全相同,但pod选择器的表达能力更强,是新一代的ReplicationController,并且将其完全替换掉(ReplicationController最终将被弃用).

2. 创建ReplicaSet

[[email protected] ~]# more httpd-rs.yaml
apiVersion: apps/v1    #api版本
kind: ReplicaSet
metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app        #标签名为app
        operator: In    #In : Label的值必须与其中一个指定的values匹配
        values:
         - httpd        #标签值为httpd
  template:             #replicaset模板
    metadata:
      labels:
        app: httpd
    spec:
      containers:
      - name: httpd
        image: httpd 

ReplicaSet相对于ReplicationController的主要改进是它更具表达力的标签选择器,ReplicaSet的pod选择器的表达能力更强。

3. 查看ReplicaSet

[[email protected] ~]# kubectl get rs
[[email protected] ~]# kubectl describe rs httpd 

4. 删除ReplicaSet

[[email protected] ~]# kubectl delete rs httpd

同理,如需保留pod可以添加参数--cascade=false

五、Deployment

1. 简介

Deployment为Pod和Replica Set(下一代 Replication Controller)提供声明式更新。你只需要在Deployment中描述你想要的目标状态是什么,Deployment controller就会帮你将Pod和Replica Set的实际状态改变到你的目标状态。你可以定义一个全新的Deployment,也可以创建一个新的替换旧的Deployment。
?
Deployment的典型应用场景 包括:

  • 定义Deployment来创建Pod和ReplicaSet
  • 滚动升级和回滚应用
  • 扩容和缩容
  • 暂停和继续Deployment

2. Deployment实践

Deployment相关操作详见:k8s实践(三):pod常用操作

六、DaemonSet

1. 简介

与Replicationcontroller和ReplicaSet在Kubemetes集群上运行部署特定数量的pod不同,DaemonSet每个Node上最多只能运行一个副本,如果节点下线,DaemonSet不会在其他地方重新创建pod,当将一个新节点添加到集群中时,DaemonSet会立刻部署一个新的pod实例。如果有人无意删除了一个pod,它也会从配置的pod模板中创建新的pod。

DaemonSet保证在每个Node上都运行一个容器副本,常用来部署一些集群的日志、监控或者其他系统管理应用。典型的应用包括:

  • 日志收集,比如fluentd,logstash等
  • 系统监控,比如Prometheus Node Exporter,collectd,New Relic agent,Gangliagmond等
  • 系统程序,比如kube-proxy, kube-dns, glusterd, ceph等

本文以日志搜集工具filebeat为例实践

2. 创建DaemonSet

[[email protected] ~]# more filebeat-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: filebeat-ds
  labels:
    app: filebeat
spec:
  selector:
    matchLabels:
      app: filebeat
  template:
    metadata:
      labels:
        app: filebeat
      name: filebeat
    spec:
      containers:
      - name: filebeat
        image: ikubernetes/filebeat:5.6.5-alpine
        env:
        - name: REDIS_HOST
          value: db.ilinux.io:6379
        - name: LOG_LEVEL
          value: info
[[email protected] ~]# kubectl apply -f filebeat-ds.yaml
daemonset.apps/filebeat-ds created

3. 查看DaemonSet

[[email protected] ~]# kubectl get ds
[[email protected] ~]# kubectl describe ds filebeat-ds
[[email protected] ~]# kubectl get po -o wide 

查看日志

4. 更新DaemonSet

[[email protected] ~]# kubectl set image daemonsets filebeat-ds filebeat=ikubernetes/filebeat:5.6.6-alpine

DaemonSet通过删除和新建方式更新image

5. 回滚DaemonSet

5.1 查询历史版本

[[email protected] ~]# kubectl rollout history ds filebeat-ds 

5.2 查询某个历史版本详细信息

[[email protected] ~]# kubectl rollout history ds filebeat-ds --revision=1
[[email protected] ~]# kubectl rollout history ds filebeat-ds --revision=2

5.3 回滚

[[email protected] ~]# kubectl rollout undo ds filebeat-ds --to-revision=1

5.4 查看DaemonSet状态

[[email protected] ~]# kubectl rollout status ds/filebeat-ds
daemon set "filebeat-ds" successfully rolled out
[[email protected] ~]# kubectl describe ds filebeat-ds |grep Image
    Image:      ikubernetes/filebeat:5.6.5-alpine

6. 删除DaemonSet

[[email protected] ~]# kubectl delete ds filebeat-ds
daemonset.extensions "filebeat-ds" deleted

七、 Job

1. 简介

从程序的运行形态上来区分,我们可以将Pod分为两类:长时运行服务(http server、daemon、mysql)和一次性任务(如并行数据计算、测试、批处理程序等)。ReplicationController、 ReplicaSet和DaemonSet创建的Pod都是长时运行服务,而Job创建的Pod都是一次性服务。

2. 创建job

[[email protected] ~]# more job.yaml
apiVersion: batch/v1    #api版本为batch/v1
kind: Job
metadata:
  name: pi
spec:
  template:
    spec:
      containers:
      - name: pi
        image: perl
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never    #设置容器失败后不重启,即直接新建pod
  backoffLimit: 4    #限制新建pod数目,默认为6
[[email protected] ~]# kubectl apply -f job.yaml
job.batch/pi created

3. 查看job

[[email protected] ~]# kubectl get job
[[email protected] ~]# kubectl get po -o wide 

查看job运行结果

[[email protected] ~]# kubectl logs pi-g2499 

该job为求圆周率精确至2000位

4. 并行job

[[email protected] ~]# more multi-job.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: multi-job
spec:
  completions: 10    #设置Job成功完成Pod的总数
  parallelism: 2    #pod并行执行数
  template:
    metadata:
      labels:
        app: multi-job
    spec:
      restartPolicy: OnFailure    #设置容器失败后重启
      containers:
      - name: busybox
        image: busybox
[[email protected] ~]# kubectl apply -f multi-job.yaml
job.batch/multi-job created

每次同时运行两个job,最终运行的pod数为10

5. Cronjob

新建cronjob

[[email protected] ~]# more cronjob.yaml
apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "*/1 * * * *"
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            args:
            - /bin/sh
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure
[[email protected] ~]# kubectl apply -f cronjob.yaml
cronjob.batch/hello created

查看cronjob

[[email protected] ~]# kubectl get cronjobs
[[email protected] ~]# kubectl get job --watch

每隔一分钟就会生成一个job

6. 删除job

[[email protected] ~]# kubectl delete job pi multi-job
[[email protected] ~]# kubectl delete cronjobs hello

本文所有脚本和配置文件已上传github:https://github.com/loong576/k8s-Controller.git

原文地址:https://blog.51cto.com/3241766/2427471

时间: 2024-08-11 09:51:12

k8s实践(四):Controller的相关文章

k8s实践(七):存储卷和数据持久化(Volumes and Persistent Storage)

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

k8s实践(八):ConfigMap and Secret

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.

k8s实践(九):Helm and Kubeapps UI

环境说明: 主机名 操作系统版本 ip docker version kubelet version helm version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 v2.14.3 2C2G master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 v2.14.3 2C2G node节点 node02 Centos 7.6.18

Linux及安全实践四——ELF文件格式分析

Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个ELF文件 以一个最简单的helloworld程序为例 1. ELF文件头 使用工具查看ELF文件头:readelf -h obj 在/usr/include/elf.h中可以找到文件头结构定义: 大小总共为64字节,换算成十六进制为0x40.在十六进制代码中找到前0x40字节,即为文件头信息部分(阅

【实践报告】Linux实践四

Linux内核分析 实践四——ELF文件格式分析 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目标文件)格式主要三种: 可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件) 可执行文件:文件保存着一个用来执行的程序.(例如bash,gcc等) 共享目标文件:共享库.

并发编程实践四:实现正确和高效的锁

你是否觉得锁是一种很神奇的东西,在并发编程中,你只需要将你的代码加上锁,就能保证代码是线程安全的(当然现实和感觉有很大差别,代码的线程安全是非常复杂的),那么,这些都是怎么做到的呢?当存在大量线程同时竞争锁时,竞争失败的锁会怎么做呢?锁又是怎么保证这一切高效的执行的呢?这篇文章将为你回答这些问题,首先我将介绍怎样实现一个正确的锁,然后介绍高效的锁应该具备的条件,最后将介绍两种常用的队列锁算法:CLH锁和MCS锁. 文中将用到一些原子变量的特性,你可以将原子变量看作加强版的volatile变量,具

k8s实践(二):基本概念、kubectl命令和资料分享

概念 1. Kubernetes简介 Kubernetes是谷歌开源的容器集群管理系统,是Google多年大规模容器管理技术Borg的开源版本,主要功能包括: 基于容器的应用部署.维护和滚动升级 负载均衡和服务发现 跨机器和跨地区的集群调度 自动伸缩 无状态服务和有状态服务 广泛的 Volume 支持 插件机制保证扩展性 Kubernetes 发展非常迅速,已经成为容器编排领域的领导者. 2. Kubernetes核心组件 Kubernetes 主要由以下几个核心组件组成: etcd 保存了整个

k8s实践(三):pod常用操作

环境说明: 主机名 操作系统版本 ip docker version kubelet version 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 master主机 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 node节点 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2 nod

k8s实践(六):Pod资源管理

环境说明: 主机名 操作系统版本 ip docker version kubelet version 配置 备注 master Centos 7.6.1810 172.27.9.131 Docker 18.09.6 V1.14.2 2C2G 备注 node01 Centos 7.6.1810 172.27.9.135 Docker 18.09.6 V1.14.2 2C2G 备注 node02 Centos 7.6.1810 172.27.9.136 Docker 18.09.6 V1.14.2