50. Manual Scheduling


kube-scheduler 的情況下,我們可以在 pod definition YAML 裡面定義 pod.spec.nodeName: <worker node name> 來把 pod 放在指定 worker node。
沒有 kube-scheduler 的情況下,必須要以 json 格式 POST 到 api-server。BTW,我找不到 docs 耶 = =


pod_binding

▲ 使用 curl


69. DaemonSets


daemondset 能夠確保每一個 node 都有一個 pod 運作,當 node join cluster 的時候會被新增,反之亦然。
在 Kubernetes v1.12 之前, daemondset 的實作方式是透過 nodeSelector,之後是透過 NodeAffinity and default scheduler。


daemondset_kube_proxy

kube-proxy 就是一個使用的例子。


72. Static Pods


示範在沒有 control plane (包含 api-server) 的情況下,如何在 worker node 建立 pod。 (只能建立 pod)
只要把 pod-definition.yml 放在 /etc/kubernetes/manifests/ (預設) 這個資料夾底下 kubelet 就會幫我們建立 pod,任何刪除及異動都會被執行。


static_pod_0

▲ 預設路徑是可以被更改的。


static_pod_1

▲ 或者傳送 config file 進去。


static_pod_2

static pod 也可以被 kubectl get 到,不過 kubectl 並沒辦法去 edit/delete static pod。
原理是當 kubelet 建立 static pod 時會建立一個 mirror podapi-server 上。 詳情 Create static Pods


static_pod_3

使用情形就是 control plane 上面的元件 (例如: api-server, etcd, controller-manager) (以 kubeadm 來說)


static_pod_4

Static PODs DaemonSets
kubelet 發起建立 api-server 發起建立 (DaemonSet controller)
用途: 部屬 control plane 所需元件 用途: 部屬 monitoring agent, logging agent
都被 kube-scheduler 忽略 都被 kube-scheduler 忽略

▲ static pod 與 daemonset 的差異


75. Multiple Schedulers


Kubernetes 允許多個 kube-scheduler 同時存在 (使用者可以自行設計不同邏輯的 scheduler)。
下面截取 /etc/kubernetes/manifests/kube-scheduler.yaml 重要片段解釋


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
  labels:
    component: kube-scheduler
    tier: control-plane
  name: kube-scheduler
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
    - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
    - --bind-address=127.0.0.1
    - --kubeconfig=/etc/kubernetes/scheduler.conf
    - --leader-elect=false
    - --port=0
    image: k8s.gcr.io/kube-scheduler:v1.20.7
  • 預設沒有給定 --scheduler-name= 的話就是叫 default-scheduler若要擁有第二個 kube-scheduler 的話就必須改名子
  • --leader-elect=true 是當有 multi master 時 (意味者有 multi kube-scheduler) 只能選一台當作 master,其餘作為備援。
  • 指定 pod 使用某個 scheduler 的話可以在 pod.spec.schedulerName 給定 scheduler name。

custom scheduler

1
2
3
4
- --leader-elect=false
- --port=58787
- --scheduler-name=my-scheduler
- --secure-port=0

/etc/kubernetes/manifests/kube-scheduler.yaml 複製出來,想要建立一個不同名子的 scheduler 需要改的東西如上。還有 pod name

  • --port 改成一個沒有被使用的。
  • --secure-port 預設 scheduler 會使用 10259 來提供 HTTPS authentication and authorization,把它改成 0 來 disabled。

1
2
3
4
5
## show event
kubectl get events -n kube-system

## show scheduler logs
kubectl logs -n kube-system kube-scheduler-mini-k8s