带你深入学习k8s--(四) 控制器(k8s核心)

news2024/12/28 4:39:31

目录

一、概念

1、什么是控制器

2、控制器执行流程

3、控制器类型

二、控制器的使用

1、ReplicaSet

2、Deployment

1、版本迭代

2、回滚 

3、修改滚动更新策略

4、暂停与恢复

3、daemonset

4、job

5、cronjob


前言:

上一章我们说到,pod有两种,分别为自主式 Pod,Pod 退出后不会被创建;和被控制器管理的 Pod,在控制器的生命周期里,始终要维持 Pod 的副本数目。本章我们来讲解下k8s的核心控制器,在官方文档中也叫工作负载资源。

官方文档:工作负载资源 | Kuberneteshttps://kubernetes.io/zh-cn/docs/concepts/workloads/controllers/

一、概念

1、什么是控制器

Kubernetes 中内建了很多 controller(控制器),这些相当于一个状态机,用来控制 Pod 的具体状态和行为。

2、控制器执行流程

通过yaml文件把用户期望的状态存入etcd,控制器会通过ApiServer访问etcd,时刻去listwatch,检索当前的状态,并获取应用的状态,不断比对当前状态和你期望的状态是否是一致的,如果不一致由代码自驱动完成修复。

3、控制器类型

Replication Controller和ReplicaSet(RC已经被RS取代,RS一般不会单独用,一般都是和deployment一起使用)
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA全称Horizontal Pod Autoscaler

二、控制器的使用

1、ReplicaSet

rs主要控制的是pod的副本数

案例:证明k8s的控制器在自动的维护pod的副本数

[root@k8s2 pod]# vim rs-example.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-example
spec:
  replicas: 3
  selector:
    matchLabels:		#通过选择标签
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

[root@k8s2 pod]# kubectl apply -f rs-example.yml

[root@k8s2 pod]# kubectl get pod --show-labels

replicaset是通过标签匹配pod,我们修改其中一个pod的标签,控制器会始终维护yaml中定义的3个副本数,所以他就会新创建一个标签为myapp的pod
[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=myapp --overwrite
[root@k8s2 pod]# kubectl get pod --show-labels 

我们把刚在修改的pod再改回来,发现还是只有3个副本数

[root@k8s2 pod]# kubectl label pod replicaset-example-q2sq9 app=nginx --overwrite
[root@k8s2 pod]# kubectl get pod --show-labels 

删除掉其中的一个pod控制器仍然会自动创建一个

replicaset自动控制副本数量,pod可以自愈

[root@k8s2 pod]# kubectl delete pod replicaset-example-q2sq9

[root@k8s2 pod]# kubectl get pod --show-labels

回收资源

[root@k8s2 pod]# kubectl delete -f rs-example.yml

2、Deployment

deployment底层还是调用rs控制器,可以用来更新,rs就相当于是其中的一个版本

比较适合部署无状态的,如web服务器

创建一个deployment控制器,我们可以发现他的yaml和RS控制器只有kind不同

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1
[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

1、版本迭代

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v2

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

replicaset就是deployment的一个版本,rs创建pod,deployment创建rs,v2版本就是把v1的资源回收,rebuild到v2

2、回滚 

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml

默认一次更新25%,可以根据自己业务的需求做对应的更改

版本已经退回到v1随便访问一个pod

3、修改滚动更新策略

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  minReadySeconds: 5    #最小就绪时间(方便测试)
  strategy:
    rollingUpdate:            #滚动更新,采用先创建一个后回收一个,比较稳妥
      maxSurge: 1            #比定义的副本数多几个
      maxUnavailable: 0    #最大不可用

  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: myapp:v1 

 [root@k8s2 pod]# kubectl apply -f deployment-example.yaml

4、暂停与恢复

生产环境使用比较多

暂停,避免触发不必要的线上更新

[root@k8s2 pod]# kubectl rollout pause deployment deployment-example

[root@k8s2 pod]# vim deployment-example.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment-example
spec:
  minReadySeconds: 5
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
  replicas: 6                #副本数增加
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: myapp
        image: nginx        #资源敏感型业务
        resources:
          limits:
            cpu: 0.5
            memory: 200Mi
          requests:
            cpu: 0.5
            memory: 200Mi

[root@k8s2 pod]# kubectl apply -f deployment-example.yaml 

调整副本数,不受影响

但是更新镜像和修改资源并没有触发更新,因为当前处于暂停状态

[root@k8s2 pod]# kubectl rollout history deployment deployment-example

deployment.apps/deployment-example

REVISION CHANGE-CAUSE

2 <none>

3 <none>

恢复后开始触发更新
[root@k8s2 pod]# kubectl rollout resume deployment deployment-example

[root@k8s2 pod]# kubectl rollout history  deployment deployment-example
deployment.apps/deployment-example
REVISION  CHANGE-CAUSE
2         <none>
3         <none>
4         <none>

回收资源
[root@k8s2 pod]# kubectl delete -f deployment-example.yaml 

3、daemonset

特点:一个节点只部署一个,只有一个副本,比较适合部署有守护进程的,分布式的文件系统
比较典型的就是kube-flannel中,有几个集群节点就会部署几个,每个节点部署一个,是自动的

还有一个就是在kube-system中 

示例:

tolerations: #允许污点存在,如果不加集群的调度节点不会生成副本

- effect: NoSchedule

  operator: Exists

[root@k8s2 pod]# vim daemonset-example.yml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: daemonset-example
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      tolerations:	#允许污点存在,如果不加集群的调度节点不会生成副本
      - effect: NoSchedule
        operator: Exists
      containers:
      - name: nginx
        image: nginx

[root@k8s2 pod]# kubectl apply -f daemonset-example.yml

回收

[root@k8s2 pod]# kubectl delete -f daemonset-example.yml

补充:扩容节点,kubeadm的join时间是24小时,超过了需要重新kubeadm token create ...重新生成

4、job

主要处理一些离线任务做一次性任务,可以参考官方的例子,计算π的值

#并行job,可以做并行任务

completions: 6         # 共完成6个

parallelism: 2        #每次跑2个

[root@k8s2 pod]# vim job.yml
apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  completions: 6	#并行job,可以做并行任务 共完成6个,每次跑2个
  parallelism: 2
  template:
    spec:
      containers:
      - name: pi
        image: perl:5.34.0
        command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: Never
  backoffLimit: 4

[root@k8s2 pod]# kubectl apply -f job.yml

查看使用logs加上pod名

[root@k8s2 pod]# kubectl logs pi-2jrhb

回收

[root@k8s2 pod]# kubectl delete -f job.yml

5、cronjob

可以做周期任务,到指定时间创建job在由job创建容器

示例:没分钟执行一段输出

[root@k8s2 pod]# vim cronjob.yml
apiVersion: batch/v1
kind: CronJob
metadata:
  name: hello
spec:
  schedule: "* * * * *"		#分钟 小时 日 月 周 代表每分钟
  jobTemplate:
    spec:
      template:
        spec:
          containers:
          - name: hello
            image: busybox
            imagePullPolicy: IfNotPresent
            command:
            - /bin/sh	#运行date命令输出一段话
            - -c
            - date; echo Hello from the Kubernetes cluster
          restartPolicy: OnFailure

[root@k8s2 pod]# kubectl apply -f cronjob.yml

回收

[root@k8s2 pod]# kubectl delete -f cronjob.yml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/477059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++——入门基础知识

0.关注博主有更多知识 C知识合集 目录 1.命名空间 1.1命名空间的定义 1.2命名空间的使用 1.3命名空间定义的补充 2.输入与输出 3.缺省参数 3.1全缺省参数 3.2半缺省参数 3.3缺省参数的补充 4.函数重载 4.1C为什么支持函数重载&#xff1f; &#xff15;.引用 5.…

Wine运行器3.2.1——Windows虚拟机模块支持非X86架构

不写太多啥了&#xff0c;详细介绍看这里就行&#xff1a;https://bbs.deepin.org/post/248098 更新内容 ※1、Windows 虚拟机安装工具支持非 X86 架构&#xff1b; ※2、应用打包器可以与星火应用商店配合构建 arm/all 全架构的 Wine 包&#xff1b; ※3、Windows 虚拟机安装…

【MATLAB图像处理实用案例详解(12)】——基于纹理特征的指纹识别方法

目录 一、指纹图像预处理1.1 图像对比度增强1.2 图像二值化1.3 图像滤波 二、指纹图像特征提取 指纹识别系统主要涉及4个步骤&#xff1a;指纹图像采集、图像预处理、特征提取、特征匹配。一开始&#xff0c;通过指纹读取设备取得图像&#xff0c;并对原始图像进行初步处理&…

《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack

来源&#xff1a;《斯坦福数据挖掘教程第三版》对应的公开英文书和PPT Chapter 2 MapReduce and the New Software Stack Computing cluster means large collections of commodity hardware, including conventional processors (“compute nodes”) connected by Ethernet …

学习HCIP的day.03

目录 OSPF&#xff1a;开放式最短路径优先协议 OSPF的数据包 -- 5种 OSPF的状态机 OSPF的工作过程 OSPF的基础配置 关于OSPF协议从邻居建立成为邻接的条件 OSPF的接口网络类型 OSPF&#xff1a;开放式最短路径优先协议 无类别链路状态型IGP协议&#xff1b;由于其基于拓…

golang Gin实现websocket

golang使用 Gin实现 websocket&#xff0c;这里笔者重新搭建一个项目 1、创建项目安装依赖 项目名为 go-gin-websocket 在指定文件夹下&#xff0c;新建项目文件夹 go-gin-websocket 进入项目文件夹&#xff0c;打开cmd窗口&#xff0c;在项目&#xff08;go-gin-websocket&a…

【Git 入门教程】第九节、Git的最佳实践

Git是一个强大的版本控制系统&#xff0c;可以帮助开发者管理和协调代码库。然而&#xff0c;正确使用Git并不总是容易。本文将介绍一些Git的最佳实践&#xff0c;以帮助开发者更好地利用Git来管理和协调代码库。 一、编写有意义的提交信息 在使用Git时&#xff0c;编写有意义…

Python编程IDE的选择

Python环境安装之后&#xff0c;接下来就是选择编写Python程序的编辑器了&#xff0c;这里就给大家推荐几种Python编辑器&#xff0c;我们简称这些编辑器为IDE。好的编程IDE可以提高编写代码效率&#xff0c;那咱话不多说&#xff0c;直接开始推荐&#xff01; IDLE 首先&…

有人USR-M100边缘主动上报电流数据到TCP服务器

前两天跟强哥配置了有人的USR-M100模块&#xff0c;实现了采集的电流信号主动上报服务器的功能&#xff0c;昨天去第一污水厂配置了1台、第二污水厂配置了5台、第三污水厂配置了1台&#xff0c;能够将数据上报到甲方的云平台&#xff0c;这里记录一下配置过程&#xff0c;方便以…

推荐4款免费好用的chatGPT平台

1 ShellGPT 这是一款出色的客户端&#xff0c;无需APIkey和科学上网即可访问chatGPT3.5以及绘画AI。项目的github地址如下&#xff1a;https://github.com/akl7777777/free-chatgpt-client-pub/&#xff0c;可在主页下载windows、linux和macOS的安装包&#xff0c;安装后即可使…

力扣刷题2023-04-30-1——题目:剑指 Offer II 007. 数组中和为 0 的三个数

题目&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案中不可以包含重复…

React之动态路由创建以及解决刷新白屏问题

动态路由的创建和动态菜单的创建几乎类似&#xff0c;只不过的是&#xff0c;动态路由需要导入组件。这样才能完成跳转。 动态路由与动态菜单一样都需要封装一个转化函数&#xff0c;将后端传来的数据进行转换&#xff0c;转换成我们需要的格式。 需要导入的依赖 导入路由use…

kali: kali工具-Ettercap

kali工具-Ettercap ettercap工具&#xff1a; 用来进行arp欺骗&#xff0c;可以进行ARP poisoning&#xff08;arp投毒&#xff09;&#xff0c;除此之外还可以其他功能&#xff1a; ettercap工具的arp投毒可以截取web服务器、FTP服务器账号密码等信息&#xff0c;简略后打印出…

C++篇--类大小计算、this指针

文章目录 一、类大小计算二、this指针 一、类大小计算 类的大小是只计算它的成员变量或者自定义成员&#xff0c;不会计算它的成员函数大小。 #include<iostream> using namespace std;class A1 { public:void fun(){_a 1;_b 2;}int _a;int _b; };int main() {cout <…

干货 | 赵亚雄:大模型、AI经济和AI基础设施

大家好&#xff0c;我是算想未来的创始人CEO赵亚雄。今天非常高兴到母校来做简短的分享。我们最近会几乎是被ChatGPT、OpenAI等等话题各类的信息轮番轰炸。我希望借助这个机会&#xff0c;把自己这一段时间来思考的有关AI基础设施还有AGI再到大模型等内容&#xff0c;从相对抽象…

ElasticSearch创建文档以及索引文档的详细流程

当我们发起一个查询请求之后&#xff0c;ES是怎么处理这个请求然后返回数据的呢&#xff1f;今天就来详细说一下。 首先看一下整体结构&#xff1a; 在集群模式下一个索引有多个分片&#xff0c;在上图中有三个节点(一个主节点两个从节点)&#xff0c;一个索引被分为两个分片(…

基于协同过滤的旅游推荐系统设计与实现(论文+源码)_kaic

1 绪论 1.1 研究背景及意义 1.2 国内外研究现状 1.3 研究目标与意义 1.4 主要研究工作 2 相关理论介绍 2.1HTML与JavaScript 2.2 MySQL数据库 2.3 协同过滤算法简介 3 系统分析与设计 3.1 系统需求分析 3.1.1 功能性需求 3.1.2 安全性需求 3.2 系统总体架构 3.3 功能模块设计 3…

vue3的props和defineProps

文章目录 1. Props 声明1.1 props用字符串数组来声明Blog.vueBlogPost.vue 1.2 props使用对象来声明Blog.vueBlogPost.vue 2. 传递 prop 的细节2.1 Prop 名字格式2.1 静态Prop & 动态 Prop静态prop动态prop示例Blog.vueBlogPost.vue 2.3 传递不同的值类型NumberBooleanArra…

【Java笔试强训 11】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;最近公共…

算法记录 | Day46 动态规划

139.单词拆分 思路&#xff1a; 1.确定dp数组以及下标的含义 dp[i] : 字符串长度为i的话&#xff0c;dp[i]为true&#xff0c;表示可以拆分为一个或多个在字典中出现的单词。 2.确定递推公式 如果 s[0: j] 可以拆分为单词&#xff08;即 dp[j] True&#xff09;&#xff…