[Kubernetes] 쿠버네티스 설치와 사용법

[Kubernetes] 쿠버네티스 설치와 사용법

안녕하세요? 정리하는 개발자 워니즈입니다. 이번시간에는 쿠버네티스의 설치와 사용법에 대해서 알아보고자합니다.

지난 글들은 아래를 참고 해주시면 됩니다.

기존에는 docker swarm으로 클러스터를 구성하였는데요. 구글에서 만든 쿠버네티스를 사용해보고자 합니다.

Kubeadm을 사용하여 Kubernetes 클러스터를 구성하는 방법에 대해 설명합니다. Kubernetes는 아래 그림과 같이 Worker Node에 명령을 내리는 Master Node와 실제 Container가 구동되는 Worker Node로 구성되어 있습니다.

아래 설치과정에서 주의해야 할것은

  • 가이드에서는 Master Node 1대와 Work Node 1대를 가정해서 설치를 가이드합니다.(총 VM 2대)

1. 설치전 작업

기본적으로 쿠버네티스는 컨테이너를 클러스터링 해주는 도구이다보니, 도커가 사전에 설치되어있어야 합니다. 또한, 마스터와 워커노트(VM 2대)가 준비되어있어야 합니다.

  • swap disable

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/fastab: Swap을 하는 파일 시스템을 찾아 disable 합니다.
  • 노드간 방화벽 해제

각 노드의 통신을 원활하게 하기 위해 방화벽 기능을 해제합니다.

systemctl disable firewalld
systemctl stop firewalld
  • net filter 모듈 활성화

br_netfilter 모듈이 활성화되어 있어야 합니다. modprobe br_netfilter 명령어로 해당 모듈을 명시적으로 추가하고, lsmod | grep br_netfilter 명령어로 추가 여부를 확인할 수 있습니다.

modprobe br_netfilter

필자는 net fillter를 활성화 하지 않아서, 오류가 발생했었는데요. /proc/sys/net/bridge 하위의 bridge-nf-call-iptables 파일이 활성화 되어있어야 합니다.

실제로 참고했던 내용입니다 .

https://stackoverflow.com/questions/44125020/cant-install-kubernetes-on-vagrant
sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'
modprobe br_netfilter
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
sudo sysctl -p
  • 도커 설치

컨테이너 실행 환경인 도커(Docker)를 설치하고 실행합니다. 쿠버네티스는 도커 외에도 여러가지 CRI(Container Runtime Interface) 구현체를 지원하기 때문에 도커에 종속적이지 않습니다.[1]

필자의 도커 설치 가이드를 참고 부탁드립니다.

  • selinux 권한 제어

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

setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

2. 쿠버네티스 설치하기

본격적으로 쿠버네티스를 설치해보겠습니다.

  • repository 수정
cat < /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 을 통한 설치
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
systemctl enable kubelet && systemctl start kubelet
  • 마스터 노드 초기화

이제 Master 노드에 컨트롤 구성 요소를 설치할 차례입니다. 해당 작업은 master 에서만 실행합니다.

kubeadm init

그럼 설치가 진행되고 마지막에 다음과 비슷한 로그가 출력됩니다.
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
  • 인증서 셋팅하기

접속하는 터미널의 인증서를 셋팅하는 과정으로 일반유저냐 Root계정이냐에 따라 설정이 다르므로 주의합니다.
여기서는 Root유저로 설정했기 때문에 아래 명령어를 수행합니다.

# export KUBECONFIG=/etc/kubernetes/admin.conf
  • Pod network add-on 설치하기

Pod 은 실제로 여러 노드에 걸쳐 배포되는데, Pod 끼리는 하나의 네트워크에 있는 것처럼 통신할 수 있습니다. 이를 오버레이 네트워크(Overlay Network)라고 합니다.
Master 노드에서 다음과 같이 설치합니다.

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
  • 워커 노드 클러스터링

맨 마지막 라인의 명령어는 워커 노드를 해당 클러스터에 추가하는 명령어입니다. 해당 명령어를 복사해서 worker-1 노드에서 수행합니다.

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

만약 해당 커맨드를 복사해놓지 않고 지워진 경우에는 다음과 같이 토큰을 확인할 수 있습니다.

kubeadm token list

해당 토큰은 24시간 동안만 사용할 수 있습니다. 새 토큰이 필요한 경우는 다음 명령어를 실행하면 됩니다

kubeadm token create

3. 쿠버네티스 확인

쿠버네티스 설치가 완료되면 다음의 명령으로 확인한다.

CNI를 설치하면 CoreDNS Pod 이 정상적으로 동작하게 됩니다.
다음 명령어로 각 노드와 상태를 확인할 수 있습니다. 처음엔 상태가 NotReady 라고 나올 수 있지만 잠시 기다리면 모두 Ready 상태가 됩니다.

kubectl get no
NAME       STATUS   ROLES    AGE     VERSION
master     Ready    master   6m44s   v1.13.3
worker-1   Ready       5m20s   v1.13.3
worker-2   Ready       5m19s   v1.13.3

설치 확인하기
다음 명령어로 쿠버네티스의 구성 요소가 모두 동작하는 것을 확인할 수 있습니다.

kubectl get componentstatuses
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok                   
controller-manager   Healthy   ok                   
etcd-0               Healthy   {"health": "true"}

4. (예제) 간단한 POD 구성해보기

먼저 간단한 Pod 을 배포해서 동작을 확인해봅시다. 다음과 같은 pod-test.yaml 파일을 생성합니다.

  • deployment.yml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
  # Deployment 객체의 Unique한 명칭
  name: deployment-example
spec:
  # Deployment label selector for pod
  selector:
    matchLabels:
      app: nginx
  # 2 Pods should exist at all times.
  replicas: 2
  template:
    metadata:
      labels:
        # Pod의 라벨
        app: nginx
    spec:
      containers:
      - name: nginx
        # Run this image
        image: nginx:1.10
  • service.yml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  labels:
    run: nginx-svc
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx

deploymentservice는 추후에 알아보겠습니다. 구성도는 아래와 같습니다.
우선 위에 보시는것처럼 deployment안에 Pod을 배포하기 위한 내용들을 기입했습니다.

아래의 spec대로 2개의 replica를 생성하기 떄문에 pod은 아래보시는것처럼 생성됩니다 .

      containers:
      - name: nginx
        # Run this image
        image: nginx:1.10

service는 아래 보시는것처럼 기존의 로드밸런스의 기능을 하는데, 그 타입이 3종류(ClusterIP, noteType, DNS)가 있습니다. 이는 추후에 알아보도록 하겠습니다.

8080포트로 접속이 되면, target (nginx)의 pod으로 80포트로 분산하겠다라는 내용의 서비스 입니다.

  ports:
  - port: 8080
    targetPort: 80
    protocol: TCP
  selector:
    app: nginx

5. 마치며

이번 포스트에서는 기존의 docker기반으로 올렸던 container들을 손쉽게 관리하기위한 cluster 도구에 대해서 알아봤습니다. 쿠버네티스는 오케스트레이션의 대표적인 도구이고, 예제에서 보시는것처럼 nginx 를 손쉽게 서비스에 붙여서 구성을 할 수 잇었습니다.

이번에는 개략적인 내용에 대해서 알았다면, 다음시간에는 쿠버네티스에서 사용하는 용어들에 대해서 하나씩 알아보는 시간을 갖도록 하겠습니다.

워니즈 블로그
워니즈 깃헙

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다