Kubernetes基础--Pod控制器

TOC
  1. 1. ReplicationController
    1. 1.1. ReplicationController 操作
    2. 1.2. ReplicationController 和 Pod 的关系
    3. 1.3. ReplicationController 的删除
  2. 2. ReplicaSet
    1. 2.1. ReplicaSet 操作
  3. 3. DaemonSet
    1. 3.1. DaemonSet 操作

ReplicationController

ReplicationController 可以保证它的 Pod 始终保持在运行状态。ReplicationController 的工作是确保 Pod 的数量始终与其标签选择器匹配,如果不匹配,ReplicationController 会采取适当的操作来协调 Pod 的数量。一个 ReplicationController 有三部分:

  • label selector(标签选择器),用于确定 ReplicationController 作用域有哪些 Pod
  • replica count(副本个数),指定应运行的 pod 数量
  • pod template(pod 模板)。用于创建新的 pod 副本
    ReplicationController 的副本个数、标签选择器,甚至是 pod 模板都能随时修改,但只有副本数量变更才会影响现有 pod。

ReplicationController 操作

首先创建 YAML 文件,replicas 表示创建 2 个 pod,selector 表示标签选择器选择的标签。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: ReplicationController
metadata:
name: kubia
spec:
replicas: 2
selector:
app: kubia
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: tutum/hello-world
ports:
- containerPort: 80

然后使用已有命令创建 rc

1
kubectl create -f kubia-rc.yaml

查看 Pod,发现已经存在两个 Pod,此时删除一个 Pod,RC 会创建一个新的 Pod。

1
2
3
4
5
6
7
8
9
10
master@master:/data/k8s/conf$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubia-98g42 1/1 Running 0 3m5s
kubia-9ppzm 1/1 Running 0 3m5s
master@master:/data/k8s/conf$ kubectl delete po kubia-98g42
pod "kubia-98g42" deleted
master@master:/data/k8s/conf$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubia-9ppzm 1/1 Running 0 6m44s
kubia-xvhqd 0/1 ContainerCreating 0 5s

查看 k8s 中所有 rc

1
2
3
master@master:/data/k8s/conf$ kubectl get rc
NAME DESIRED CURRENT READY AGE
kubia 2 2 2 8m2s

ReplicationController 和 Pod 的关系

Pod 并没有绑定到 ReplicationController,ReplicationController 只管理与标签选择器匹配的 Pod。通过修改 Pod 的标签,可以将 Pod 从 ReplicationController 作用域中添加或删除。如果更改了一个 Pod 的标签,不在与 ReplicationController 的标签选择器匹配,那该 Pod 和其他手动创建的 Pod 相同,如果该 Pod 终止,也不会重新调度。ReplicationController 发现 Pod 丢失后,会启动新的 Pod 替代它。
还可以使用一下命令修改当前 ReplicationController 的配置。

1
kubectl edit rc kubia

该命令会在默认文本编辑器中打开 ReplicationController 的 YAML 配置文件,修改保存后,会自动更新。

ReplicationController 的删除

使用 kubectl delete 命令会删除 ReplicationController 和管理的 Pod,可以通过添加–cascade=false 参数避免删除 Pod

1
2
3
4
5
6
7
master@master:/data/k8s/conf$ kubectl delete rc kubia --cascade=false
replicationcontroller "kubia" deleted
master@master:/data/k8s/conf$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kubia-9ppzm 1/1 Running 0 21m
kubia-xvhqd 1/1 Running 0 15m

ReplicaSet

ReplicaSet 是替换 ReplicationController 的调度组件。ReplicaSet 和 ReplicationController 完全相同,但是 ReplicaSet 的 Pod 选择器表达能力更强,ReplicaSet 允许匹配缺少某个标签的 Pod,包含特定标签名的 Pod。

ReplicaSet 操作

新建 ReplicaSet 的 YAML 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: kubia
spec:
replicas: 2
selector:
matchLabels:
app: kubia
template:
metadata:
labels:
app: kubia
spec:
containers:
- name: kubia
image: tutum/hello-world

DaemonSet

一个 DaemonSet 对象能确保其创建的 Pod 在集群中的每一台(或指定)Node 上都运行一个副本。如果集群中动态加入了新的 Node,DaemonSet 中的 Pod 也会被添加在新加入 Node 上运行。删除一个 DaemonSet 也会级联删除所有其创建的 Pod。

DaemonSet 操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
nodeSelector:
disk: ssd
containers:
- name: main
image: tutum/hello-world

创建 DaemonSet

1
2
master@master:/data/k8s/conf$ kubectl create -f daemonset.yaml
daemonset.apps/ssd-monitor created

此时查看 DaemonSet,会发现创建了 0 个 Pod,此时查看 Pod 的数量也是 0。因为 DaemonSet 会检测所有的节点,如果节点的标签是 ssd,那就会把 Pod 部署上去。

1
2
3
4
5
master@master:/data/k8s/conf$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ssd-monitor 0 0 0 0 0 disk=ssd 15s
master@master:/data/k8s/conf$ kubectl get pods
No resources found in default namespace.

向节点上添加标签:

1
2
3
4
5
6
7
8
9
10
11
master@master:/data/k8s/conf$ kubectl get node
NAME STATUS ROLES AGE VERSION
minikube Ready master 5d13h v1.18.0
master@master:/data/k8s/conf$ kubectl label node minikube disk=ssd
node/minikube labeled
master@master:/data/k8s/conf$ kubectl get pods
NAME READY STATUS RESTARTS AGE
ssd-monitor-m59rf 1/1 Running 0 11s
master@master:/data/k8s/conf$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ssd-monitor 1 1 1 1 1 disk=ssd 12m

从节点上删除/修改标签,DaemonSet 也会删除该节点上的 Pod

1
2
3
4
5
6
7
master@master:/data/k8s/conf$ kubectl label node minikube disk=hdd --overwrite
node/minikube labeled
master@master:/data/k8s/conf$ kubectl get pods
No resources found in default namespace.
master@master:/data/k8s/conf$ kubectl get ds
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ssd-monitor 0 0 0 0 0 disk=ssd 14m