웹사이트 검색

Ubuntu 18.04 LTS의 Kubernetes 클러스터에 Nginx 부하 분산을 배포하는 방법


이 페이지에서

  1. 요구 사항\n
  2. 시작하기\n
  3. Docker 및 Kubernetes 설치
  4. Kubernetes 마스터 서버 구성
  5. Kubernetes 클러스터에 슬레이브 추가
  6. Kubernetes 클러스터에 NGINX 배포

Kubernetes는 컨테이너를 배포하고 관리하는 데 사용할 수 있는 무료 오픈 소스 컨테이너 오케스트레이션 시스템입니다. Google에서 개발했으며 자동 확장 및 자동화된 배포를 위해 특별히 설계되었습니다. Kubernetes는 모든 클라우드 인프라 및 베어메탈에서 실행할 수 있습니다. Kubernetes를 사용하면 노드 클러스터 전체에 여러 애플리케이션을 배포할 수 있습니다. Kubernetes는 자가 치유, 자동 확장성, 로드 밸런싱, 배치 실행, 수평적 확장, 서비스 검색, 스토리지 오케스트레이션 등을 비롯한 다양한 기능을 제공합니다.

이 튜토리얼에서는 Ubuntu 18.04에서 Kubernetes로 Nginx 로드 밸런싱을 설정하는 방법을 배웁니다.

요구 사항

  • Ubuntu 18.04가 설치된 두 대의 서버.
  • 각 서버에 최소 2GB의 RAM이 설치되어 있습니다.
  • 루트 암호는 두 서버 모두에서 구성됩니다.\n

시작하기

먼저 두 서버를 안정적인 최신 버전으로 업데이트해야 합니다. 다음 명령을 실행하여 업데이트할 수 있습니다.

apt-get update -y
apt-get upgrade -y

두 서버가 모두 업데이트되면 다시 시작하여 모든 변경 사항을 적용하십시오.

기본적으로 Kuberenetes는 스왑 메모리를 지원하지 않으며 스왑이 활성화된 경우 작동하지 않습니다. 따라서 두 서버 모두에서 스왑 메모리를 비활성화해야 합니다.

임시로 스왑 메모리를 비활성화하려면 다음 명령을 실행하십시오.

swapoff -a

스왑 메모리를 영구적으로 비활성화하려면 /etc/fstab 파일을 엽니다.

nano /etc/fstab

마지막 줄을 주석 처리합니다.

# /etc/fstab: static file system information.
#
# use 'blkid' to print the universally unique identifier for a
# device; this may be used with uuid= as a more robust way to name devices
# that works even if disks are added and removed. see fstab(5).
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sda1 during installation
# swap was on /dev/sda4 during installation #UUID=65se21r-1d3t-3263-2198-e564c275e156 none swap sw 0 0

파일을 저장하고 닫습니다. 그런 다음 다음 명령을 실행하여 구성 변경 사항을 적용합니다.

mount -a

다음으로 두 서버 모두에서 호스트 이름 확인을 설정해야 합니다. 따라서 각 서버는 호스트 이름을 사용하여 서로 통신할 수 있습니다.

이렇게 하려면 원하는 편집기를 사용하여 /etc/hosts 파일을 엽니다.

nano /etc/hosts

다음 줄을 추가합니다.

192.168.0.103 master
192.168.0.100 slave

완료되면 파일을 저장하고 닫습니다. 그런 다음 다음 단계를 진행합니다.

Docker 및 Kubernetes 설치

다음으로 두 서버 모두에 Docker 및 Kubernetes 도구 kubelet, kubeadm 및 kubectl을 설치해야 합니다.

먼저 필요한 패키지를 설치하고 다음 명령을 사용하여 GPG 키를 추가합니다.

apt-get install apt-transport-https ca-certificates curl software-properties-common -y
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

다음으로 다음 명령을 실행하여 두 서버 모두에 Docker CE 리포지토리를 추가합니다.

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

다음으로 리포지토리를 업데이트하고 다음 명령을 사용하여 Docker CE를 설치합니다.

apt-get update -y
apt-get install docker-ce -y

설치가 완료되면 다음 명령을 사용하여 Docker CE의 상태를 확인하십시오.

systemctl status docker

다음 출력이 표시되어야 합니다.

? docker.service - Docker Application Container Engine
   Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2019-07-19 07:05:50 UTC; 1h 24min ago
     Docs: https://docs.docker.com
 Main PID: 3619 (dockerd)
    Tasks: 8
   CGroup: /system.slice/docker.service
           ??3619 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.574491681Z" level=warning msg="Your kernel does not support swap memory limit"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575196691Z" level=warning msg="Your kernel does not support cgroup rt period"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.575733336Z" level=warning msg="Your kernel does not support cgroup rt runtime"
Jul 19 07:05:48 master dockerd[3619]: time="2019-07-19T07:05:48.582517104Z" level=info msg="Loading containers: start."
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.391255541Z" level=info msg="Default bridge (docker0) is assigned with an IP add
Jul 19 07:05:49 master dockerd[3619]: time="2019-07-19T07:05:49.681478822Z" level=info msg="Loading containers: done."
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.003776717Z" level=info msg="Docker daemon" commit=0dd43dd graphdriver(s)=overla
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.009892901Z" level=info msg="Daemon has completed initialization"
Jul 19 07:05:50 master systemd[1]: Started Docker Application Container Engine.
Jul 19 07:05:50 master dockerd[3619]: time="2019-07-19T07:05:50.279284258Z" level=info msg="API listen on /var/run/docker.sock"

Kubernetes 패키지는 Ubuntu 18.04 기본 리포지토리에서 사용할 수 없습니다. 따라서 두 서버 모두에 Kubernetes 리포지토리를 추가해야 합니다.

다음 명령으로 추가할 수 있습니다.

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' | tee /etc/apt/sources.list.d/kubernetes.list

다음으로 다음 명령을 사용하여 리포지토리를 업데이트하고 Kubernetes 패키지를 설치합니다.

apt-get install kubelet kubeadm kubectl -y

모든 패키지가 설치되면 마스터 서버 구성을 진행할 수 있습니다.

Kubernetes 마스터 서버 구성

먼저 마스터 서버에서 개인 IP 주소로 클러스터를 초기화해야 합니다.

kubeadm 명령으로 이를 수행할 수 있습니다.

kubeadm init --pod-network-cidr=192.168.0.0/16 --apiserver-advertise-address=192.168.0.103

클러스터가 성공적으로 초기화되면 다음 출력이 표시되어야 합니다.

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

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 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u \
    --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c 

다음으로 마스터 서버에서 kubectl 도구를 구성해야 합니다. 다음 명령으로 수행할 수 있습니다.

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

다음으로 서버에 CNI(컨테이너 네트워킹 인터페이스)를 배포해야 합니다. 클러스터에 CNI가 없기 때문입니다.

다음 명령을 사용하여 CNI를 클러스터에 배포할 수 있습니다.

kubectl apply -f https://docs.projectcalico.org/v2.6/getting-started/kubernetes/installation/hosted/kubeadm/1.6/calico.yaml

다음 출력이 표시되어야 합니다.

configmap/calico-config created
daemonset.extensions/calico-etcd created
service/calico-etcd created
daemonset.extensions/calico-node created
deployment.extensions/calico-kube-controllers created
deployment.extensions/calico-policy-controller created
clusterrolebinding.rbac.authorization.k8s.io/calico-cni-plugin created
clusterrole.rbac.authorization.k8s.io/calico-cni-plugin created
serviceaccount/calico-cni-plugin created
clusterrolebinding.rbac.authorization.k8s.io/calico-kube-controllers created
clusterrole.rbac.authorization.k8s.io/calico-kube-controllers created
serviceaccount/calico-kube-controllers created

이제 다음 명령을 실행하여 네임스페이스를 확인할 수 있습니다.

kubectl get namespaces

모든 것이 제대로 진행되면 다음 출력이 표시됩니다.

NAME          STATUS    AGE
default       Active    4h
kube-public   Active    4h
kube-system   Active    4h

다음으로 다음 명령을 사용하여 마스터 노드가 이제 제대로 실행되고 있는지 확인합니다.

kubectl get nodes

다음 출력이 표시되어야 합니다.

name          status    roles     age       version
master   Ready     master    12m       v1.15.3

Kubernetes 클러스터에 슬레이브 추가

다음으로 슬레이브 서버에 로그인하고 다음 명령을 실행하여 슬레이브를 Kubernetes 클러스터에 추가합니다.

kubeadm join 192.168.0.103:6443 --token zsyq2w.c676bxzjul3upd7u --discovery-token-ca-cert-hash sha256:a720ae35d472162177f6ee39de758a5de40043f53e4a3e00aefd6f9832f3436c

그런 다음 마스터 서버로 이동하여 다음 명령을 사용하여 슬레이브가 Kubernetes 클러스터에 추가되었는지 확인하십시오.

kubectl get nodes

다음 출력이 표시되어야 합니다.

name status roles age version
master ready master 25m v1.15.3
slave ready 2m v1.15.3

완료되면 다음 단계로 진행할 수 있습니다.

Kubernetes 클러스터에 NGINX 배포

이제 Kubernetes 클러스터가 설치, 구성 및 제대로 작동합니다. Kubernetes 클러스터에 Nginx를 배포할 시간입니다.

마스터 서버로 이동하고 다음 명령을 사용하여 Nginx 배포를 만듭니다.

kubectl create deployment nginx --image=nginx

이제 다음 명령을 사용하여 Nginx 배포를 나열할 수 있습니다.

kubectl get deployments

다음 출력이 표시되어야 합니다.

NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           99s

Nginx가 배포되면 다음 명령을 사용하여 애플리케이션을 노출할 수 있습니다.

kubectl create service nodeport nginx --tcp=80:80

이제 다음 명령으로 할당된 새 서비스 및 ClusterIP 주소를 볼 수 있습니다.

kubectl get svc

다음 출력이 표시되어야 합니다.

NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.152.183.1             443/TCP   15m
nginx        ClusterIP   10.152.183.199           80:32456/TCP    60s

축하합니다! Kubernetes 클러스터에 Nginx를 성공적으로 배포했습니다. Kubernetes 클러스터에 다른 노드를 쉽게 추가할 수도 있습니다. 자세한 내용은 Kubernetes Doc에서 Kubernetes 공식 문서를 참조하세요. 궁금한 점이 있으면 언제든지 문의해 주세요.