Kubernetes工作负载资源之RC、RS

这里将介绍Kubernetes工作负载资源中的RC、RS

Kubernetes工作负载资源之RC、RS

abstract.png

RC:ReplicationController

ReplicationController,简称RC。作为K8s中的一种资源,其可确保在任何时候都有指定数量的Pod副本处于运行状态。当Pod 数量过多时,RC会终止多余的Pod;当Pod数量太少时,RC将会启动新的Pod

创建RC

我们可以通过Yaml配置文件创建RC,如下所示

apiVersion: v1
# 资源类型
kind: ReplicationController
metadata:
  # RC名称
  name: my-kubia-rc-1
spec:
  # Pod副本数量
  replicas: 3
  # 标签选择器
  selector:
    app: my-kubia
  # Pod模板    
  template:
    metadata:
      # 标签信息
      labels:
        app: my-kubia
    spec:
      # 容器信息
      containers:
        - name: my-kubia-1
          image: luksa/kubia
          # 仅用于展示容器所使用的端口
          ports:
            - containerPort: 8080
              protocol: TCP

利用kubectl create命令创建RC资源,并可以利用下述命令查看

# 查看RC资源
kubectl get rc

效果如下所示,可以看到该RC会根据配置文件自动创建3个Pod副本

Kubernetes工作负载资源之RC、RS

figure 1.jpeg

RC创建的Pod并不是直接绑定到RC上的。RC是通过标签选择器来管理其下所属的Pod。故在RC的配置文件中,必须保证selector标签选择器与Pod模板中的标签信息相匹配,否则会导致RC无休止的创建Pod。下面我们将名为my-kubia-rc-1-2fs96的Pod的标签信息修改为app=my-foo。此时由于满足app=my-kubia标签的Pod数 少于 RC所期望的Pod副本数。故RC会再次自动创建一个Pod。如下名为my-kubia-rc-1-q9fwm的Pod所示

Kubernetes工作负载资源之RC、RS

figure 2.jpeg

水平缩放

可以通过修改RC中replicas字段的值,实现动态调整Pod副本的数量。具体地,执行下述命令,打开Vim编辑器后修改spec.replicas字段值为5

kubectl edit rc <RC的名称>

效果如下所示,Pod的数量已经扩容为5个

Kubernetes工作负载资源之RC、RS

figure 3.jpeg

此外,还可以通过kubectl scale命令实现对RC中replicas字段的值修改

# 将指定RC期望的Pod副本数 设置为 指定值
kubectl scale rc <RC的名称> --replicas=<Pod的副本数>

效果如下所示

Kubernetes工作负载资源之RC、RS

figure 4.jpeg

删除RC

当我们直接删除RC时,其相应的Pod也会全部被自动删除。事实上,kubectl会先将RC缩放为0并等待,以便在删除RC自身之前先删除全部Pod

# 删除RC
kubectl delete rc <RC的名称>

效果如下所示

Kubernetes工作负载资源之RC、RS

figure 5.jpeg

如果期望只删除RC自身,而不删除相应的Pod。可在删除时使用 –cascade=orphan 选项

# 只删除RC自身,而不删除相应的Pod
kubectl delete rc my-kubia-rc-1 --cascade=orphan

效果如下所示

Kubernetes工作负载资源之RC、RS

figure 6.jpeg

RS:ReplicaSet

ReplicaSet简称RS。其与RC的功能基本一致,可以将其视为对RC的升级

创建RS

我们可以通过Yaml配置文件创建RS,如下所示

# API组、版本
apiVersion: apps/v1
# 资源类型
kind: ReplicaSet
metadata:
  # RS名称
  name: my-kubia-rs-3
spec:
  # 副本数量
  replicas: 5
  # 标签选择器
  selector:
    # matchLabels 选择器
    matchLabels:
      company: Microsoft
  # Pod 模板
  template:
    metadata:
      # 标签信息
      labels:
        company: Microsoft
    spec:
      # 容器信息
      containers:
        - name: my-kubia-3
          image: luksa/kubia
          # 仅用于展示容器所使用的端口
          ports:
            - containerPort: 8080
              protocol: TCP

效果如下所示,可以看到该RS会根据配置文件自动创建5个Pod副本

Kubernetes工作负载资源之RC、RS

figure 7.jpeg

标签选择器

RS相比较于RC,主要的改进是它更具表现力的标签选择器。上文的示例我们使用了等值条件的matchLabels选择器。这里我们介绍下RS的matchExpressions标签选择器,其支持更丰富的运算符

「1. Exists」

spec:
  # 标签选择器
  selector:
    matchExpressions:
      # Pod 需要包含指定名称的标签, 不论该标签的值
      - operator: Exists
        key: company

「2. DoesNotExist」

spec:
  # 标签选择器
  selector:
    matchExpressions:
      # Pod 不得包含指定名称的标签, 不论该标签的值
      - operator: DoesNotExist
        key: company

「3. In」

spec:
  # 标签选择器
  selector:
    matchExpressions:
      # Pod 包含指定名称的标签, 且该标签的值必须与其中一个指定的values匹配
      - operator: In
        key: company
        values:
          - Apple
          - LinkedIn

「4. NotIn」

spec:
  # 标签选择器
  selector:
    matchExpressions:
      # Pod 要么 不存在指定名称的标签,
      # 要么 存在指定名称的标签,但该标签的值与所有指定的values均不匹配
      - operator: NotIn
        key: company
        values:
          - Apple
          - LinkedIn

此外如果使用matchExpressions选择器指定了多个表达式时,则各表达式间的关系为and与。即所有表达式的结果都必须为true,才能使标签选择器与Pod匹配。类似地,如果同时使用matchExpressions选择器、matchLabels选择器,则二者的关系也是and与

参考文献

  1. Kubernetes in Action中文版 Marko Luksa著
  2. 深入剖析Kubernetes 张磊著

原文始发于微信公众号(青灯抽丝):Kubernetes工作负载资源之RC、RS

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/42053.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!