当前位置: 首页 > article >正文

Kubernetes调度基础

一、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.kler.cn/news/311995.html

相关文章:

  • 二叉树的遍历【C++】
  • python批量对遥感影像进行归一化与数据清洗
  • 【Linux】—— muduo网络库的安装配置与使用
  • 第160天:安全开发-Python-蓝队项目流量攻击分析文件动态监控Webshell检测
  • DepthCrafter:为开放世界视频生成一致的长深度序列
  • VISIA 皮肤检测
  • 深入浅出Docker
  • Docker UI强大之处?
  • k8s部署springboot项目
  • Vue3 : Pinia的性质与作用
  • Pandas与Matplotlib:Python中的动态数据可视化
  • 计算机专业的就业方向
  • Vue 3 中 `$emit` 的使用示例
  • 最新Kali Linux超详细安装教程(附镜像包)
  • go 实现操作mysql并且防止sql注入
  • 从《中国数据库前世今生》看中国数据库技术的发展与挑战
  • C#使用实体类Entity Framework Core操作mysql入门:从数据库反向生成模型
  • 【AI】简单了解AIGC与ChatGPT
  • VUE项目运行npm run dev命令后,自动打开浏览器导航到主页
  • flink 批量写clickhouse
  • SQL 查询语句汇总
  • 金砖软件测试赛项之Jmeter如何录制脚本!
  • 算法训练——day18 两数之和三数之和
  • 力扣春招100题——队列
  • Acwing 堆
  • 【QT】基于HTTP协议的网络应用程序
  • docker构建java镜像,运行镜像出现日志 no main manifest attribute, in /xxx.jar
  • 大模型-模型架构-新型模型架构
  • 程序员常用开发软件集合
  • AirTest 基本操作范例和参数解释(一)