본 포스팅에서 사용하는 버전은
- 쿠버네티스 1.24
- 우분투 20.04
- calico 3.23
을 기준으로 사용한다.
설치는 마스터 하나, 워커 2개 설치를 진행하며 공통적으로 해야하는 부분과, 각 노드마다 설정해 줘야하는 부분으로 나눠서 설명한다.
공통
설치를 위해 각 노드들의 방화벽 설정은 열어두고 진행.
마음 편하게 private network 상 패킷만 모두 통과하는 정책을 사용하거나 모두 꺼두고 진행하는게 편하다.
0. swap 메모리 끄기
쿠버네티스는 자원 관리를 확실히 하기 위해 swap 메모리를 사용하지 않는다. 아래 명령어로 swap 메모리를 비활성화 한다.
sudo swapoff -a
1. 네트워크 설정
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
아래 3줄의 명령은 반드시 루트계정에서
echo 1 > /proc/sys/net/ipv4/ip_forward
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
2. 컨테이너 런타임 설치
여기서는 containerd, cri-o 두개의 런타임 설치에 대해 다룬다.
아래 두개중 하나의 컨테이너 런타임을 선택하여 설치하면 된다.
2.1 containerd설치 (선택1)
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update && sudo apt install containerd.io
cri 인터페이스 활성화
/etc/containerd/config.toml 파일 수정
disabled_plugins = ["cri"] 라인 주석 추가
...
# disabled_plugins = ["cri"]
...
containerd 재실행
service containerd restart
2.2 cri-o설치 (선택2)
https://kubernetes.io/ko/docs/setup/production-environment/container-runtimes/#cri-o
컨테이너 런타임
파드가 노드에서 실행될 수 있도록 클러스터의 각 노드에 컨테이너 런타임을 설치해야 한다. 이 페이지에서는 관련된 항목을 설명하고 노드 설정 관련 작업을 설명한다. 쿠버네티스 1.24에서는
kubernetes.io
위 링크의 설치 내용을 간단히 요약한거다.
네트워크 세팅
# .conf 파일을 만들어 부팅 시 모듈을 로드한다
cat <<EOF | sudo tee /etc/modules-load.d/crio.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
# 요구되는 sysctl 파라미터 설정, 이 설정은 재부팅 간에도 유지된다.
cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
커널 변수 설정
OS=xUbuntu_20.04
VERSION=1.20
위 OS변수는 설치를 진행하는 호스트의 우분투 버전
아래 VERSION 변수는 설치 하고자 하는 CRI-O의 버전
만약 환경이 다르다면 다르게 설정하면 된다.
설치 진행
cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable.list
deb https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/ /
EOF
cat <<EOF | sudo tee /etc/apt/sources.list.d/devel:kubic:libcontainers:stable:cri-o:$VERSION.list
deb http://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/$VERSION/$OS/ /
EOF
curl -L https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers.gpg add -
curl -L https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/Release.key | sudo apt-key --keyring /etc/apt/trusted.gpg.d/libcontainers-cri-o.gpg add -
apt-get update
apt-get install cri-o cri-o-runc
3. 쿠버네티스 설치
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
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 -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
마스터노드
쿠버네티스 control plane initialization
마스터노드에서는 쿠버네티스의 initialization를 진행한다.
sudo kubeadm init --pod-network-cidr=192.168.0.0/16
옵션으로 사용된 pod-network-cidr은 calico 사용을 위해 192.168.0.0/16 으로 지정해준다.
다른 cidr을 사용하기 위해선 calico setting을 바꿔주면 된다.
정상적으로 설치가 완료되게 되면 아래와 같은 결과가 나오게 된다.
초기화가 성공하면 설명에 따라 몇가지 작업을 진행해준다.
일반유저일때
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
루트유저일때
export KUBECONFIG=/etc/kubernetes/admin.conf
맨 마지막에는 워커노드 조인을 위한 명령어가 나오게 된다.
kubeadm join 172.16.10.7:6443 --token yjie5s.wnk9mzvme8isj1u7 \
--discovery-token-ca-cert-hash sha256:d39ef3a16753820d75c30bc0315c54e5373b73728ab47261d924bad2786c39a6
이는 워커노드에서 실행시켜 join할때 사용된다.
calico CNI 설치
이후 네트워크를 위한 인터페이스를 설치한다.
https://projectcalico.docs.tigera.io/getting-started/kubernetes/self-managed-onprem/onpremises
Install Calico networking and network policy for on-premises deployments
Install Calico networking and network policy for on-premises deployments.
projectcalico.docs.tigera.io
calico 관련 yml 파일을 다운로드 받은 후 kubectl apply를 통해 적용시킨다.
curl https://projectcalico.docs.tigera.io/manifests/calico.yaml -O
kubectl apply -f calico.yaml
워커노드
워커노에서는 쿠버네티스 초기화의 결과로 나온 조인 명령을 사용하여 조인하게 된다.
kubeadm join 172.16.10.7:6443 --token yjie5s.wnk9mzvme8isj1u7 \
--discovery-token-ca-cert-hash sha256:d39ef3a16753820d75c30bc0315c54e5373b73728ab47261d924bad2786c39a6
이 인증은 토큰 기반 인증이므로, 토큰의 유효기간이 끝나게 되면 해당 명령으론 조인이 불가하다.
이때는 마스터노드 에서 다음 명령을 실행시켜 새 토큰 발행과 함께 새로운 조인 명령을 받을 수 있다.
#마스터 노드에서 실행
kubeadm token create --print-join-command
워커노드에서는 join 명령을 이용하여 마스터 노드에 붙기만 하면 설정이 끝난다.
만약 워커노드에서 클러스터의 kubectl 명령을 사용하고자 한다면 마스터노드 홈디렉토리에 있는 .kube 디렉토리를 워커노드의 홈 디렉토리로 옮겨주면 된다.
워커노드와 마스터 노드에서 모든 설정이 끝난 후
kubectl get po -A -owide
명령을 통해 각 노드들에서 kube-proxy, calico-node pod 들이 잘 작동하는지, coredns, kube-controller, calico-controller pod들이 잘 작동하는지 확인하면 된다.
STATUS가 Running이고,
Ready가 1/1 이면 잘 작동하는거다.
만약 Ready가 0/1 이라면 해당 pod에 무언가 문제가 있는것이므로 다음 명령을 통해 문제를 해결해야함.
kubectl describe pod [pod이름] -n kube-system