Exercise 3.1: Install Kubernetes

  1. CP로 SSH 접속

    ssh root@CP_IP_ADDRESS
  2. 실습 환경에 필요한 라이브러리 설치

    sudo apt update && sudo apt install -y \
    curl apt-transport-https vim git wget gnupg2 net-tools \
    software-properties-common lsb-release ca-certificates uidmap 
  3. 컨테이너 런타임 구동에 필요한 overlay와 br_netfilter 커널 모듈 불러오기

    {
        cat <<EOF | sudo tee /etc/modules-load.d/kubernetes.conf
    overlay
    br_netfilter
    EOF
    
        sudo modprobe overlay
        sudo modprobe br_netfilter
    }
  4. 컨테이너 런타임 구동에 필요한 커널 파라미터 설정

    {
        cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf
    net.bridge.bridge-nf-call-iptables  = 1
    net.bridge.bridge-nf-call-ip6tables = 1
    net.ipv4.ip_forward                 = 1
    EOF
    
        sudo sysctl --system
    }
  5. 컨테이너 런타임 설치

    {
        sudo mkdir -p /etc/apt/keyrings
        curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
        echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
        sudo apt update && apt install -y containerd.io
        sudo containerd config default | tee /etc/containerd/config.toml
        sudo sed -e 's/SystemdCgroup = false/SystemdCgroup = true/g' -i /etc/containerd/config.toml
        sudo systemctl restart containerd
        
        cat <<EOF | sudo tee /etc/crictl.yaml
    runtime-endpoint: unix:///run/containerd/containerd.sock
    EOF
    }
  6. 쿠버네티스 설치 및 구동에 필요한 바이너리 설치

    {
        curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
        echo "deb  http://apt.kubernetes.io/  kubernetes-xenial  main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
        sudo apt update && sudo apt install -y kubelet=1.27.1-00 kubeadm=1.27.1-00 kubectl=1.27.1-00
        sudo apt-mark hold kubelet kubeadm kubectl
    }
  7. 클러스터 설정 파일 생성

    cat << EOF | tee kubeadm-config.yaml
    apiVersion: kubeadm.k8s.io/v1beta3
    kind: ClusterConfiguration
    kubernetesVersion: 1.27.1
    controlPlaneEndpoint: "k8scp:6443"
    networking:
      podSubnet: 192.168.0.0/16
    EOF
  8. /etc/hosts 파일에 아래와 같은 라인 추가 - CP_IP_ADDRESS는 CP 노드 IP주소

    CP_IP_ADDRESS k8scp

    예를들어 CP의 IP주소가 123.45.67.89라면 아래처럼 입력

    123.45.67.89 k8scp
  9. k8scp에 연결된 IP 주소 확인

    nslookup k8scp
  10. 컨트롤 플레인 구성

    kubeadm init --config=kubeadm-config.yaml --upload-certs | tee kubeadm-init.out
  11. kubeconfig 파일 복사

    {
        mkdir -p $HOME/.kube
        sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
    }
  12. kubeconfig 파일 확인

    cat ~/.kube/config
  13. 실행중인 Pod 확인

    kubectl get pod --all-namespaces
  14. Pending 상태의 Pod의 상세내용 확인

    kubectl describe pod \
    $(kubectl get pod -A --field-selector=status.phase=Pending -o=jsonpath='{.items[0].metadata.name}') \
    -n $(kubectl get pod -A --field-selector=status.phase=Pending -o=jsonpath='{.items[0].metadata.namespace}')
  15. 노드 목록 확인

    kubectl get node
  16. CP 노드 상태 확인

    kubectl describe node cp
  17. kubelet 로그 확인

    sudo journalctl -u kubelet -n 10 --no-pager
  18. CNI 플러그인 설치

    kubectl apply -f \
    https://raw.githubusercontent.com/youngwjung/lf-training/main/LFS458/v1.28.1/SOLUTIONS/s_03/cilium-cni.yaml
  19. 실행중인 Pod 확인

    kubectl get pod -A
  20. CP 노드 상태 확인

    kubectl describe node cp
  21. kubectl 명령어에 대한 bash completion 설정

    {
        echo 'source <(kubectl completion bash)' >>~/.bashrc
        source <(kubectl completion bash)
    }

Last updated