[kubernetes] kubeadm join Master 노드 추가하기
Kubernetes는 컨테이너화된 애플리케이션을 자동으로 배포, 확장, 관리하는 오픈 소스 플랫폼이며, 다양한 환경에서 일관된 애플리케이션 실행을 가능하게 해주는 컨테이너 오케스트레이션 도구입니다.
kubeadm join
명령어는 Kubernetes 클러스터에 새로운 노드를 추가할 때 사용되는 명령어입니다. Master 노드를 추가하는 경우, 단순 Worker 노드를 추가하는 것보다 몇 가지 추가 설정이 필요합니다.
Kubernetes 클러스터에 Master 노드를 추가하는 방법을 알아보도록 하겠습니다.
작업 구성
Kubernetes 클러스터 구성은 총 3대의 서버를 Master 노드로 구성하고자 합니다.
첫 번째 Master(또는 Control Plane) 노드는 init 명령어로 클러스터를 구성합니다.
두 번째와 세 번째 Master 노드는 join 명령어를 통해 클러스터에 노드로 추가되며 추가 시 옵션을 추가하여 Worker 노드가 아닌 Master 노드로 추가될 예정입니다.
사전 작업
[첫 번째 Master 노드] kubeadm init 클러스터 구성하기
Kubernetes 클러스터에 control plane이 구성된 첫 번째 Master 노드를 구성합니다.
- [kubernetes] kubeadm init 클러스터 구성하기
https://every-up.tistory.com/88
- [kubernetes] controlPlaneEndpoint 구성하기
https://every-up.tistory.com/93
[두 번째, 세 번째 Master 노드]
두 번째, 세 번째 Master 노드는 join 명령어를 통해 첫 번째 Master 노드를 통해 클러스터에 연결 및 추가됩니다.
기본 환경 구성을 위해 첫 번째 Master 노드와 유사하게 kubeadm init 이전까지의 기본 사전 작업을 진행합니다.
- [kubernetes] CRI-O 설치하기
https://every-up.tistory.com/84
- [kubernetes] kubeadm, kubelet, kubectl 설치하기
https://every-up.tistory.com/87
- [Linux] IPv4 Forwarding 설정하기
https://every-up.tistory.com/89
kubeadm join 시 필요한 정보 확인
Worker 노드를 추가할 경우에는 token 값과 CA 인증서 값만 필요하지만 Master 노드를 추가할 경우에는 클러스터 인증서 값이 추가적으로 필요합니다. 아래 링크를 통해 kubeadm join 시 필요한 정보를 사전에 확인 합니다.
- [kubernetes] kubeadm join 시 필요한 정보 확인
https://every-up.tistory.com/92
kubeadm join
두 번째, 세 번째 Master 노드는 join 명령어를 통해 첫 번째 Master 노드 클러스터에 연결 및 추가합니다.
kubeadm join 명령어에는 Master 노드 IP 및 Port, 토큰(Token), CA 인증서 해시, 클러스터 인증서 값이 필요합니다.
kubeadm join 명령어를 사용하여 클러스터를 추가합니다.
# kubeadm join 10.0.0.11:6443 \
--token fb4jku.kkt1ivfjvxkskxrq \
--discovery-token-ca-cert-hash sha256:48ebf1c55897a3d0e55c19e75648d457b6309f4f0b8c88ae5e3dc871c0d8a1a5 \
--control-plane --certificate-key 9ea5555144a397c54a6ddfec77dc8b14ad5b93d6d006c8fc04092aa88c833f27 \
--v=5
I1112 09:56:19.086799 1171838 join.go:419] [preflight] found NodeName empty; using OS hostname as NodeName
I1112 09:56:19.086913 1171838 join.go:423] [preflight] found advertiseAddress empty; using default interface's IP address as advertiseAddress
I1112 09:56:19.087599 1171838 initconfiguration.go:123] detected and using CRI socket: unix:///var/run/crio/crio.sock
##### 생략 #####
This node has joined the cluster and a new control plane instance was created:
* Certificate signing request was sent to apiserver and approval was received.
* The Kubelet was informed of the new secure connection details.
* Control plane label and taint were applied to the new node.
* The Kubernetes control plane instances scaled up.
* A new etcd member was added to the local/stacked etcd cluster.
To start administering your cluster from this node, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Run 'kubectl get nodes' to see this node join the cluster.
마지막 로그에서 나온 것과 같이 클러스터와 통신할 수 있도록 인증 정보 설정을 추가합니다.
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
클러스터 추가 작업이 완료되었습니다.
kubeadm join 시 오류 발생
kubeadm join 명령어로 클러스터 추가 시 발생할 수 있는 오류 내용입니다.
kubeadm join 명령어 입력 시 --v=5
옵션을 추가해야 상세 오류 내용을 확인하실 수 있습니다.
TOKEN 값 오류 로그
TOKEN 값이 만료되었거나 일치하지 않을 경우 아래와 같이 에러 로그가 발생합니다.
I1031 14:16:15.895101 43351 token.go:228] [discovery] Retrying due to error: could not find a JWS signature in the cluster-info ConfigMap for token ID "sa3r4y"
CA 인증서 Hash 값 오류 로그
CA 인증서 Hash 값이 일치하지 않을 경우 아래와 같이 에러 로그가 발생합니다.
none of the public keys "sha256:48ebf1c55897a3d0e55c19e75648d457b6309f4f0b8c88ae5e3dc871c0d8a1a5" are pinned
controlPlaneEndpoint 오류 로그
join 하고자 하는 master 서버 API의 IP, Port 정보가 잘못되었거나 controlPlaneEndpoint가 설정되어 있지 않을 경우 아래와 같이 에러 로그가 발생합니다.
One or more conditions for hosting a new control plane instance is not satisfied.
unable to add a new control plane instance to a cluster that doesn't have a stable controlPlaneEndpoint address
Please ensure that:
* The cluster has a stable controlPlaneEndpoint address.
* The certificates that must be shared among control plane instances are provided.
클러스터 join 상태 확인
Kubernetes 클러스터에서 현재 구성된 모든 노드(node)에 대한 정보를 확인할 수 있습니다.
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-cn-001 Ready control-plane 12d v1.31.2
k8s-cn-002 Ready control-plane 3h32m v1.31.2
k8s-cn-003 Ready control-plane 3h26m v1.31.2
노드 이름, 상태, 역할, 생성된 시간, 버전 등의 정보를 확인할 수 있습니다.
Kubernetes 클러스터의 핵심 구성 요소들이 실행되는 kube-system 네임스페이스의 리소스를 확인할 수 있습니다.
etcd, kube-api-server, kube-controller-manager, kube-proxy, kube-scheduler 등 Master(또는 Control Plane) 노드에 필요한 구성 요소들이 추가된 노드에 따라 각각 추가된 것을 확인하실 수 있습니다.
# kubectl get all -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/coredns-7c65d6cfc9-9znfx 1/1 Running 0 12d
kube-system pod/coredns-7c65d6cfc9-j76md 1/1 Running 0 12d
kube-system pod/etcd-k8s-cn-001 1/1 Running 0 12d
kube-system pod/etcd-k8s-cn-002 1/1 Running 0 3h34m
kube-system pod/etcd-k8s-cn-003 1/1 Running 0 3h28m
kube-system pod/kube-apiserver-k8s-cn-001 1/1 Running 0 3h47m
kube-system pod/kube-apiserver-k8s-cn-002 1/1 Running 0 3h34m
kube-system pod/kube-apiserver-k8s-cn-003 1/1 Running 0 3h28m
kube-system pod/kube-controller-manager-k8s-cn-001 1/1 Running 2 (3h48m ago) 12d
kube-system pod/kube-controller-manager-k8s-cn-002 1/1 Running 0 3h34m
kube-system pod/kube-controller-manager-k8s-cn-003 1/1 Running 0 3h28m
kube-system pod/kube-proxy-kx2tk 1/1 Running 0 3h28m
kube-system pod/kube-proxy-xgvst 1/1 Running 0 12d
kube-system pod/kube-proxy-xs2wk 1/1 Running 0 3h34m
kube-system pod/kube-scheduler-k8s-cn-001 1/1 Running 2 (3h48m ago) 12d
kube-system pod/kube-scheduler-k8s-cn-002 1/1 Running 0 3h34m
kube-system pod/kube-scheduler-k8s-cn-003 1/1 Running 0 3h28m
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 12d
kube-system service/kube-dns ClusterIP 10.96.0.10 <none> 53/UDP,53/TCP,9153/TCP 12d
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/kube-proxy 3 3 3 3 3 kubernetes.io/os=linux 12d
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system deployment.apps/coredns 2/2 2 2 12d
NAMESPACE NAME DESIRED CURRENT READY AGE
kube-system replicaset.apps/coredns-7c65d6cfc9 2 2 2 12d
Kubernetes에서 kubeadm join 명령어를 통해 Master 노드를 추가하는 방법을 알아봤습니다.
먼저, Kubernetes 클러스터를 고가용성(HA)으로 구성하기 위해 첫 번째 Master 노드에서 kubeadm init 명령어를 사용하여 클러스터의 control plane을 초기화하고, controlPlaneEndpoint를 설정합니다. 이후 두 번째와 세 번째 Master 노드는 kubeadm join 명령어를 사용하여 클러스터에 연결합니다. Master 노드를 추가할 때는 token 값, CA 인증서 해시, 클러스터 인증서가 필요하며, --control-plane 옵션을 사용하여 Master 노드로 추가합니다.
클러스터에 추가된 노드에서 kubectl 명령어를 사용하기 위해 설정 파일을 준비하고 권한을 설정하는 명령을 실행합니다.
이후 kubectl get nodes 명령어로 노드 상태를 확인하고, kubectl get all -A 명령어로 kube-system 네임스페이스 내 핵심 구성 요소들이 각 노드에 추가되어 정상적으로 실행되고 있는지 확인합니다.
지금까지 Kubernetes에서 kubeadm join 명령어를 통해 Master 노드를 추가하는 방법을 알아보는 시간을 가졌습니다....! 끝...!
유익하게 보셨다면 공감을 눌러주고, 댓글로 의견을 공유해 남겨주시면 감사하겠습니다!
[Reference]
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-join/
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/
'kubernetes' 카테고리의 다른 글
[kubernetes] controlPlaneEndpoint 설정하기 (0) | 2024.11.13 |
---|---|
[kubernetes] kubeadm join 시 필요한 정보 확인 (1) | 2024.11.04 |
[kubernetes] kubeadm join 시 secrets "kubeadm-certs" is forbidden 오류 확인 (2) | 2024.11.01 |
[kubernetes] Master/Worker 노드 개념 알아보기 (0) | 2024.10.29 |
[kubernetes] kubeadm init 클러스터 구성하기 (0) | 2024.10.22 |