내가 했던 내용 정리할 겸 올려본다.
참고로 이거 v1.29.3으로, 내가 사용한 시점에는 최신버전이었다.
우선 내가 했던 환경을 정리하면 다음과 같다
OS : Ubuntu-22.04-server-amd64
CPU :
우선 처음에 우분투를 설치한 초기 상태에 해야할 일부터 적겠다.
# 업데이트, 업그레이드하고 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파드가 노드마다 생성된거 확인가능하다.