간단하게 kubernetes cluster 구축하기

서용준·2024년 4월 12일

쿠버네티스

목록 보기
4/4

내가 했던 내용 정리할 겸 올려본다.
참고로 이거 v1.29.3으로, 내가 사용한 시점에는 최신버전이었다.

우선 내가 했던 환경을 정리하면 다음과 같다
OS : Ubuntu-22.04-server-amd64
CPU :

  • control-plane-node : 4-core
  • worker-node : 2-core
    RAM :
  • control-plane-node : 8GB
  • worker-node : 4GB
    Storage:
  • ALL : 60GB

우선 처음에 우분투를 설치한 초기 상태에 해야할 일부터 적겠다.

# 업데이트, 업그레이드하고 ifconfig 사용하기 위한 기본 툴 설치
sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install net-tools

본격적으로 쿠버네티스를 설치하기 전에 우선 swap 메모리를 꺼야한다.

# 앞에 명령어는 swap파일 끄는거고, 뒤에 명령어는 스왑파일 아예 안쓰도록 하는거 (안하면 재부팅하면 살아남)
sudo swapoff -a && free -h && sudo sed -i '$s/^/#/' /etc/fstab && cat /etc/fstab

다음으로는 kubeadm, kubelet, kubectl을 한번에 설치한다.

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.29/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.29/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

출처 : https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/

만약 나와 환경이 다르다면 저기서 찾아서 설치해주면 된다.
대충 apt 레포지토리 주소 추가해주고 설치하고 서비스 등록 하고 등등이다.

다음으로는 containerd라는 컨테이너 런타임을 설치해줘야 한다. 참고로 dockershim은 v1.24부터 지원안된다. (v1.20부터 안쓸거라고 경고했다고 함. 출처 : https://kubernetes.io/docs/setup/production-environment/container-runtimes/)

apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common

cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

# sysctl params required by setup, params persist across reboots
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
EOF

# Apply sysctl params without reboot
sudo sysctl --system

# lsmod | grep br_netfilter
# lsmod | grep overlay

sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

apt install -y containerd
mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml

sudo systemctl restart containerd

# Restart and enable docker service.
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd

# Hold containerd at this specific version.
apt-mark hold containerd

이렇게 하고 나서 kubernetes의 기본 명령어인 kubectl 을 이용해 뭔가 보려 하면 암것도 안보이고 올바른 주소나 port 연결했냐고만 뜬다. 클러스터 네트워크 구성안해줘서 그렇다나 뭐라나. 해줘야지 뭐. 우선 kubeadm으로 초기설정해준다.

kubeadm init \
--apiserver-advertise-address=[ip 주소] \
--apiserver-cert-extra-sans=[ip 주소] \
--pod-network-cidr=192.168.0.0/16 \
--service-cidr=192.168.0.0/16 \
--node-name=master

이렇게 초기설정해주면 root user가 아닌 경우에도 사용가능하게 설정해주는게 있다.

mkdir -p $HOME/.kube && sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config && sudo chown $(id -u):$(id -g) $HOME/.kube/config

참고로 저거 &&대신 ; 쓰고 한줄에 써도 된다.
글구 이거 하면 나오는 다음 명령어는 저장하자

kubeadm join [내 ip주소]:6443 --token [토큰 값] \ --discovery-token-ca-cert-hash sha256:[해시값]

위 명령어는 토큰 값이랑 해쉬값이랑 포함된 명령어로, 저거 있어야 worker node 에서 control plane node로 join 가능하다.

그리고 대망의 Container-Network-Interface 줄여서 CNI.

난 calcio 쓰기로 했다.
(flannel 도 있다는데 그냥 눈에 먼저 들어온거 씀)

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

이거 버전 안맞는건지 다른거 뭐 하나 쓰니까 자꾸 안되던데.

이거 실행시키고 systemctl daemon-reload 하면 coredns 랑 calico-kube-controllers pod가 잘 돌아간다.

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

이게 flannel 설치하는 명령어인듯?
일단 yaml파일만 봤는데 그럴싸하게 생김

이제 worker node 에서 위에서 받았던 join 명령어로 연결하고

systemctl daemon-reload

하면 된다.

만약 worker node에서도 kubectl 명령어 쓰고 싶으면

mkdir ~/.kube: cd ~/.kube; touch config

한 다음에
control plane node에 저 경로에 있는 파일 복붙하면 됨.
만약 할줄 모르면 control plane node에서

scp ./kube/config 워커노드유저이름@워커노드ip주소:~/
:~/

라고 해주면 ~폴더로 파일이 ssh 통신으로 전송이 됨.
그러면 workernode의 기본 경로인 ~/에 들어와있을텐데, 이걸 이제 다음 명령어로 위치에 갖다 두면 된다.

mv ~/config ~/.kube/config

라고 하면 됨.

여기까지 하면

kubectl get nodes -o wide

로 보면 노드 다 연결되고

kubectl get pods -A -o wide

명령어로 calico파드가 노드마다 생성된거 확인가능하다.

profile
공부하는중입니다.

0개의 댓글