[Kubernetes] 2.쿠버네티스 설치하기

Docker for Desktop을 설치하면 기본적인 쿠버네티스 클러스터까지 전부 설치가 되지만

AWS에서는 Docker Desktop을 설치할 수 없기 떄문에 직접 클러스터를 구축하여야 한다.


1. 쿠버네티스 설치

AWS 프리티어로는 쿠버네티스 최소 사양에 모자라 Google Compute Engine을 사용하였다.

Google Compute Engine은 Google Cloud Platform의 VM으로 처음 가입 시 1년 동안 사용할 수 있는 $300 상당의 크레딧을 제공해준다.

Master 노드와 worker-1, worker-2 노드로 사용할 총 세 개의 VM을 생성한다. 쿠버네티스 최소 사양은 아래 글을 참고 한다.

[Trouble shooting] 1.쿠버네티스 설치하기

사전 작업

master, worker-1, worker-2 노드에서 root권한으로 작업한다.

  1. Swap은 메모리가 부족하거나 절전 모드에서 디스크의 일부 공간을 메모리처럼 사용하는 기능입니다. Kubelet이 정상 동작할 수 있도록 해당 기능을 swap 디바이스와 파일 모두 disable 합니다.

    $ swapoff -a
    $ echo 0 > /proc/sys/vm/swappiness
    $ sed -e '/swap/ s/^#*/#/' -i /etc/fstab
    

    swapoff -a : paging과 swap기능을 끔

    /proc/sys/vm/swappiness : 커널 속성을 변경해 swap을 disable 함

    /etc/fstab : Swap을 하는 파일 시스템을 찾아 disable 함

  2. 노드간 통신을 원할 하게 하기 위해 방화벽 기능을 해제

   $ systemctl disable firewalld
   $ systemctl stop firewalld
  1. SELinux(Security-Enhanced Linux)는 리눅스 보안 모듈로 액세스 권한을 제어함. 쿠버네티스는 컨테이너가 호스트의 파일 시스템에 접속할 수 있도록 해당 기능을 꺼야 함

    $ setenforce 0
    $ sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config 
    
  2. CentOS7 iptables 이슈

    $ cat <<EOF >  /etc/sysctl.d/k8s.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF
    $ sysctl --system
    

    확인 불가

  3. 컨테이너 실행 환경인 도커 설치

    $ yum install docker -y
    $ systemctl start docker.service
    

    쿠버네티스는 도커 외에도 여러 CRI 구현체를 지원 함.

    도커는 지원 중단 예정이다.

쿠버네티스 설치

$ cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF

$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
$ systemctl enable kubelet && systemctl start kubelet

마스터 노드

마스터 노드에 컨트롤 구성 요소를 설치한다.

마스터 노드 설치 시 사용할 이미지를 다운로드 받는다.

$ kubeadm config images pull

마스터 노드를 초기화

$ kubeadm init

초기화는 한번만 진행 할 수 있으며 잘 못 되면 kubeadm reset 하여야 한다.

초기화를 하면 설치가 진행되고 로그가 출력된다.

Your Kubernetes master 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

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/

You can now join any number of machines by running the following on each node
as root:
  kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec

여기서 일반 사용자가 kubectl을 사용할 수 있도록 로그 중간에 있는 명령어를 실행합니다.

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

워커 노드

로그 마지막에 있는 kubeadm join 명령어는 워커 노드를 클러스터에 추가하는 명령어 입니다. 해당 명령어를 워커노드에서 실행합니다.

$ kubeadm join 10.146.0.25:6443 --token yuaea3.d7m8hkpvazrbv5yw --discovery-token-ca-cert-hash sha256:c6a7121c5d5207179f67d913fa654441137f76027ad0f4e23724f0202b280eec

만약 토큰을 복사하지 않아 찾을 수 없으면 다음 명령어로 토큰을 확인할 수 있습니다.

$ kubeadm token list

이 토큰은 24시간의 만료시간을 가지고 있으니 새 토큰이 필요한 경우 새로 발급한다.

$ kubeadm token create

Pod network Add-on 설치하기

Pod는 실제로 여러 노드에 걸쳐 배포 되는데 Pod끼리는 하나의 네트워크에 있는 것처럼 통신할 수 있다. 이를 오버레이 네트워크 (Overlay network)라고 합니다.

오버레이 네트워크를 지원하는 CNI(Container Network Interface) 플러그인을 설치한다. CNI는 여러 종류가 있는데 그 중 Weave를 설치한다.

마스터 노드

$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

이후에 노드의 상태를 확인한다.

$ kubectl get nodes

쿠버네티스의 구성 요소가 모두 동작하는지 확인하기

$ kubectl get componentstatuses

쿠버네티스의 Pod가 어떤 노드에 떠있는지 확인하기

$ kubectl get pod -o custom-columns=Pod:metadata.name,Node:spec.nodeName -n kube-system

Pod 배포하기

예제

# my-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

nginx Pod를 실행하는 Deployment를 실행합니다.

$ kubectl apply -f my-deploy.yml

정상 동작하는지 확인

$ kubectl get pods

http://localhost/로 접속 시도 해본다.