우분투에 쿠버네티스(k8s) 싱글 노드를 구성하는 방법
테스트 환경
컨트롤 플레인 | control-plane |
워커 노드 | worker1 |
컨테이너 런타임 | Containerd |
네트워크 플러그인 | Flannel |
1. 호스트 이름 변경
sudo hostnamectl set-hostname control-plane
sudo hostnamectl set-hostname worker1
2. 호스트(/etc/hosts) 파일 수정
cat <<EOF >> /etc/hosts
# kubernetes
192.168.10.111 control-plane
192.168.10.114 worker1
EOF
3. Swap 비활성화(스왑 끄기)
sudo swapoff -a
sudo sed -i '/\/swap\.img[[:space:]]\+none[[:space:]]\+swap[[:space:]]\+sw[[:space:]]\+0[[:space:]]\+0/s/^/#/' /etc/fstab
Swap 상태 확인
swapon -s
4. 방화벽(firewalld) 비활성화
sudo systemctl --now disable ufw
5. Kernel 모듈 및 Parameters 설정
br_netfilter 및 overlay 모듈 로드
sudo tee /etc/modules-load.d/k8s.conf <<EOF
overlay
br_netfilter
EOF
모듈 로드
sudo modprobe overlay
sudo modprobe br_netfilter
모듈 확인
lsmod | grep "overlay\|br_netfilter"
IP 포워딩 및 iptables 설정
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
IP 포워딩 활성화
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl 설정 적용
sudo sysctl -p
sysctl 설정 확인
sudo sysctl -a | grep 'net.bridge.bridge-nf-call-ip6tables\|net.bridge.bridge-nf-call-iptables\|net.ipv4.ip_forward'
6. 시스템 패키지 업데이트 및 필수 패키지 설치
sudo apt-get update
sudo apt-get install -y gnupg2 software-properties-common apt-transport-https \
ca-certificates lsb-release curl
7. Containerd 설치 및 설정
Docker 리포지토리 추가
sudo rm -f /etc/apt/trusted.gpg.d/docker.gpg
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmour -o /etc/apt/trusted.gpg.d/docker.gpg
sudo add-apt-repository -y "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
Containerd 설치
sudo apt-get update
sudo apt-get install -y containerd.io
sudo systemctl --now enable containerd
Containerd 버전 정보 확인
$ containerd --version
containerd github.com/containerd/containerd 1.7.12
Containerd 설정 파일 생성
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
Containerd 설정 파일 수정
- containerd(config.toml) 설정 파일에서 SystemdCgroup 설정을 true로 변경합니다.
sudo sed -i 's/^\([[:blank:]]*\)SystemdCgroup = false/\1SystemdCgroup = true/' /etc/containerd/config.toml
cat /etc/containerd/config.toml | grep SystemdCgroup
Containerd 서비스 재시작
sudo systemctl restart containerd
Containerd 서비스 상태 확인
sudo systemctl status containerd --no-pager -l
8. 쿠버네티스 설치
쿠버네티스 버전 지정
KUBERNETES_VERSION="v1.30"
쿠버네티스 apt-keyring 설정 및 GPG 키 설정
sudo mkdir -p -m 755 /etc/apt/keyrings
sudo rm -f /etc/apt/keyrings/kubernetes-apt-keyring.gpg
curl -fsSL https://pkgs.k8s.io/core:/stable:/${KUBERNETES_VERSION}/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
쿠버네티스 APT 리포지토리 추가
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/${KUBERNETES_VERSION}/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list
kubeadm, kubelet, kubectl 패키지 설치
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
kubeadm, kubelet, kubectl 패키지 버전 고정(업그레이드 방지)
sudo apt-mark hold kubelet kubeadm kubectl
kubelet 서비스 활성화 및 시작
sudo systemctl --now enable kubelet
kubelet 서비스 상태 확인
sudo systemctl status kubelet --no-pager -l
9. 컨트롤 플레인에서 쿠버네티스 클러스터 초기화
컨트롤 플레인(control-plane)에서 kubeadm을 사용하여 클러스터를 초기화합니다.
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 | tee $HOME/kubeadm_init_output.log
---
...
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.10.111:6443 --token c1mrm6.75ecxwbwb0o1l4l5 \
--discovery-token-ca-cert-hash sha256:dd6064f540fc386db8cdc2e226e8a24fe5fca15c50d230684038fe2898f33d98
---
명령이 성공하면 kubeadm join 명령이 출력됩니다. 이 명령은 워커 노드를 클러스터에 추가할 때 사용됩니다.
kubeconfig 설정
컨트롤 플레인에서 kubectl을 사용하려면 일반 사용자로 kubeconfig 파일을 설정해야 합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl의 자동 완성 기능을 Bash 셸에서 활성화
echo "source <(kubectl completion bash)" | tee -a $HOME/.bashrc
kubectl 설정 확인
kubectl config view
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: DATA+OMITTED
server: https://192.168.10.111:6443
name: kubernetes
contexts:
- context:
cluster: kubernetes
user: kubernetes-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
user:
client-certificate-data: DATA+OMITTED
client-key-data: DATA+OMITTED
클러스터 상태 확인
kubectl get nodes
NAME STATUS ROLES AGE VERSION
control-plane NotReady control-plane 8m29s v1.30.4
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7db6d8ff4d-2wpxx 0/1 Pending 0 8m58s
kube-system coredns-7db6d8ff4d-xghnp 0/1 Pending 0 8m58s
kube-system etcd-control-plane 1/1 Running 0 9m10s
kube-system kube-apiserver-control-plane 1/1 Running 0 9m10s
kube-system kube-controller-manager-control-plane 1/1 Running 0 9m10s
kube-system kube-proxy-5kj4b 1/1 Running 0 8m58s
kube-system kube-scheduler-control-plane 1/1 Running 0 9m13s
10. 네트워크 플러그인 설치(CNI 설정 - 컨트롤 플레인)
쿠버네티스는 네트워킹을 위해 추가 플러그인이 필요합니다. 가장 많이 사용하는 플러그인 중 하나인 플란넬(Flannel)을 설치합니다.
Flannel 네트워크 플러그인 설치
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
namespace/kube-flannel created
serviceaccount/flannel created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
Flannel 파드 상태 확인
kubectl get pods --namespace=kube-flannel
NAME READY STATUS RESTARTS AGE
kube-flannel-ds-8x9nr 1/1 Running 0 65s
kubectl get pods -n kube-flannel -l app=flannel
파드 상태 확인
kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-flannel kube-flannel-ds-8x9nr 1/1 Running 0 103s
kube-system coredns-7db6d8ff4d-2wpxx 1/1 Running 0 12m
kube-system coredns-7db6d8ff4d-xghnp 1/1 Running 0 12m
kube-system etcd-control-plane 1/1 Running 0 12m
kube-system kube-apiserver-control-plane 1/1 Running 0 12m
kube-system kube-controller-manager-control-plane 1/1 Running 0 12m
kube-system kube-proxy-5kj4b 1/1 Running 0 12m
kube-system kube-scheduler-control-plane 1/1 Running 0 12m
11. 워커 노드 클러스터 구성(워커 노드 join)
각 워커 노드에서 다음 명령을 실행하여 클러스터에 추가합니다. 이 명령은 kubeadm init 명령 실행 시 출력된 kubeadm join 명령입니다.
sudo kubeadm join <control-plane_IP>:6443 \
--token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
kubeadm join 192.168.10.111:6443 \
--token c1mrm6.75ecxwbwb0o1l4l5 \
--discovery-token-ca-cert-hash sha256:dd6064f540fc386db8cdc2e226e8a24fe5fca15c50d230684038fe2898f33d98
---
...
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.
---
각 워커 노드에서 위 명령을 실행하여 클러스터에 조인합니다.
12. 클러스터 상태 확인
모든 노드가 정상적으로 클러스터에 조인되었는지 확인합니다.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
control-plane Ready control-plane 16m v1.30.4
worker1 Ready <none> 98s v1.30.4
참고URL
- phoenixNAP : https://phoenixnap.com/kb/how-to-install-kubernetes-on-centos
- docker docs : Install using the convenience script
- kubernetes docs : kubeadm 설치하기
'리눅스' 카테고리의 다른 글
MetalLB를 설치하고 설정하여 LoadBalancer 서비스를 테스트하는 방법 (0) | 2024.08.21 |
---|---|
Kubernetes CNI 플러그인과 특징 비교 (0) | 2024.08.21 |
쿠버네티스에 Ingress Controller를 설치하고 이를 통해 외부에서 NGINX 웹 서비스에 접근할 수 있도록 설정하는 방법 (0) | 2024.08.19 |
쿠버네티스 클러스터에서 노드를 새로운 노드로 교체하는 방법 (0) | 2024.08.16 |
쿠버네티스 워커 노드를 설치하고 클러스터에 참여시키기 (0) | 2024.08.16 |