6. 只要肯下功夫,10岁也能学的会的Kubernetes 控制器

2024-02-23 17:30

本文主要是介绍6. 只要肯下功夫,10岁也能学的会的Kubernetes 控制器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

undefined

文章目录

  • 一、控制器简介
  • 二、ReplicationController和ReplicaSet
  • 三、Deployment
    • 3.1 Deployment介绍和使用
    • 3.2 扩容
    • 3.3 更新
    • 3.4 回滚
  • 四、DaemonSet
  • 五、Job/CronJob
  • 六、StateFulSet
  • 七、Horizontal Pod Autoscaling

一、控制器简介

Kubernetes中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod的具体状态和行为。 控制器大致分为如下介绍六种:

二、ReplicationController和ReplicaSet

ReplicationControllerRC)用来确保容器应用的副本数始终保持在用户定义的副本数,即如果有容器异常退出,会自动创建新的 Pod来替代;而如果异常多出来的容器也会自动回收;

在新版本的 Kubernetes中建议使用 ReplicaSet来取代 RCReplicaSetRC没有本质的不同,只是名字不一样,并且 ReplicaSet支持集合式的 selector

案例:


[root@master resource]apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:name: frontend
spec:replicas: 3selector:matchLabels:tier: frontendtemplate:metadata:labels:tier: frontendspec:containers:- name: myappimage: hub.hc.com/library/myapp:v1env:- name: GET_HOSTS_FROMvalue: dnsports:- containerPort: 80[root@master resource]
[root@master resource]
NAME             READY   STATUS    RESTARTS   AGE
frontend-44vbw   1/1     Running   0          21s
frontend-9lx78   1/1     Running   0          21s
frontend-q54pf   1/1     Running   0          21s[root@master resource]
NAME       DESIRED   CURRENT   READY   AGE
frontend   3         3         3       60s[root@master resource]
pod "frontend-44vbw" deleted[root@master resource]
NAME             READY   STATUS    RESTARTS   AGE
frontend-9lx78   1/1     Running   0          15m
frontend-q54pf   1/1     Running   0          15m
frontend-scbzb   1/1     Running   0          14s

三、Deployment

3.1 Deployment介绍和使用

DeploymentPodReplicaSet提供了一个声明式定义 (declarative) 方法,用来替代以前的 RC来方便的管理应用。

典型的应用场景包括:

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

RSDeployment的关联:

案例:


[root@master resource]apiVersion: extensions/v1beta1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: hub.hc.com/library/myapp:v1ports:- containerPort: 80[root@master resource]
deployment.extensions/nginx-deployment created[root@master resource]
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   3/3     3            3           13s[root@master resource]
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-6b4dcdb44b   3         3         3       6m50s[root@master resource]
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6b4dcdb44b-bwzwq   1/1     Running   0          6m28s
nginx-deployment-6b4dcdb44b-kmv66   1/1     Running   0          6m28s
nginx-deployment-6b4dcdb44b-xmpcf   1/1     Running   0          6m28s

undefined

3.2 扩容

案例:


[root@master resource]
deployment.extensions/nginx-deployment scaled[root@master resource]
NAME               READY   UP-TO-DATE   AVAILABLE   AGE
nginx-deployment   5/5     5            5           20m[root@master resource]
NAME                                READY   STATUS    RESTARTS   AGE
nginx-deployment-6b4dcdb44b-b9knj   1/1     Running   0          43s
nginx-deployment-6b4dcdb44b-bwzwq   1/1     Running   0          20m
nginx-deployment-6b4dcdb44b-j278k   1/1     Running   0          43s
nginx-deployment-6b4dcdb44b-kmv66   1/1     Running   0          20m
nginx-deployment-6b4dcdb44b-xmpcf   1/1     Running   0          20m

如果集群支持 horizontal pod autoscaling的话,还可以为 Deployment设置自动扩展:

kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80

3.3 更新

案例:


[root@master resource]
NAME                                READY   STATUS    RESTARTS   AGE     IP            NODE      NOMINATED NODE   READINESS GATES
nginx-deployment-6b4dcdb44b-b9knj   1/1     Running   0          5m58s   10.244.2.20   worker2   <none>           <none>
nginx-deployment-6b4dcdb44b-bwzwq   1/1     Running   0          26m     10.244.2.18   worker2   <none>           <none>
nginx-deployment-6b4dcdb44b-j278k   1/1     Running   0          5m58s   10.244.1.15   worker1   <none>           <none>
nginx-deployment-6b4dcdb44b-kmv66   1/1     Running   0          26m     10.244.1.14   worker1   <none>           <none>
nginx-deployment-6b4dcdb44b-xmpcf   1/1     Running   0          26m     10.244.2.19   worker2   <none>           <none>[root@master resource]
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>[root@master resource]
deployment.extensions/nginx-deployment image updated[root@master resource]
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5c478875d8   5         5         5       72s
nginx-deployment-6b4dcdb44b   0         0         0       31m[root@master resource]
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-deployment-5c478875d8-b5kh2   1/1     Running   0          83s   10.244.2.21   worker2   <none>           <none>
nginx-deployment-5c478875d8-hrzl8   1/1     Running   0          65s   10.244.1.17   worker1   <none>           <none>
nginx-deployment-5c478875d8-jvvbz   1/1     Running   0          83s   10.244.1.16   worker1   <none>           <none>
nginx-deployment-5c478875d8-nm2cf   1/1     Running   0          64s   10.244.2.22   worker2   <none>           <none>
nginx-deployment-5c478875d8-wj5w5   1/1     Running   0          52s   10.244.1.18   worker1   <none>           <none>[root@master resource]
Hello MyApp | Version: v2 | <a href="hostname.html">Pod Name</a>[root@master resource]

Deployment更新策略:

Deployment可以保证在升级时只有一定数量的 Poddown的。默认的,它会确保至少有比期望的 Pod数量少一个是 up状态(最多一个不可用)

Deployment同时也可以确保只创建出超过期望数量的一定数量的 Pod。默认的,它会确保最多比期望的 Pod数量多一个的 Podup的(最多1个 surge

未来的 Kuberentes版本中,将从1-1变成25%-25%

3.4 回滚

案例:


[root@master resource]
deployment.extensions/nginx-deployment rolled back[root@master resource]
NAME                          DESIRED   CURRENT   READY   AGE
nginx-deployment-5c478875d8   0         0         0       5m34s
nginx-deployment-6b4dcdb44b   5         5         5       35m[root@master resource]
NAME                                READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
nginx-deployment-6b4dcdb44b-5qk6n   1/1     Running   0          45s   10.244.2.23   worker2   <none>           <none>
nginx-deployment-6b4dcdb44b-72zvc   1/1     Running   0          43s   10.244.2.24   worker2   <none>           <none>
nginx-deployment-6b4dcdb44b-c2dls   1/1     Running   0          43s   10.244.1.20   worker1   <none>           <none>
nginx-deployment-6b4dcdb44b-d8mwz   1/1     Running   0          42s   10.244.2.25   worker2   <none>           <none>
nginx-deployment-6b4dcdb44b-p8ttm   1/1     Running   0          44s   10.244.1.19   worker1   <none>           <none>[root@master resource]
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>[root@master resource]
deployment "nginx-deployment" successfully rolled out

Deployment回滚策略(多个rollout并行):

假如您创建了一个有5个 niginx:1.7.9 replicaDeployment,但是当还只有3个 nginx:1.7.9replica创建出来的时候您就开始更新含有5个 nginx:1.9.1 replicaDeployment。在这种情况下, Deployment会立即杀掉已创建的3个 nginx:1.7.9Pod,并开始创建 nginx:1.9.1Pod。它不会等到所有的5个 nginx:1.7.9Pod都创建完成后才开始改变航道

更多回滚操作:


$ kubectl rollout history deployment/nginx-deployment$ kubectl rollout undo deployment/nginx-deployment --to-revision=2$ kubectl rollout pause deployment/nginx-deployment

清理Policy:

您可以通过设置 spec.revisonHistoryLimit项来指定 Deployment最多保留多少 revision历史记录。默认的会保留所有的 revision;如果将该项设置为0, Deployment就不允许回退了。

四、DaemonSet

DaemonSet确保全部(或者一些) Node上运行一个 Pod的副本。当有 Node加入集群时,也会为他们新增一个 Pod。当有 Node从集群移除时,这些 Pod也会被回收。删除 DaemonSet将会删除它创建的所有 Pod

使用 DaemonSet的一些典型用法:

  • 运行集群存储 daemon,例如在每个 Node上运行 glusterdceph
  • 在每个 Node上运行日志收集 daemon,例如 fluentdlogstash
  • 在每个 Node上运行监控 daemon,例如 Prometheus Node ExportercollectdDatadog代理、 New Relic代理,或 Ganglia gmond

案例:

[root@master resource]apiVersion: apps/v1
kind: DaemonSet
metadata:name: deamonset-examplelabels:app: daemonset
spec:selector:matchLabels:name: deamonset-exampletemplate:metadata:labels:name: deamonset-examplespec:containers:- name: daemonset-exampleimage: hub.hc.com/library/myapp:v1[root@master resource]
daemonset.apps/deamonset-example created[root@master resource]
NAME                      READY   STATUS    RESTARTS   AGE
deamonset-example-jjd5z   1/1     Running   0          7s
deamonset-example-nltnz   1/1     Running   0          7s[root@master resource]
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
deamonset-example-jjd5z   1/1     Running   0          14s   10.244.2.26   worker2   <none>           <none>
deamonset-example-nltnz   1/1     Running   0          14s   10.244.1.21   worker1   <none>           <none>

五、Job/CronJob

Job负责批处理任务,即仅执行一次的任务,它保证批处理任务的一个或多个 Pod成功结束。

** Job 使用注意事项:**

  • RestartPolicy仅支持 NeverOnFailure
  • 单个 Pod时,默认 Pod成功运行后 Job即结束
  • .spec.completions标志 Job结束需要成功运行的 Pod个数,默认为1
  • .spec.parallelism标志并行运行的 Pod的个数,默认为1
  • spec.activeDeadlineSeconds标志失败 Pod的重试最大时间,超过这个时间不会继续重试

案例:


[root@master resource]apiVersion: batch/v1
kind: Job
metadata:name: pi
spec:template:metadata:name: pispec:containers:- name: piimage: perlcommand: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: Never[root@master resource]
job.batch/pi created[root@master resource]
NAME   COMPLETIONS   DURATION   AGE
pi     0/1           5s         5s[root@master resource]
NAME       READY   STATUS    RESTARTS   AGE
pi-g694b   1/1     Running   0          9s[root@master resource]
NAME       READY   STATUS      RESTARTS   AGE
pi-g694b   0/1     Completed   0          28s[root@master resource]
log is DEPRECATED and will be removed in a future version. Use logs instead.3.14159265358979323846264338327950288419716939937510582097494...

Cron Job管理基于时间的 Job,即:在给定时间点只运行一次 && 周期性地在给定时间点运行。

使用前提条件:当前使用的 Kubernetes集群,版本 >= 1.8(对 CronJob);对于先前版本的集群,版本

典型的用法如下所示:

  • 在给定的时间点调度 Job运行
  • 创建周期性运行的 Job,例如:数据库备份、发送邮件

CronJob spec用法:

  • .spec.schedule:调度,必需字段,指定任务运行周期,格式同 Cron
  • .spec.jobTemplateJob模板,必需字段,指定需要运行的任务,格式同 Job
  • .spec.startingDeadlineSeconds:启动 Job的期限(秒级别),该字段是可选的。如果因为任何原因而错过了被调度的时间,那么错过执行时间的 Job 将被认为是失败的。如果没有指定,则没有期限
  • .spec.concurrencyPolicy:并发策略,该字段也是可选的。它指定了如何处理被 Cron Job创建的 Job的并发执行。只允许指定下面策略中的一种:
    • Allow(默认):允许并发运行 Job
    • Forbid:禁止并发运行,如果前一个还没有完成,则直接跳过下一个
    • Replace:取消当前正在运行的 Job,用一个新的来替换注意,当前策略只能应用于同一个 Cron Job创建的 Job。如果存在多个 Cron Job,它们创建的 Job之间总是允许并发运行。
  • .spec.suspend:挂起,该字段也是可选的。如果设置为 true,后续所有执行都会被挂起。它对已经开始执行的 Job不起作用。默认值为 false
  • .spec.successfulJobsHistoryLimit.spec.failedJobsHistoryLimit:历史限制,是可选的字段。它们指定了可以保留多少完成和失败的 Job。默认情况下,它们分别设置为3和1。设置限制的值为0,相关类型的 Job完成后将不会被保留。

案例:


[root@master resource]apiVersion: batch/v1beta1
kind: CronJob
metadata:name: hello
spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: helloimage: busyboxargs:- /bin/sh- -c- date; echo Hello from the Kubernetes clusterrestartPolicy: OnFailure[root@master resource]
cronjob.batch/hello created[root@master resource]
NAME    SCHEDULE      SUSPEND   ACTIVE   LAST SCHEDULE   AGE
hello   */1 * * * *   False     1        13s             15s[root@master resource]
NAME               COMPLETIONS   DURATION   AGE
hello-1574487960   0/1           11s        11s[root@master resource][root@master resource]
Sat Nov 23 05:46:27 UTC 2019
Hello from the Kubernetes cluster

六、StateFulSet

StatefulSet作为 ControllerPod提供唯一的标识。它可以保证部署和 scale的顺序

StatefulSet是为了解决有状态服务的问题(对应 DeploymentsReplicaSets是为无状态服务而设计),其应用场景包括:

  • 稳定的持久化存储,即 Pod重新调度后还是能访问到相同的持久化数据,基于 PVC来实现
  • 稳定的网络标志,即 Pod重新调度后其 PodNameHostName不变,基于 Headless Service(即没有 Cluster IPService)来实现
  • 有序部署,有序扩展,即 Pod是有顺序的,在部署或者扩展的时候要依据定义的顺序依次依次进行(即从0到 N-1,在下一个 Pod运行之前所有之前的 Pod必须都是 RunningReady状态),基于 init containers来实现
  • 有序收缩,有序删除(即从 N-1到0)

七、Horizontal Pod Autoscaling

应用的资源使用率通常都有高峰和低谷的时候,如何削峰填谷,提高集群的整体资源利用率,让 service中的 Pod个数自动调整呢?这就有赖于 Horizontal Pod Autoscaling了,顾名思义,使 Pod水平自动缩放。

这篇关于6. 只要肯下功夫,10岁也能学的会的Kubernetes 控制器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/739361

相关文章

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

什么是Kubernetes PodSecurityPolicy?

@TOC 💖The Begin💖点点关注,收藏不迷路💖 1、什么是PodSecurityPolicy? PodSecurityPolicy(PSP)是Kubernetes中的一个安全特性,用于在Pod创建前进行安全策略检查,限制Pod的资源使用、运行权限等,提升集群安全性。 2、为什么需要它? 默认情况下,Kubernetes允许用户自由创建Pod,可能带来安全风险。

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

【Kubernetes】K8s 的安全框架和用户认证

K8s 的安全框架和用户认证 1.Kubernetes 的安全框架1.1 认证:Authentication1.2 鉴权:Authorization1.3 准入控制:Admission Control 2.Kubernetes 的用户认证2.1 Kubernetes 的用户认证方式2.2 配置 Kubernetes 集群使用密码认证 Kubernetes 作为一个分布式的虚拟

kubernetes集群部署Zabbix监控平台

一、zabbix介绍 1.zabbix简介 Zabbix是一个基于Web界面的分布式系统监控的企业级开源软件。可以监视各种系统与设备的参数,保障服务器及设备的安全运营。 2.zabbix特点 (1)安装与配置简单。 (2)可视化web管理界面。 (3)免费开源。 (4)支持中文。 (5)自动发现。 (6)分布式监控。 (7)实时绘图。 3.zabbix的主要功能

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【Kubernetes】常见面试题汇总(一)

目录 1.简述 etcd 及其特点? 2.简述 etcd 适应的场景? 3.简述什么是Kubernetes? 4.简述 Kubernetes和 Docker的关系? 1.简述 etcd 及其特点? (1)etcd 是Core0s 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(keyvalue)数据

什么是Kubernetes准入机制?

什么是Kubernetes准入机制? 1、工作原理2、常用组件 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的准入机制是API请求处理前的一道重要安全屏障。它通过一系列预定义的准入控制组件,对请求进行拦截和检查,确保只有合法且符合规范的请求才能继续执行。 1、工作原理 认证与授权:首先,请求者需要通过身份认证和权限授权。准入控制:随后

jmeter之仅一次控制器

仅一次控制器作用: 不管线程组设置多少次循环,它下面的组件都只会执行一次 Tips:很多情况下需要登录才能访问其他接口,比如:商品列表、添加商品到购物车、购物车列表等,在多场景下,登录只需要1次,我们期望的是重复执行登陆后面的接口来做压测,这就和事务相关,例如 事务1: 登录—>添加购物车 事务2: 登录—>购物车列表 事务3: 登录—>商品列表—>添加购物车 … 一、仅一次控制器案例 在