使用kubeadm建立指定clusterName的Kubernetes叢集
早期經驗不足,對於 Kubernetes 的一切,一開始大多會採用預設值來進行組態設定,也因此踩了很多雷,對預設值的雷(例如 Calico IPPool 沒規劃好這件事)。另外如題碰到的問題是,我們早期建置的 Kubernetes 叢集,在導入一些工具後發現,每個名稱 Kubernetes 叢集名稱預設都是一模一樣的叫作 kubernetes,這在管理上就帶來了不便,從名稱上根本分不出,這個是測試區還是正式區的Kubernetes叢集。
也因此,這裡會分成兩集:
- 如果是重頭新建立的 Kubernetes 叢集,我們應該怎麼指定 Kubernetes 叢集名稱。
- 如果是已經建立好的 Kubernetes 叢集,我們應該如何修改 Kubernetes 叢集名稱。
在 kubeadm init 指定 clusterName
kubeadm init 是初始化 Kubernetes 叢集。它本身可以指定許多參數,例如看過很多次的:
sudo kubeadm init --apiserver-advertise-address=192.168.56.10 --pod-network-cidr=192.168.0.0/16
比較可惜是沒有一個參數能直接指定如 --clusterName TestK8s 這樣的值。但在文件中也有提到,kubeadm 能透過組態檔來做組態設定,我們試著走這條路。
首先,kubeadm 可以透過以下指令取得 init 組態預設值:
# https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-config/
$ sudo kubeadm config print init-defaults
# 省略
---
# 精簡過內容
apiVersion: kubeadm.k8s.io/v1beta4
clusterName: kubernetes
kind: ClusterConfiguration
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
在這裡我們得到幾個重要的資訊:
kind: ClusterConfiguration
clusterName: kubernetes
看起來是有機會從組態指定 clusterName,我們試著製作一個 kubeadm-config.yml
# 也能匯出來修改
# $ sudo kubeadm config print init-defaults > kubeadm-config.yml
$ vim kubeadm-config.yml
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
clusterName: TestK8s
$ sudo kubeadm init --apiserver-advertise-address=192.168.56.10 --pod-network-cidr=192.168.0.0/16 --config kubeadm-config.yaml --dry-run
can not mix '--config' with arguments [apiserver-advertise-address pod-network-cidr]
錯誤訊息很明確的說了,用了 --config 參數之後就不能混合其他參數來一起使用。kubeadm config print init-defaults 輸出並沒有如 pod-network-cidr 預設值,還好在 kubeadm-config.v1beta4 找到可以參考的範例。
讓我們接著修改:
$ vim kubeadm-config.yml
apiVersion: kubeadm.k8s.io/v1beta4
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: {your apiserver-advertise-address}
---
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
clusterName: TestK8s
networking:
podSubnet: {your pod-network-cidr}
--apiserver-advertise-address=192.168.56.10 一般在單網卡單 IP 的情況下是可以省略。但習慣了,我還是把它轉進 kubeadm-config.yml 裡。
$ sudo kubeadm init --config kubeadm-config.yaml --dry-run
unable to read config from "kubeadm-config.yaml" : open kubeadm-config.yaml: no such file or directory
# 非常長,長到輸出看不到我們想看的資訊,因此我們輸出日誌來檢查
$ sudo kubeadm init --config ~kkbruce/kubeadm-config.yml --dry-run > RunKubeadmLogger.txt
這裡注意一下,--config path 的路徑不能是相對路徑,這裡讓我卡了一下。另外,我們使用了 --dry-run 來協助我們測試指令而不生效,這點很重要。如此,我們就能在日誌中檢查組態的套用是否如你所願:
# 省略
[dryrun] Attached object:
apiVersion: v1
data:
ClusterConfiguration: |
clusterName: TestK8s
networking:
dnsDomain: cluster.local
podSubnet: 192.168.0.0/16
serviceSubnet: 10.96.0.0/12
proxy: {}
scheduler: {}
kind: ConfigMap
# 省略
確定 clusterName 與 podSubnet 都沒有問題之後,正式執行 kubeadm init 看看:
$ sudo kubeadm init --config ~brucechen/kubeadm-config.yml
$ kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://172.19.4.106:6443
name: TestK8s
contexts:
- context:
cluster: TestK8s
user: kubernetes-admin
name: kubernetes-admin@TestK8s
current-context: kubernetes-admin@TestK8s
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
完成之後,不用等設定 Pod Network,直接進行 kubectl config view 就能看到現在 Kubernetes 叢集的 clusterName 會是你所設定的名稱。
沒有留言:
張貼留言
感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。