前言:
调度约束,即创建的pod节点可以指定
kubernetes通过warch的机制进行每个组件的协作,每个组件之间的设计实现了解耦
一:K8S的工作流程图
流程概述:
控制器放在etcd和scheduler中间
1.创建pod时,会把命令中的pod的属性信息写入到etcd中,记录pod元信息
2.etcd会把信息记录完成的结果告诉api
3.api会把创建pod的告知给scheduler,要求调度分配
4.scheduler会给后端打分,将优先级高的node与pod绑定,bind pod
5.这时会把信息转告给api,node节点IP也知道了,api会把信息写入到etcd,node的地址,pod的节点信息
6.etcd告诉api自己已记录
7.api去调用kubelet,分配dockerIP地址,
8.开始docker run,镜像
9.完成后会反馈给kubelet
10.kubelet会把状态属性告诉api
11.api又将收到的信息写入到etcd中,pod的状态信息
12.etcd反馈已写入
13.再去找kubelet
此时再用kubectl get pods 去找etcd
二:scheduler调度方式
- nodeName用于将Pod调度到指定的node名称上(跳过调度器直接分配)
- nodeSelector用于将pod调度到匹配label的node上
2.1 nodeName演示
2.1.1 编写yaml文件,其中指定nodename
[root@master1 ~]# vim nodename.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: nginx
spec:
nodeName: 192.168.247.144
containers:
- name: nginx
image: nginx:1.15
2.1.2 启动
[root@master1 ~]# kubectl apply -f nodename.yaml
pod/pod-example created
[root@master1 ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
pod-example 0/1 ContainerCreating 0 8s
pod-example 1/1 Running 0 25s
2.1.3 查看描述信息中的详细事件,没有经过调度器
[root@master1 ~]# kubectl describe pod pod-example
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pulling 2m3s kubelet, 192.168.247.144 pulling image "nginx:1.15"
Normal Pulled 100s kubelet, 192.168.247.144 Successfully pulled image "nginx:1.15"
Normal Created 99s kubelet, 192.168.247.144 Created container
Normal Started 99s kubelet, 192.168.247.144 Started container
2.1.4 查看网络
[root@master1 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
pod-example 1/1 Running 0 2m45s 172.17.42.2 192.168.247.144 <none>
2.2 nodeSelector选择器
标签需要经过调度器
2.2.1 使用label标签给节点打标签
[root@master1 ~]# kubectl label --help
Usage:
kubectl label [--overwrite] (-f FILENAME | TYPE NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--resource-version=version]
[options]
2.2.2 查看node节点名称
[root@master1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
192.168.247.143 Ready <none> 13d v1.12.3
192.168.247.144 Ready <none> 13d v1.12.3
2.2.3 依据名字,给node打标签
[root@master1 ~]# kubectl label nodes 192.168.247.143 gsy=01
node/192.168.247.143 labeled
[root@master1 ~]# kubectl label nodes 192.168.247.144 gsy=02
node/192.168.247.144 labeled
2.2.4 查看标签:
[root@master1 ~]# kubectl get nodes --show-labels
NAME STATUS ROLES AGE VERSION LABELS
192.168.247.143 Ready <none> 13d v1.12.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gsy=01,kubernetes.io/hostname=192.168.247.143
192.168.247.144 Ready <none> 13d v1.12.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,gsy=02,kubernetes.io/hostname=192.168.247.144
2.2.5 编写yaml文件
[root@master1 ~]# vim nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-example
labels:
app: nginx
spec:
nodeSelector:
gsy: 01
containers:
- name: nginx
image: nginx:1.15
[root@master1 ~]# kubectl apply -f nodeselector.yaml
for: "nodeselector.yaml": cannot convert int64 to string
2.2.6 出现报错,换个标签
发现可以,证明标签不能这么写
[root@master1 ~]# kubectl label nodes 192.168.247.143 shl=one
node/192.168.247.143 labeled
[root@master1 ~]# vim nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod8
labels:
app: nginx
spec:
nodeSelector:
shl: one
containers:
- name: nginx
image: nginx:1.15
[root@master1 ~]# kubectl apply -f nodeselector.yaml
pod/pod8 created
[root@master1 ~]# kubectl get pods -w -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
pod-example 1/1 Running 0 30m 172.17.42.2 192.168.247.144 <none>
pod8 1/1 Running 0 27s 172.17.45.2 192.168.247.143 <none>
2.2.7 查看详细事件
[root@master1 ~]# kubectl describe pod pod8
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 114s default-scheduler Successfully assigned default/pod8 to 192.168.247.143
Normal Pulling 114s kubelet, 192.168.247.143 pulling image "nginx:1.15"
Normal Pulled 97s kubelet, 192.168.247.143 Successfully pulled image "nginx:1.15"
Normal Created 97s kubelet, 192.168.247.143 Created container
Normal Started 97s kubelet, 192.168.247.143 Started container
标签需要经过调度器
2.2.8 再测试node原有的标签是否可行
[root@master1 ~]# vim 1nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod9
labels:
app: nginx
spec:
nodeSelector:
kubernetes.io/hostname: 192.168.247.144
containers:
- name: nginx
image: nginx:1.15
[root@master1 ~]# kubectl get pods
[root@master1 ~]# kubectl apply -f 1nodeselector.yaml
pod/pod9 created
[root@master1 ~]# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
pod9 1/1 Running 0 12s
[root@master1 ~]# kubectl describe pod pod9
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 33s default-scheduler Successfully assigned default/pod9 to 192.168.247.144
Normal Pulled 32s kubelet, 192.168.247.144 Container image "nginx:1.15" already present on machine
Normal Created 32s kubelet, 192.168.247.144 Created container
Normal Started 32s kubelet, 192.168.247.144 Started container