본문 바로가기

DevOps

최신 (k8s - 2022.07 기준) kubernetes 설치

728x90

최신 (k8s - 2022.07 기준) kubernetes 설치

 

본 게시글은 2022-07-31 일 기준으로 필자가 직접 설치해본 결과를 기록했습니다.

 

2020.12 월 kubernetes 는 docker 를 deprecated 한다는 글을 공지했다.

kubernetes의 default container runtime 이었던 docker 가 v1.20 부터 deprecated 되고,  2021년도 하반기에 출시되는 v1.23 부터는 docker를 container runtime 으로 활용할 수 없음. 
관련 글 : https://ikcoo.tistory.com/189

 

즉, 왜? Docker 가. Kubernetes 의 Container Runtime Interface 인 CRI 를 구현하지 않았기 때문이다.

이에 Docker 를 인수한 Mirantis 는 cri-docker 를 출시했다. 

 

기존에 kubernetes 에서 사용되었던 docker 의 containerd 는 실질적으로   kubernetes의 CRI 가 관리한것이 아닌 docker-shim 이 관리하는 구조였다. 그렇기에 kubernetes 의 CRI 를 구현한 cri-docker 가 containerd 를 관리하도록 교체해 주는 작업을 진행하면 된다.

 

그럼 본격적으로 설치를 진행해보자. 

참고로 간단하게 사용해볼 경우라면 Docker Container 를 활용해 Minikube 를 사용해보는 것을 권장한다.

(필자의 경우 virtualBox 에 ubuntu 설치만 1시간 넘게 걸렸기 때문이다...)

Docker Container 를 활용해  CI/CD 를 구성해보자 feat(Jenkins, Ansible, Minikube)

 

설치전 기본으로 다음이 준비되어 있어야한다.(ubuntu)

  • Master
  • Node1
  • node2

만약 virtualbox 를 통한 master , node1 , node2 가 설치되지 않았다면 다음 영상을 참고해 설치하자

관련 영상 : (영상을 보고 docker 설치 전 까지만 진행하면 된다.)

/**

(본 실습에서는 사용하지 않지만 만약 vagrant 로 구축하고 싶다면 이 글을 참고하면 될 것 같다.)

* vagrant : 단일 워크 플로우로 가상 시스템 환경을 구축하고 관리하기위한 도구

vagrant 참고로그

vagrant 활용해 설치

*/

 

설치를 시작하기전 각 설치 단계는 다음과 같은 상황에 적용됨으로 주의하자!

  • Master , node1 , node2 공통사항 : 도커 설치, cri-docker 설치, Kubernetes 설치
  • Master 단일 사항 : CNI(Container Network Interface) 설치, kubeadm init
  • Node1, node2 공통사항 : master 가 kubeadm init 시 생성된 join key 등록 

 

—-

(Master , node1 , node2 공통사항)

먼저 도커를 설치하자. 도커가 설치되어 있다면 본과정을 생랼해도된다.

 

패키지 도구 업데이트

$  sudo apt-get update

 

설치에 필요한 라이브러리 설치

$ sudo apt-get install \

    ca-certificates \

    curl \

    gnupg \

    lsb-release

 

도커의 공개 key 내려받기

$ sudo mkdir -p /etc/apt/keyrings

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

 

레포지토리 설정

$ 

echo \

  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.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 version

$ system status docker

여기까지가 도커의 설치였다. 

 

———

 

(Master , node1 , node2 공통사항)

이제 cri-docker 를 설치해보자

 

패키지 도구를 업데이트하고 필요한 라이브러리를 받자

$ sudo apt update

$ sudo apt install git wget curl

 

Cri-docker 의 최신 버전을 변수로 만들자

$ VER=$(curl -s https://api.github.com/repos/Mirantis/cri-dockerd/releases/latest|grep tag_name | cut -d '"' -f 4|sed 's/v//g')

$ echo $VER

 

관련 파일을 깃에서 받자 ( 아래 두가지 중 자신의 환경에 맞는 것으로 받자.)

### For Intel 64-bit CPU ###
$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgz
tar xvf cri-dockerd-${VER}.amd64.tgz

### For ARM 64-bit CPU ###
$ wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.arm64.tgz
cri-dockerd-${VER}.arm64.tgz

 

Cri-docker 의 바이너리 파일을 옮기자

$ sudo mv cri-dockerd/cri-dockerd /usr/local/bin/

 

Cri-docker 가 설치되었는지 확인하자

$ cri-dockerd --version

 

리눅스의 systems 는 root control group(cgroup)을 생성 및 사용하는 cgroup 관리자로 작동한다.

관련 systemd 설정을 해주자

$ wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.service

$ wget https://raw.githubusercontent.com/Mirantis/cri-dockerd/master/packaging/systemd/cri-docker.socket

$ sudo mv cri-docker.socket cri-docker.service /etc/systemd/system/

$ sudo sed -i -e 's,/usr/bin/cri-dockerd,/usr/local/bin/cri-dockerd,' /etc/systemd/system/cri-docker.service

 

변경사항을 적용하자

$ sudo systemctl daemon-reload

$ sudo systemctl enable cri-docker.service

$ sudo systemctl enable --now cri-docker.socket

 

잘 작동하는지 확인하자 (Active 상태인지)

$ systemctl status cri-docker.socket

 

———

 

(Master , node1 , node2 공통사항)

이제 kubernetes 를 설치하자

 

먼저 kubelet이 제대로 작동하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.

$ swapoff -a && sed -i '/swap/s/^/#/' /etc/fstab

 

통신이 잘되도록 방화벽을 해제하자(실무에서는 쿠버네티스보다 앞단에 방화벽 설정을 하기에 해제해도 무관하다.)

만약 특정 포트만 오픈하길 바란다면 ufw 를 이용할 수 있다. : https://mrgamza.tistory.com/792

$ systemctl stop firewalld 

$ systemctl disable firewalld

 

iptables 가 bridged traffic 을 볼 수 있게하자.

$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf

br_netfilter

EOF

$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

EOF

$ sudo sysctl --system

 

kubeadm, kubelet 및 kubectl 설치

apt 패키지를 업데이트하고, 설치에 필요한 라이브러리를 설치한다.

$ sudo apt-get update

$ 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

 

쿠버네티스 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

 

apt 패키지를 업데이트하고, kubelet, kubeadm, kubectl을 설치한다. 그 후 해당 버전을 고정한다.

$ sudo apt-get update

$ sudo apt-get install -y kubelet kubeadm kubectl

$ sudo apt-mark hold kubelet kubeadm kubectl

 

———

 

(Master 적용)

 

Kubeadm init 을 통해 초기화 및 join key 를 생성하자. 

(-pod-network-cidr=192.168.0.0/16 는 다른 서비스와 겹치지 않게 설정하자 192.168.0.0/16 의 경우 CNI 의 calico 인 경우 사용하는 ip여서 우리는 Weave 를 사용할 것이기에 달리해줘도 된다.)

$ sudo kubeadm init \

  --pod-network-cidr=192.168.0.0/16 \

  --cri-socket /run/cri-dockerd.sock

 

다음을 실행하고 키를 잃어버리지 않게 저장하자.

  $ mkdir -p $HOME/.kube

  $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

  $ sudo chown $(id -u):$(id -g) $HOME/.kube/config

$ cat <<EOF > token.txt 

kubeadm join 172.16.0.10:6443 --token ylhehd.v3orja12078tmls5 --discovery-token-a-cert-hash sha256:838fa3d377b2f00d***************9

EOF

 

CNI 설치(Weave Net Works 사용)

$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

 

확인해보자.

$ kubectl get nodes

 

———

 

(Node1, node2 적용)

Master 가 kubeadm init 을 통해 생성한 join key 등록 및 join

$ kubeadm join 172.16.0.10:6443 --token ylhehd.v3orja12078tmls5 --discovery-token-a-cert-hash sha256:838fa3d377b2f00d***************9 --cri-socket unix:///var/run/cri-dockerd.sock

 

이제 마스터로 와서 잘 등록되었는지 확인하자

(Master 적용)

$ kubectl get nodes

728x90