Kubernetes/02. 쿠버네티스 설치 및 구성

[쿠버네티스] 우분투 환경에서 쿠버네티스 설치하기 + kubeadm 툴박스로 클러스터 만들기 (kubeadm, kubectl, kubelet)

Jaden Park 2021. 6. 18. 01:23

들어가며
사전확인

도커 설치하기
kubeadm, kubelet, kubectl 설치하기
kubeadm 툴박스로 클러스터 만들기
Control-plane 컴포넌트 구성 및 네트워크 환경구성
worker node 구성 추가
control-plane 노드에서 상태확인

work node 구성 삭제
끝마치며

 

들어가며

  • vagrant 설치 및 환경 구성을 한 뒤 이어서 쓰는 글이니 작업 환경이 궁금하다면 이전 글을 참조하길 바랍니다.
  • 이 글은 우분투 18.04 LTS 환경에서 쿠버네티스 클러스터를 설치 및 구성하는 글입니다.

 

  • 본인의 프로세서가 싱글코어 이하 이거나, 1GB 이하의 RAM 이라면 따라하는 것을 권장하지 않습니다.
  • 또한 $swapon -s 를 확인했을 때 스왑 사용중이라면 kubelet이 재대로 작동하지 않고, 스왑을 사용하지 않으면 정상작동하게 됩니다.


사전 확인

MAC 주소와 product_uuid가 모든 노드에 대해 고유한지 확인

  • MAC 주소 확인 : ip link 혹은 ifconfig -a
  • product_uuid : sudo cat /sys/class/dmi/id/product_uuid

 

네트워크 어댑터 확인

 

iptables 가 bridge된 트래픽을 올바르게 보게 하기

  • "sysctl" 구성에서 "net.bridge.bridge-nf-call-iptables" 가 1로 설정되어 있는지 확인해보면 됩니다.

 

필수 포트 확인해보기

컨트롤 플레인 노드

  • TCP : 6443(재정의 가능), 2379-2380, 10250-10252 포트는 마스터에서 사용을 위해 비워놔야합니다.

 

워커 노드

  • TCP : 10250, 30000-32767 포트는 워커에서 사용을 위해 비워놔야합니다.

도커 설치하기

쿠버네티스를 설치하기 전 도커가 우선적으로 설치되어 있어야 합니다.

ubuntu 가 아니거나 자세한 사항은 docker docs 홈페이지를 참고하시기 바랍니다.

 

docker 가 이미 설치되어있다면 지우기

과거 버전이 설치되어 있다면 지우고 설치해야 합니다.

하지만, 이전 포스트에서 같이 진행을 하셨거나 도커를 설치한 이력이 없으다면 이 과정은 무시하셔도 됩니다.

$ sudo apt-get remove docker docker-engine docker.io containerd runc

 

 

레포지토리 설치하기

$ sudo apt-get update

$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

 

 

도커 GPG키 추가하기

 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

 

 

stable 저장소를 설정을 위해 다음 명령을 사용

nightly 또는 test 저장소를 추가하려면 아래 명령에서 stable 단어 뒤에 nightly , test (혹은  둘 다) 라는 단어를 추가하시면 되는데 권장하지 않습니다

x86_64 / amd64  전용. [다른 아키텍쳐라면 docker docs 홈페이지를 참고하세요]

echo \
  "deb [arch=amd64 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

 

 

도커 설치를 완료했다면 사용자 보조그룹 지정 후 ssh 재접속

vagrant@kube-control1:~$ sudo usermod -aG docker vagrant
vagrant@kube-control1:~$ exit

user@ubuntu:~$ vagrant ssh kube-control1

vagrant@kube-control1:~$ id
uid=1000(vagrant) gid=1000(vagrant) groups=1000(vagrant),998(docker)

 

 


Kubeadm, Kubelet, Kubectl 설치하기

모든 머신에 다음 패키지들을 설치합니다.

  • kubeadm : 클러스터를 부트스트랩하는 명령힙니다
    • 부트스트랩 (컴퓨팅): 더 복잡한 도구를 만들 수 있도록 도와 주는 단순 도구를 만들거나 적재함으로써 복잡한 소프트웨어 도구를 만들거나 컴퓨터를 시작하는 것을 말한다. 줄여서 시동이라고도 할 수 있으며, 이는 컴퓨터를 시작하는 과정
  • kubelet : 클러스터의 모든 머신에서 실행되는 pod와 container 시작과 같은 작업을 수행하는 컴포넌트 입니다.
  • kubectl : 클러스터와 통신하기 위한 커맨드 라인 유틸리티 입니다.

kubeadm은 kubelet 또는 kubectl을 설치하거나 관리하지 않습니다.
따라서 kubeadm이 설치하려는 쿠버네티스 컨트롤 플레인의 버전과 일치하는지 확인해야합니다.

 

버전은 A.B.C 에서 A는 메이저버전, B는 마이너버전, C는 패치버전을 의미합니다.

 

kube-apiserver 는 최대 1단계의 마이너 버전 차이까지 가능합니다.
ex) 하나의 kube-apiserver 의 버전이 1.21 라면 다른 kube-apiserver 는 1.20 or 1.21 이여야 합니다.

 

kubelet 은 kube-apiserver 보다 최신이여서는 안됩니다. 그리고 최대 2단계 이전의 마이너 버전 차이까지 가능합니다.
ex) kube-apiserver 가 1.21 이라면 kubelet 은 1.21 or 1.20 or 1.19 까지 사용가능합니다.

 

kubectl 은 kube-apiserver 과 최대 1단계의 마이너 버전 차이까지 가능합니다.
ex) kube-apiserver 가 1.21 이라면 kubectl 은 1.22 or 1.21 or 1.20 까지 사용가능합니다.

 

더 자세한 내용은 쿠버네티스 버전 및 버전-차이 정책kubeadm 버전 차이 정책을 확인하면 됩니다.

 

1. apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 레포지토리를 사용하는 데 필요한 패키지를 설치

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl

 

2. 구글 클라우드의 공개 사이닝 키를 다운로드

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

 

3. 쿠버네티스 apt 레포지터리를 추가

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

 

4. apt 패키지 색인을 업데이트하고, 안정성을 위해 최신 버전보다 2~3 단계 아래 마이너버전을 선택.

sudo apt-get update
sudo apt-cache madison kubeadm

 

5. 원하는 버전을 설치하고 해당 버전을 고정

sudo apt-get install -y kubelet=1.18.18-00 kubeadm=1.18.18-00 kubectl=1.18.18-00
sudo apt-mark hold kubelet kubeadm kubectl

 

6. 설치완료 확인하기

kubelet --version
kubeadm version
kubectl version

kubeadm 툴박스로 클러스터 만들기

Control plane 컴포넌트 구성 및 네트워크 환경구성

1. 이미지를 내려받기 (오프라인 환경, 네트워크 감도가 좋지 못한 환경에서 권장)

sudo kubeadm config images pull

 

2. init

  • --control-plane-endpoint
    모든 컨트롤 플레인 노드의 공유 엔드 포인트를 설정하는 데 사용할 수 있습니다.
    단일 컨트롤 플레인 kubeadm 클러스터를 고가용성으로 업그레이드 할 계획이 있는 경우 모든 컨트롤 플레인 노드에 대해 공유 엔드 포인트를 설정하려면 지정해야 합니다. 엔드 포인트는 로드 밸런서의 DNS이름 또는 IP 주소일 수 있습니다.
  • --pod-network-cidr
    pod 네트워크 범위를 지정합니다. 서브넷마스크값은 대게 16 혹은 12를 주어 할당 가능한 ip 갯수를 확보하는 편입니다.
  • --apiserver-advertise-address
    다른 네트워크 인터페이스를 사용하려면 kubeadm default gateway와 연결된 네트워크 인터페이스를 사용하여 특정 컨트롤 플레인 노드의 api 서버에 대한 ip 주소를 지정합니다.
// 본인의 ip 확인 후 입력. (ip a s 에서 host-only)
sudo kubeadm init --control-plane-endpoint 192.168.100.11 --pod-network-cidr 192.168.0.0/16 --apiserver-advertise-address 192.168.100.11

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

kubeadm init 명령 실행 시 컨트롤 플레인 에 kubernetes 컴포넌트들이 생성됩니다.
만일, init 명령 실패했다면 kubeadm reset 후 init 명령 재실행

kubeadm init 명령실행시 master에 kubernetes 컴포넌트들이 생성됩니다.

mkdir, cp, chown 명령을 kubernetes 관리자 계정에서 실행합니다.

 

3. token 값 저장하기

kubeadm init 명령 실행 결과에 나오는 kubeadm join <토큰> <해시값> 은 worker node가 control-plane에 연결될 때 필요합니다.
실습이기에 별도로 저장하겠습니다. 실무에서는 권장하지 않습니다.

cat > token.txt
kubeadm join 192.168.100.11:6443 --token dog003.pa3th0xgn4icoo8v \
    --discovery-token-ca-cert-hash sha256:tbq2d106be726f397282920eaafedf298c51aaf6aa1fe3f4de7fe5fe732312h

만약, 토큰값을 별도로 저장하고 싶지않거나 잊어버린 경우는 아래와 같이 알 수 있습니다.

// 토큰 확인
kubeadm token list

// 토큰 확인 출력
TOKEN                    TTL  EXPIRES              USAGES           DESCRIPTION            EXTRA GROUPS
dog003.pa3th0xgn4icoo8v  23h  2021-06-12T02:51:28Z authentication,  The default bootstrap  system:
                                                   signing          token generated by     bootstrappers:
                                                                    'kubeadm init'.        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/^.* //'

// 해시값 확인 출력
tbq2d106be726f397282920eaafedf298c51aaf6aa1fe3f4de7fe5fe732312h

 

기본적으로 토큰은 24시간 후에 만료됩니다. 현재 토큰이 만료된 후 클러스터에 노드를 조인하는 경우 컨트롤플레인 노드에서 다음 명령을 실행하여 새 토큰을 만들 수 있습니다. 해시값은 위에 설명한 방법과 동일하게 확인할 수 있습니다.

//새 토큰 만들기
kubeadm token create

//출력
5didvk.d09sbcov8ph2amjw

 

4-1. 루트가 아닌 사용자에서 kubectl 작동시키기

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

 

4-2. 루트인 경우

export KUBECONFIG=/etc/kubernetes/admin.conf

 

5. Installing a Pod network add-on

calico Networks

curl https://docs.projectcalico.org/manifests/calico.yaml -O
kubectl apply -f calico.yaml

 

worker node 구성

컨트롤플레인 API ip, 노드의 토큰과 해시값을 가지고 컨트롤플레인과 연결하면 됩니다.

kubeadm join 192.168.100.11:6443 --token dog003.pa3th0xgn4icoo8v \
    --discovery-token-ca-cert-hash sha256:tbq2d106be726f397282920eaafedf298c51aaf6aa1fe3f4de7fe5fe732312h

control-plane 노드에서 상태확인

컨트롤플레인 노드에서 kubectl get nodes 를 이용해 확인하면 됩니다.
Ready 로 변하는데 약간의 시간이 소요됩니다.

kubectl get nodes

//출력
NAME            STATUS   ROLES    AGE    VERSION
kube-control1   Ready    master   40m   v1.18.18
kube-node1      Ready    <none>   20s   v1.18.18

 


work node 구성 삭제

 

클러스터를 보다 깔끔하게 프로비저닝 해제하려면 먼저 노드를 drain 하고 노드가 비어있는지 확인한 다음 노드를 구성 해제해야 합니다.

drain 은 정상적인 종료를 기다리고 노드를 비웁니다.

//control-plane
kubectl drain kube-node1 --delete-local-data --force --ignore-daemonsets

--delete-local-data : emptyDir(노드가 drain 될 때 삭제되는 로컬 데이터)를 사용하는 pod가 있어도 계속합니다

--force : ReplicationController, ReplicaSet, Job, DaemonSet 또는 StatefulSet에서 관리하지 않는 pod가 있어도 계속합니다.

--ignore-daemonsets : DaemonSet에서 관리하는 pod를 무시합니다.

 

 

노드를 제거하기 전에 설치된 상태를 재설정

//work node
kubeadm reset

 

재설정 프로세스는 iptables 규칙 또는 IPVS 테이블을 재설정하거나 정리하지 않습니다. iptables를 재설정하려면 수동으로 수행해야합니다.

//work node
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X

 

IPVS 테이블을 재설정하려면 다음 명령을 실행해야합니다.

//work node
ipvsadm -C

 

 

노드 제거

//control-plane

kubectl get nodes

NAME            STATUS       ROLES    AGE    VERSION
kube-control1   Ready        master   40m   v1.18.18
kube-node1      Not-Ready    <none>         v1.18.18

kubectl delete node kube-node1

kubectl get nodes

NAME            STATUS       ROLES    AGE    VERSION
kube-control1   Ready        master   40m   v1.18.18

 

 


 

끝마치며

다음에는 쿠버네티스 버전을 업그레이드 방법에 대해 포스팅 하겠습니다.