Replication Controller(RC)
Replication Controller简称RC,RC是Kubernetes系统中的核心概念之一,简单来说,RC可以保证在任意时间运行Pod的副本数量,能够保证Pod总是可用的。如果实际Pod数量比指定的多那就结束掉多余的,如果实际数量比指定的少就新启动一些Pod,当Pod失败、被删除或者挂掉后,RC都会去自动创建新的Pod来保证副本数量,所以即使只有一个Pod,我们也应该使用RC来管理我们的Pod。
Kubernetes的资源对象
Replication Controller:用来部署、升级Pod
Replica Set:下一代的Replication Controller
Deployment:可以更加方便的管理Pod和Replica Set
RC应用
vi nginx_rc.yaml
piVersion: v1
kind: ReplicationController
metadata:
name: rc-demo
labels:
name: rc
spec:
replicas: 3
selector:
name: rc
template:
metadata:
labels:
name: rc
spec:
containers:
- name: nginx-demo
image: hub.atomgit.com/library/nginx:1.24
ports:
- containerPort: 80
# kind:ReplicationController
# spec.replicas: 指定Pod副本数量,默认为1
# spec.selector: RC通过该属性来筛选要控制的Pod
# spec.template: 这里就是我们之前的Pod的定义的模块,但是不需要apiVersion和kind了
# spec.template.metadata.labels: 注意这里的Pod的labels要和spec.selector相同,这样RC就可以来控制当前这个Pod了。
#这个YAML文件中的意思就是定义了一个RC资源对象,它的名字叫rc-demo,保证一直会有3个Pod运行,Pod的镜像是nginx镜像。
[root@master ~]# cat nginx_rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: rc-demo
labels:
name: rc
spec:
replicas: 3
selector:
name: rc
template:
metadata:
labels:
name: rc
spec:
containers:
- name: nginx-demo
image: nginx:1.20
ports:
- containerPort: 80
[root@master ~]# kubectl apply -f nginx_rc.yaml
replicationcontroller/rc-demo created
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
rc-demo-tv7tc 0/1 ContainerCreating 0 4s
rc-demo-vprgq 0/1 ContainerCreating 0 4s
rc-demo-w7lw8 0/1 ContainerCreating 0 4s
你也可以使用尝试删除一个pod,会发现删除以后又会启动一个pod。
# 查看rc
[root@master ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
rc-demo 3 3 3 4m3s
RC滚动更新
# rolling-update在1.11版开始过时的,控制Pod副本数量后面我们主要使用Deployment
kubectl rolling-update rc-demo --image=nginx:1.21
Replication Set(RS)
Replication Set简称RS,随着Kubernetes的高速发展,官方已经推荐我们使用RS和Deployment来代替RC了,实际上RS和RC的功能基本一致,目前唯一的一个区别就是RC只支持基于等式的selector(env=dev或environment!=qa),但RS还支持基于集合的selector(version in (v1.0, v2.0)),这对复杂的运维管理就非常方便了。
RC/RS的特性和作用
我们可以通过定义一个RC实现的Pod的创建和副本数量的控制
RC中包含一个完整的Pod定义模块(不包含apiversion和kind)
RC是通过label selector机制来实现对Pod副本的控制的
通过改变RC里面的Pod副本数量,可以实现Pod的扩缩容功能
通过改变RC里面的Pod模板中镜像版本,可以实现Pod的滚动升级功能(但是不支持一键回滚,需要用相同的方法去修改镜像地址)
RS应用
1.
vi nginx_rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: hub.atomgit.com/library/nginx:1.24
与replication controll类似,rs是他的升级版
[root@master ~]# kubectl apply -f nginx_rs.yaml
replicaset.apps/nginx created
[root@master ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx 3 3 3 7m15s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-jfw4d 1/1 Running 0 7m17s
nginx-kwpbr 1/1 Running 0 7m17s
nginx-x6bls 1/1 Running 0 7m17s
Deployment
Deployment同样也是Kubernetes系统的一个核心概念,主要职责和RC、RS一样的都是保证Pod的数量和健康,通过定义一个Deployment控制器会创建一个新的ReplicaSet控制器,通过ReplicaSet创建pod,删除Deployment控制器,也会删除Deployment控制器下对应的ReplicaSet控制器和pod资源。二者大部分功能都是完全一致的,我们可以看成是一个升级版的RC、RS控制器
功能
事件和状态查看:可以查看Deployment的升级详细进度和状态
回滚:当升级Pod的时候如果出现问题,可以使用回滚操作回滚到之前的任一版本
版本记录:每一次对Deployment的操作,都能够保存下来,这也是保证可以回滚到任一版本的基础
暂停和启动:对于每一次升级都能够随时暂停和启动
一般无状态服务都是使用Deployment来进行管理
无状态服务
服务不依赖自身的状态,实例的状态数据可以维护在内存中。
任何一个请求都可以被任意一个实例处理。
不存储状态数据,实例可以水平拓展,通过负载均衡将请求分发到各个节点。
在一个封闭的系统中,只存在一个数据闭环。
通常存在于单体架构的集群中。
maxSurge和maxUnavailable用来控制滚动更新的更新策略
maxUnavailable:和期望ready的副本数比,不可用副本数最大比例(或最大值),这个值越小,越能保证服务稳定,更新越平滑;
maxSurge:和期望ready的副本数比,超过期望副本数最大比例(或最大值),这个值调的越大,副本更新速度越快。
取值范围
数值
1. maxUnavailable: [0, 副本数]
2. maxSurge: [0, 副本数]
注意:两者不能同时为0
比例
1. maxUnavailable: [0%, 100%] 向下取整,比如10个副本,5%的话==0.5个,但计算按照0个;
2. maxSurge: [0%, 100%] 向上取整,比如10个副本,5%的话==0.5个,但计算按照1个;
注意:两者不能同时为0
建议配置
1. maxUnavailable == 0
2. maxSurge == 1
Deployment应用
vi nginx_deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels:
app: nginx
spec:
replicas: 6
selector:
matchLabels:
app: nginx
# 用于将现有 Pod 替换为新 Pod 的部署策略。
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: hub.atomgit.com/library/nginx:1.20
imagePullPolicy: IfNotPresent
~
[root@master ~]# kubectl apply -f nginx_deployment.yaml
deployment.apps/nginx created
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 6/6 6 6 63s
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-795ff9d4cc-8hjqr 1/1 Running 0 11s
nginx-795ff9d4cc-fr9dx 1/1 Running 0 14s
nginx-795ff9d4cc-ldvb4 1/1 Running 0 9s
nginx-795ff9d4cc-mpdx5 1/1 Running 0 13s
nginx-795ff9d4cc-mwccx 1/1 Running 0 8s
nginx-795ff9d4cc-wxrs9 1/1 Running 0 6s
扩缩容Pod应用
# 修改yaml文件中的replicas配置,然后重新应用yaml文件
# replicas的值修改的比之前多就是扩容,比之前少就是缩容
[root@master ~]# vi nginx_deployment.yaml
[root@master ~]# kubectl apply -f nginx_deployment.yaml
deployment.apps/nginx configured
# 还可以使用edit直接修改
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 8/8 8 8 4m7s
# 找到replicas配置修改完以后保存退出即可
[root@master ~]# kubectl edit deployment nginx
deployment.apps/nginx edited
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 9/9 9 9 5m33s
# 使--replicas指定数量即可
[root@master ~]# kubectl scale deployment nginx --replicas=2
deployment.apps/nginx scaled
滚动更新应用
更新
# 编写yaml文件中image,然后重新应用yaml文件
[root@master ~]# vi nginx_deployment.yaml
[root@master ~]# kubectl apply -f nginx_deployment.yaml
deployment.apps/nginx configured
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-5ff79c7ff8-865kg 0/1 ContainerCreating 0 0s
nginx-5ff79c7ff8-lttfr 1/1 Running 0 2s
nginx-795ff9d4cc-29z2t 1/1 Running 0 32s
nginx-795ff9d4cc-dxst6 1/1 Running 0 32s
nginx-795ff9d4cc-grmwm 1/1 Running 0 32s
nginx-795ff9d4cc-kpdzl 1/1 Terminating 0 32s
nginx-795ff9d4cc-xtwbc 1/1 Running 0 32s
nginx-795ff9d4cc-xztdg 1/1 Running 0 32s
nginx-795ff9d4cc-z2cxn 1/1 Running 0 32s
nginx-795ff9d4cc-zh5gn 1/1 Running 0 32s
# 使用该命令可以查看发布历史
[root@master ~]# kubectl rollout history deployment nginx
deployment.apps/nginx
REVISION CHANGE-CAUSE
1 <none>
2 <none>
# 使用--revision可以查看某个发布历史的具体信息
[root@master ~]# kubectl rollout history deployment nginx --revision=1
deployment.apps/nginx with revision #1
Pod Template:
Labels: app=nginx
pod-template-hash=795ff9d4cc
Containers:
nginx:
Image: nginx:1.20
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
[root@master ~]# kubectl rollout history deployment nginx --revision=2
deployment.apps/nginx with revision #2
Pod Template:
Labels: app=nginx
pod-template-hash=5ff79c7ff8
Containers:
nginx:
Image: nginx:1.21
Port: <none>
Host Port: <none>
Environment: <none>
Mounts: <none>
Volumes: <none>
# 可以使用kubectl set image命令来进行滚动更新
[root@master ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 8/8 8 8 6m50s
[root@master ~]# kubectl set image deployment nginx nginx=nginx:1.22
deployment.apps/nginx image updated
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-5ff79c7ff8-778cz 1/1 Running 0 7m40s
nginx-5ff79c7ff8-865kg 1/1 Running 0 7m43s
nginx-5ff79c7ff8-c8ccl 1/1 Running 0 7m42s
nginx-5ff79c7ff8-cx9g4 1/1 Running 0 7m38s
nginx-5ff79c7ff8-hcj4d 1/1 Running 0 7m41s
nginx-5ff79c7ff8-lttfr 1/1 Running 0 7m45s
nginx-5ff79c7ff8-srmdq 1/1 Running 0 7m39s
nginx-5ff79c7ff8-zq9nk 1/1 Running 0 7m37s
nginx-7c8489bfcf-n2kkw 0/1 ContainerCreating 0 5s
# 查看发布状态
[root@master ~]# kubectl rollout status deployment nginx
deployment "nginx" successfully rolled out
查看拉取镜像失败的pod的原因
#kubectl describe rs 失败pod的name
kubectl describe rs nginx-94578b596