- 一、Replicaset概述
- 二、Replicaset资源清单文件编写技巧
- 三、Replicaset使用案例
- 四、Replicaset管理pod
- 4.1、扩容
- 4.2、缩容
- 4.3、自动伸缩
- 总结:整理不易,如果对你有帮助,可否点赞关注一下?
一、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
三、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
nginx-deployment-cwwjf 1/1 Running 0 18m 10.244.27.12 k8s-worker-21
nginx-deployment-nwkzv 1/1 Running 0 18m 10.244.27.13 k8s-worker-21
[root@k8s-client-17 yaml]# kubectl get hpa -o wide
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-scaler ReplicaSet/nginx-deployment /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.1443/TCP 22d nginx-deployment ClusterIP 10.96.249.13 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集群运维实战



