前言
Pod 代表了 Kubernetes 中的基本部署单元;在实际用例中,我们希望部署能自动保持运行,并且保持健康,无需人工干预,要做到这一点,我们几乎不会手动创建 pod,而是创建 RepicationController 这种资源,由它们创建并管理实际的 pod。
ReplicationController
ReplicationController(简称 RC)也是一种 Kubernetes 资源,可以确保它的 pod 始终保持运行状态,如果 pod 因为任何原因消失,则 RC 都会注意到缺少了 pod 并创建替代 pod。
RC 会持续监控运行的 pod 列表,并保证相应类型(匹配 label selector)的 pod 的数量与期望相符,多删少补。
RC 分为三部分
- label selector,标签选择器,用于确定 RC 管理的 pod
- replica count,副本个数,指定运行 pod 的数量
- pod template,pod 模板,用于创建新的 pod
RC 可以保证一定数量的 pod 副本正在运行;当节点故障,也会在正常节点上创建新的 pod 副本;通过更改副本个数,也可以实现 pod 的水平伸缩。
创建 RC
创建 yaml
rc_test.yaml,// 注释内容实际文件中不应该存在
apiVersion: v1
kind: ReplicationController // 定义了 RC 资源
metadata:
name: rc-nginx // RC 资源名称
spec:
replicas: 3 // 副本数量
selector:
app: rc-nginx // RC 操作对象 pod 选择器,label
template: // pod 模板
metadata:
labels:
app: rc-nginx
spec:
containers:
- name: rc-nginx
image: nginx
ports:
- containerPort: 80
affinity: // 设置反亲和性,让 pod 不在一个 node
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- rc-nginx
topologyKey: kubernetes.io/hostname
kubectl 应用 yaml 文件
$ kubectl apply -f rc_test.yaml
replicationcontroller/rc-nginx created
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rc-nginx-4mfvn 1/1 Running 0 13m 10.244.1.39 worker <none> <none>
rc-nginx-cf5mx 1/1 Running 0 13m 10.244.0.11 master <none> <none>
rc-nginx-rflp4 1/1 Running 0 13m 10.244.2.8 worker2 <none> <none>
查看 RC
查看 selector,Labels,副本数和当前 pod 装填。
$ kubectl describe rc rc-nginx
Name: rc-nginx
Namespace: default
Selector: app=rc-nginx
Labels: app=rc-nginx
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=rc-nginx
Containers:
rc-nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 12m replication-controller Created pod: rc-nginx-vjwsf
删除 Pod
删除其中一个 pod,会重新创建一个,保持 pod 副本数量为 3。
$ kubectl delete pod rc-nginx-4mfvn
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rc-nginx-cf5mx 1/1 Running 0 61m 10.244.0.11 master <none> <none>
rc-nginx-rflp4 1/1 Running 0 61m 10.244.2.8 worker2 <none> <none>
rc-nginx-vjwsf 1/1 Running 0 21s 10.244.1.40 worker <none> <none>
水平伸缩 RC
直接修改 RC
$ kubectl edit rc rc-nginx
直接修改副本数量
scale
$ kubectl scale rc rc-nginx --replicas=2
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rc-nginx-cf5mx 1/1 Running 0 80m 10.244.0.11 master <none> <none>
rc-nginx-rflp4 1/1 Running 0 80m 10.244.2.8 worker2 <none> <none>
删除 RC
删除 RC 后删除所有 pod,如果想保留 pod,可以 --cascade=false
$ kubectl delete rc rc-nginx
$ kubectl get pods -o wide
No resources found in default namespace.
ReplicaSet
ReplicaSet (RS) 行为与 RC 完全相同,但 pod 选择器的表达能力更强,RS 相较于 RC 允许匹配缺少某个标签的 pod,或包含特定标签名的 pod,不管其值如何。
例如 pod 的 selector,可以使用 matchLabels。
创建 RS
创建 yaml
rs_test.yaml,// 注释内容实际文件中不应该存在
apiVersion: apps/v1 // API 版本
kind: ReplicaSet
metadata:
name: rs-nginx
spec:
replicas: 3
selector:
matchLabels:
app: rs-nginx // pod Selector 为 matchLabels
template:
metadata:
labels:
app: rs-nginx
spec:
containers:
- name: rs-nginx
image: nginx
ports:
- containerPort: 80
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- rc-nginx
topologyKey: kubernetes.io/hostname
apply rs_test.yaml
$ kubectl apply -f rs_test.yaml
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
rs-nginx-mwrmp 1/1 Running 0 27s 10.244.1.44 worker <none> <none>
rs-nginx-tgkkf 1/1 Running 0 27s 10.244.0.14 master <none> <none>
rs-nginx-v8tlf 1/1 Running 0 27s 10.244.2.11 worker2 <none> <none>
查看 RS
$ kubectl describe rs rs-nginx
Name: rs-nginx
Namespace: default
Selector: app=rs-nginx
Labels: <none>
Annotations: <none>
Replicas: 3 current / 3 desired
Pods Status: 3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
Labels: app=rs-nginx
Containers:
rs-nginx:
Image: nginx
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulCreate 66s replicaset-controller Created pod: rs-nginx-mwrmp
Normal SuccessfulCreate 66s replicaset-controller Created pod: rs-nginx-v8tlf
Normal SuccessfulCreate 66s replicaset-controller Created pod: rs-nginx-tgkkf
rolling-update
一般建议使用 Deployment 来自动管理 ReplicaSet,ReplicaSet 不支持 rolling-update 但 Deployment 支持。
TS
默认情况下,是不允许在 master 节点上进行 pod 调度创建,因为在 master 节点上设置了污点;
$ kubectl describe node master
Taints: node-role.kubernetes.io/master:NoSchedule
去掉污点
$ kubectl taint node master node-role.kubernetes.io/master-