🧩 DevOps/Kubernetes

[Kubernetes] Worker Node 추가 구성하기 : Join

nayoungs 2022. 5. 16. 23:09
728x90

본 글은 여기에 이어서 진행한다.

Vagrant를 통해 Worker Node로 사용할 1대의 VM을 구축한 뒤, k8s 관련 패키지들을 설치 및 설정하고

Control PlaneWorker Node가 동시에(1대에) 구축되어 있던 기존의 VM에 새로 구축한 Worker Nodejoin할 예정이다.



📌Index



✔️ VM 생성하기

Vagrantfile을 사용하여 ubuntu VM을 생생하자.

Vagrant.configure("2") do |config| 
    # Control Plane과 Worker Node가 동시에 구축된 기존의 VM 
    config.vm.define "docker" do |centos|
    config.vm.boot_timeout = 1800
        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

    # Worker Node로 구성할 새로운 VM
    config.vm.define "worker" do |centos|
    config.vm.boot_timeout = 1800
        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

Vagrantfile이 존재하는 디렉토리로 이동하여 다음 명령을 실행하자.

vagrant up worker



✔️ Docker 설치 및 설정하기

앞서 구축한 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

docker가 1.22 버전으로 오면서 cgroupfs를 지원하지 않게되었다.

$ sudo docker info | grep 'Cgroup Driver'
 
 Cgroup Driver: cgroupfs

만약 Cgoup Drivercgroups로 설정되어있다면 /etc/docker/daemon.json을 다음과 같이 작성한다.

/etc/docker/daemon.json

{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
$ sudo systemctl restart docker

Cgoup Drivercgroups 에서 systemd 로 변경된 것을 확인할 수 있다.

$ docker info | grep 'Cgroup Driver'

 Cgroup Driver: systemd
$ sudo systemctl daemon-reload
$ sudo usermod -aG docker vagrant

그룹에 docker를 추가한 것을 적용하기 위해, exit 한 뒤에 재접속한다.

$ exit



✔️ kubeadm, kubelet, kubectl 설치하기

  • kubeadm: 클러스터를 부트스트랩하는 명령
  • kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트(kubelet, k-proxy)
  • 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

패키지 업데이트 시 쿠버네티스까지 업데이트되면 안되기때문에 apt-mark hold로 잠금해준다.

$ sudo apt-mark hold kubelet kubeadm kubectl



✔️K8s Cluster에 Join하기

join nodes에 따라 진행해보자.

 

Joining your nodes

클러스터에 새 노드를 추가하려면 각 머신에 대해 다음 사항들을 만족해야한다.

  • 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>

 

토큰 목록 확인하기

$ kubeadm token list

토큰은 24시간만 유효하고,

따라서 24시간전에 생성한 토큰이라면 만료되어서 목록에서 확인할 수 없다.

 

토큰 생성하기

$ kubeadm token create

토큰을 생성한 뒤 생성된 토큰을 토큰 목록에서 확인할 수 있다.

$ kubeadm token list  
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
u3odgd.idt2ukfxqqbo8j31   23h         2022-05-17T00:44:09Z   authentication,signing   <none>                                                     system:bootstrappers:kubeadm:default-node-token

토큰 해시값 확인하기

$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

 

etc/kubernetes/pki에는 클러스터 내의 각 구성요소들의 CA 키와 인증서들이 존재한다.

$ ls  /etc/kubernetes/pki           
apiserver-etcd-client.crt     apiserver.crt  etcd                    front-proxy-client.key
apiserver-etcd-client.key     apiserver.key  front-proxy-ca.crt      sa.key
apiserver-kubelet-client.crt  ca.crt         front-proxy-ca.key      sa.pub
apiserver-kubelet-client.key  ca.key         front-proxy-client.crt

 

join 하기

$ sudo kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>

control-plane-port : 컨트롤 플레인 노드의 쿠버네티스 apiserver의 포트번호로, 기본적으로 6443을 사용한다.


알맞은 값을 넣어 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.

Control Plane에서 kubectl get nodes 명령을 실행하면, worker 노드가 정상적으로 join된 것을 확인할 수 있다.

$ kubectl get nodes
NAME     STATUS   ROLES                  AGE     VERSION
docker   Ready    control-plane,master   41h     v1.22.8
worker   Ready    <none>                 3m30s   v1.22.8

참고로 worker 노드는 역할(ROLES)에 아무것도 붙으면 안된다.

 

join 후 시간이 흐른 뒤, kubectl get pods -A 명령 시 모든 것들이 Running상태이고, READY1/1 이 되었다면, 정상적으로 워커노드는 Ready 상태가 된 것이다.

$ kubectl get pods -A 
NAMESPACE          NAME                                       READY   STATUS    RESTARTS         AGE
calico-apiserver   calico-apiserver-5f79f45d44-l6sx4          1/1     Running   2 (108m ago)     45h
calico-apiserver   calico-apiserver-5f79f45d44-w4g8m          1/1     Running   2 (108m ago)     45h
calico-system      calico-kube-controllers-5d74cd74bc-t7xwr   1/1     Running   2 (108m ago)     45h
calico-system      calico-node-fpqnj                          0/1     Running   3 (107m ago)     45h
calico-system      calico-node-v5mnw                          0/1     Running   0                4h19m
calico-system      calico-typha-69974c84d7-z9rdf              1/1     Running   4 (108m ago)     45h
kube-system        coredns-78fcd69978-kk922                   1/1     Running   2 (108m ago)     46h
kube-system        coredns-78fcd69978-w4jg2                   1/1     Running   2 (108m ago)     46h
kube-system        etcd-docker                                1/1     Running   4 (108m ago)     46h
kube-system        kube-apiserver-docker                      1/1     Running   4 (108m ago)     46h
kube-system        kube-controller-manager-docker             1/1     Running   4 (108m ago)     46h
kube-system        kube-proxy-qqnnd                           1/1     Running   0                4h19m
kube-system        kube-proxy-qrbcs                           1/1     Running   3 (108m ago)     46h
kube-system        kube-scheduler-docker                      1/1     Running   4 (108m ago)     46h
tigera-operator    tigera-operator-7cf4df8fc7-r4stp           1/1     Running   429 (108m ago)   45h

 

 

 

728x90