Kubernetes는 컨테이너 오케스트레이션 플랫폼으로, 애플리케이션의 배포, 확장 및 관리를 자동화하는 오픈 소스 도구입니다. 현재 Kubernetes는 정말 많은 곳에서 활용되고 있습니다. 이번 가이드에서는 Kubernetes Cluster를 CentOS 환경에서 구성하는 방법에 대해 알아보겠습니다.
sudo systemctl disable --now firewalld
원활한 테스트를 위해 방화벽을 비활성화 합니다. 방화벽을 따로 설정하여 진행하셔도 됩니다.
sudo swapoff -a
swap을 사용하여 node를 실행할 경우, 공유 시스템을 실행 가능하게 만드는 많은 격리 속성이 손실되기 때문에 권장하지 않는다고 합니다. 또한 swap을 사용하여 kubernetes를 구축하는게 '기술적으로 어려워서'라는 이유로 지원되지 않았습니다.
그러나 1.28 버전 이후로 베타 지원을 한다고 합니다. 관련 내용은 해당 문서를 확인해주세요.
저는 원활한 테스트를 위해 그냥 swap을 종료하도록 하겠습니다.
sudo modprobe br_netfilter
sudo modprobe overlay
cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
br_netfilter
: Kubernetes는 Pod 간 통신을 가능하게 하는 가상 이더넷 브릿지를 사용하는데, 이 모듈을 활성화함으로써 IP 패킷을 브릿지로 전달하고 네트워크 패킷을 필터링하여 클러스터 내의 다양한 Pod 간에 통신이 가능하도록 합니다.
overlay
: Kubernetes에서 Overlay 네트워크를 통해 Pod의 IP 주소를 캡슐화/언캡슐화하여 클러스터 내의 다른 노드에 있는 Pod로 트래픽을 전달합니다.
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
net.bridge.bridge-nf-call-iptables
: 브릿지 네트워크 드라이버가 iptables를 호출하도록 허용합니다.
net.ipv4.ip_forward
: IPv4 패킷 포워딩을 활성화합니다. Kubernetes에서는 여러 노드에 걸쳐 있는 Pod 간의 통신을 가능하게 하기 위해 패킷을 전달할 때 IP 포워딩이 필요합니다.
net.bridge.bridge-nf-call-ip6tables
: 브릿지 네트워크 드라이버가 ip6tables를 호출하도록 허용합니다. IPv6를 사용하는 환경에서 IPv6 패킷을 필터링하고 관리하기 위해 필요합니다.
sudo sysctl --system
변경한 내용을 적용합니다.
* Applying /etc/sysctl.d/kubernetes.conf ...
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
성공적으로 적용되었음을 확인하실 수 있습니다.
sudo yum update -y
Kubernetes를 설치하기 위해 패키지를 업데이트합니다.
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key
EOF
Kubernetes를 설치하기 위해 Repository를 등록합니다. 해당 링크를 참고하여 관련 업데이트 내용을 확인해주시기 바랍니다.
sudo yum install kubelet kubeadm kubectl -y
sudo systemctl enable --now kubelet
Kubernetes를 설치하고 실행합니다.
sudo yum install yum-utils -y
Containerd 설치를 위해 yum-utils를 설치합니다.
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Containerd를 설치하기 위해 Repository를 등록합니다.
sudo yum install containerd.io -y
Containerd를 설치합니다.
sudo rm -rf /etc/containerd/config.toml
sudo systemctl enable --now containerd
Kubernetes init 작업 시, runtime.v1alpha2.RuntimeService
에러가 발생할 수 있기 때문에 설정 파일을 삭제하고 Containerd를 실행합니다.
sudo kubeadm init --pod-network-cidr=<Pod의 기본 cidr 지정> --control-plane-endpoint=<Master Node IP>
Kubernetes의 Master Node를 초기화합니다.
kubeadm join <Master Node IP>:6443 --token <Token 값> \
--discovery-token-ca-cert-hash <Hash 값>
성공적으로 수행되면 위와 같은 문구가 출력됩니다. 이 명령어를 Worker Node에 입력하여 클러스터에 Join해야 합니다.
접속중인 유저가 Kubernetes를 사용하기 위해서 admin 설정 파일을 옮기도록 하겠습니다.
mkdir $HOME/.kube
현재 접속한 유저의 Home 경로에 .kube
폴더를 생성합니다.
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
admin 설정 파일을 옮겨줍니다.
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo chown -R $USER $HOME/.kube
admin 설정 파일의 소유자를 변경합니다.
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
컨테이너 간의 네트워킹 제어를 위해서 CNI를 설치합니다.
kubeadm join <Master Node IP>:6443 --token <Token 값> \
--discovery-token-ca-cert-hash <Hash 값>
Master Node 초기화 작업 이후 출력된 명령어를 입력합니다.
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
성공적으로 연결되었음을 확인하실 수 있습니다.
accepts at most 1 arg(s), received 3
To see the stack trace of this error execute with --v=5 or higher
Master Node 초기화 작업을 진행하면서 Token이 만료되면 이와 같은 에러가 발생할 수도 있습니다.
kubeadm token create --print-join-command
해당 에러가 발생할 경우, Master Node에서 Token을 다시 생성해서 연결 작업을 진행하시면 됩니다.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
gweowe-master Ready control-plane 16h v1.28.1
gweowe-worker-1 Ready <none> 15h v1.28.1
gweowe-worker-2 Ready <none> 15h v1.28.1
gweowe-worker-3 Ready <none> 15h v1.28.1
Cluster가 제대로 구성되었음을 확인할 수 있습니다.