zaki work log

作業ログやら生活ログやらなんやら

[Kubernetes / kubeadm]クラスタ名を指定してK8sデプロイ(kubeadm config YAML)

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-certsYAMLに設定無いので従来通りオプション指定する。

というわけで、上のオプションを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自動化の実装例

github.com

github.com

template使ってYAML生成してkubeadm init実行する感じ。