우분투 Kubernetes 설치 방법
우분투에서 쿠버네티스를 설치하는 방법을 설명드립니다. Kubernetes를 설치 후 Master 노드를 초기화하고, Pod Network 를 추가 한 뒤에 Slave 노드를 추가하도록 하겠습니다. 그리고 마지막으로 Dashboard를 설정하는 방법까지 함께 설명드리도록 하겠습니다.
소개 및 환경
Kubernetes는 docker를 기반으로 하여 컨테이너화된 어플리케이션을 자동으로 배포, 확장, 관리할 수 있는 오픈소스 입니다. 따라서 가장 먼저 docker가 설치되었을 것을 가정하에 설명드리도록 하겠습니다. docker 설치에 대한 자세한 방법은 아래의 글을 참고해 주시기 바랍니다. 운영체제는 우분투 16.04 버전을 기준으로 설명드리지만, 우분투 18.04 버전에서도 크게 다르지 않을 것이라 생각됩니다.
이글을 읽으면서 준비해 주셔야 할 내용은 아래와 같습니다.
- 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 를 설치합니다. 우분투 16.04 를 포함하여 이후버전에서도 동일한 명령어로 설치 가능합니다.
$ echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
$ sudo apt update
$ sudo apt install kubelet kubeadm kubectl kubernetes-cni
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 -w net.bridge.bridge-nf-call-iptables=1
$ sudo sysctl -w net.ipv4.ip_forward=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를 추가합니다.
$ sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/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 create -f https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/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='^*
위의 명령어를 실행했을 경우, 내부에서 접속이 가능합니다.
웹서버 설정
도메인을 통해서 외부에서 접속 하도록 설정하기 위해서는 추가적으로 웹서버에서 Proxy 설정을 해주셔야 합니다.
다음의 내용은 Aapche에서 SSL 인증서를 이용하여 Proxy설정 하는 방법입니다. 보다 자세한 내용은 아래의 글을 참고해 주시기 바랍니다.
$ 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
그리고 마지막으로 다음 페이지에 접속 후 위의 토큰 정보로 로그인 하실 수 있을겁니다.
( 본문 인용시 출처를 밝혀 주시면 감사하겠습니다.)