Kubernetes调度基础
一、RC 和 RS
1. Replication Controller
Replication Controller,简称 RC,复制控制器,可确保Pod 副本数达到期望值,也就是 RC 可确保一个 Pod 总是可用,或一组 Pod 的数量永远处于一个定值。
如果存在的 Pod 大于设定的期望值,RC 会终止额外的Pod。反之,当 Pod 数量小于期望值时,RC 将启动更多的 Pod 来保证达到该期望值。
与手动创建 Pod 不同,使用 RC 控制的 Pod,在失败、删除或终止时会自动替换为正常运行的 Pod,因此,为达到高可用的效果,即使应用程序只需要一个 Pod,也应该使用 RC 或其他控制器的方式管理。
RC 类似于进程管理监控程序,监视多个节点上的多个Pod。
(1)定义 Replication Controller
[root@k8s-master pods]# vim rc-nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata: # 元数据
name: nginx # rc名称
spec: # 定义资源信息
replicas: 3 # 定义副本数量
selector: # 定义资源标签
app: nginx
template: # 定义pod信息
metadata:
name: nginx # pod名称
labels:
app: nginx # 定义pod标签
spec:
containers:
- name: nginx
image: docker.io/library/nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
[root@k8s-master pods]# kubectl create -f rc-nginx.yaml
replicationcontroller/nginx created
(2)测试 Pod 数量控制
[root@k8s-master pods]# kubectl get po
NAME READY STATUS RESTARTS AGE
cluster-test-66bb44bd88-nk46t 1/1 Running 21 (40m ago) 5d10h
nginx-llt9n 1/1 Running 0 31s
nginx-nkblw 1/1 Running 0 31s
nginx-rtcjk 1/1 Running 0 31s
nginx0001 1/1 Running 0 59m
test001 1/1 Running 1 (160m ago) 4d1h
test007 0/1 Completed 0 85m
[root@k8s-master pods]# kubectl delete pod/nginx-llt9n //删除pod其中一个容器
pod "nginx-llt9n" deleted
[root@k8s-master pods]# kubectl get po //发现又新启动了一个容器
NAME READY STATUS RESTARTS AGE
cluster-test-66bb44bd88-nk46t 1/1 Running 21 (41m ago) 5d10h
nginx-dv8zq 1/1 Running 0 8s
nginx-nkblw 1/1 Running 0 85s
nginx-rtcjk 1/1 Running 0 85s
nginx0001 1/1 Running 0 60m
test001 1/1 Running 1 (161m ago) 4d1h
test007 0/1 Completed 0 86m
[root@k8s-master pods]# kubectl edit rc nginx //直接对rc控制的pod集作修改
replicationcontroller/nginx edited
[root@k8s-master pods]# kubectl get po //因为修改了复制集的数量,所以又新启动了一个同类容器
NAME READY STATUS RESTARTS AGE
cluster-test-66bb44bd88-nk46t 1/1 Running 21 (46m ago) 5d10h
nginx-dv8zq 1/1 Running 0 5m55s
nginx-nkblw 1/1 Running 0 7m12s
nginx-rtcjk 1/1 Running 0 7m12s
nginx-z9z6x 1/1 Running 0 2m33s
nginx0001 1/1 Running 0 66m
test001 1/1 Running 1 (167m ago) 4d1h
test007 0/1 Completed 0 92m
2. ReplicaSet
ReplicaSet,简称 RS,在 Kubernetes v1.2 版本,由旧的 Replication Controller 升级而来。与 RC 的主要区别在于,RS 支持基于集合的 Label Selector (标签选择器)功能。
RS 主要作用于 Deployment 协调创建、删除和更新Pod,在实际应用中,虽然 ReplicaSet 可以单独使用,但一般建议使用 Deployment 来自动管理 ReplicaSet,除非自定义的 Pod 不需要更新或有其他编排等。
RS 比 RC 具有更强大的功能及灵活性,所以如果只有这两种选择,建议选择 RS。
定义一个 ReplicaSet 的示例:
[root@k8s-master pods]# vim rs-nginx.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata: # 元数据
name: nginx # rs名称
spec: # 定义资源信息
replicas: 3 # 定义副本数量
selector: # 定义资源标签
matchLabels:
tier: nginx
matchExpressions: # matchLabels和matchExpressions可以通用,也可以选一中方式用
- {key: tier, operator: In, values: [nginx]} # 更高级的标签匹配形式,使用In操作符来匹配“tier”标签的值是否在给定的值列表中。具体来说,它正在查找“tier”标签的值为“nginx”的资源
template: # 定义pod信息
metadata:
name: nginx # pod名称
labels: # 定义pod标签
app: guestbook # 标签1
tier: nginx # 标签2
spec:
containers:
- name: nginx
image: docker.io/library/nginx:latest
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
[root@k8s-master pods]# kubectl create -f rs-nginx.yaml
replicaset.apps/nginx created
[root@k8s-master pods]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cluster-test-66bb44bd88-nk46t 1/1 Running 24 (29m ago) 5d13h
nginx-lm858 1/1 Running 0 5s
nginx-qsddf 1/1 Running 0 5s
nginx-rzjkd 1/1 Running 0 5s
nginx0001 1/1 Running 0 3h48m
二、无状态和有状态应用特性
1. 无状态应用
无状态应用:不将数据或应用状态存储到集群或永久性存储空间的应用。
常见的无状态应用包括 Web 服务器、负载均衡器、静态文件服务器等。
以 web 服务器为例:客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份,服务端不会保存任何客户端请求者信息。
无状态应用特点:
易于扩展:由于无状态应用不保存请求状态,因此可以轻松地将它们部署在多个服务器上,从而实现水平扩展。
高可用性:由于无状态应用的每个请求都是独立的,因此即使某个请求失败,也不会影响其他请求的处理。这有助于提高应用的可用性。
安全性:无状态应用通常不保存敏感数据,因此不太可能泄露敏感信息。
可替代性:由于无状态应用不保存请求状态,因此不同的服务器可以处理相同的请求,这意味着任何一个服务器都可以替代其他服务器来处理请求。
2. 有状态应用
有状态应用:应用程序的处理需要依赖特定的状态或数据存储。
“有状态应用”的例子有很多,比如 Redis、MySQL 这样的数据库,它们的“状态”就是在内存或者磁盘上产生的数据,是应用的核心价值所在,如果不能够把这些数据及时保存再恢复,那绝对会是灾难性的后果。
有状态应用特点:
依赖状态:应用程序的处理依赖于特定的状态信息。
数据持久化:有状态应用通常需要将状态数据持久化存储,以便后续请求可以访问和使用。
有序性:由于有状态应用处理请求时依赖先前的状态,因此请求之间的顺序可能很重要。
三、Deployment 无状态应用
在 Kubernetes 中,Deployment 是最常用的 Pod 控制器,一般用于部署企业内部的无状态服务(微服务居多),可利用 Deployment 的高级功能做到无缝迁移、自动扩缩容、自动容灾、一键回滚等功能。
1. 创建 Deployment
[root@k8s-master pods]# kubectl create deployment nginx --image=docker.io/library/nginx:latest --replicas=4 -o yaml --dry-run=client > nginx-dp.yaml
# 命令拆分
# kubectl:k8s命令工具
# create:新建一个k8s资源
# deploy:该资源类型为deployment
# nginx:该deploymet资源名为nginx
# --image=docker.io/library/nginx:latest:拉取本地镜像库的nginx镜像(详情请看镜像问题)
# --replicas=4:创建的pod数量
# -o yaml:输出为yaml格式
# --dry-run=client:不真正创建资源,仅预览该deployment资源的配置信息
# > nginx-dp.yaml:预览的配置信息输出到nginx-dp.yaml文件内
[root@k8s-master pods]# vim nginx-dp.yaml # 使用kubectl命令工具生成的deployment资源配置文件
apiVersion: apps/v1 # API版本,只能使用这个
kind: Deployment # 资源类型:deployment
metadata: # 元数据信息
creationTimestamp: null # 时间注解(没用)
labels: # 标签
app: nginx
name: nginx # 名称
spec: # deployment的配置信息
replicas: 4 # 创建pod的数量
selector: # 标签选择器,与template的label对应,apiVersion为apps/v1时必须指定该字段
matchLabels: # 匹配标签
app: nginx # 匹配这个标签
strategy: {} # pod的更新策略
template: # 定义pod资源配置
metadata: # 元信息
creationTimestamp: null
labels: # pod标签
app: nginx
spec: # 配置容器信息
containers:
- image: docker.io/library/nginx:latest
name: nginx
resources: {}
status: {}
2. 修改生成的 Deploy 文件
[root@k8s-master pods]# vim nginx-dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 4
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: docker.io/library/nginx:latest
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
[root@k8s-master pods]# kubectl create -f nginx-dp.yaml
deployment.apps/nginx created
[root@k8s-master pods]# kubectl get deployments.apps # 查看默认命名空间下deployment所有资源
NAME READY UP-TO-DATE AVAILABLE AGE
cluster-test 1/1 1 1 5d13h
nginx 4/4 4 4 26s
[root@k8s-master pods]# kubectl get pod #查看默认命名空间下的所有pods
NAME READY STATUS RESTARTS AGE
cluster-test-66bb44bd88-nk46t 1/1 Running 24 (53m ago) 5d13h
nginx-55d8987498-bgqs9 1/1 Running 0 76s
nginx-55d8987498-j749x 1/1 Running 0 76s
nginx-55d8987498-j7k9j 1/1 Running 0 76s
nginx-55d8987498-xk9pw 1/1 Running 0 76s
[root@k8s-master pods]# kubectl rollout status deployment nginx # 查看整个deployment创建状态
deployment "nginx" successfully rolled out
[root@k8s-master pods]# kubectl get rs -l app=nginx # 查看deployment对应的replicaSet,-l指定标签
NAME DESIRED CURRENT READY AGE
nginx-55d8987498 4 4 4 4m31s
3.测试副本数量控制机制
删除一个 deployment 的 pod
[root@k8s-master pods]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cluster-test-66bb44bd88-nk46t 1/1 Running 24 (58m ago) 5d14h
nginx-55d8987498-bgqs9 1/1 Running 0 6m3s
nginx-55d8987498-j749x 1/1 Running 0 6m3s
nginx-55d8987498-j7k9j 1/1 Running 0 6m3s
nginx-55d8987498-xk9pw 1/1 Running 0 6m3s
[root@k8s-master pods]# kubectl delete po nginx-55d8987498-bgqs9
pod "nginx-55d8987498-bgqs9" deleted
再次查看
[root@k8s-master pods]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cluster-test-66bb44bd88-nk46t 1/1 Running 24 (59m ago) 5d14h
nginx-55d8987498-57msw 1/1 Running 0 22s #创建了一个新的
nginx-55d8987498-j749x 1/1 Running 0 7m2s
nginx-55d8987498-j7k9j 1/1 Running 0 7m2s
nginx-55d8987498-xk9pw 1/1 Running 0 7m2s