우분투 Kubernetes 설치 방법


우분투 Kubernetes 설치 방법
우분투에서 쿠버네티스를 설치하는 방법을 설명드립니다. Kubernetes를 설치 후 Master 노드를 초기화하고, Pod Network 를 추가 한 뒤에 Slave 노드를 추가하도록 하겠습니다. 그리고 마지막으로 Dashboard를 설정하는 방법까지 함께 설명드리도록 하겠습니다.

소개 및 환경

Kubernetes는 docker를 기반으로 하여 컨테이너화된 어플리케이션을 자동으로 배포, 확장, 관리할 수 있는 오픈소스 입니다. 따라서 가장 먼저 docker가 설치되었을 것을 가정하에 설명드리도록 하겠습니다. docker 설치에 대한 자세한 방법은 아래의 글을 참고해 주시기 바랍니다. 운영체제는 우분투 16.04 버전을 기준으로 설명드리지만, 우분투 18.04 버전에서도 크게 다르지 않을 것이라 생각됩니다.

우분투에서 docker 설치 방법

이글을 읽으면서 준비해 주셔야 할 내용은 아래와 같습니다.

  • Master 노드 : 우분투 기준으로 설명드리며, Kunernets 의 마스터 노드가 설정될 호스트입니다.
  • Slave 노드(옵션) : 필수 사항은 아니지만, 클러스터에 Slave 노드 추가 방법을 함께 설명드립니다. 같은 환경입니다.
  • 서버 SSL인증서 : Dashboard UI에 적용될 서버 SSL 인증서입니다. 없으셔도 됩니다.

Kubernetes 설치

먼저 아래의 명령어로 신뢰할 수 있는 APT 키를 추가합니다.

$ sudo apt install apt-transport-https
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add

그리고 아래의 명령어로 Repository를 추가하고, Kubernetes 를 설치합니다.

$ sudo add-apt-repository "deb http://apt.kubernetes.io/ kubernetes-$(lsb_release -cs) main"
$ sudo apt update
$ sudo apt install kubelet kubeadm kubectl kubernetes-cni

위의 명령어로 설치하실경우, 어렵지 않게 Kubernetes를 설치 하실 수 있습니다.

Master 노드 초기화

Kubernetes가 성공적으로 설치 되었을 경우, 가정 먼저 수행해 주실 내용은 Master 노드를 초기화 하는 것입니다.
Master 노드를 초기화 할 때에 사용하실 Pod Network에 따라 초기화 코드가 달라질 수 있습니다. 이 글에서는 Pod Network를 flannel으로 지정하여 초기화 하도록 하겠습니다. 종류 별로 Pod Network 사용 방법 및 초기화 코드를 확인 하기 위해서는 아래의 페이지를 참고해 주시기 바랍니다.

https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/#pod-network

먼저 브릿지되어있는 IPv4 트래픽을 iptables 체인으로 전달될 수 있도록 아래의 명령어를 실행합니다.

$ sudo sysctl net.bridge.bridge-nf-call-iptables=1

그리고 다음 명령어로 Master 노드를 초기화 합니다.

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

위의 명령어를 실행한 결과는 다음과 같습니다.

[init] using Kubernetes version: v1.11.2
[preflight] running pre-flight checks
I0823 05:52:23.060797    1902 kernel_validator.go:81] Validating kernel version
I0823 05:52:23.060966    1902 kernel_validator.go:96] Validating kernel config
[preflight/images] Pulling images required for setting up a Kubernetes cluster
[preflight/images] This might take a minute or two, depending on the speed of your internet connection
[preflight/images] You can also perform this action in beforehand using 'kubeadm config images pull'
[kubelet] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
.. 중략 ..
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy

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 172.31.20.231:6443 --token 95bt0c.dqi8yv7xzhbqgwcp --discovery-token-ca-cert-hash sha256:b2c7c12685340f8782013b2fe0c1521c74f02994b9f15a068f13a38a39c114c0

위의 내용에서 제일 하단에 노드를 추가하는 명령어가 나타나있습니다. 추후 노드를 추가할 때 사용되므로 복사해 두시기 바랍니다. 그리고 위에 나타나있는 클러스터 설정 파일을 복사하는 명령어를 아래와 같이 실행해 주시기 바랍니다.

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

Pod Network 추가

마스터 노드가 초기화 된 다음에는 Pod 간의 통신을 위해서 Pod Network를 추가해 주셔야합니다. 아래의 명령어를 실행하여 Pod Network를 추가합니다.

$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

그리고 다음 명령어로 현재 클러스터 노드 정보를 확인합니다.

$ kubectl get nodes
NAME               STATUS    ROLES     AGE       VERSION
ip-172-31-20-231   Ready     master    7m        v1.11.2

만약 STATUS 값이 NotReady 상태인 경우, Pod Network가 아직 deploy 되기 전 상태일 수 있습니다. 잠시 기다려주시면 STATUS가 변경될 수 있습니다.
Ready 상태로 노드가 변경되지 않는 다면 아래의 글을 참고해 주시기 바랍니다.

http://joecreager.com/troubleshooting-kubernetes-worker-node-notready/

Slave 노드 추가

학습을 목적으로 Kubernetes을 설치하고 테스트하시는 경우, Slave 노드를 추가하지 않으셔도 됩니다. 하지만 Slave 노드를 추가하는 경우가 필요 할 수 있으니 함께 설명드리도록 하겠습니다.

Slave 노드로 활용하고자 하는 호스트에서, 위의 내용과 공통적으로 Kubernetes를 설치해 줍니다. 그리고 위에서 Master 노드를 초기화하는 코드 대신 Slave 노드를 추가하는 코드를 작성하면 됩니다.

$ sudo kubeadm join 172.31.20.231:6443 --token 95bt0c.dqi8yv7xzhbqgwcp --discovery-token-ca-cert-hash sha256:b2c7c12685340f8782013b2fe0c1521c74f02994b9f15a068f13a38a39c114c0

위의 마스터 노드에서 초기화 할 때, 나타난 명령어는 Master 노드의 사설 아이피가 나타나있습니다. 외부에서 접근하기 위해서는 공용 아이피가 지정되어져야 할 수 있으며 토큰 등의 값은 맞게 수정해 주셔야 합니다.

위의 명령어를 실행 한 뒤에 Master 노드에서 노드가 추가되었는지 다음 명령어로 확인합니다.

$ kubectl get nodes
NAME               STATUS    ROLES     AGE       VERSION
ip-172-31-20-231   Ready     master    17m       v1.11.2
ip-172-31-21-201   Ready         1m        v1.11.2

Web UI (Dashboard)

Kubernetes의 Dashboard인 Web UI를 추가하는 방법을 설명드리도록 하겠습니다. Master 노드에서 다음과 같은 명령어를 실행합니다.

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml

그리고 다음 명령어로 kubernetes-dashboard 가 실행중인 상태인지 확인합니다.

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                       READY     STATUS    RESTARTS   AGE
kube-system   kubernetes-dashboard-6948bdb78-g6ckx       1/1       Running   0          39s

다음 명령어를 사용하여, 세부적인 정보를 확인할 수도 있습니다.

$ kubectl -n kube-system get service kubernetes-dashboard
NAME                   TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
kubernetes-dashboard   ClusterIP   10.102.180.168           443/TCP   3m

정상적으로 서비스가 Running 상태일 경우, 아래의 명령어를 실행하여 외부에서 접속 proxy 데몬을 실행합니다.

$ kubectl proxy --accept-hosts='^*$'
Starting to serve on 127.0.0.1:8001

위의 명령어를 실행했을 경우, 내부에서 접속이 가능합니다.

웹서버 설정

도메인을 통해서 외부에서 접속 하도록 설정하기 위해서는 추가적으로 웹서버에서 Proxy 설정을 해주셔야 합니다.
다음의 내용은 Aapche에서 SSL 인증서를 이용하여 Proxy설정 하는 방법입니다. 보다 자세한 내용은 아래의 글을 참고해 주시기 바랍니다.

SSL인증서를 Apache 서버에 설정하는 방법

$ sudo apt install apache2
$ sudo a2enmod ssl
$ sudo a2enmod proxy
$ sudo a2enmod proxy_html
$ sudo a2enmod proxy_http
$ sudo a2enmod rewrite

위의 명령어로 Apache를 설치해 주시고, 필요한 모듈을 활성화합니다.
그리고 다음과 같은 내용의 설정 파일을 작성합니다.

<VirtualHost *:443>
  ServerName  hiseon.me

  SSLEngine on
  SSLCertificateKeyFile /etc/ssl/hiseon.me/hiseon_me.key
  SSLCertificateFile /etc/ssl/hiseon.me/hiseon_me.crt
  SSLCACertificateFile /etc/ssl/hiseon.me/hiseon_me.ca-bundle

  ProxyPreserveHost On
  ProxyRequests Off

  ProxyPass / http://127.0.0.1:8001/
  ProxyPassReverse / http://127.0.0.1:8001/

  <Directory />
    AllowOverride All
    Options All
    Require all granted
  </Directory>
</VirtualHost>

그리고 다음 명령어로 웹 서버를 다시 실행해 주시면 됩니다.

$ sudo service apache2 restart

Dashboard 접속

Kubernetes의 Web UI인 Dashboard에 접속하기 위해서는 브라우저로 다음 주소로 방문하시면 됩니다.

http://127.0.0.1:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/
https://도메인/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

위의 페이지로 방문하시면 다음과 같이 로그인 화면이 나타납니다.

Kubernetes의 Web UI인 Dashboard에 접속하기 위해서는 다음 명령어로 먼저 토큰을 만들어 주시기 바랍니다.

$ kubectl -n kube-system describe $(kubectl -n kube-system \
    get secret -n kube-system -o name | grep namespace) | grep token

토큰생성 후 내용은 아래와 같습니다.

Name:         namespace-controller-token-2zwm4
Type:  kubernetes.io/service-account-token
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlci10b2tlbi0yendtNCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImVhMGViNzU0LWE2OTgtMTFlOC04ZjRjLTBhNDdmNTZhNmNjZSIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpuYW1lc3BhY2UtY29udHJvbGxlciJ9.dOA1oYVlwDk4QMCIvNFtHDjk8aDKvEbkEYK68J4ZmScYZo80e8IImiJ3xp_eSTIlQ6vGRcMZMokv35T3YduzdCbLCL3ZkDhTPTsW6hkh98yoRIPX3iqm512MYjLxwptrIQNn6GuUv3pAUWGg6LCwBQZGVOUTxt1ClDYOADIAgFNrDrPBRy0SQEq-2PrNA3nqDfbPxM_WhgkCljTdxhpTyXtQnGpYT08NoEz75JV6S-KZ7A_beTm8QesDIwCyF3-nQdoxE5xlC9y_PZtJxZMontaYk3rsOg4rDvzlHSW3XQbdOVxLEXLqkkopisOKrLmX2_qRFoN50GQb9N0BQSuwzw

그리고 마지막으로 다음 페이지에 접속 후 위의 토큰 정보로 로그인 하실 수 있을겁니다.

본문 내용 인용시에는 출처를 밝혀 주시기 바랍니다.