kubeadmを使ったクラスタ作成時にクラスタ名を設定する。
何がしたいの?
kubectl config get-clusters
を実行すると、設定済みkubeconfigに登録されているKubernetesクラスタ一覧が表示される。
EKSやAKS、kindを使っていれば、クラスタ作成時に指定した名称が表示される。
kubeadmだと、特にクラスタ名を指定しない場合は
[zaki@cloud-dev ~]$ kubectl config get-clusters NAME kubernetes
と、なる。
クラスタが一つだとさほど問題ないけど、クラウドサービスのK8sなどで複数のクラスタを使い始めるとイマイチなのと、「kubeadm使って2個目のクラスタをデプロイ」すると、名前が無いと区別がつかない。
ということで今回のゴールは、
[zaki@cloud-dev ~]$ kubectl config get-clusters NAME my-kubeadm-cluster
というように指定したクラスタ名でKubernetesクラスタをデプロイすること。
設定方法
kubeadm init --help
を見た感じだと、kubeadm init
のオプションに該当機能(--clustername
みたいなFlag)は、現バージョンでは提供されてない。
「指定できない?そんなわけないやろー?」と思ってドキュメント見てると、--config <YOUR CONFIG FILE>
を使ったYAMLの設定ファイルを指定する方法があり、kubeadmのAPIのドキュメントみると、こんな感じの設定でいけそう。
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration # [...] clusterName: "example-cluster"
ちなみに、kube-controller-managerのドキュメントを見ると、
--cluster-name string Default: "kubernetes"
という記載はあるので、この辺りの機能で指定されると思われ。
既存のオプションもkubeadm config YAMLに設定
普段kubeadm init
を実行するとき、手元の環境では大体こんなオプション使ってる。
--pod-network-cidr
--control-plane-endpoint
--upload-certs
kubeadm init --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=master.example.org --upload-certs
ただ、pod-network-cidrとcontrol-plane-endpointは--config <YOUR CONFIG FILE>
と併用はできない。
調べきれてないけど、YAMLで指定可能な設定はコマンドラインオプションで指定できないような雰囲気。
[zaki@k8s-master01 ~]$ kubeadm init --config kubeadmconfig.yaml --pod-network-cidr=10.244.0.0/16 --control-plane-endpoint=master.example.org --upload-certs can not mix '--config' with arguments [control-plane-endpoint pod-network-cidr]
逆に--upload-certs
はYAMLに設定無いので従来通りオプション指定する。
というわけで、上のオプションをYAMLで設定するには
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration controlPlaneEndpoint: master.example.org clusterName: example-cluster networking: podSubnet: 10.244.0.0/16
というファイルを用意し、
$ kubeadm init --config configure.yaml" --upload-certs
を実行すればOK
標準の設定YAMLの取得
以下を実行すると表示される。
$ kubeadm config print init-defaults
現バージョン(v1.18.5)の場合以下の通り。
nodeRegistration.name
辺りは、実行してるノード情報などから取得している模様。
apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 1.2.3.4 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master01.esxi.jp-z.jp taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: k8s.gcr.io kind: ClusterConfiguration kubernetesVersion: v1.18.0 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 scheduler: {}
ちなみに現バージョンではkubeadm init
のオプションの--control-plane-endpoint
でコントロールプレーンノードをHA構成にしてロードバランスするサーバーを指定するが、v1.15まで遡るとこのオプションがないっぽくてYAML指定するような内容のドキュメントになっている。
以下引用
apiVersion: kubeadm.k8s.io/v1beta2 kind: ClusterConfiguration kubernetesVersion: stable controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT"
なので将来的にはkubeadm init
のオプションでもクラスタ名が指定可能になるんじゃないかなーと勝手に思ってる。
(参考)構築後のコンテキスト名のリネーム
コンテキスト名の変更であれば、KUBECONFIGの設定をリネームする方法も。
[zaki@cloud-dev ~]$ kubectl config get-clusters NAME kubernetes [zaki@cloud-dev ~]$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * kubernetes-admin@kubernetes kubernetes kubernetes-admin
この設定状態のときに
[zaki@cloud-dev ~]$ kubectl config rename-context kubernetes-admin@kubernetes my-k8s Context "kubernetes-admin@kubernetes" renamed to "my-k8s".
すると
[zaki@cloud-dev ~]$ kubectl config get-contexts CURRENT NAME CLUSTER AUTHINFO NAMESPACE * my-k8s kubernetes kubernetes-admin [zaki@cloud-dev ~]$ kubectl config get-clusters NAME kubernetes
となる。
環境
[zaki@k8s-master01 ~]$ kubeadm version kubeadm version: &version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:45:16Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Ansible自動化の実装例
template
使ってYAML生成してkubeadm init
実行する感じ。