---
html:
toc: true
offline: true
export_on_save:
html: true
---
# Kubernetes 클러스터 설치하기
---
3대 서버에 마스터 1개, 노드1, 노도2의 쿠버네티스 클러스터를 구성하기 위한 설치 방법을 설명합니다.
각 서버의 호스트 이름 및 IP 는 아래와 같이 가정합니다.
csle1 : 192.168.0.5 (master)
csle2 : 192.168.0.6 (node1)
csle3 : 192.168.0.7 (node2)
## 모든 서버에 공통으로 설치하기
### [모든 서버 공통] java 8 설치하기
KSB 툴박스 설치의 java-8-oracle 설치 부분을 참고합니다.
### [모든 서버 공통] 기타 우분투 프로그램 설치하기
```sh
sudo apt-get update && \
sudo apt-get install -y --no-install-recommends apt-utils curl bc jq && \
sudo apt-get install -y ssh locales wget git vim rsync locales filezilla python3-pip && \
sudo apt-get install -y net-tools && \
pip3 install kafka-python
```
### [모든 서버 공통] SSHD port 변경 및 root 로그인 가능하게 SSHD config 수정하기
아래의 명령을 수행하여 포트 정보를 2243로 수정하고, root 로그인을 허용합니다.
```sh
sudo sed -ri 's/^Port 22/Port 2243/g' /etc/ssh/sshd_config
sudo sed -ri 's/^PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config
```
### [모든 서버 공통] SSH config 수정하기
SSH 접속시 known_hosts에 호스트 정보 저장 질문을 하지 않도록 설정합니다.
아래의 명령을 수행하여 ssh_config의 기존 내용을 모두 삭제하고 설정을 추가합니다.
```sh
sudo truncate -s0 /etc/ssh/ssh_config
echo "Host localhost" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host 0.0.0.0" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host 127.0.0.1" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host csle*" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "Host master" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "StrictHostKeyChecking no" | sudo tee -a /etc/ssh/ssh_config >/dev/null
echo "UserKnownHostsFile=/dev/null" | sudo tee -a /etc/ssh/ssh_config >/dev/null
```
### [모든 서버 공통] SSH 서비스 재시작하기
```sh
sudo service ssh restart
```
### [모든 서버 공통] docker 설치하기
```sh
curl -fsSL https://apt.dockerproject.org/gpg | sudo apt-key add -
apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D
add-apt-repository "deb https://apt.dockerproject.org/repo/ ubuntu-xenial main"
apt-get update
apt-get -y install docker-engine
systemctl enable docker
```
#### [참고사항] 기존 docker-engine 삭제
sudo apt-get purge -y docker docker-engine docker.io
### [모든 서버 공통] docker sudo 명령없이 사용하기 위한 설정하기
Docker 명령시 root 권한이 필요합니다. root가 아닌 사용자가 sudo 없이 사용하려면 해당 사용자를 docker 그룹에 추가합니다.
```sh
sudo usermod -aG docker csle
# 사용자가 로그인 중이라면 다시 로그인 후 권한이 적용됩니다. 단, 현재 터미널에서만 적용됩니다.
sudo su csle
PC 재부팅
```
PC 재부팅을 통해서 sudo 명령없이 docker 명령을 사용할 수 있습니다.
### [모든 서버 공통] Kubernetes 설치하기
```sh
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - && \
echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list && \
sudo apt-get update -q && \
sudo apt-get install -qy kubelet=1.9.6-00 kubectl=1.9.6-00 kubeadm=1.9.6-00
kubectl version
```
#### [모든 서버 공통] (참고사항) 기존 Kubernetes 버전 삭제 방법
```sh
sudo su -
kubeadm reset
rm /usr/local/bin/kubectl
rm -r /etc/kubernetes
rm -r /var/lib/etcd
rm -rf /var/lib/cni/
ifconfig cni0 down && ip link delete cni0
ifconfig flannel.1 down && ip link delete flannel.1
apt-get autoremove --purge -y kubelet kubeadm kubectl kubernetes-cni
```
### [모든 서버 공통] /etc/fstab 수정 후 재부팅하기
쿠버네티스가 Swap 기능을 관리해야 하므로, 아래의 swap이 적용된 file 시스템 부분을 주석 처리한다.
```sh
sudo vi /etc/fstab
UUID=c3ec283e-682f-4e8c-b822-43eef87a725f / ext4 errors=remount-ro 0 1
# /boot/efi was on /dev/nvme0n1p1 during installation
UUID=7D67-73C7 /boot/efi vfat umask=0077 0 1
# swap was on /dev/nvme0n1p3 during installation
# (주의!!!) swap 설정 해제
#UUID=257a989b-d1fa-4a7c-8ae7-9ccad9b9c0c6 none swap sw 0 0
```
### [모든 서버 공통] Kubernetes master /etc/hosts 변경하기
```sh
sudo vi /etc/hosts
127.0.0.1 localhost
# 아래 주석처리. Hdfs 연동시 문제가 생김.
#127.0.1.1 csle1
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
# 쿠버네티스 master, node1, node2 정보 등록
192.168.0.5 csle1 master
192.168.0.6 csle2
192.168.0.7 csle3
```
### [모든 서버 공통] sysctl kernel parameter값 수정하기
커널 차원에서 보안 및 최적화 관련 설정을 변경합니다.
먼저 root계정으로 변경합니다.
```sh
csle@csle1:~# sudo su -
root@csle1:~#
```
아래와 같이 설정 후 반영합니다.
```sh
root@csle1:~# vi /etc/sysctl.conf
# 아래의 내용을 마지막에 추가합니다.
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.netfilter.nf_conntrack_max = 786432
root@csle1:~# sysctl -p
```
### [모든 서버 공통] kubectl 명령 옵션의 자동 완성 기능 설정하기
```sh
root@csle1:~# source /etc/profile.d/bash_completion.sh
root@csle1:~# source <(kubectl completion bash)
root@csle1:~# echo "source /etc/profile.d/bash_completion.sh" | tee -a ~/.bashrc
root@csle1:~# echo "source <(kubectl completion bash)" | tee -a ~/.bashrc
```
### [모든 서버 공통] Security Enhanced Linux 모드 disable 하기
갑작스러운 리부팅 이후에 apiserver, etcd 등이 정상 기동되지 않는 경우가 자주 발생을 막기 위해 permissive로 설정합니다.
```sh
root@csle1:~# apt install -y selinux-utils
root@csle1:~# setenforce 0
```
### [모든 서버 공통] 10-kubeadm.conf 수정하기
ExecStart= 위의 라인에 Environment 설정값을 추가합니다.
```sh
root@csle1:~$ vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"
Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"
Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"
Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"
Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"
# 아래의 내용을 추가합니다.
Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false --runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"
ExecStart=
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS
```
아래의 명령을 통해 kubelet을 재시작 합니다.
```sh
root@csle1:~$ swapoff -a
root@csle1:~$ sudo systemctl daemon-reload
root@csle1:~$ sudo systemctl restart kubelet
root@csle1:~$ sudo systemctl status kubelet
● kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since 수 2018-07-25 09:55:44 KST; 3s ago
Docs: http://kubernetes.io/docs/
Process: 10517 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR
Main PID: 10517 (code=exited, status=1/FAILURE)
7월 25 09:55:44 csle4 systemd[1]: kubelet.service: Unit entered failed state.
7월 25 09:55:44 csle4 systemd[1]: kubelet.service: Failed with result 'exit-code'.
```
systemctl status kubelet 실행시 status=1/FAILURE로 나타나지만 무시해도 됩니다.
kubeadm이 정상 실행 되면 정상화됩니다.
모든 노드에 대해 동일하게 설정하는 부분을 완료하였습니다.
master와 node들 각각에 대한 설정 방법을 설명합니다.
## Kubernetes master (csle1) 설정하기
### [Master: csle1] kubeadm 초기화하기
자신의 ip에 맞도록 수정하고 kubeadm으로 초기화합니다. (예: master ip : 192.168.0.5)
```sh
root@csle1:~$ kubeadm init --apiserver-advertise-address=192.168.0.5 --pod-network-cidr=10.244.0.0/16 --service-cidr 10.96.0.0/12 --token-ttl 0
```
아래와 같은 로그가 나오면서 초기화 되면 정상입니다.
```
[init] Using Kubernetes version: v1.9.9
[init] Using Authorization modes: [Node RBAC]
[preflight] Running pre-flight checks.
[WARNING FileExisting-crictl]: crictl not found in system path
[certificates] Generated ca certificate and key.
[certificates] Generated apiserver certificate and key.
[certificates] apiserver serving cert is signed for DNS names [csle1 kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 129.254.xxx.xxx]
[certificates] Generated apiserver-kubelet-client certificate and key.
[certificates] Generated sa key and public key.
[certificates] Generated front-proxy-ca certificate and key.
[certificates] Generated front-proxy-client certificate and key.
[certificates] Valid certificates and keys now exist in "/etc/kubernetes/pki"
[kubeconfig] Wrote KubeConfig file to disk: "admin.conf"
[kubeconfig] Wrote KubeConfig file to disk: "kubelet.conf"
[kubeconfig] Wrote KubeConfig file to disk: "controller-manager.conf"
[kubeconfig] Wrote KubeConfig file to disk: "scheduler.conf"
[controlplane] Wrote Static Pod manifest for component kube-apiserver to "/etc/kubernetes/manifests/kube-apiserver.yaml"
[controlplane] Wrote Static Pod manifest for component kube-controller-manager to "/etc/kubernetes/manifests/kube-controller-manager.yaml"
[controlplane] Wrote Static Pod manifest for component kube-scheduler to "/etc/kubernetes/manifests/kube-scheduler.yaml"
[etcd] Wrote Static Pod manifest for a local etcd instance to "/etc/kubernetes/manifests/etcd.yaml"
[init] Waiting for the kubelet to boot up the control plane as Static Pods from directory "/etc/kubernetes/manifests".
[init] This might take a minute or longer if the control plane images have to be pulled.
[apiclient] All control plane components are healthy after 46.007752 seconds
[uploadconfig] Storing the configuration used in ConfigMap "kubeadm-config" in the "kube-system" Namespace
[markmaster] Will mark node csle1 as master by adding a label and a taint
[markmaster] Master csle1 tainted and labelled with key/value: node-role.kubernetes.io/master=""
[bootstraptoken] Using token: a96953.b5d1418a5099b5de
[bootstraptoken] Configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials
[bootstraptoken] Configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token
[bootstraptoken] Configured RBAC rules to allow certificate rotation for all node client certificates in the cluster
[bootstraptoken] Creating the "cluster-info" ConfigMap in the "kube-public" namespace
[addons] Applied essential addon: kube-dns
[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 --token a96953.b5d1418a5099b5de 129.254.xxx.xxx:6443 --discovery-token-ca-cert-hash sha256:648c1dd27c51edc0e90ff356f47599e1a8bee800f77ada9f23fdacd8d69e62a0
```
다른 노드에서 master에 접속하기 위해서 아래의 부분을 저장해 둡니다.
```sh
kubeadm join --token a96953.b5d1418a5099b5de 192.168.0.5:6443 --discovery-token-ca-cert-hash sha256:648c1dd27c51edc0e90ff356f47599e1a8bee800f77ada9f23fdacd8d69e62a0
```
### [Master: csle1] K8s master 노드 kubectl 실행환경 설정하기
```sh
root@csle1:~$ sudo su csle
csle@csle1:~$ mkdir -p $HOME/.kube
csle@csle1:~$ yes | sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
csle@csle1:~$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
csle@csle1:~$ export KUBECONFIG=$HOME/.kube/config
csle@csle1:~$ echo "export KUBECONFIG=$HOME/.kube/config" | tee -a ~/.bashrc
csle@csle1:~$ kubectl get componentstatus
```
## Kubernetes node1, node2 설정하기 (csle2, csle3)
먼저 root계정으로 변경합니다.
```sh
csle@csle2:~$ sudo su -
root@csle2:~$
```
### [csle2, csle3] kubernetes master에 join 하기
kublet을 재부팅합니다.
```sh
root@csle2:~$ swapoff -a
root@csle2:~$ sudo systemctl daemon-reload
root@csle2:~$ sudo systemctl restart kubelet
root@csle2:~$ sudo systemctl status kubelet
```
kubernetes master에서 init시 생성된 script와 추가 옵션을 이용해 master에 join 합니다.
```sh
kubeadm join --token c8908d.5dc02f87aca87415 192.168.0.5:6443 --discovery-token-ca-cert-hash sha256:756ac632e63878260dc6b3a3497b8ba69d29087ba0428beaea061e4f5241b29d --ignore-preflight-errors=all --discovery-token-unsafe-skip-ca-verification
```
## kubernetes master에서 확인하기 (csle1)
### [Master: csle1] node 및 pod 동작 확인하기
node1, node2가 join이 성공했는지 아래의 명령을 이용해서 확인합니다.
```sh
root@csle1:~$ sudo su csle
csle@csle1:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
csle1 NotReady master 5m v1.9.6
csle2 NotReady 1m v1.9.6
csle3 NotReady 1m v1.9.6
```
### [Master: csle1] kubernetes 클러스터 환경 구성을 위한 yaml 환경 설정하기
kubernetes master에서 클러스터 환경 구성을 위한 yaml 파일들을 이용해서 서비스를 생성합니다.
```sh
csle@csle1:~$ cd /home/csle/ksb-csle/kubernetes/env_set
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f kube-flannel.yml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f kubernetes-dashboard.yaml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f kubernetes-dashboard-admin-rbac.yaml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f ServiceAccount.yml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f ClusterRoleBinding.yml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f k8s-heapster/
```
```sh
csle@csle1:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
csle1 Ready master 5m v1.9.6
csle2 Ready 1m v1.9.6
csle3 Ready 1m v1.9.6
```
```sh
csle@csle1:~$ kubectl get pods --all-namespaces
kube-system etcd-csle1 1/1 Running 2 1d
kube-system kube-apiserver-csle1 1/1 Running 2 1d
kube-system kube-controller-manager-csle1 1/1 Running 2 1d
kube-system kube-dns-6f4fd4bdf-vtqbt 3/3 Running 6 1d
kube-system kube-proxy-vwp26 1/1 Running 2 1d
kube-system kube-proxy-zs2sw 1/1 Running 2 1d
kube-system kube-scheduler-csle1 1/1 Running 2 1d
```
클러스터 환경 구성을 위한 pod가 정상적으로 구동되었는지 확인합니다.
```sh
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system etcd-csle1 1/1 Running 2 1d
kube-system heapster-dfd674df9-bz45s 1/1 Running 2 1d
kube-system kube-apiserver-csle1 1/1 Running 2 1d
kube-system kube-controller-manager-csle1 1/1 Running 2 1d
kube-system kube-dns-6f4fd4bdf-vtqbt 3/3 Running 6 1d
kube-system kube-flannel-ds-c6mpq 1/1 Running 2 1d
kube-system kube-flannel-ds-rc74q 1/1 Running 2 1d
kube-system kube-proxy-vwp26 1/1 Running 2 1d
kube-system kube-proxy-zs2sw 1/1 Running 2 1d
kube-system kube-scheduler-csle1 1/1 Running 2 1d
kube-system kubernetes-dashboard-5bd6f767c7-4qzj7 1/1 Running 2 1d
kube-system monitoring-grafana-76848b566c-4n4xj 1/1 Running 2 1d
kube-system monitoring-influxdb-6c4b84d695-ts7dk 1/1 Running 2 1d
```
### [Master: csle1] Ingress 환경 설정하기
kubernetes master에서 ingress를 설정합니다.
```sh
csle@csle1:~$ cd /home/csle/ksb-csle/kubernetes/env_set
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f default-backend-for-ingress.yaml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f configmap-nginx-ingress-controller.yaml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f deploy-nginx-ingress-controller.yaml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f ingress-rule.yaml
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create -f svc-expose-by-nodeport.yaml
```
### [Master: csle1] Dashboard URL에 접속하기
아래의 명령으로 dashboard 프록시를 동작시킵니다.
```sh
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:kubernetes-dashboard
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl proxy --port=9999 --address='192.168.0.5' --accept-hosts="^*$"
```
크롬을 열어 아래의 주소로 쿠버네티스 dashboard에 접속한다.
http://192.168.0.5:9999/ui
아래에서 skip을 선택하여 dashboard에 접속합니다.
![Dashboard 접속하기](./images/1.6.KSB_K8s_install_Guide_01.png)
![Dashboard 접속화면](./images/1.6.KSB_K8s_install_Guide_02.png)
## KSB 프레임워크와 연동을 위한 환경설정하기
### [모든 서버 공통] KSB 툴박스에 포함된 SSH 인증키 공유하기
KSB 프레임워크의 엔진이 Kubernetes 마스터에 접속할때 인증 키를 묻지않도록 배포된 KSB 툴박스에 포함된 .ssh 폴더를 쿠버네티스 서버의 홈에 복사합니다.
```sh
cp -r ~/ksb-csle/tools/.ssh/ /home/csle/
```
### [모든 서버 공통] hadoop 프로그램을 설치하기
~/ksb-csle/tools/hadoop-2.7.3 폴더를 master, node1, node2의 csle 홈 폴더에 복사합니다.
```sh
cp -r ~/ksb-csle/tools/hadoop-2.7.3 /home/csle/
```
그리고 아래와 같이 설정합니다.
```sh
ln -s hadoop-2.7.3 hadoop
```
### [모든 서버 공통] ~/.bashrc 수정하기
```sh
sudo vi ~/.bashrc
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
export PATH=$PATH:$JAVA_HOME/bin
export KSB_HOME=/home/csle/ksb-csle
export PYTHONPATH=/home/csle/ksb-csle/pyML/:$PYTHONPATH
export PYTHONPATH=./:/home/csle/ksb-csle/ksblib:$PYTHONPATH
export KUBECONFIG=/home/csle/.kube/config
export HADOOP_HOME=/home/csle/hadoop-2.7.3
export HADOOP_PREFIX=$HADOOP_HOME
export PATH=$PATH:$HADOOP_PREFIX/bin
export PATH=$PATH:$HADOOP_PREFIX/sbin
export HADOOP_CONF_DIR=$HADOOP_HOME/etc/hadoop
export HADOOP_MAPRED_HOME=${HADOOP_PREFIX}
export HADOOP_COMMON_HOME=${HADOOP_PREFIX}
export HADOOP_HDFS_HOME=${HADOOP_PREFIX}
export YARN_HOME=${HADOOP_PREFIX}
export HADOOP_COMMON_LIB_NATIVE_DIR=${YARN_HOME}/lib/native
export HADOOP_OPTS="-Djava.library.path=$YARN_HOME/lib/native"
source ~/.bashrc
```
이상으로 쿠버네티스와 KSB 툴박스와 연동을 하기 위한 모든 준비가 완료되었습니다.
# FAQ
###1. 서버 재부팅 후, connection 에러가 발생하는 경우
```sh
csle@csle1:~$ kubectl get nodes
The connection to the server 192.168.0.5:6443 was refused - did you specify the right host or port?
```
- 해결 방법
```sh
csle@csle1:~$ sudo -i
root@csle1:~# swapoff -a
root@csle1:~# exit
csle@csle1:~$ strace -eopenat kubectl version
```
###2. 서버 재부팅 후, dashboard가 ContainerCreating 상태로 에러가 발생한 경우
```sh
csle@csle1:~/ksb-csle/kubernetes/env_set$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default default-http-backend-66fbbd8844-5dn62 1/1 Running 1 56m
default default-http-backend-66fbbd8844-b2xld 1/1 Running 1 56m
default nginx-ingress-controller-6857676bb9-9569x 1/1 Running 1 56m
default nginx-ingress-controller-6857676bb9-k46f4 1/1 Running 1 56m
kube-system etcd-csle1 1/1 Running 3 1d
kube-system kube-apiserver-csle1 1/1 Running 3 1d
kube-system kube-controller-manager-csle1 1/1 Running 3 1d
kube-system kube-dns-6f4fd4bdf-2b6px 3/3 Running 3 1d
kube-system kube-proxy-9cfj8 1/1 Running 3 1d
kube-system kube-proxy-dvdkx 1/1 Running 3 1d
kube-system kube-scheduler-csle1 1/1 Running 3 1d
kube-system kubernetes-dashboard-6c664cf6c5-pmpjr 1/1 ContainerCreating 1 22
```
dashboard 관련 설정파일을 이용해서 pod를 delete 후, 재생성합니다.
```sh
cd /home/csle/ksb-csle/kubernetes/env_set
kubectl delete -f kube-flannel.yml
kubectl delete -f kubernetes-dashboard.yaml
kubectl delete -f kubernetes-dashboard-admin-rbac.yaml
kubectl delete -f ServiceAccount.yml
kubectl delete -f ClusterRoleBinding.yml
kubectl delete -f k8s-heapster/
kubectl create -f kube-flannel.yml
kubectl create -f kubernetes-dashboard.yaml
kubectl create -f kubernetes-dashboard-admin-rbac.yaml
kubectl create -f ServiceAccount.yml
kubectl create -f ClusterRoleBinding.yml
kubectl create -f k8s-heapster/
```
###3. KSB 툴박스 docker 컨테이너에서 host pc에 ssh 접속시 password를 묻는지 확인하는 방법
KSB 툴박스 docker 컨테이너에서 아래의 명령을 수행하여 각 kubernete 마스터와 노드에 접속시 password를 묻는지 확인합니다.
```sh
csle@csle1:~$ ssh -l csle csle1 -p 2243 mkdir -p /home/csle/ksb-csle/kubernetes/modelDB/kangnam/0001
Warning: Permanently added '[csle1]:2243,[192.168.0.5]:2243' (ECDSA) to the list of known hosts.
csle@csle1:~$
csle@csle1:~$ ssh -l csle csle2 -p 2243 mkdir -p /home/csle/ksb-csle/kubernetes/modelDB/kangnam/0001
Warning: Permanently added '[csle2]:2243,[192.168.0.6]:2243' (ECDSA) to the list of known hosts.
csle@csle1:~$
```
만약 password를 묻는다면, .ssh 폴더의 인증키가 공유되지 않은 상태입니다. password를 묻는 마스터 혹은 노드 HOST에서 대해서 아래의 절차대로 인증키를 복사하시기 바랍니다.
#### [Host PC] KSB 툴박스 docker 이미지내 SSH 키를 host pc에 복사하기
KSB 툴박스 docker 컨테이너의 인증키를 공유하기 위해 ksb-csle/tools 폴더에 있는 .ssh 폴더를 csle 홈에 카피합니다.
```sh
cp -r ~/ksb-csle/tools/.ssh/ /home/csle/
chmod 600 ~/.ssh/authorized_keys
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh/
rm ~/.ssh/known_hosts
sudo service ssh restart
```