메뉴 건너뛰기

Cloudera, BigData, Semantic IoT, Hadoop, NoSQL

Cloudera CDH/CDP 및 Hadoop EcoSystem, Semantic IoT등의 개발/운영 기술을 정리합니다. gooper@gooper.com로 문의 주세요.


출처 : https://hiseon.me/linux/ubuntu/ubuntu-kubernetes-install/



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

우분투 Kubernetes 설치 방법

소개 및 환경

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 https://apt.kubernetes.io/ kubernetes-$(lsb_release -cs) main"
$ sudo apt-get update
$ sudo apt-get install kubelet kubeadm kubectl kubernetes-cni

위의 명령어는 현재 사용중인 우분투 배포판의 코드네임의 Repository를 자동으로 추가합니다. 만약 우분투 18.04 버전에서 아래와 같이 오류가 발생할 경우 아직 우분투 18.04 버전을 지원하고 있지 않는 것입니다.

E: The repository 'https://apt.kubernetes.io kubernetes-bionic Release' does not have a Release file

kubelet 설정

swap 설정을 해주어야 한다.

1
2
3
$ sed -i '9s/^/Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"\n/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
$ systemctl daemon-reload
$ systemctl restart kubelet

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 
$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors Swap

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

[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 apply -f https://raw.githubusercontent.com/coreos/flannel/bc79dd1505b0c8681ece4de4c0d86c5cd2643275/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설정 하는 방법입니다. 보다 자세한 내용은 아래의 글을 참고해 주시기 바랍니다.

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

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


번호 제목 날짜 조회 수
602 W/F수행후 Logs not available for 1. Aggregation may not to complete. 표시되며 로그내용이 보이지 않은 경우 2020.05.08 2403
601 A Cluster의 HDFS 디렉토리및 파일을 사용자및 권한 유지 하여 다운 받아서 B Cluster에 넣기 2020.05.06 992
600 impala external 테이블 생성시 컬럼과 라인 구분자를 지정하여 테이블 생성하는 예시 2020.02.20 988
599 [Kerberos]Kerberos상태의 클러스터에 JDBC로 접근할때 케이스별 오류내용 2020.02.14 1252
598 cloudera서비스 중지및 기동순서 2020.02.14 821
597 impala테이블 쿼리시 max_row_size 관련 오류가 발생할때 조치사항 2020.02.12 839
596 hue.axes_accessattempt테이블 데이터 샘플 2020.02.10 638
595 hue.desktop_document2의 type의 종류 2020.02.10 1098
594 hue db에서 사용자가 가지는 정보 확인 2020.02.10 2117
593 Cloudera의 CMS각 컴포넌트의 역할 2020.02.10 917
592 Namenode Metadata백업하는 방법 2020.02.10 946
591 cloudera의 hue에서 사용자가 사용한 쿼리 목록 2020.02.07 875
590 hive metadata(hive, impala, kudu 정보가 있음) 테이블에서 db, table, owner, location를 조회하는 쿼리 2020.02.07 1068
589 쿠버네티스(k8s) 설치 및 클러스터 구성하기 2019.10.19 472
» [kubernetes]우분투 Kubernetes 설치 방법 file 2019.07.24 1344
587 LAGOM 1.4 AND KUBERNETES ORCHESTRATION 2019.07.19 192
586 oozie WF에서 참고할만한 내용 2019.07.18 353
585 [shellscript] 함수에 배열을 인자로 주어서 처리하는 방법 2019.07.16 915
584 [shellscript]엑셀파일에서 여러줄에 존재하는 단어를 한줄의 문자열로 합치는 방법(comma로 구분) 2019.07.15 1247
583 원격에 있는 git를 받은후 기존repository삭제후 새로운 리포지토리에 연결하여 소스 등록 2019.07.13 721
위로