✔️ Worker Node 추가 구성하기
이 글에서는 워커 노드로 사용하기 위한 1대의 VM을 Vagrant를 통해 구축한다.
해당 VM에 k8s 관련 패키지들을 설치 및 설정하고
컨트롤 플레인과 워커 노드가 동시에 구축되어 있던 기존의 VM에 join하는 과정을 기술한다.
✔️ Worker Node 추가 순서
- Vagrantfile VM 추가
- cpu : 2, mem : 2G
- Docker 설치 및 설정
- kubeadm, kubectl, kubelet 설치 (1.22.8 버전 사용)
kubeadm join xxx
(worker node에서 실행)kubectl get nodes
,kubectl get pods -A
(control plane에서 실행)
✔️ VM 추가
Vagrantfile을 사용해 ubuntu VM 1대를 추가 구축한다.
Vagrant.configure("2") do |config|
# Define VM
config.vm.define "docker" do |centos| # 기존에 존재하던 docker
config.vm.boot_timeout = 1800 # 30 minutes
centos.vm.box = "ubuntu/focal64"
centos.vm.hostname = "docker"
centos.vm.network "private_network", ip: "192.168.100.100"
centos.vm.provider "virtualbox" do |vb|
vb.name = "docker"
vb.cpus = 2
vb.memory = 4096
end
end
# Define VM
config.vm.define "worker" do |centos| # worker node로 구성할 새로운 VM
config.vm.boot_timeout = 1800 # 30 minutes
centos.vm.box = "ubuntu/focal64"
centos.vm.hostname = "worker"
centos.vm.network "private_network", ip: "192.168.100.101"
centos.vm.provider "virtualbox" do |vb|
vb.name = "worker"
vb.cpus = 2
vb.memory = 4096
end
end
end
vagrant up
Vagrantfile 위치로 이동해 해당 명령 실행
✔️ Docker 설치 및 설정
구축한 worker VM에 SSH 접속 후 Docker 설치 및 설정하기
sudo apt-get update
sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
success result
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, 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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.100.100:6443 --token dywlj7.88ojfvndq0ts8pcv \
--discovery-token-ca-cert-hash sha256:4dd37e7865e2da8b915a23bf20a0eb401f2df7a667b2dbc8aec68ad4ad0a6e55 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.100.100:6443 --token dywlj7.88ojfvndq0ts8pcv \
--discovery-token-ca-cert-hash sha256:4dd37e7865e2da8b915a23bf20a0eb401f2df7a667b2dbc8aec68ad4ad0a6e55
✔️ kubeadm, kubelet, kubectl 설치
sudo apt-get install -y apt-transport-https ca-certificates curl
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install kubeadm=1.22.8-00 kubelet=1.22.8-00 kubectl=1.22.8-00 -y
✔️ k8s 설치 Trouble Shooting
kubeadm, kubelet, kubectl 설치 과정에서 오류 발생시 다음 방법으로 해결한다.
docker info | grep 'Cgroup Driver'
Cgroup Driver: cgroupfs
/etc/docker/daemon.json 파일 수정
{
"exec-opts": ["native.cgroupdriver=systemd"]
}
sudo systemctl restart docker
Docker 서비스 재시작
docker info | grep 'Cgroup Driver'
Cgroup Driver: systemd
Cgroup Driver가 cgroupfs에서 systemd로 바뀐 것을 확인
sudo systemctl daemon-reload && sudo systemctl restart kubelet
sudo usermod -aG docker vagrant
docker 그룹에 vagrant 추가후 VM 재접속
kubeadm init 실패시
sudo kubeadm reset
sudo kubeadm init --control-plane-endpoint 192.168.100.100 --pod-network-cidr 172.16.0.0/16 --apiserver-advertise-address 192.168.100.100
ip에 구축한 VM에 맞는 적절한 값 입력 후 init하기
설치 성공시 다음 메세지 출력
✔️ join 방법
두가지 join 명령이 존재한다.
control-plane
: 컨트롤 플레인을 다중 구성하기 위함
kubeadm join 192.168.100.100:6443 --token dywlj7.88ojfvndq0ts8pcv \
--discovery-token-ca-cert-hash sha256:4dd37e7865e2da8b915a23bf20a0eb401f2df7a667b2dbc8aec68ad4ad0a6e55 \
--control-plane
worker nodes
: 워커 노드를 다중 구성하기 위함
kubeadm join 192.168.100.100:6443 --token dywlj7.88ojfvndq0ts8pcv \
--discovery-token-ca-cert-hash sha256:4dd37e7865e2da8b915a23bf20a0eb401f2df7a667b2dbc8aec68ad4ad0a6e55
컨트롤 플레인이나 워커 노드를 추가(join)하기 위해서 해당 명령어를 사용해야 한다.
두 명령어의 차이는 맨 끝에 --control-plane
옵션의 유무 차이다.
내용을 자세히 살펴보면
192.168.100.100
: 컨트롤 플레인의 ip6443
: - API 서버의 포트, docker의 API 서버의 포트이다.--token
: 토큰값은 랜덤하게 지정되며 이 값이 없으면 조인할 수 없다. VM이 클러스터에 조인하기 위한 password라고 생각하면 된다.--discovery-token-ca-cert-hash
: CA 인증서의 해시값이다.
토큰값을 발급해주는 CA가 있다.
k8s의 모든 구성 요소들은 API 서버로부터 인증을 받아야 한다.
인증을 받는다는 개념은 각 구성 요소가 CA로부터 발급된 개별 인증서를 가지고 있어야 한다는 것이다.--control-plane
: 컨트롤 플레인 조인
해당 옵션이 없다면 워커 노드로 추가하게 된다.
Creating a cluster with kubeadm | Kubernetes
worker node로 추가하려는 VM에 요구하는 사항들
Joining your nodes
The nodes are where your workloads (containers and Pods, etc) run. To add new nodes to your cluster do the following for each machine:
- SSH to the machine
- Become root (e.g.
sudo su -
) - Install a runtime if needed
- Run the command that was output by
kubeadm init
. For example:
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
join을 위해서는 다음 명령 형식을 따라야 한다.
✔️ 토큰 리스트 확인
vagrant@docker ~ kubeadm token list
해당 명령어로 토큰 리스트를 확인할 수 있으며 토큰은 생성한뒤 24시간이 지나면 만료된다.
토큰이 만료되었다면 토큰 생성 명령을 통해 만들어야 한다.
✔️ 토큰값 생성
vagrant@docker ~ kubeadm token create
06w08w.56jtw3no3iwbwgcs
vagrant@docker ~ kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
06w08w.56jtw3no3iwbwgcs 23h 2022-05-17T00:43:58Z authentication,signing <none> system:bootstrappers:kubeadm:default-node-token
✔️ 토큰 해시값 확인
vagrant@docker /etc/kubernetes/pki openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
openssl dgst -sha256 -hex | sed 's/^.* //'
해당 명령을 실행하면 토큰의 해시값이 나온다.
vagrant@docker ~ cd /etc/kubernetes
vagrant@docker /etc/kubernetes ls
admin.conf controller-manager.conf kubelet.conf manifests pki scheduler.conf
vagrant@docker /etc/kubernetes cd pki
vagrant@docker /etc/kubernetes/pki ls
apiserver-etcd-client.crt apiserver-kubelet-client.key ca.crt front-proxy-ca.crt front-proxy-client.key
apiserver-etcd-client.key apiserver.crt ca.key front-proxy-ca.key sa.key
apiserver-kubelet-client.crt apiserver.key etcd front-proxy-client.crt sa.pub
/etc/kubernetes/pki
디렉토리로 이동하면 클러스터 내의 각 구성 요소들이 발급받은 인증서 리스트를 볼 수 있다.
k8s는 마이너 버전이 3개월 마다 출시되며 4개 버전까지 지원되므로 1년동안 한번도 업데이트를 하지 않으면 문제가 발생한다.
업데이트를 하지 않으면 인증서가 만료되어 클러스터가 가동을 멈춘다.
✔️ join 명령 실행
sudo kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
필요한 값을 채워 join 명령을 실행한다.
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
해당 메세지 출력시 정상적으로 join이 되었으며 컨트롤 플레인에서 kubectl get nodes
명령어로 확인 가능하다.
vagrant@docker ~ kubectl get nodes
NAME STATUS ROLES AGE VERSION
docker Ready control-plane,master 2d19h v1.22.8
worker Ready <none> 13m v1.22.8
vagrant@docker ~ kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-6dcd859f85-bxdq6 1/1 Running 3 (125m ago) 2d18h
calico-apiserver calico-apiserver-6dcd859f85-xwpjd 1/1 Running 3 (9h ago) 2d18h
calico-system calico-kube-controllers-5d74cd74bc-z6sh7 1/1 Running 3 (9h ago) 2d18h
calico-system calico-node-cvsmp 0/1 Running 3 (9h ago) 2d18h
calico-system calico-node-htjlm 0/1 Running 0 10m
calico-system calico-typha-8bdc64c6-ds66m 1/1 Running 3 (125m ago) 2d18h
kube-system coredns-78fcd69978-f2m28 1/1 Running 3 (9h ago) 2d19h
kube-system coredns-78fcd69978-h74sn 1/1 Running 3 (9h ago) 2d19h
kube-system etcd-docker 1/1 Running 4 (9h ago) 2d19h
kube-system kube-apiserver-docker 1/1 Running 4 (9h ago) 2d19h
kube-system kube-controller-manager-docker 1/1 Running 4 (9h ago) 2d19h
kube-system kube-proxy-6k2vj 1/1 Running 0 10m
kube-system kube-proxy-7nn4r 1/1 Running 3 (125m ago) 2d19h
kube-system kube-scheduler-docker 1/1 Running 4 (125m ago) 2d19h
tigera-operator tigera-operator-7cf4df8fc7-krfd2 1/1 Running 5 (125m ago) 2d18h
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Kubespray로 쿠버네티스 설치하기 (0) | 2022.05.16 |
---|---|
[Kubernetes] k8s 클러스터 업그레이드 (0) | 2022.05.16 |
[Kubernetes] kubeadm을 사용한 K8s 설치 및 K8s 클러스터 생성 (0) | 2022.05.16 |
[Kubernetes] Kubernetes(쿠버네티스)란 ?! (0) | 2022.05.16 |
[Kubernetes] Pod 생성 과정 (0) | 2022.03.28 |
영차영차 성장 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!