Mac M2 UTM k8s 로컬 환경 구성
UTM에 Ubuntu 설치하는 내용은 없습니다. 구글링하시면 많이 나와요
UTM의 Ubuntu 20.04로 로컬 환경을 구축하였다.
마스터 노드 이외의 세팅은 모든 노드에 적용되어야 한다.
총 세개의 노드로 구성하였다.
Master
worker1
worker2
- swap memory off
https://askubuntu.com/questions/214805/how-do-i-disable-swap
모든 노드에서 진행한다
sudo swapoff -a # 현재 시스템에 적용(리부팅하면 재설정 필요)
sudo sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab # 리부팅 필수
위와 같이 swap 메모리를 off 해주고 kubernetes 설치를 진행한다.
컨테이너 런타임 구성
# Using Docker Repository
sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) 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
# containerd 설치
sudo apt update
sudo apt install -y containerd.io
# sudo systemctl status containerd # Ctrl + C를 눌러서 나간다.
# Containerd configuration for Kubernetes
cat <<EOF | sudo tee -a /etc/containerd/config.toml
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
SystemdCgroup = true
EOF
sudo sed -i 's/^disabled_plugins \=/\#disabled_plugins \=/g' /etc/containerd/config.toml
sudo systemctl restart containerd
# 소켓이 있는지 확인한다.
ls /var/run/containerd/containerd.sock
kubeadm, kubelet 및 kubectl 설치
모든 머신에 다음 패키지들을 설치한다.
- kubeadm: 클러스터를 부트스트랩하는 명령이다. 클러스터를 초기화하고 관리하는 기능을 갖는다.
- kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다. 데몬으로 동작하며 컨테이너를 관리한다.
- kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다. 클라이언트 전용 프로그램이다.
모든 노드에서 다음 명령을 실행한다.
sudo mkdir /etc/apt/keyrings
cat < kube_install.sh
# 1. apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
# 2. 구글 클라우드의 공개 사이닝 키를 다운로드 한다.
curl -fsSL <https://packages.cloud.google.com/apt/doc/apt-key.gpg> | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-archive-keyring.gpg
# 3. 쿠버네티스 apt 리포지터리를 추가한다.
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-archive-keyring.gpg] <https://apt.kubernetes.io/> kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 4. apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
EOF
sudo bash kube_install.sh
kubeadm 버전을 확인한다.
kubeadm version
넷필터 브릿지 설정
모든 노드에 다음 명령으로 넷필터 브릿지 설정
sudo -i
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
exit
클러스터 구성
지금까지는 모든 노드에 실행되는 작업이 동일했다. 하지만 여기부터는 각 노드에서 작업하는 내용이 다르기 때문에 주의가 필요하다.
마스터 노드 초기화
마스터 노드에서 init 작업을 시작한다.
sudo kubeadm init
본인은 sudo kubeadm init 명령시 해당 에러가 발생하였다.
[preflight] Running pre-flight checks
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR IsPrivilegedUser]: user is not running as root
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
해결
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
sudo rm /etc/containerd/config.toml
sudo apt update (이 명령어는 빠져도 될 것 같다. 기억이 안남)
sudo apt install -y containerd.io
sudo kubeadm 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/>
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.64.10:6443 --token rh9fia.l2nm5bv9ar37vmlk \\
--discovery-token-ca-cert-hash sha256:1fbf915d51e2702001ec197b5927ed6ce9776dd90462c4068451083109b6ed80
유저 설정
다음 명령을 실행하면 .kube/config 파일이 설정되면서 사용이 가능해진다. 이 실습은 마스터 노드에서만 진행한다.
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
NAME STATUS ROLES AGE VERSION
master-1 NotReady control-plane 5m v1.26.0
워커 노드 조인하기
본인의 콘솔에 출력된 토큰과 hash 값을 사용해 조인을 수행해야 한다. 다음 명령은 워커 노드에서 실습을 진행한다.
kubeadm join 192.168.64.10:6443 --token rh9fia.l2nm5bv9ar37vmlk \\
--discovery-token-ca-cert-hash sha256:1fbf915d51e2702001ec197b5927ed6ce9776dd90462c4068451083109b6ed80
마스터 노드에서 노드 목록을 조회한다.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master-1 NotReady control-plane 7m55s v1.26.0
worker-1 NotReady <none> 14s v1.26.0
worker-2 NotReady <none> 23s v1.26.0
💡 init이나 join을 잘못 수행한 경우 sudo kubeadm reset을 사용해 초기 설정으로 돌아갈 수 있다.
💡 token 재발급 받는 방법 (마스터 노드에서 실습)
- 토큰 리스트 확인하기: sudo kubeadm token list
- 토큰 재발급하기: sudo kubeadm token create --print-join-command
파드 네트워크 배포
마스터 노드에서 다음 명령을 실행하면 앞서 구성한 유저 설정을 통해 클러스터에 cilium을 설치한다.
https://kubernetes.io/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy/
!!!!!이거아님!!!!!
curl -LO <https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz>
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz
cilium install
해당 명령어를 입력하니
ubuntu@master-1:~$ cilium install
bash: /usr/local/bin/cilium: cannot execute binary file: Exec format error
실행 중인 바이너리 파일이 시스템과 호환되지 않는 경우 발생하는 일반적인 에러 메시지가 발생했다.
해결
uname -m (시스템 아키텍처를 터미널에 출력)
lsb_release -a(시스템 운영 체제 정보를 출력)
내 아키텍처는 aarch64 였다..
sudo curl -LO <https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-arm64.tar.gz>
sudo tar xzvfC cilium-linux-arm64.tar.gz /usr/local/bin
sudo rm cilium-linux-arm64.tar.gz
cilium install
해당 명령어로 수정해서 install 하니 성공
VM Restart 이후 필수 실행 명령어
sudo -i
# swapoff
sudo swapoff -a
sudo sed -i '/ swap / s/^\\(.*\\)$/#\\1/g' /etc/fstab
# netfilter bridge configure
modprobe br_netfilter
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
exit