[공통] Master Node, Worker Node
📌 ufw 서비스 중지
ufw : ubuntu 방화벽 서비스.
# ufw 서비스 중지.
sudo systemctl stop ufw
# ufw 서비스 자동 실행 중지.
sudo systemctl disable ufw
📌 swap 기능 비활성화
- swap 기능을 비활성화 하는 이유.
- 노드 리소스 예측 : 노드의 CPU, 메모리 등의 자원을 효율적으로 사용하도록 설계. SWAP 메모리 사용 시 메모리 사용량 예측하기 어려움.
- Qos 보장 : 메모리 제한에 도달한 Pod가 Swap을 사용하게 되면, Swap 공간이 부족할 경우 프로세스가 종료될 수 있음.
- 성능저하 : 디스크 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

