11. 搭建一個完整的Kubernetes集群
1. kubectl的命令遵循分類的原則(重點)
語法1:
kubectl
動作
類
具體的對象
例如:
""" kubectl describe node master describe 描述,相當於語法中的動作 node node資源,相當於語法中的類,對某一類資源的統稱 master node資源中的一個叫master資源,相當於語法中的具體對象 """
語法2:
kubectl
動作
類
大范圍參數
細化參數
...例如:
""" kubectl get pods -n kube-system -o wide -n 表示 namespace(命名空間) kube-system 表示 多個命名空間中的一個命名空間 -o wide 更加全面的展示信息 """
2. Master節點是通過什么技術來限制用戶不允許運行用戶自己的pod的?
默認情況下 Master 節點是不允許運行用戶 Pod 的。而 Kubernetes 做到這一點,依靠的是 Kubernetes 的 Taint/Toleration 機制。
它的原理非常簡單:一旦某個節點被加上了一個 Taint(污點),即被“打上了污點”,那么所有 Pod 就都不能在這個節點上運行,因為 Kubernetes 的 Pod 都有“潔癖”。
除非,有個別的 Pod 聲明自己能“容忍”這個“污點”,即聲明了 Toleration,它才可以在這個節點上運行。
其中,為節點打上“污點”(Taint)的命令是:
kubectl taint nodes node1 foo=bar:NoSchedule
這時,該 node1 節點上就會增加一個鍵值對格式的 Taint,即:foo=bar:NoSchedule。其中值里面的 NoSchedule,意味着這個 Taint 只會在調度新 Pod 時產生作用,而不會影響已經在 node1 上運行的 Pod,哪怕它們沒有 Toleration。
那么 Pod 又如何聲明 Toleration 呢?
我們只要在 Pod 的.yaml 文件中的 spec 部分,加入 tolerations 字段即可:
apiVersion: v1 kind: Pod ... spec: tolerations: - key: "foo" operator: "Equal" value: "bar" effect: "NoSchedule"
這個 Toleration 的含義是,這個 Pod 能“容忍”所有鍵值對為 foo=bar 的 Taint( operator: “Equal”,“等於”操作)。
現在回到我們已經搭建的集群上來。這時,如果你通過 kubectl describe 檢查一下 Master 節點的 Taint 字段,就會有所發現了:
$ kubectl describe node master Name: master Roles: master Taints: node-role.kubernetes.io/master:NoSchedule
可以看到,Master 節點默認被加上了
node-role.kubernetes.io/master:NoSchedule
這樣一個“污點”,其中“鍵”是node-role.kubernetes.io/master
,而沒有提供“值”此時,你就需要像下面這樣用“Exists”操作符(operator: “Exists”,“存在”即可)來說明,該 Pod 能夠容忍所有以 foo 為鍵的 Taint,才能讓這個 Pod 運行在該 Master 節點上:
apiVersion: v1 kind: Pod ... spec: tolerations: - key: "foo" operator: "Exists" effect: "NoSchedule"
當然,如果你就是想要一個單節點的 Kubernetes,刪除這個 Taint 才是正確的選擇:
$ kubectl taint nodes --all node-role.kubernetes.io/master-
如上所示,我們在“
node-role.kubernetes.io/master
”這個鍵后面加上了一個短橫線“-”,這個格式就意味着移除所有以“node-role.kubernetes.io/master
”為鍵的 Taint