Post

Section 11-1. Deploy with Kubeadm

udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의 및 쿠버네티스 인 액션 (마르코 룩샤)를 참고하여 정리한 글입니다.

Section11. Install “Kubernetes the kubeadm way”

Demo - Deployment with kubeadm

K8S 설치를 위한 기본 환경 설정

1. swap off

1
  swapoff -a

왜 swap off를 통해 swap 메모리를 꺼둬야할까?

  • swap 이란 물리 메모리 (RAM)의 용량이 부족할 때 하드 디스크이 일부 공간을 메모리처럼 사용하는 것이다.
    • swap out이란 메모리에서 가용할 수 있는 프로세스 이상으로 프로세스가 올라가야할 경우 이미 실행된 프로세스 중 특정 프로세스를 잠시 swap partition으로 이동시켜 놓는 것을 뜻한다.
    • 반대로 swap in은 스왑으로 이동했던 프로세스에서 이벤트가 올 경우 다시 메모리 영역으로 이동 시키는 것을 말한다.
  • 쿠버네티스는 파드를 생성할 때, 필요한 만큼의 리소스를 할당 받아서 사용하는 구조이다. 쿠버네티스의 kubelet은 이러한 스왑 상황을 처리하도록 만들어지지 않았기 때문에 쿠버네티스 클러스터 Node들은 모두 Swap 메모리를 비활성화 해줘야 한다.

2. 방화벽 설정

  • 방화벽 비활성화
    1
    2
    3
    
    $ systemctl disable firewalld
    $ systemctl stop firewalld
    # systemctl status firewalld
    
  • 방화벽을 비활성화 하지 않을경우 bridge 된 트래픽을 정상적으로 보기위해 아래와 같은 설정이 필요하다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    $ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
      br_netfilter
      EOF
      
    $ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
      net.bridge.bridge-nf-call-ip6tables = 1
      net.bridge.bridge-nf-call-iptables = 1
      EOF
      
    $ sudo sysctl --system
    

3. 쿠버네티스 repository 설치

3-1 인증 키 추가

  • 먼저 쿠버네티스를 사용하기 전에 인증키를 추가할것인데 먼저 다음과 같이 apt 패키지를 업데이트하고 필요한 패키지들을 설치한다.
    1
    2
    
    $ sudo apt-get update
    $ sudo apt-get install -y apt-transport-https ca-certificates curl
    

    3-2 구글 클라우드의 공개 사이닝키를 다운로드한다.

    1
    
    $ sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
    

    3-3 쿠버네티스 apt 레포지토리를 추가한다.

    1
    
    $ 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
    

    3-4 apt 패키지를 업데이트하고 kubelet, kubeadm, kubectl을 설치한 후 버전을 고정한다.

    1
    2
    3
    
    $ sudo apt-get update
    $ sudo apt-get install -y kubelet kubeadm kubectl
    # sudo apt-mark hold kubelet kubeadm kubectl
    

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

4. Container Runtime 설치 (containerd)

쿠버네티스 에서 사용할수 있는 Container Runtime은 컨테이너 런타임 인터페이스(CRI) 요구사항을 만족하는 런타임을 사용해야 하며 대표적으로 사용 되는 컨테이너로 런타임으로는 containerd 와 CRI-O , docker 가 있다. 쿠버네티스 버전 1.20 에서 도커(docker) 지원에 대해서 Deprecated 되었으며, 1.24 버전에서는 Dockershim 이 제거 되었다.

그래서 OCI 표준을 준수하는 Container Runtime 중 containerd 으로 설치를 진행하도록 한다.

4-1 HTTPS를 활용해 저장소에 접근하기 위한 패키지를 설치

  • 사실 containerd는 Docker를 설치하게 되면 자연스럽게 함께 설치하게 되는데 이는 Docker의 컨테이너 런타임이 containerd이기 때문이다.
    1
    2
    3
    4
    5
    6
    
      $ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release
    

4-2 Docker의 공식 GPG 키를 시스템에 추가

1
  $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

4-3 Docker를 stable 버전으로 설치하기 위한 명령

1
2
3
  $ 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 > /dev/null

4-4 apt 업데이트 및 containerd.io 설치

1
2
  $ sudo apt-get update
  $ sudo apt-get install containerd.io

5. containerd 설정 작업

5-1 containerd의 기본 설정 정의

  • containerd config default 를 수행하면 기본적으로 제공하는 설정값들을 얻을 수 있다.
  • tee 명령어를 통해 화면으로도 출력하고, config.toml 파일로도 저장한다.
    1
    2
    
    $ sudo mkdir -p /etc/containerd
    $ containerd config default | sudo tee /etc/containerd/config.toml
    

5-2 설치 후 docker의 데몬 드라이버를 systemd 로 교체 (k8s에서 권장) 변경된 런타임 k8s 에서 동작하도록 설정 추가

1
2
3
  $ sudo vi /etc/systemd/system/kubelet.service.d/containerd.conf
    [Service]
    Environment="KUBELET_EXTRA_ARGS=--runtime-request-timeout=15m     --image-service-endpoint=unix:///run/containerd/containerd.sock    --cgroup-driver=systemd"

5-3 systemd를 cgroup driver로 사용

1
2
3
4
5
6
7
  $ vi /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 # 해당 줄을 추가
  ~  

5-4 proxy 환경에서 containerd proxy 설정

1
2
3
4
5
6
7
8
9
10
  # Containerd Proxy 설정
  sudo mkdir -p /etc/systemd/system/containerd.service.d
  vi /etc/systemd/system/containerd.service.d/http-proxy.conf
  [Service]
  Environment=”HTTP_PROXY=http://example.proxy.co.kr:3128"
  Environment=”HTTPS_PROXY=http://example.proxy.co.kr:3128"
  
  # Restart the containerd daemon
  systemctl daemon-reload
  systemctl restart containerd

6. 쿠버네티스 설치

  • 여러 설치방법이 있으나 기본적으로 Master node IP 의 설정, pod-network 의 IP만 설정하여 초기화 해준다.
  • pod-network 는 Flannel 에서 권장하는 네트워크인 10.244.0.0/16 으로 설정한다.

마스터 노드

1
2
3
$ kubeadm init \
  --apiserver-advertise-address=172.88.10.11 \
  --pod-network-cidr=10.244.0.0/16
  • 정상 설치시 아래와 같이 나온다. ``` 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 172.88.10.11:6443 –token 1rnf72.myfkkr8q109ugylr
–discovery-token-ca-cert-hash sha256:8a5130aa0992e920a7756f8abea8be391ae444c6ecd2433e4eeb1d2c71885c09

1
2
- 일반 사용자 환경에서 kubectl 사용을 위해 아래 명령어를 사용하여 /home 계정안에 환경을 설정한다.

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

1
2
3
4
5
6
**워커 노드**
- master 를 제외한 모든 노드에 아래 Join 명령으로 Master node 와 연결한다.
- token 은 직접 master 에서 kubeadm init 후 나온 값을 입력한다.
- 기본적으로 master init 전까지 모든 설치 환경 구성은 동일하다.

$ kubeadm join 172.88.10.11:6443 –token 1rnf72.myfkkr8q109ugylr
–discovery-token-ca-cert-hash sha256:8a5130aa0992e920a7756f8abea8be391ae444c6ecd2433e4eeb1d2c71885c09

1
2
3
4
5
6
7
8
#### 7. CNI 플러그인 설치

- 쿠버네티스는 자체적으로 네트워크 구성 해주지 않기 때문에 클러스터를 구성할 때 CNI(Container Network Interface) 규약을 구현한 CNI 플러그인을 함께 설치해야한다.
- 여기서는 Flannel이라는 파드 네트워크 애드온을 설치해 사용한다.

**7-1 Flannel 적용**
- 이 때 Flannel 에서 권장하는 네트워크 10.244.0.0/16이다.

$ kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml ```

This post is licensed under CC BY 4.0 by the author.