文章目录
一、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集群运维实战