쿠버네티스 구축 실습하기
순서
(1) GCP VM에 쿠버네티스 구축하기
- HAProxy 서버 1대, Master Node 3대
(2) Rook-Ceph을 이용해서 cephFS 구축하기
준비물
VM Instance 4대(HAProxy 1대, Master Node 3대)
OS : ubuntu 22.04 LTS
4vCPU, 16GB, 50GB >> 디스크용량 넉넉하게 하자. ceph, tekton 설치하려다 보니 용량이 부족함.
GCP에서 4대 생성 후 고정IP 적용, SSH키 설정
1. 공통 작업(4대 모두 진행)
hostname을 설정하고 ip addr show 나 hostname -I 로 vm 내부 ip를 확인 후 /etc/hosts에 IP와 hostname을 넣는다.
# 호스트 이름 확인
hostnamectl
# (1) hostname 설정
sudo hostnamectl set-hostname <호스트명>
# 예: haproxy-node, master1, master2, master3
# (2) /etc/hosts 추가
sudo vim /etc/hosts
# 예시(기존 내용 밑에 추가하면 됨)
10.178.0.4 haproxy
10.178.0.5 master1
10.178.0.6 master2
10.178.0.8 master3
내부 IP 고정하기
/etc/netplan에 보면 yaml이 하나 있음. 이거 내용을 수정.
GCP에서는 내부IP가 인스턴스 삭제하지 않으면 고정이라 굳이 할 필요 없음.
# 예시임. 클라우드마다 다름.
sudo vim /etc/netplan/01-netcfg.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses:
- 172.20.100.57/24 << 이 부분을 vm 개별 사설 ip로 변경
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
routes:
- to: 0.0.0.0/0
via: 172.20.100.1 << 이 부분을 vm 개별 사설 ip로 변경
4대 다 작업하고
sudo netplan apply 로 적용한다. 경고가 뜨는데 권한이 너무 많이 열려 있어서 나오는 거임.
2. HAProxy 서버에 HAProxy 설치하기(1대만)
sudo apt update
sudo apt install -y haproxy
sudo systemctl enable --now haproxy
sudo systemctl status haproxy
상태 확인에서 Active: active (running) 나오면 정상
/etc/haproxy/haproxy.cfg 파일 수정하기
sudo vim /etc/haproxy/haproxy.cfg
안에 내용 보면 global 이랑 default 만 있는데 여기에 fronend, backend를 추가한다.
- frontend → 클라이언트가 접속하는 포트 (6443)
- backend → 실제 Master Node 3대로 트래픽 분산
- 내부 IP는 본인 환경에 맞게 수정
- mode tcp << 이 부분이 중요하다.
frontend kubernetes-frontend
mode tcp
option tcplog
bind *:6443
default_backend kubernetes-backend
backend kubernetes-backend
mode tcp
balance roundrobin
server master1 10.178.0.5:6443 check
server master2 10.178.0.6:6443 check
server master3 10.178.0.8:6443 check
설정 파일 문법 확인
Configuration file is valid 나오면 OK
sudo haproxy -c -f /etc/haproxy/haproxy.cfg
HAProxy 재시작
sudo systemctl restart haproxy
sudo systemctl status haproxy
Active: active (running) 나와야 정상
3. 도커 설치하기(master 3대에만 설치하면 된다.) -> 이거 도커 설치할 필요 없이 containerd만 설치해도 된다.
https://joosblog.tistory.com/500
containerd 설치하기
https://jbground.tistory.com/107
sudo apt update
sudo apt install -y containerd
sudo systemctl enable --now containerd
sudo systemctl status containerd
containerd 기본 설정 생성 후 재시작
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
sudo systemctl restart containerd
4. Kubernetes 설치 (kubeadm, kubelet, kubectl) (master 3대에만 설치하면 된다.)
한국어 공식 문서는 보지 말자.
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
These instructions are for Kubernetes v1.34.
# 필수 패키지 설치
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 패키지 목록 업데이트
sudo apt-get update
# 설치 전 버전 고정 해제
sudo apt-mark unhold kubeadm kubelet kubectl
# Kubernetes 주요 패키지 설치
sudo apt-get install -y kubelet kubeadm kubectl
# 설치 후 버전 고정
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
# 설치 확인
kubectl version --client
kubeadm version
kubelet --version
1.32.8 버전 설치할 경우
# 필수 패키지 설치
sudo apt-get update
# apt-transport-https may be a dummy package; if so, you can skip that package
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# If the directory `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 패키지 목록 업데이트
sudo apt-get update
# 설치 전 버전 고정 해제
sudo apt-mark unhold kubeadm kubelet kubectl
# Kubernetes 주요 패키지 설치
sudo apt install -y kubeadm=1.32.8-1.1 kubelet=1.32.8-1.1 kubectl=1.32.8-1.1
# 설치 후 버전 고정
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
# 설치 확인
kubectl version --client
kubeadm version
kubelet --version
5. 쿠버네티스 설정하기
kubeadm init 하기 전에 밑에 있는 스크립트를 이용해서 설정을 변경하자.
k8s-prep.sh으로 한번에 설정하기(3개 마스터노드에서 모두 실행)
# 아래 스크립트를 넣는다.
sudo vim k8s-prep.sh
sudo chmod +x k8s-prep.sh
./k8s-prep.sh
#!/bin/bash
set -e
echo "[1/5] 스왑 비활성화"
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
echo "[2/5] containerd 설정 수정 (SystemdCgroup=true)"
sudo mkdir -p /etc/containerd
if [ ! -f /etc/containerd/config.toml ]; then
containerd config default | sudo tee /etc/containerd/config.toml > /dev/null
fi
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
echo "[3/5] 네트워크 브리지 설정"
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-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system
echo "[4/5] kubelet 설정 (systemd cgroup)"
sudo mkdir -p /var/lib/kubelet
cat <<EOF | sudo tee /var/lib/kubelet/config.yaml
kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io/v1beta1
cgroupDriver: systemd
EOF
echo "[5/5] 서비스 재시작"
sudo systemctl daemon-reexec
sudo systemctl restart containerd
sudo systemctl restart kubelet
echo "✅ Kubernetes 사전 준비 완료!"
echo "이제 'sudo kubeadm reset -f && sudo kubeadm init ...' 실행하세요."
kubeadm으로 설치한 마스터/워커 노드 초기화
sudo kubeadm reset -f
kubeadm init 실행하기(1대의 마스터노드에서만 실행한다.)
1️⃣ 기본 명령
- sudo kubeadm init → 현재 노드를 쿠버네티스 마스터 노드로 초기화
- 실행 후 kube-apiserver, etcd, 컨트롤 플레인 구성
sudo kubeadm init --control-plane-endpoint "172.20.100.54:6443" --upload-certs --pod-network-cidr=10.244.0.0/16
2️⃣ 옵션 설명
2-1. --control-plane-endpoint "172.20.100.54:6443" <<< 이거 자신의 haproxy에 맞게 변경(내부IP)
- 클러스터 컨트롤 플레인 접근용 엔드포인트 지정
- HAProxy 등 로드밸런서를 통한 마스터3대 접근 시 사용
- IP: 172.20.100.54 → HAProxy 고정 내부 IP
- Port: 6443 → kube-apiserver 기본 포트
- 마스터가 여러 대일 때 API 서버 접속을 단일 엔드포인트로 통일 가능
2-2. --upload-certs
- 클러스터 인증서(ETCD, kubelet, controller-manager 등)를 kubeadm join 시 다른 마스터가 자동 가져가도록 업로드
- 다중 마스터 환경에서 다른 마스터 노드를 쉽게 조인 가능
2-3. --pod-network-cidr=10.244.0.0/16
- Pod 네트워크 CIDR 지정
- CNI 플러그인(예: Flannel, Calico)에서 Pod IP 할당 범위 사용
- 예시: Flannel 기본 CIDR → 10.244.0.0/16
- 주의: CNI와 CIDR이 일치해야 Pod 통신 가능
init 성공하면 아래와 같이 나옴.
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/
You can now join any number of control-plane nodes running the following command on each as root:
kubeadm join 10.178.0.4:6443 --token 2vk06f.8q8l5vktzuitlq3x \
--discovery-token-ca-cert-hash sha256:bc244b779a1e3c5ec84ba8962c01926aee32f70b650705ad1adc1926e33cd9ec \
--control-plane --certificate-key 97d5d218c2f435a468b620ea3420d335bd6ac962dad4e0e3100d66dad3343ccc
Please note that the certificate-key gives access to cluster sensitive data, keep it secret!
As a safeguard, uploaded-certs will be deleted in two hours; If necessary, you can use
"kubeadm init phase upload-certs --upload-certs" to reload certs afterward.
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.178.0.4:6443 --token 2vk06f.8q8l5vktzuitlq3x \
--discovery-token-ca-cert-hash sha256:bc244b779a1e3c5ec84ba8962c01926aee32f70b650705ad1adc1926e33cd9ec
init 하다가 에러나면 클러스터 초기화 잔여 파일 삭제 (주의: 기존 데이터 삭제)
아래 명령어 실행 후 설정 맞게 변경하고 다시 init 하자.
- kubeadm reset → 기존 kubeadm 상태 초기화
- manifests/, etcd 삭제 → 남은 Pod/데이터 제거
sudo kubeadm reset -f
sudo rm -rf /etc/kubernetes/manifests
sudo rm -rf /var/lib/etcd
sudo systemctl restart kubelet
init 성공하면 init했던 노드(마스터노드1)에서 kubectl 설정하고, flannel 생성하기
Flannel은 Kubernetes 같은 컨테이너 오케스트레이션 환경에서 Pod 간 네트워크를 구성하기 위한 CNI(Container Network Interface) 플러그인 중 하나예요. 간단히 말해, 쿠버네티스 클러스터 안에서 서로 다른 노드에 있는 Pod들이 통신할 수 있도록 가상 네트워크를 만들어 주는 소프트웨어입니다.
보통은 calico를 사용한다. 다음에는 calico를 설치하도록 하자.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Calico 설치(ver 3.28.1)
CNI는 join하고 설치해도 됨 -> CNI 설치 전에는 Node status가 not ready임.
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/calico.yaml
Flannel 설치하기 -> 보통은 calico를 사용한다. 다음에는 calico를 설치하도록 하자.
# 보통은 calico를 사용한다. 다음에는 calico를 설치하도록 하자.
# kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
init 했던 마스터노드 말고 다른 2대의 마스터노드를 조인하기(마스터노드2,3)
이 명령어는 init 했을 때 나오는 걸 복사해서 실행해야 함.sudo로 실행
sudo kubeadm join 10.178.0.4:6443 --token 2vk06f.8q8l5vktzuitlq3x \
--discovery-token-ca-cert-hash sha256:bc244b779a1e3c5ec84ba8962c01926aee32f70b650705ad1adc1926e33cd9ec \
--control-plane --certificate-key 97d5d218c2f435a468b620ea3420d335bd6ac962dad4e0e3100d66dad3343ccc
join 성공했으면 kubectl 설정하고 클러스터 상태 확인하기 (마스터노드2,3)
# kubectl 설정 (사용자 계정 기준)
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 nodes
kubectl get pods -A
GCP VM에서는 flannel POD가 오류남
모든 노드에서 다 해줘야 함.
# br_netfilter 모듈 로드
sudo modprobe br_netfilter
#이 설정은 브리지 네트워크에서 iptables를 통해 트래픽이 정상 처리되도록 해줌
#Flannel, Calico 등 대부분 CNI에서 필수
sudo tee /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
# Flannel DaemonSet 재시작
kubectl delete pod -n kube-flannel -l app=flannel
kubectl get pods -n kube-flannel -o wide
마스터노드에도 일반 pod 생성하도록 설정 변경
원래 마스터노드에는 쿠버네티스 관련 pod만 생성하고 워커 노드에 일반적인 pod를 생성하는데
지금은 마스터노드만 있으니까 마스터노드에도 pod를 생성할 수 있도록 taint 설정을 변경해야 한다.
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
testuser@master1:~$ kubectl taint nodes --all node-role.kubernetes.io/control-plane-
node/master1 untainted
node/master2 untainted
node/master3 untainted
이렇게 untainted가 나오면 pod를 생성할 수 있다.
kubeadm 초기화 -> 다른 버전으로 설치하기
sudo kubeadm reset -f
sudo systemctl stop kubelet
sudo systemctl stop containerd
sudo rm -rf /etc/cni/net.d
sudo rm -rf /etc/kubernetes
sudo rm -rf /var/lib/etcd
sudo rm -rf /var/lib/kubelet/*
sudo systemctl restart containerd
sudo systemctl restart kubelet'배운 내용 > Kubernetes' 카테고리의 다른 글
| 실무과제5 tekton 설치 (0) | 2025.09.24 |
|---|---|
| 실무과제4 Rook-Ceph 설치 (0) | 2025.09.24 |
| Ubuntu 환경에서 K9S 설치 / 명령어 자동완성 (0) | 2025.09.18 |
| [web]deployment - pod - service - ingress 설정 - aws route53 (1) | 2025.08.18 |
| [Helm] kubernetes-dashboard 설치 (0) | 2025.06.12 |
