Kubernetes 마스터 및 워커 노드 설정 가이드 – ubuntu 22.04

🫆 [공통] Master Node, Worker Node

📌 ufw 서비스 중지

ufw : ubuntu 방화벽 서비스.

# ufw 서비스 중지.
sudo systemctl stop ufw

# ufw 서비스 자동 실행 중지.
sudo systemctl disable ufw

📌 swap 기능 비활성화

  • swap 기능을 비활성화 하는 이유.
  1. 노드 리소스 예측 : 노드의 CPU, 메모리 등의 자원을 효율적으로 사용하도록 설계. SWAP 메모리 사용 시 메모리 사용량 예측하기 어려움.
  2. Qos 보장 : 메모리 제한에 도달한 Pod가 Swap을 사용하게 되면, Swap 공간이 부족할 경우 프로세스가 종료될 수 있음.
  3. 성능저하 : 디스크 I/O가 증가하여 성능 저하 가능.

# Swap 끄기.
sudo swapoff -a

# swap 자동 마운트 끄기.
sudo vi /etc/fstab
# /swap ...   주석처리

📌 hosts 에 노드 정보 추가

vi /etc/hosts

# 마스터 및 워커 노드 노드 정보 추가.
# 0.0.0.0에 해당한 IP 넣기.

0.0.0.0 k8s-master-node
0.0.0.0 k8s-worker-node-01
0.0.0.0 k8s-worker-node-02

🐳 Docker 설치

# 필수 패키지 설치
sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release

# docker 공식 GPG 키 추가
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# docker 저장소 추가
echo "deb [arch=amd64 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

# docker 설치
sudo apt update -y
sudo apt upgrade -y
sudo apt install docker-ce -y

🛟 K8s 설치

# 시스템 기본 설정.
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl apt-transport-https gnupg ca-certificates

# 컨테이너 런타임 설치.
sudo apt install -y containerd
# 설정파일 생성.
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# systemdcgroup 활성화.
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

# 재시작
sudo systemctl restart containerd
sudo systemctl enable containerd

# k8s 설치.
sudo mkdir -p /etc/apt/keyrings

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.29/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] \
  https://pkgs.k8s.io/core:/stable:/v1.29/deb/ /" | \
  sudo tee /etc/apt/sources.list.d/kubernetes.list > /dev/null

# 설치.
sudo apt update
sudo apt install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

🧱 K8s 추가설정

# IP 포워딩 활성
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
  
# 변경 사항 적용
sudo sysctl -p

# br_netfilter 모듈 로드 (Kubernetes 및 기타 컨테이너 런타임이 브리지된 네트워크 트래픽을 올바르게 처리할 수 있도록 함)
sudo modprobe br_netfilter

# container.d 초기 설정 파일 생성
sudo bash -c "containerd config default > /etc/containerd/config.toml"

# systemd를 Cgroup 드라이버로 사용하는 설정
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/g' /etc/containerd/config.toml

# crictl 설정 파일
cat <<EOF | sudo tee -a /etc/crictl.yml
runtime-endpoint: unix:///var/run/containerd/containerd.sock
image-endpoint: unix:///var/run/containerd/containerd.sock
timeout: 10
debug: true
EOF

# container.d 재시작
sudo systemctl restart containerd 

# 시스템 부팅시 자동으로 시작하도록 설정
sudo systemctl enable containerd

🫆 Master Node 초기화

TIP: IP 자동 설정 명령어

sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=$(hostname -I | awk '{print $1}') \
  --cri-socket=unix:///var/run/containerd/containerd.sock
# --pod-network-cidr는 생성될 pod들의 네트워크 주소(subnet Mask 255.255.0.0)
# --apiserver-advertise-address는 마스터노드의 IP 주소

sudo kubeadm init --pod-network-cidr=10.10.0.0/16 --apiserver-advertise-address=192.168.0.0 --cri-socket=unix:///var/run/containerd/containerd.sock

[생략]
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.0.0:6443 --token 123456.1234567890123456 \
 --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7

# kubernetes 인증 정보 복사
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 설치 확인
kubectl get pods --all-namespaces

📦 Calico 설치 — Master Node

  • Calico : Network CNI 플러그인 중 하나
# CRD번들 크기가 크기 때문에 kubectl apply , replace 대신 create 사용해야 에러가 발생하지 않음
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml

# custom-resources.yaml 파일 다운로드
curl -O https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml

# cidr 정보 변경 (--pod-network-cidr 인 10.10.0.0/16로 변경)
vi custom-resources.yaml

# 변경한 내용으로 생성
kubectl create -f custom-resources.yaml

# 설치 확인하기 (coredNS의 상태가 Pending에서 Running으로 변경됨)
kubectl get pod -A
NAMESPACE          NAME                                      READY   STATUS    RESTARTS   AGE
calico-apiserver   calico-apiserver-68467b4b9d-lr6lg         1/1     Running   0          3m32s
calico-apiserver   calico-apiserver-68467b4b9d-ltlgn         1/1     Running   0          3m32s
calico-system      calico-kube-controllers-5c85f7b95-8kgtb   1/1     Running   0          4m37s
calico-system      calico-node-9lxpl                         1/1     Running   0          4m38s
calico-system      calico-typha-b9b589dc7-9b64q              1/1     Running   0          4m38s
calico-system      csi-node-driver-ztrgm                     2/2     Running   0          4m37s
kube-system        coredns-7db6d8ff4d-8n6xt                  1/1     Running   0          25m
kube-system        coredns-7db6d8ff4d-rdlwq                  1/1     Running   0          25m
kube-system        etcd-k8s-master                           1/1     Running   0          25m
kube-system        kube-apiserver-k8s-master                 1/1     Running   0          25m
kube-system        kube-controller-manager-k8s-master        1/1     Running   0          25m
kube-system        kube-proxy-pdcsj                          1/1     Running   0          25m
kube-system        kube-scheduler-k8s-master                 1/1     Running   0          25m
tigera-operator    tigera-operator-77f994b5bb-72lnv          1/1     Running   0          5m40s

📦 Worker Node 추가

# 기존 token 확인 
kubeadm token list

# 토큰 생성 (유효기간 : 24H)
kubeadm token create 

# 토큰 유효기간 설정하여 생성
kubeadm token create --ttl 48h

#  --discovery-token-ca-cert-hash 값 추출하기
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

# 워커 노드 추가하기
sudo kubeadm join 192.168.91.100:6443 --token 123456.1234567890123456 --discovery-token-ca-cert-hash sha256:d7a9fc38cd353b4803c63873bbad3fc1bbf5cfab44e678363e7699e930c99bc7

# master 노드의 인증 정보 파일(~/.kube/config) 복사
mkdir -p $HOME/.kube
scp sppolo@192.168.91.100:/home/sppolo/.kube/config /home/sppolo/.kube
sudo chown $(id -u):$(id -g) $HOME/.kube/config

🧱 선택사항 ➡️ Dashboard 설치

# dashboard  manifests 다운로드
curl -O https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.1/aio/deploy/recommended.yaml

# dashboard manifests 수정 (Service타입을 ClusterIP -> NodePort로 변경)
vi recommended.yaml

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 32000           # 외부 접근 포트 설정
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort                # 외부 접근 가능하도록 NodePort로 변경

# 마스터 노드에 파드 설치하도록 설정 변경 (taint 제거)
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule-

# dashboard 설치
kubectl create -f recommended.yaml

# 원복 (마스터노드에 파드 설치X)
kubectl taint nodes k8s-master node-role.kubernetes.io/control-plane:NoSchedule

# dashboard admin 계정 생성
kubectl create serviceaccount admin -n kubernetes-dashboard

# admin 계정에 클러스터 관리자 권한 부여
kubectl create clusterrolebinding admin-binding --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:admin

# dashboard admin토큰 생성
kubectl -n kubernetes-dashboard create token admin

# dashboard 접속하기
https://192.168.91.100:32000

댓글

댓글 남기기