최신 (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 를 출시했다.
- Cri-docker 프로젝트 : https://github.com/Mirantis/cri-dockerd
기존에 kubernetes 에서 사용되었던 docker 의 containerd 는 실질적으로 kubernetes의 CRI 가 관리한것이 아닌 docker-shim 이 관리하는 구조였다. 그렇기에 kubernetes 의 CRI 를 구현한 cri-docker 가 containerd 를 관리하도록 교체해 주는 작업을 진행하면 된다.
- 관련 내용 : https://computingforgeeks.com/install-mirantis-cri-dockerd-as-docker-engine-shim-for-kubernetes/
그럼 본격적으로 설치를 진행해보자.
참고로 간단하게 사용해볼 경우라면 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 : 단일 워크 플로우로 가상 시스템 환경을 구축하고 관리하기위한 도구
*/
설치를 시작하기전 각 설치 단계는 다음과 같은 상황에 적용됨으로 주의하자!
- Master , node1 , node2 공통사항 : 도커 설치, cri-docker 설치, Kubernetes 설치
- Master 단일 사항 : CNI(Container Network Interface) 설치, kubeadm init
- Node1, node2 공통사항 : master 가 kubeadm init 시 생성된 join key 등록
—-
(Master , node1 , node2 공통사항)
먼저 도커를 설치하자. 도커가 설치되어 있다면 본과정을 생랼해도된다.
- 도커 repository 설치 : https://docs.docker.com/engine/install/ubuntu/#set-up-the-repository
패키지 도구 업데이트
$ 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 를 설치하자
- 쿠버네티스 설치 : https://kubernetes.io/ko/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
먼저 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
'DevOps' 카테고리의 다른 글
Docker container 를 활용해 CI/CD 실습해보자 feat(Jenkin, Ansible, Minikube) (0) | 2022.09.14 |
---|---|
Kubernetes 구조 이해하기 (0) | 2022.08.10 |
Terraform 을 사용해 AWS EC2 Instance 를 올려보자 (0) | 2022.07.26 |
AWS를 통한 효과적인 데브옵스 구축 2/e 2장 중 AWS CLI 로 EC2 구성하기 (0) | 2022.07.20 |
IaaS , PaaS , SaaS (0) | 2022.07.20 |