Kubernetes 1.10.2でノードを別のクラスタに再参加
目次
概要
Kubernetesのノードがクラスタに参加した後で、一度既存のクラスタから離脱して、 別のクラスタに参加させるための手順です。
AWSのEC2を利用して1マスタ、2ノードのKubernetesクラスタを構築していたのですが、 ちょっとしたミスでマスタサーバのLinuxが起動しなくなってしまいました。 そこでマスタサーバをゼロから再セットアップしたのですが、これまでとは別の 新規のクラスタとして構成されるため、2台のノードは新規のマスタサーバから認識されない状態になりました。 そこで、ノードのKubernetesをリセットして、新規のクラスタに参加させました。その時の手順です。
構成
利用環境
サーバ環境はAWS(Amazon Web Services)のEC2インスタンスを利用しました。 サーバのスペックは以下のとおりです。
項目 | 内容 |
---|---|
AMI | CentOS 7 (x86_64) - with Updates HVM |
インスタンスタイプ | t2.micro |
vCPU | 1 |
メモリ | 1GiB |
ディスク | 汎用SSD(GP2) 8GiB |
リージョン | 日本 |
サーバ構成
OSバージョン
CentOS 7.5.1804 x86_64
ソフトウェア・パッケージ一覧
- docker-1.13.1-58.git87f2fab.el7.centos.x86_64.rpm
- 32e8bd812a3944ccf07750d52088a118fa11493d34e009e2873317e0f0b0dfd2-kubectl-1.10.2-0.x86_64.rpm
- b754a6990af7d7012189610b0dc69e6e950c13a8c415b9ebea8d56352e9719fd-kubeadm-1.10.2-0.x86_64.rpm
- bdee083331998c4631bf6653454c584fb796944fe97271906acbaacbf340e1d5-kubelet-1.10.2-0.x86_64.rpm
環境構築
ノードでクラスタからの離脱(Kubernetesのリセット)
Kubernetesのリセット
kubeadmコマンドで既存のKubernetes環境をリセットします。
$ sudo su - Last login: Thu Jun 7 07:03:46 UTC 2018 on pts/0 # kubeadm reset [preflight] Running pre-flight checks. [reset] Stopping the kubelet service. [reset] Unmounting mounted directories in "/var/lib/kubelet" [reset] Removing kubernetes-managed containers. [reset] No etcd manifest found in "/etc/kubernetes/manifests/etcd.yaml". Assuming external etcd. [reset] Deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/dockershim /var/run/kubernetes] [reset] Deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki] [reset] Deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
Dockerコンテナの停止を確認
Kubernetesの環境をリセットしたことで、これまで起動していたFlannelなどのDockerコンテナが停止していることを確認します。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ノードをクラスタへ参加
ノードをクラスタへ参加
マスタサーバで kubeadm init を実行したときに表示されたクラスタへの参加コマンド(kubeadm join)を実行します。
# kubeadm join 172.31.31.100:6443 --token k1hxj6.xs146671w14qiwj8 --discovery-token-ca-cert-hash sha256:a03e85ecbbee1b62d8d7b3528e2534974cf99e5a5f1ddd5dee38cec0292613df [preflight] Running pre-flight checks. [WARNING FileExisting-crictl]: crictl not found in system path Suggestion: go get github.com/kubernetes-incubator/cri-tools/cmd/crictl [preflight] Starting the kubelet service [discovery] Trying to connect to API Server "172.31.31.100:6443" [discovery] Created cluster-info discovery client, requesting info from "https://172.31.31.100:6443" [discovery] Requesting info from "https://172.31.31.100:6443" again to validate TLS against the pinned public key [discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server "172.31.31.100:6443" [discovery] Successfully established connection with API Server "172.31.31.100:6443" This node has joined the cluster: * Certificate signing request was sent to master and a response was received. * The Kubelet was informed of the new secure connection details. Run 'kubectl get nodes' on the master to see this node join the cluster.
Dockerコンテナの起動を確認
クラスタへ参加したことで、ノードとして動作するために必要なFlannelなどのプロセスがDockerコンテナとして起動していることを確認します。
# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b0390a7524ee f0fad859c909 "/opt/bin/flanneld..." 2 minutes ago Up 2 minutes k8s_kube-flannel_kube-flannel-ds-479jj_kube-system_7b40af29-6cc3-11e8-94c6-062edb1e23b8_1 448880ce8c38 k8s.gcr.io/kube-proxy-amd64@sha256:d46cfa2b1d944d42b1cd3890dc7b7f32a1f5d8eb6ff2047ecab650f5406a7e96 "/usr/local/bin/ku..." 2 minutes ago Up 2 minutes k8s_kube-proxy_kube-proxy-8fp22_kube-system_7b3fc76a-6cc3-11e8-94c6-062edb1e23b8_0 b40fb6db9bed k8s.gcr.io/pause-amd64:3.1 "/pause" 2 minutes ago Up 2 minutes k8s_POD_kube-flannel-ds-479jj_kube-system_7b40af29-6cc3-11e8-94c6-062edb1e23b8_0 1d30b297375a k8s.gcr.io/pause-amd64:3.1 "/pause" 2 minutes ago Up 2 minutes k8s_POD_kube-proxy-8fp22_kube-system_7b3fc76a-6cc3-11e8-94c6-062edb1e23b8_0
マスタサーバでノードの確認
ノードの確認
マスタサーバでクラスタに参加しているノードの一覧を表示すると、 1行目に表示されているノードが今回クラスタに参加したノードです。 STATUSがReadyとなっているので、正常にノードが稼働しています。
# kubectl get nodes NAME STATUS ROLES AGE VERSION ip-172-31-21-206.ap-northeast-1.compute.internal Ready <none> 18s v1.10.2 ip-172-31-31-100.ap-northeast-1.compute.internal Ready master 6m v1.10.4
参考にしたサイト
Kubernetesの公式サイト kubernetes.io に書かれている手順を参考にしました。