前言:
調度約束,即創建的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