Ubuntu 22.04 에서 Kubernetes 설치하기
k8s 1.24 ( 2022/05 ) 이후
k8s 에서 기본적으로 내부 연결 지원해주던 dockershim 이 제거되어
cri-docker 추가 설치하여 도커를 k8s에 연결하는 작업이 필요
아래 내용은 AWS EC2 를 이용해 Kubernetes 를 설치하는 방법을 설명합니다.
간단히 흐름을 정리해 보면
- EC2 인스턴스 생성
- 모든 인스턴스에 준비사항 반영
- 모든 인스턴스에 도커 설치
- Control-plane 구성 (master only)
- Worker node 구성 (worker node only)
이렇게 진행합니다.
기타 Hello, World 앱을 실행시켜 보는 것은 다른 문서에 작성하도록 하겠습니다.
EC2 인스턴스 생성
Ubuntu 22.04 버전을 선택해서 인스턴스를 생성합니다.
Master 에는 t3.small(메모리 2G, CPU 2개, 20G), Node 01 에는 t3.medium(메모리 4G, CPU 2개, 20G)를 설정해 줍니다.
비용은 시간당 100원이 안되므로 생성확인 후 삭제하면 비용발생은 많지 않습니다.
모든 인스턴스에 준비사항 반영
시스템 업데이트
sudo apt update
sudo sed -i "/#\$nrconf{restart} = 'i';/s/.*/\$nrconf{restart} = 'a';/" /etc/needrestart/needrestart.conf
sudo apt -y upgrade
Swap off
AWS EC2 인스턴스는 디폴트로 스왑을 disable 시키므로 필요없기는 하지만 그래도 적어 놓습니다.
sudo swapoff -a && sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
방화벽 off
sudo ufw disable
커널 파라미터 수정
sudo tee /etc/modules-load.d/containerd.conf <<EOF
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
sudo tee /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
보안그룹 설정
allow-kubernetes 라는 이름의 보안그룹을 생성합니다.
inbound/outbound 는 설정하지 않습니다.
protect-kubernetes 라는 이름의 보안그룹을 생성합니다.
inbound 에 아래 내용을 설정합니다.
- 유형 : 모든 TCP
- 포트범위 : 0 – 65535
- 소스 : allow-kubernetes
allow-kubernetes, protect-kubernetes 를 모든 master/node 에 할당해 줍니다.
모든 인스턴스에 도커 설치
sudo apt-get update
sudo apt-get install -y \
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 -y docker-ce docker-ce-cli containerd.io
sudo docker version
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl enable containerd
sudo systemctl start containerd
sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
# cri-docker Install
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
wget https://github.com/Mirantis/cri-dockerd/releases/download/v${VER}/cri-dockerd-${VER}.amd64.tgz
tar xvf cri-dockerd-${VER}.amd64.tgz
sudo mv cri-dockerd/cri-dockerd /usr/local/bin/
# cri-docker Version Check
cri-dockerd --version
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
# cri-docker Active Check
sudo systemctl restart docker && sudo systemctl restart cri-docker
sudo systemctl status cri-docker.socket --no-pager
sudo docker info | grep Cgroup
----------------
Cgroup Driver: systemd
Cgroup Version: 2
모든 인스턴스에 Kubernetes 설치
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/kubernetes-xenial.gpg
sudo apt-add-repository -y "deb http://apt.kubernetes.io/ kubernetes-xenial main"
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
Control-plane 구성 (master only)
반드시 master 에서만 실행합니다.
# sudo kubeadm init
sudo kubeadm init --cri-socket unix:///var/run/cri-dockerd.sock
아래와 유사한 메시지가 표시되면 메모장같은 곳에 복사해 놓습니다.
kubeadm join 172.31.43.124:6443 --token co2dgc.6tqutxehblku3mpp \
--discovery-token-ca-cert-hash sha256:af76d7e108915d86b3af4be9a8b3d1e26799de1a96ec75f84e80d7be32b68012
아래 명령을 설정해 줌으로 해서 sudo 없이 kubectl 을 실행할 수 있습니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# sudo 를 붙이지 않습니다.
kubectl version
---------------------------
Client Version: v1.28.2
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.28.5
kubectl get nodes
---------------------------
NAME STATUS ROLES AGE VERSION
ip-172-31-43-124 NotReady control-plane 3m40s v1.28.2
kubectl get pods -n kube-system
---------------------------
NAME READY STATUS RESTARTS AGE
coredns-5dd5756b68-jz8hj 0/1 Pending 0 2m50s
coredns-5dd5756b68-qg2ll 0/1 Pending 0 2m50s
etcd-ip-172-31-41-44 1/1 Running 0 2m53s
kube-apiserver-ip-172-31-41-44 1/1 Running 0 2m53s
kube-controller-manager-ip-172-31-41-44 1/1 Running 0 2m53s
kube-proxy-d8lwv 1/1 Running 0 2m51s
kube-scheduler-ip-172-31-41-44 1/1 Running 0 2m53s
위에 NotReady/Pending 은 신경쓰지 않아도 됩니다.
Worker node 구성 (worker node only)
아래 명령으로 Worker node 를 등록합니다.
sudo 를 반드시 붙여서 실행해야 합니다.
--cri-socket
을 추가해 주어야 합니다.
sudo kubeadm join 172.31.16.157:6443 --token ou08ek.xzjXXXXXXXXXXXXX \
--discovery-token-ca-cert-hash sha256:6e0305d27b12b3f8b51d8e021138d59227124c2XXXXXXXXXXXXXXXX \
--cri-socket unix:///var/run/cri-dockerd.sock
Pod network 애드온 설치 (master only)
# kubectl apply -f https://github.com/weaveworks/weave/releases/download/v2.8.1/weave-daemonset-k8s.yaml
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.25.0/manifests/calico.yaml
kubectl get nodes
kubectl get pods -n kube-system