ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mac M2 UTM k8s 로컬 환경 구성
    k8s 2023. 11. 23. 18:25

    UTM에 Ubuntu 설치하는 내용은 없습니다. 구글링하시면 많이 나와요

     

    UTM의 Ubuntu 20.04로 로컬 환경을 구축하였다.

    마스터 노드 이외의 세팅은 모든 노드에 적용되어야 한다.
    총 세개의 노드로 구성하였다.
    Master
    worker1 
    worker2

     

    1. 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
    
Designed by Tistory.