Kubernetes调度基础

news2024/9/21 20:17:14

一、RC 和 RS

1. Replication Controller

Replication Controller,简称 RC,复制控制器,可确保Pod 副本数达到期望值,也就是 RC 可确保一个 Pod 总是可用,或一组 Pod 的数量永远处于一个定值。
如果存在的 Pod 大于设定的期望值,RC 会终止额外的Pod。反之,当 Pod 数量小于期望值时,RC 将启动更多的 Pod 来保证达到该期望值。
与手动创建 Pod 不同,使用 RC 控制的 Pod,在失败、删除或终止时会自动替换为正常运行的 Pod,因此,为达到高可用的效果,即使应用程序只需要一个 Pod,也应该使用 RC 或其他控制器的方式管理。
RC 类似于进程管理监控程序,监视多个节点上的多个Pod。

(1)定义 Replication Controller

[root@k8s-master pods]# vim rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata: # 元数据
        name: nginx # rc名称
spec: # 定义资源信息
        replicas: 3 # 定义副本数量
        selector: # 定义资源标签
                app: nginx
        template: # 定义pod信息
                metadata:       
                        name: nginx # pod名称
                        labels:
                                app: nginx # 定义pod标签
                spec:
                        containers:
                        - name: nginx
                          image: docker.io/library/nginx:latest
                          imagePullPolicy: IfNotPresent
                          ports:
                          - containerPort: 80
[root@k8s-master pods]# kubectl create -f rc-nginx.yaml 
replicationcontroller/nginx created

(2)测试 Pod 数量控制

[root@k8s-master pods]#  kubectl get po
NAME                            READY   STATUS      RESTARTS       AGE
cluster-test-66bb44bd88-nk46t   1/1     Running     21 (40m ago)   5d10h
nginx-llt9n                     1/1     Running     0              31s
nginx-nkblw                     1/1     Running     0              31s
nginx-rtcjk                     1/1     Running     0              31s
nginx0001                       1/1     Running     0              59m
test001                         1/1     Running     1 (160m ago)   4d1h
test007                         0/1     Completed   0              85m
[root@k8s-master pods]# kubectl delete pod/nginx-llt9n           //删除pod其中一个容器
pod "nginx-llt9n" deleted
[root@k8s-master pods]#  kubectl get po                    //发现又新启动了一个容器
NAME                            READY   STATUS      RESTARTS       AGE
cluster-test-66bb44bd88-nk46t   1/1     Running     21 (41m ago)   5d10h
nginx-dv8zq                     1/1     Running     0              8s
nginx-nkblw                     1/1     Running     0              85s
nginx-rtcjk                     1/1     Running     0              85s
nginx0001                       1/1     Running     0              60m
test001                         1/1     Running     1 (161m ago)   4d1h
test007                         0/1     Completed   0              86m

[root@k8s-master pods]# kubectl edit rc nginx                    //直接对rc控制的pod集作修改

replicationcontroller/nginx edited
[root@k8s-master pods]#  kubectl get po                   //因为修改了复制集的数量,所以又新启动了一个同类容器
NAME                            READY   STATUS      RESTARTS       AGE
cluster-test-66bb44bd88-nk46t   1/1     Running     21 (46m ago)   5d10h
nginx-dv8zq                     1/1     Running     0              5m55s
nginx-nkblw                     1/1     Running     0              7m12s
nginx-rtcjk                     1/1     Running     0              7m12s
nginx-z9z6x                     1/1     Running     0              2m33s
nginx0001                       1/1     Running     0              66m
test001                         1/1     Running     1 (167m ago)   4d1h
test007                         0/1     Completed   0              92m

2. ReplicaSet

ReplicaSet,简称 RS,在 Kubernetes v1.2 版本,由旧的 Replication Controller 升级而来。与 RC 的主要区别在于,RS 支持基于集合的 Label Selector (标签选择器)功能。
RS 主要作用于 Deployment 协调创建、删除和更新Pod,在实际应用中,虽然 ReplicaSet 可以单独使用,但一般建议使用 Deployment 来自动管理 ReplicaSet,除非自定义的 Pod 不需要更新或有其他编排等。
RS 比 RC 具有更强大的功能及灵活性,所以如果只有这两种选择,建议选择 RS。

定义一个 ReplicaSet 的示例:
[root@k8s-master pods]# vim rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata: # 元数据
        name: nginx # rs名称
spec: # 定义资源信息
        replicas: 3 # 定义副本数量
        selector: # 定义资源标签
                matchLabels:
                        tier: nginx
                matchExpressions:                      # matchLabels和matchExpressions可以通用,也可以选一中方式用
                - {key: tier, operator: In, values: [nginx]}            # 更高级的标签匹配形式,使用In操作符来匹配“tier”标签的值是否在给定的值列表中。具体来说,它正在查找“tier”标签的值为“nginx”的资源
        template: # 定义pod信息
                metadata:
                        name: nginx # pod名称
                        labels: # 定义pod标签
                                app: guestbook # 标签1
                                tier: nginx # 标签2
                spec:
                        containers:
                        - name: nginx
                          image: docker.io/library/nginx:latest
              imagePullPolicy: IfNotPresent            
                          ports:
                          - containerPort: 80
[root@k8s-master pods]# kubectl create -f rs-nginx.yaml 
replicaset.apps/nginx created
[root@k8s-master pods]# kubectl get pod
NAME                            READY   STATUS      RESTARTS        AGE
cluster-test-66bb44bd88-nk46t   1/1     Running     24 (29m ago)    5d13h
nginx-lm858                     1/1     Running     0               5s
nginx-qsddf                     1/1     Running     0               5s
nginx-rzjkd                     1/1     Running     0               5s
nginx0001                       1/1     Running     0               3h48m


二、无状态和有状态应用特性

1. 无状态应用

无状态应用:不将数据或应用状态存储到集群或永久性存储空间的应用。
常见的无状态应用包括 Web 服务器、负载均衡器、静态文件服务器等。
以 web 服务器为例:客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份,服务端不会保存任何客户端请求者信息。

无状态应用特点:
易于扩展:由于无状态应用不保存请求状态,因此可以轻松地将它们部署在多个服务器上,从而实现水平扩展。
高可用性:由于无状态应用的每个请求都是独立的,因此即使某个请求失败,也不会影响其他请求的处理。这有助于提高应用的可用性。
安全性:无状态应用通常不保存敏感数据,因此不太可能泄露敏感信息。
可替代性:由于无状态应用不保存请求状态,因此不同的服务器可以处理相同的请求,这意味着任何一个服务器都可以替代其他服务器来处理请求。

2. 有状态应用

有状态应用:应用程序的处理需要依赖特定的状态或数据存储。
“有状态应用”的例子有很多,比如 Redis、MySQL 这样的数据库,它们的“状态”就是在内存或者磁盘上产生的数据,是应用的核心价值所在,如果不能够把这些数据及时保存再恢复,那绝对会是灾难性的后果。

有状态应用特点:
依赖状态:应用程序的处理依赖于特定的状态信息。
数据持久化:有状态应用通常需要将状态数据持久化存储,以便后续请求可以访问和使用。
有序性:由于有状态应用处理请求时依赖先前的状态,因此请求之间的顺序可能很重要。

三、Deployment 无状态应用

在 Kubernetes 中,Deployment 是最常用的 Pod 控制器,一般用于部署企业内部的无状态服务(微服务居多),可利用 Deployment 的高级功能做到无缝迁移、自动扩缩容、自动容灾、一键回滚等功能。


1. 创建 Deployment

[root@k8s-master pods]# kubectl create deployment nginx --image=docker.io/library/nginx:latest --replicas=4 -o yaml --dry-run=client > nginx-dp.yaml
# 命令拆分
# kubectl:k8s命令工具
# create:新建一个k8s资源
# deploy:该资源类型为deployment
# nginx:该deploymet资源名为nginx
# --image=docker.io/library/nginx:latest:拉取本地镜像库的nginx镜像(详情请看镜像问题)
# --replicas=4:创建的pod数量
# -o yaml:输出为yaml格式
# --dry-run=client:不真正创建资源,仅预览该deployment资源的配置信息
# > nginx-dp.yaml:预览的配置信息输出到nginx-dp.yaml文件内

[root@k8s-master pods]# vim nginx-dp.yaml       # 使用kubectl命令工具生成的deployment资源配置文件
apiVersion: apps/v1                          # API版本,只能使用这个
kind: Deployment                    # 资源类型:deployment
metadata:            # 元数据信息
  creationTimestamp: null                # 时间注解(没用)
  labels:                    # 标签
    app: nginx
  name: nginx                # 名称
spec:                # deployment的配置信息
  replicas: 4            # 创建pod的数量
  selector:            # 标签选择器,与template的label对应,apiVersion为apps/v1时必须指定该字段
    matchLabels:        # 匹配标签
      app: nginx        # 匹配这个标签
  strategy: {}            # pod的更新策略
  template:            # 定义pod资源配置
    metadata:            # 元信息
      creationTimestamp: null
      labels:            # pod标签
        app: nginx
    spec:                # 配置容器信息
      containers:
      - image: docker.io/library/nginx:latest
        name: nginx
        resources: {}
status: {}

2. 修改生成的 Deploy 文件

[root@k8s-master pods]# vim nginx-dp.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: nginx
  name: nginx
spec:
  replicas: 4
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: docker.io/library/nginx:latest
        imagePullPolicy: IfNotPresent   
        name: nginx
        ports:
        - containerPort: 80
[root@k8s-master pods]# kubectl create -f nginx-dp.yaml 
deployment.apps/nginx created
[root@k8s-master pods]# kubectl get deployments.apps    # 查看默认命名空间下deployment所有资源
NAME           READY   UP-TO-DATE   AVAILABLE   AGE
cluster-test   1/1     1            1           5d13h
nginx          4/4     4            4           26s
[root@k8s-master pods]# kubectl get pod                          #查看默认命名空间下的所有pods
NAME                            READY   STATUS      RESTARTS        AGE
cluster-test-66bb44bd88-nk46t   1/1     Running     24 (53m ago)    5d13h
nginx-55d8987498-bgqs9          1/1     Running     0               76s
nginx-55d8987498-j749x          1/1     Running     0               76s
nginx-55d8987498-j7k9j          1/1     Running     0               76s
nginx-55d8987498-xk9pw          1/1     Running     0               76s
[root@k8s-master pods]# kubectl rollout status deployment nginx             # 查看整个deployment创建状态
deployment "nginx" successfully rolled out
[root@k8s-master pods]# kubectl get rs -l app=nginx         # 查看deployment对应的replicaSet,-l指定标签
NAME               DESIRED   CURRENT   READY   AGE
nginx-55d8987498   4         4         4       4m31s

3.测试副本数量控制机制

删除一个 deployment 的 pod
[root@k8s-master pods]# kubectl get pod
NAME                            READY   STATUS      RESTARTS        AGE
cluster-test-66bb44bd88-nk46t   1/1     Running     24 (58m ago)    5d14h
nginx-55d8987498-bgqs9          1/1     Running     0               6m3s
nginx-55d8987498-j749x          1/1     Running     0               6m3s
nginx-55d8987498-j7k9j          1/1     Running     0               6m3s
nginx-55d8987498-xk9pw          1/1     Running     0               6m3s
[root@k8s-master pods]# kubectl delete po nginx-55d8987498-bgqs9 
pod "nginx-55d8987498-bgqs9" deleted
再次查看
[root@k8s-master pods]# kubectl get pod
NAME                            READY   STATUS      RESTARTS        AGE
cluster-test-66bb44bd88-nk46t   1/1     Running     24 (59m ago)    5d14h
nginx-55d8987498-57msw          1/1     Running     0               22s          #创建了一个新的
nginx-55d8987498-j749x          1/1     Running     0               7m2s
nginx-55d8987498-j7k9j          1/1     Running     0               7m2s
nginx-55d8987498-xk9pw          1/1     Running     0               7m2s

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

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

相关文章

杭州等保测评揭秘:数据安全如何成为企业的“一道锁”

在数字化时代,数据安全已成为企业和机构面临的重要挑战。杭州作为科技创新的前沿城市,积极推进信息安全建设,其中等保测评(等级保护测评)成为保障数据安全的重要手段。 等保测评是依据《信息安全等级保护管理办法》对…

代码随想录训练营第36天|二维背包

1049. 最后一块石头的重量 II class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sumaccumulate(stones.begin(),stones.end(),0);int targetsum/2;vector<int> dp(target1,0);for(auto& stone: stones){for(int itarget; i>s…

如何快速学习拼音打字?

拼音打字是很多人学会使用电脑或手机的第一步&#xff0c;尤其是对于需要经常输入中文的人来说&#xff0c;熟练掌握拼音打字可以大大提升效率。下面分享一些快速学习拼音打字的方法和技巧&#xff0c;帮助你尽快掌握这项技能。 1. 了解拼音的基本规则 学习拼音打字之前&…

代码随想录算法训练营第五十八天 | 拓扑排序精讲-软件构建

目录 软件构建 思路 拓扑排序的背景 拓扑排序的思路 模拟过程 判断有环 写代码 方法一&#xff1a; 拓扑排序 软件构建 题目链接&#xff1a;卡码网&#xff1a;117. 软件构建 文章讲解&#xff1a;代码随想录 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文…

Vue|mixin混入

目录 mixin混入什么是mixin代码准备如何混入?全局混合 在 Vue 中&#xff0c;混入&#xff08;Mixins&#xff09;是一种灵活的分发功能&#xff0c;可以将可复用的代码片段和功能注入到多个组件中。简单来说&#xff0c;混入允许你在多个组件之间共享逻辑&#xff0c;而无需重…

QT<24> Qt和windows中获取CPU序列号号以及主板序列号

前言&#xff1a;在qt中获取CPU和主板唯一序列号&#xff0c;可以在程序构造函数中判断是否与windows中一致&#xff0c;不一致可以直接退出程序&#xff0c;防止程序daoyong。 一、获取电脑CPU唯一序列号 QString MainPage::get_cpu() {QString cmd"wmic cpu get proc…

DNS和ICMP

DNS DNS&#xff08;Domain Name System &#xff09; DNS 是一整套从域名映射到 IP 的系统 关于DNS背景 TCP/IP 中使用 IP 地址和端口号来确定网络上的一台主机的一个程序 . 但是 IP 地址不 方便记忆 . 于是人们发明了一种叫主机名的东西 , 是一个字符串 , 并且…

computed计算属性与watch侦听器

1.computed计算属性的写法有两种&#xff0c;一种是只读的&#xff0c;只负责展示&#xff0c;另一种可以进行修改&#xff0c;利用get来获取值&#xff0c;利用set来进行修改 2.watch侦听器的写法也有两种&#xff0c;可以直接写成函数&#xff0c;也可以写成对象&#xff0c;…

浅显易懂的Git教程

Git概述 SVN与Git的对比 SVN&#xff08;Subversion&#xff09; 类型&#xff1a;集中式版本控制系统 工作流程&#xff1a; 从中央服务器下载最新版本到本地。在本地进行开发。提交更改回中央服务器。 优点&#xff1a; 简单易用&#xff0c;适合小型团队。版本历史清…

【源代码+仿真+原理图+技术文档+演示视频+软件】基于物联网的多功能手环设计与实现

摘 要 随着社会进步和生活水平的提高&#xff0c;人们对健康的重视程度不断增加。为了更好地了解自身的身心健康状况&#xff0c;人们对高精密、便携式医疗监控仪器的需求也越来越大。电子信息技术和医学的发展相互促进&#xff0c;二者的结合可以解决人们在健康问题上的困扰…

单通道低压全桥驱动芯片既可应用在电子锁,医疗器械等产品中也能直接Pin to pin贝岭的BL8123

芯片描述 GC8123 是一款低压 5V 全桥驱动芯片&#xff0c;为摄像机、消费类产品、玩具和其他低压或者电池供电的运动控制类应用提供了集成的电机驱动解决方案。GC8123 能提供高达 1.2A 的持续输出电流。可以工作在 1.2~6V 的电源电压上。GC8123 具有 PWM&#xff08;IN/IN&…

Git使用教程-将idea本地文件配置到gitte上的保姆级别教程

&#x1f939;‍♀️潜意识起点&#xff1a;个人主页 &#x1f399;座右铭&#xff1a;得之坦然&#xff0c;失之淡然。 &#x1f48e;擅长领域&#xff1a;前端 是的&#xff0c;我需要您的&#xff1a; &#x1f9e1;点赞❤️关注&#x1f499;收藏&#x1f49b; 是我持…

Linux配置静态IP详细步骤及联网问题,以及更改主机名问题

一&#xff0c;Linux配置静态IP详细步骤及联网问题 我的Linux操作系统版本是是CentOS7/CentOS8 1.网络适配器&#xff1a;NAT模式点击设置-网络适配器-网络连接 &#xff08;选择NAT模式&#xff09;-点击确定 2.查看网关相关配置点击 编辑-虚拟网络编辑器-选择VMnet8-点击更…

python 环境问题

日常环境问题记录 1、pycharm 终端禁止运行脚本1.1 问题描述1.2 以管理员身份运行powershell1.3 修改权限 1、pycharm 终端禁止运行脚本 1.1 问题描述 当我在pycharm终端执行脚本&#xff0c;比如 activate激活虚拟环境时&#xff0c;会报错不让执行 这类问题的出现原因是没…

操作系统相关

操作系统 1. 操作系统主要功能 进程管理 功能&#xff1a;创建、调度、终止进程&#xff0c;管理进程的执行。目的&#xff1a;确保多个进程能够有效地共享处理器资源&#xff0c;并进行合理的调度和管理。 内存管理 功能&#xff1a;分配和管理系统内存&#xff0c;包括虚拟…

02 基于STM32的按键控制继电器驱动电机

本专栏所有源资料都免费获取&#xff0c;没有任何隐形消费。 注意事项&#xff1a;STM32仿真会存在各种各样BUG&#xff0c;且尽量按照同样仿真版本使用。本专栏所有的仿真都采用PROTEUS8.15。 本文已经配置好STM32F103C8T6系列&#xff0c;在PROTUES仿真里&#xff0c;32单片…

系统编程-初识MCU

初识MCU 目录 初识MCU 一、什么是mcu&#xff1f; 二、MCU 的组成与作用 三、常见的MCU 四、家用空气质量检测仪项目分析 1、项目市场调研 2、项目需求分析&#xff08;重要&#xff09; 3、产品的硬件设计 五、常用元器件以及对应电路介绍(重点) 1、电阻 2、电容 …

怎么使用Chrome与C++实现高效自动化测试

在软件开发过程中&#xff0c;自动化测试是确保代码质量和稳定性的关键步骤。谷歌浏览器&#xff08;Chrome&#xff09;提供了强大的开发者工具和丰富的API&#xff0c;结合C的强大功能&#xff0c;可以实现高效的自动化测试。本文将介绍如何使用Chrome和C来实现这一目标。&am…

路径规划算法-蚁群算法

一、蚁群算法&#xff08;ACO&#xff09;基本原理 winter老哥链接 蚁群路径规划算法&#xff08;Ant Colony Optimization, ACO&#xff09;是一种模拟蚂蚁觅食行为的启发式优化算法&#xff0c;它通过模拟蚂蚁在寻找食物过程中的路径选择和信息素交流来解决路径规划问题。以下…

图片文字翻译怎么快速翻译?5个软件教你快速进行图片文字翻译

图片文字翻译怎么快速翻译&#xff1f;5个软件教你快速进行图片文字翻译 图片文字翻译是日常工作和生活中常见的需求&#xff0c;尤其是在处理外文资料或旅游时。以下5款优秀的软件可以帮助你轻松、快速地将图片中的文字进行翻译&#xff0c;让你不再依赖手动输入和繁琐操作。…