Joo's
반응형

쿠버네티스 구축 실습하기

순서

(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
반응형
profile

Joo's

@JooJY

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!