Kubernetes知识篇:Kubernetes之Replicaset控制器》



一、Replicaset概述

ReplicaSet是kubernetes中的一种副本控制器,简称rs,是新一代的ReplicationController,相比较与ReplicationController,其Pod选择器的表达能力更强,可匹配缺少某个标签或特定标签名的Pod。

ReplicaSet能够实现以下功能
1、确保pod副本的数量始终维持在预设的个数
2、确保pod监控运行:探测到由其管控的pod对象因其所在的工作节点故障而不可用时,自动请求由调度器调度到其它工作节点创建缺失的pod副本。
3、弹性伸缩:业务规模因各种原因经常存在明显波动,在波峰或波谷期间,可以通过rs控制器动态调整相关pod资源对象数量。此外,在必要时还可以通过hpa(HroizontalPodAutoscaler)控制器实现pod资源规模的自动伸缩。

官方推荐不要直接使用ReplicaSet,用Deployments取而代之,Deployments是比ReplicaSet更高级的概念,它会管理ReplicaSet并提供很多其它有用的特性,最重要的是Deployments支持声明式更新,声明式更新的好处是不会丢失历史变更。所以Deployment控制器不直接管理Pod对象,而是由Deployment管理ReplicaSet,再由ReplicaSet负责管理Pod对象。

Replicaset控制器主要由三个部分组成
1、用户期望的pod副本数:用来定义由这个控制器管控的pod副本有几个
2、标签选择器:选定哪些pod是自己管理的,如果通过标签选择器选到的pod副本数量少于我们指定的数量,需要用到下面的组件
3、pod资源模板:如果集群中现存的pod数量不够我们定义的副本中期望的数量怎么办,需要新建pod,这就需要pod模板,新建的pod是基于模板来创建的。


二、Replicaset资源清单文件编写技巧

[root@k8s-client-17 yaml]# kubectl explain replicaset.spec
KIND:     ReplicaSet
VERSION:  apps/v1

RESOURCE: spec <Object>

DESCRIPTION:
     Spec defines the specification of the desired behavior of the ReplicaSet.
     More info:
     https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status

     ReplicaSetSpec is the specification of a ReplicaSet.

FIELDS:
   minReadySeconds	<integer> #新建的pod对象,在启动后的多长时间内如果其容器未发生崩溃等异常情况即被视为就绪;默认0s,表示一旦就绪性探测成功,即被视作可用  
   replicas	<integer> #期望的pod对象副本数
   selector	<Object> -required-  #必须字段,当前控制器匹配pod对象副本的标签选择器,支持matchLabels和matchExpressions两种匹配机制。
   template	<Object> #用于补足pod副本数量时使用的pod模板资源

三、Replicaset使用案例

由于ReplicaSet是ReplicationController的代替物,因此用法基本相同,唯一的区别在于ReplicaSet除了可以使用matchLabels,也支持集合式的selector。一个典型的RS描述文件如下:

[root@k8s-client-17 yaml]# vim nginx-replicaset.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
    matchExpressions:
      - {key: app, operator: In, values: [nginx]}
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe: #存活性探测,用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启。如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。
          tcpSocket:
            port: 80  #检测80端口是否存在
          initialDelaySeconds: 60 #Pod启动60s执行第一次检查
          periodSeconds: 10  #第一次检查后每隔10s检查一次
        readinessProbe: #就绪性探测,有时候应用程序可能暂时无法接受请求,比如Pod已经Running了,但是容器内应用程序尚未启动成功,在这种情况下,如果没有ReadinessProbe,则Kubernetes认为它可以处理请求了,然而此时,我们知道程序还没启动成功是不能接收用户请求的,所以不希望kubernetes把请求调度给它,则使用ReadinessProbe探针。
          tcpSocket:
            port: 80 
          initialDelaySeconds: 60
          periodSeconds: 10
      nodeName: k8s-worker-21

四、Replicaset管理pod

4.1、扩容

方法一

[root@k8s-client-17 yaml]# kubectl scale rs nginx-replicaset --replicas=5
replicaset.apps/nginx-replicaset scaled
[root@k8s-client-17 yaml]# kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-replicaset-2pcp6   1/1     Running   0          26m
nginx-replicaset-b7rk6   1/1     Running   0          26m
nginx-replicaset-dkvjg   1/1     Running   0          69s
nginx-replicaset-l6p6q   1/1     Running   0          69s
nginx-replicaset-q67qx   1/1     Running   0          26m

方法二

#修改yaml文件中的副本数为5
spec:
  replicas: 5

[root@k8s-client-17 yaml]# kubectl apply -f nginx-replicaset.yaml 
replicaset.apps/nginx-replicaset configured
horizontalpodautoscaler.autoscaling/nginx-scaler unchanged

4.2、缩容

方法一

[root@k8s-client-17 yaml]# kubectl scale rs nginx-replicaset --replicas=2
replicaset.apps/nginx-replicaset scaled
[root@k8s-client-17 yaml]# kubectl get pods
NAME                     READY   STATUS        RESTARTS   AGE
nginx-replicaset-2pcp6   1/1     Running       0          27m
nginx-replicaset-b7rk6   1/1     Running       0          27m

方法二

#修改yaml文件中的副本数为2
spec:
  replicas: 2

[root@k8s-client-17 yaml]# kubectl apply -f nginx-replicaset.yaml 
replicaset.apps/nginx-replicaset configured
horizontalpodautoscaler.autoscaling/nginx-scaler unchanged

4.3、自动伸缩

1、创建HPA策略,autoscaling/v1版本只支持CPU一个指标。

[root@k8s-client-17 yaml]# vim  nginx-replicaset-scaler.yaml 
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
    matchExpressions:
      - {key: app, operator: In, values: [nginx]}
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe: #存活性探测,用于判断容器是否存活,即Pod是否为running状态,如果LivenessProbe探针探测到容器不健康,则kubelet将kill掉容器,并根据容器的重启策略是否重启。如果一个容器不包含LivenessProbe探针,则Kubelet认为容器的LivenessProbe探针的返回值永远成功。
          tcpSocket:
            port: 80  #检测80端口是否存在
          initialDelaySeconds: 60 #Pod启动60s执行第一次检查
          periodSeconds: 10  #第一次检查后每隔10s检查一次
        readinessProbe: #就绪性探测,有时候应用程序可能暂时无法接受请求,比如Pod已经Running了,但是容器内应用程序尚未启动成功,在这种情况下,如果没有ReadinessProbe,则Kubernetes认为它可以处理请求了,然而此时,我们知道程序还没启动成功是不能接收用户请求的,所以不希望kubernetes把请求调度给它,则使用ReadinessProbe探针。
          tcpSocket:
            port: 80 
          initialDelaySeconds: 60
          periodSeconds: 10
      nodeName: k8s-worker-21
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata: 
  name: nginx-scaler
spec:
  maxReplicas: 10
  minReplicas: 3
  scaleTargetRef: #表示当前要伸缩对象是谁
    apiVersion: apps/v1  
    kind: ReplicaSet
    name: nginx-deployment 
  targetCPUUtilizationPercentage: 10 #当整体的资源利用率超过10%的时候,会进行扩容

[root@k8s-client-17 yaml]# kubectl apply -f nginx-replicaset.yaml 
replicaset.apps/nginx-replicaset created
horizontalpodautoscaler.autoscaling/nginx-scaler created

[root@k8s-client-17 yaml]# kubectl get pods -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP             NODE            NOMINATED NODE   READINESS GATES
nginx-deployment-6hs8c   1/1     Running   0          18m   10.244.27.15   k8s-worker-21   <none>           <none>
nginx-deployment-cwwjf   1/1     Running   0          18m   10.244.27.12   k8s-worker-21   <none>           <none>
nginx-deployment-nwkzv   1/1     Running   0          18m   10.244.27.13   k8s-worker-21   <none>           <none>
[root@k8s-client-17 yaml]# kubectl get hpa -o wide
NAME           REFERENCE                     TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
nginx-scaler   ReplicaSet/nginx-deployment   <unknown>/10%   3         10        3          18m

2、创建hpa之后报错,这个情况是metrics无法获取到pod的cpu指标,新版k8s已经弃用了heapster,使用metrics来代替,安装一个metrics就行了
在这里插入图片描述
解决方法如下:
a、安装metrics

#1、下载components.yaml
wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

#2、修改components.yaml在,只需添加--kubelet-insecure-tls,其它内容无需修改,如下图所示

#3、部署metrics,建议提前下载好镜像
kubectl apply -f components.yaml

如下图所示:
在这里插入图片描述
b、修改kube-controller-manager.yaml,新增一个选项–horizontal-pod-autoscaler-use-rest-clients=true

[root@k8s-master-13 manifests]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml 
--horizontal-pod-autoscaler-use-rest-clients=true

如下图所示:
在这里插入图片描述
c、等待一会时间,查看hpa状态

[root@k8s-client-17 yaml]# kubectl top node
NAME            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master-13   275m         4%     1174Mi          20%       
k8s-master-14   248m         4%     1255Mi          21%       
k8s-master-15   278m         4%     1179Mi          20%       
k8s-worker-16   118m         1%     633Mi           10%       
k8s-worker-21   99m          2%     633Mi           8%  
[root
@k8s-client-17 yaml]# kubectl get hpa
NAME           REFERENCE                     TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-scaler   ReplicaSet/nginx-replicaset   0%/10%    3         10        3          115s

3、压力测试,观察自动伸缩效果

[root@k8s-master-14 ~]# yum -y install httpd-tools
[root@k8s-master-14 ~]# kubectl get svc
NAME               TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes         ClusterIP   10.96.0.1      <none>        443/TCP   22d
nginx-deployment   ClusterIP   10.96.249.13   <none>        80/TCP    22d
[root@k8s-master-14 ~]# ab -n 1000000 -c 1000 http://10.96.249.13/index.html

压测一段时间观察cpu使用情况
[root@k8s-client-17 yaml]# kubectl top node
NAME            CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
k8s-master-13   340m         5%     1167Mi          20%       
k8s-master-14   1796m        29%    1262Mi          21%       
k8s-master-15   311m         5%     1151Mi          19%       
k8s-worker-16   150m         2%     634Mi           10%       
k8s-worker-21   2212m        55%    707Mi           9%   

从上面可以看出,随着cpu压力增大,pod已经自动拓展了,如下图所示:
在这里插入图片描述
大概4分钟之后,pod又恢复了3个副本,跟我预期的一致
在这里插入图片描述


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:企业级K8s集群运维实战

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

东城绝神

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值