ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 | 설치
    kubernetes 2021. 5. 15. 01:37

    쿠버네티스를 시작할 때 로컬환경에서 간단하게 시작할 수 있는 방법은 minikube를 설치해서 진행하는 방법이 있을 수 있겠지만, 개인적으로 로컬환경에 VM으로 설치를 해서 사용해보고 싶었고 설치하는 과정에 대해서 기록해 두려고 합니다.

     

    이전시간에는 쿠버네티스를 설치하기위해 VM을 세팅하는 과정을 진행했습니다.

    이번시간에는 이전에 준비한 VM에 쿠버네티스를 설치하여 클러스터를 구성해보는 과정을 진행하도록 하겠습니다.

    만약 쿠버네티스 설치를 위한 VM을 만드셔야 한다면 이전 글을 참고해 주시면 되겠습니다! 

     

    0. setup (master, worker 공통)

    개인적으로는 VirtualBox로 띄워진 VM창 내에서 작업하는게 불편하여 따로 ssh로 접근하여 설치를 진행했습니다.

    # ip 확인을 위해 설치
    apt install -y net-tools
    
    # ssh 접속을 위해 설치
    apt install -y ssh

     

    각각 접속을 시도합니다.

    # master
    ssh ubuntu@192.168.0.17
    
    # node1
    ssh ubuntu@192.168.0.18
    
    # node2
    ssh ubuntu@192.168.0.19
    각자 vm의 주소로 접근하면 됩니다.

     

    1. Docker install (master, worker 공통)

    먼저 쿠버네티스는 기본 컨테이너 런타임으로 도커를 사용하기 때문에 도커를 설치한다.

    sudo apt install -y docker.io
    apt-get update
    도커를 설치하는 방법은 꼭 이방법이 아니어도 됩니다. (맘에드는 방법으로 설치하면 됩니다~)

     

    2. swap 끄기 (master, worker 공통)

    kubelet이 제대로 작동하기 위해서는 swap을 사용하지 않는것을 권장하고 있습니다.

    sudo swapoff -a
    sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

     

    3. kubernetes 설치 (master, worker 공통)

    공식홈페이지를 참고하였습니다.

    sudo apt-get update
    sudo apt-get install -y apt-transport-https ca-certificates curl
    sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
    sudo echo 'deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main' | 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
    여기까지 설치가 완료되었다면 이제 설정을 해줄일만 남았습니다.

     

    쿠버네티스 1.24 버전 부터는 설치시 다음과 같은 작업이 추가로 필요합니다.

    # containerd의 기본설정 정의
    sudo mkdir -p /etc/containerd
    sudo containerd config default | sudo tee /etc/containerd/config.toml
    
    # containerd enabled 여부 확인
    systemctl is-enabled containerd 
    
    # disabled일 경우
    systemctl enable containerd
    
    
    # config 수정
    sudo vi /etc/containerd/config.toml
    
    [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
        # SystemdCgroup = false 기본 false로 되어있는 부분을 true로 변경한다.
        SystemdCgroup = true
        
        
    # containerd 재시작
    sudo systemctl restart containerd
    모든 노드에 적용합니다.

     

    4. 마스터노드 설정 (master)

    sudo kubeadm init --pod-network-cidr=10.244.0.0/16

    kubeadm init를 통해서 master노드를 셋업 할 수 있습니다.

    --pod-network-cidr=10.244.0.0/16는 쿠버네티스는 자체적으로 네트워크 구성 해주지 않기 때문에 Pod간 통신할 수 있도록 클러스터를 구성할 때 CNI(Container Network Interface) 규약을 구현한 CNI 플러그인을 함께 설치하게 됩니다.

    현재 실습에서는 Flannel이란 것 을 사용할 것이기 때문에 Flannel에서 기본적으로 권장하는 네트워크 대역인 10.244.0.0/16을 지정한 것 입니다.

     

    마스터노드 설정시에 다음과 같은 문제로 진행이 되지 않는 경우가 있을 수 있습니다.

    Get http://localhost:10248/healthz: dial tcp 127.0.0.1:10248: connect: connection refused

     

    해결방안

    sudo mkdir /etc/docker
    cat <<EOF | sudo tee /etc/docker/daemon.json
    {
      "exec-opts": ["native.cgroupdriver=systemd"],
      "log-driver": "json-file",
      "log-opts": {
        "max-size": "100m"
      },
      "storage-driver": "overlay2"
    }
    EOF

     

    sudo systemctl enable docker
    sudo systemctl daemon-reload
    sudo systemctl restart docker

     

    위의 명령어들을 수행한 이후

    sudo kubeadm reset

    kubeadm reset을 진행한 후 다시 init부터 진행을 해주시면 됩니다.

    (2021.12.05일 기준 테스트 과정에서 위의 내용은 master, node 둘다 진행해야 했습니다.)

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

     

    Master노드의 셋업이 완료되면 다음과 같은 내용을 볼 수 있습니다.

     

    위에서 첫번째 부분은 지금은 간단하게 설명하자면 쿠버네티스 클러스터의 admin권한을 가지고있는 config파일을 받아오는것 입니다.

     

    두번째는 다른 Node1, Node2를 Master 노드로 연결시키기 위한 명령어입니다.

     

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

    admin.conf파일을 $HOME/.kube/config 경로로 복사하여 해당 config파일을 통해 쿠버네티스 클러스터로 요청을 보낼수 있도록 합니다.

    Kubectl명령을 실행 할 때 기본적으로 $HOME/.kube/config파일을 찾게됩니다.

     

    5. CNI 설치

    쿠버네티스는 자체적으로 네트워크 구성 해주지 않기 때문에 클러스터를 구성할 때 CNI(Container Network Interface) 규약을 구현한 CNI 플러그인을 함께 설치해야 합니다.

    kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
    위에서 설명한 것 처럼 Flannel을 설치하였습니다.

     

    6. Node JOIN

    마지막으로 이전 과정에서 마스터노드를 init하게되면 다음과 같은 명령어가 조회되는데 해당 명령어를 Node에 해당하는 VM에서 실행하도록 합니다.

    kubeadm join xxx.xxx.xxx.xxx:6443 --token xxxxx.xxxxxxxxxxxxxxxxx \
    --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

     

    마지막으로 Master노드에서 다음과 같은 명령어를 실행하여 Node들이 들어온 것을 확인할 수 있습니다.

    kubectl get node
    
    # pod가 만들어지는 것을 확인하실 경우
    kubectl run nginx --image nginx
    kubectl get pods -w
    node1과 node2가 Ready상태가 되것을 통해 정상적으로 Master노드에 등록된것을 확인할 수 있습니다.

     

    Node Ready 확인

    Pod Create 확인

     

    추가적으로 위와 같이 쿠버네티스 클러스터가 구성된 이후 만들어진 클러스터가 로컬에서 테스트 용도의 경우에는 Master Vm에서 ~/.kube.config의 파일을 로컬에 두어 master노드에서가 아닌 로컬환경에서 만들어진 kubernetes에 접근할 수 있습니다.

     

    쿠버네티스 클러스터를 로컬환경에서 간단하게 설치하는 것을 목적으로 두었기 때문에 설치하는 명령어에 대한 설명을 자세하게 다루지는 않았습니다. 이후 쿠버네티스를 더 공부해나가면서 내용을 보완하도록 하겠습니다.

     

    간단하게 쿠버네티스를 설치 할 경우에는 위의 명령어들을 통해서 쿠버네티스를 설치 하는 방법을 정리해 보았습니다.

    이후에는 쿠버네티스 리소스들을 정리해보도록 하겠습니다.

     

    참고자료


Designed by Tistory.