kubernetes 基础 -- 3.1 kubernetes 控制器之 ReplicationController 和 ReplicaSet

前言

Pod 代表了 Kubernetes 中的基本部署单元;在实际用例中,我们希望部署能自动保持运行,并且保持健康,无需人工干预,要做到这一点,我们几乎不会手动创建 pod,而是创建 RepicationController 这种资源,由它们创建并管理实际的 pod。

ReplicationController

ReplicationController(简称 RC)也是一种 Kubernetes 资源,可以确保它的 pod 始终保持运行状态,如果 pod 因为任何原因消失,则 RC 都会注意到缺少了 pod 并创建替代 pod。

RC 会持续监控运行的 pod 列表,并保证相应类型(匹配 label selector)的 pod 的数量与期望相符,多删少补。

RC 分为三部分

  • label selector,标签选择器,用于确定 RC 管理的 pod
  • replica count,副本个数,指定运行 pod 的数量
  • pod template,pod 模板,用于创建新的 pod

RC 可以保证一定数量的 pod 副本正在运行;当节点故障,也会在正常节点上创建新的 pod 副本;通过更改副本个数,也可以实现 pod 的水平伸缩。

创建 RC

创建 yaml
rc_test.yaml,// 注释内容实际文件中不应该存在

apiVersion: v1
kind: ReplicationController				// 定义了 RC 资源
metadata:
  name: rc-nginx							// RC 资源名称
spec:
  replicas: 3									// 副本数量
  selector:
    app: rc-nginx							// RC 操作对象 pod 选择器,label
  template:									// pod 模板
    metadata:
      labels:
        app: rc-nginx
    spec:
      containers:
      - name: rc-nginx
        image: nginx
        ports: 
        - containerPort: 80
      affinity:									// 设置反亲和性,让 pod 不在一个 node
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - rc-nginx
            topologyKey: kubernetes.io/hostname

kubectl 应用 yaml 文件

$ kubectl apply -f rc_test.yaml
replicationcontroller/rc-nginx created

$ kubectl get pods -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
rc-nginx-4mfvn   1/1     Running   0          13m   10.244.1.39   worker    <none>           <none>
rc-nginx-cf5mx   1/1     Running   0          13m   10.244.0.11   master    <none>           <none>
rc-nginx-rflp4   1/1     Running   0          13m   10.244.2.8    worker2   <none>           <none>

查看 RC

查看 selector,Labels,副本数和当前 pod 装填。

$ kubectl describe rc rc-nginx
Name:         rc-nginx
Namespace:    default
Selector:     app=rc-nginx
Labels:       app=rc-nginx
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=rc-nginx
  Containers:
   rc-nginx:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                    Message
  ----    ------            ----  ----                    -------
  Normal  SuccessfulCreate  12m   replication-controller  Created pod: rc-nginx-vjwsf

删除 Pod

删除其中一个 pod,会重新创建一个,保持 pod 副本数量为 3。

$ kubectl delete pod  rc-nginx-4mfvn
$ kubectl get pods -o wide
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
rc-nginx-cf5mx   1/1     Running   0          61m   10.244.0.11   master    <none>           <none>
rc-nginx-rflp4   1/1     Running   0          61m   10.244.2.8    worker2   <none>           <none>
rc-nginx-vjwsf   1/1     Running   0          21s   10.244.1.40   worker    <none>           <none>

水平伸缩 RC

直接修改 RC

$ kubectl edit rc rc-nginx
直接修改副本数量

scale

$ kubectl scale rc rc-nginx --replicas=2
NAME             READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
rc-nginx-cf5mx   1/1     Running   0          80m   10.244.0.11   master    <none>           <none>
rc-nginx-rflp4   1/1     Running   0          80m   10.244.2.8    worker2   <none>           <none>

删除 RC

删除 RC 后删除所有 pod,如果想保留 pod,可以 --cascade=false

$ kubectl delete rc rc-nginx
$ kubectl get pods -o wide
No resources found in default namespace.

ReplicaSet

ReplicaSet (RS) 行为与 RC 完全相同,但 pod 选择器的表达能力更强,RS 相较于 RC 允许匹配缺少某个标签的 pod,或包含特定标签名的 pod,不管其值如何。

例如 pod 的 selector,可以使用 matchLabels。

创建 RS

创建 yaml
rs_test.yaml,// 注释内容实际文件中不应该存在

apiVersion: apps/v1								// API 版本
kind: ReplicaSet	
metadata:
  name: rs-nginx							
spec:
  replicas: 3									
  selector:
    matchLabels:
      app: rs-nginx								// pod Selector 为 matchLabels
  template:
    metadata:
      labels:
        app: rs-nginx
    spec:
      containers:
      - name: rs-nginx
        image: nginx
        ports: 
        - containerPort: 80
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - rc-nginx
              topologyKey: kubernetes.io/hostname

apply rs_test.yaml

$ kubectl apply -f rs_test.yaml
$ kubectl get pods -o wide
NAME             READY   STATUS    RESTARTS   AGE    IP            NODE      NOMINATED NODE   READINESS GATES
rs-nginx-mwrmp   1/1     Running   0          27s   10.244.1.44   worker    <none>           <none>
rs-nginx-tgkkf   1/1     Running   0          27s   10.244.0.14   master    <none>           <none>
rs-nginx-v8tlf   1/1     Running   0          27s   10.244.2.11   worker2   <none>           <none>

查看 RS

$ kubectl describe rs rs-nginx
Name:         rs-nginx
Namespace:    default
Selector:     app=rs-nginx
Labels:       <none>
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=rs-nginx
  Containers:
   rs-nginx:
    Image:        nginx
    Port:         80/TCP
    Host Port:    0/TCP
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age   From                   Message
  ----    ------            ----  ----                   -------
  Normal  SuccessfulCreate  66s   replicaset-controller  Created pod: rs-nginx-mwrmp
  Normal  SuccessfulCreate  66s   replicaset-controller  Created pod: rs-nginx-v8tlf
  Normal  SuccessfulCreate  66s   replicaset-controller  Created pod: rs-nginx-tgkkf

rolling-update
一般建议使用 Deployment 来自动管理 ReplicaSet,ReplicaSet 不支持 rolling-update 但 Deployment 支持。

TS

默认情况下,是不允许在 master 节点上进行 pod 调度创建,因为在 master 节点上设置了污点;

$ kubectl describe node master

Taints:             node-role.kubernetes.io/master:NoSchedule

去掉污点

$ kubectl taint node master node-role.kubernetes.io/master-
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值