설치환경
OS : Ubuntu 20.04.4 LTS(2 CPU, 4GB Memory)
시작하기 전에
- 호환되는 리눅스 머신. 쿠버네티스 프로젝트는 데비안 기반 배포판, 레드햇 기반 배포판, 그리고 패키지 매니저를 사용하지 않는 경우에 대한 일반적인 가이드를 제공한다.
- 2 GB 이상의 램(이 보다 작으면 사용자의 앱을 위한 공간이 거의 남지 않음)
- 2 개 이상의 CPU
- 클러스터의 모든 머신에 걸친 전체 네트워크 연결(공용 또는 사설 네트워크면 괜찮음). CNI 설치
- 모든 노드에 대해 고유한 호스트 이름, MAC 주소 및 product_uuid. 자세한 내용은 여기를 참고한다.
- 컴퓨터의 특정 포트들 개방. 자세한 내용은 여기를 참고한다.
- 스왑의 비활성화. kubelet이 제대로 작동하게 하려면 반드시 스왑을 사용하지 않도록 설정한다.(전체 서버)
iptables가 브리지된 트래픽을 보게 하기
br_netfilter 모듈이 로드되었는지 확인한다. lsmod | grep br_netfilter 를 실행하면 된다. 명시적으로 로드하려면 sudo modprobe br_netfilter 를 실행한다.
리눅스 노드의 iptables가 브리지된 트래픽을 올바르게 보기 위한 요구 사항으로, sysctl 구성에서 net.bridge.bridge-nf-call-iptables 가 1로 설정되어 있는지 확인해야 한다.
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system
필수 포트 확인
필수 포트들은 쿠버네티스 컴포넌트들이 서로 통신하기 위해서 열려 있어야 한다. 다음과 같이 telnet 명령을 이용하여 포트가 열려 있는지 확인해 볼 수 있다. 아래는 마스터 노드 IP가 10.10.1.21 인 경우에 대한 예시입니다.
telnet 10.10.1.21 6443
- 서버 방화벽이 있는 경우에는 방화벽을 disable 합니다.
systemctl stop firewalld
systemctl disable firewalld
swap 메모리 비활성화
$ sudo swapoff -a
swap 메모리 상태 확인
#출력값이 없으면 swap 메모리가 비활성화된 상태입니다.
$ sudo swapon -s
# 아래와 같이 출력되면 swap 메모리가 0이면 비활성화된 상태입니다.
$ free -h
total used free shared buff/cache available
Mem: 3.9G 266M 3.4G 8.8M 232M 3.4G
Swap: 0B 0B 0B
docker 설치
docs.docker.com 참조하여 설치합니다. 참고로, 현재 도커 엔진 패키지는 docker-ce라고 부릅니다.
구버전 도커 Uninstall
이전 버전의 Docker는 docker, docker.io 또는 docker-engine이라고 했습니다. 이러한 항목이 설치된 경우 제거합니다.
$ sudo apt-get remove docker docker-engine docker.io containerd runc
저장소를 사용하여 설치
Docker 저장소를 설정해야 합니다. 그런 다음 저장소에서 Docker를 설치하고 업데이트할 수 있습니다.
저장소 설정
apt 패키지 인덱스를 업데이트하고 apt가 HTTPS를 통해 리포지토리를 사용할 수 있도록 패키지를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
도커 공식 GPG 키를 추가합니다.
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
다음 명령어를 사용하여 저장소를 설정합니다.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker Engine 설치
apt 패키지 인덱스를 업데이트하고 최신 버전의 Docker Engine, containerd 및 Docker Compose를 설치합니다.
$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
hello-world 이미지를 실행하여 Docker 엔진이 올바르게 설치되었는지 확인합니다.
sudo docker run hello-world
Docker 엔진을 설치하면 도커 그룹이 생성되지만 사용자가 추가되지 않습니다. 일반 사용자가 Docker 명령을 실행하려면 sudo를 사용해야 합니다. 일반 사용자가 sudo 명령어없이 Docker 명령을 실행할 수 있도록 아래 명령어를 수행합니다.
- docker를 사용할 user를 docker 그룹에 추가합니다.(참고 docker를 설치하면 docker group 이 생성됩니다.)
$ sudo usermod -aG docker $USER
- 추가된 그룹을 적용하기 위해 로그아웃했다가 다시 로그인합니다. 또는 아래와 같이 명령어를 수행하여 변경된 그룹을 적용합니다.
newgrp docker
아래와 같이 sudo 없이 docker 명령어를 수행합니다. 아래 처럼 "Hello from Docker!" 내용이 보여집니다.
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
재부팅 시 docker 자동 기동
$ sudo systemctl enable docker.service
$ sudo systemctl enable containerd.service
쿠버네티스 설정
kubernetes.io 사이트에 접속하여 각자의 OS에 맞는 설치 방법에 따라 설치한다.
document에서 "Set up cluster"를 클릭한다. install the kubeadm setup tool 를 클락한 후 설명대로 진행한다.
- 설치전 환경 설정 : 위에서 설명
- kubeadm, kubectl, kubelet
- control plane 구성
- worker node 구성
- 설치 확인
kubeadm, kubelet 및 kubectl 설치
모든 머신에 다음 패키지들을 설치한다.
- kubeadm: 클러스터를 부트스트랩하는 명령이다.
- kubelet: 클러스터의 모든 머신에서 실행되는 파드와 컨테이너 시작과 같은 작업을 수행하는 컴포넌트이다.
- kubectl: 클러스터와 통신하기 위한 커맨드 라인 유틸리티이다.
# NOTE: "xenial" is correct here. Kubernetes publishes the Debian-based packages at kubernetes-xenial.
# reference: https://kubernetes.io/docs/tasks/tools/install-kubectl/#install-using-native-package-management
apt 패키지 색인을 업데이트하고, 쿠버네티스 apt 리포지터리를 사용하는 데 필요한 패키지를 설치한다.
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
구글 클라우드의 공개 사이닝 키를 다운로드 한다.
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
또는 아래 명령어를 수행합니다.
sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
쿠버네티스 apt 리포지터리를 추가한다.
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
echo 1 > sudo tee /proc/sys/net/ipv4/ip_forward
apt 패키지 색인을 업데이트하고, kubelet, kubeadm, kubectl을 설치하고 해당 버전을 고정한다.
모든 노드에 설치한다.
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
kubeadm으로 클러스터 생성(control plane 구성)
control-plane node 초기화
control-plane 노드는 etcd(클러스터 데이터베이스) 및 API 서버(kubectl 명령줄 도구가 통신함)를 포함하여 control-plane 구성 요소가 실행되는 시스템입니다. control-plane node를 초기화합니다. master node에서만 실행합니다.
sudo kubeadm init
[init] Using Kubernetes version: v1.23.6
[preflight] Running pre-flight checks
[WARNING SystemVerification]: missing optional cgroups: hugetlb
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR NumCPU]: the number of available CPUs 1 is less than the required 2
[ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
[preflight] If you know what you are doing, you can make a check non-fatal with `--ignore-preflight-errors=...`
To see the stack trace of this error execute with --v=5 or higher
ip_forward 설정
위와 같이 /proc/sys/net/ipv4/ip_forward contents are not set to 1 오류가 발생하면 아래 명령어를 수행합니다.
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
/etc/sysctl.conf 파일을 열어
net.ipv4.ip_forward=1 이 부분을 주석 해제한다.
확인 다음 명령으로 확인 해보면, 변경된 걸 볼 수 있다.
$ sudo sysctl -p
참고) pod 생성 시 네트워크 대역을 설정할 수 있습니다.
kubeadm init --pod-network-cidr=10.244.0.0/16;
kubeadm init 실행시 에러 : 'curl -sSL http://localhost:10248/healthz' failed with error
발생 시
/etc/docker 디렉토리에 daemon.json 파일을 아래와 같이 만들어줍니다.
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
위 조치 방법은 쿠버네티스 공식 홈페이지에 나와 있는 내용 그대롭니다.
=> https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
사실은, 원래 쿠버네티스 설치전에 Container runtime 을 먼저 설치해줘야 하는데(여기서는 docker 부분..)
이 부분을 빠뜨리고 진행한 경우 이런 에러상황을 만나게 되는 겁니다.
위와 같이 daemon.json 파일을 만들어주고나서, kubeadm reset 하고 init 해주니 정상적으로 잘 되네요~
> kubeadm reset
> kubeadm init
에러 유형 3)
init] Using Kubernetes version: v1.24.0
[preflight] Running pre-flight checks
[WARNING SystemVerification]: missing optional cgroups: blkio
error execution phase preflight: [preflight] Some fatal errors occurred:
[ERROR CRI]: container runtime is not running: output: time="2022-05-04T10:21:27Z" level=fatal msg="getting status of runtime: rpc error: code = Unimplemented desc = unknown service runtime.v1alpha2.RuntimeService"
, error: exit status 1
조치내용 : config.toml 파일 삭제, 컨테이너 엔진 재실행 후 kubeadm init 를 실행합니다.
sudo rm /etc/containerd/config.toml
sudo systemctl restart containerd
sudo kubeadm init
kubeadm init 이 완료되면 제일 아래 줄에 아래와 같이 token 이 나타납니다. master node와 연결 시 필요하므로 별도로 저장해 둡니다.
## kubeadm init 실행 결과
......
kubeadm join 10.10.1.21:6443 --token j0vdns.lqbq17k0rwbuvwqj \
--discovery-token-ca-cert-hash sha256:acfc34d9d77a3b0b326de55f969f95f34779853ac34720526eef99357982750d
kubectl get nodes 명령어를 수행해 봅니다. 오류가 발생하는데,
# kubectl get nodes
The connection to the server localhost:8080 was refused - did you specify the right host or port?
오류 발생 시 아래 내용을 참조해서 명령어를 수행합니다.
cluster 를 일반 유저로 실행하려면 일반 유저 계정에서 아래를 실행합니다.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
일반 유저로 다시 node를 조회해 봅니다.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady control-plane 4m11s v1.24.0
root 유저로 수행하려면 아래를 설정합니다.
# export KUBECONFIG=/etc/kubernetes/admin.conf
root@instance-2:~# kubectl get nodes
NAME STATUS ROLES AGE VERSION
instance-2 NotReady control-plane,master 9m30s v1.23.6
위에서 STATUS 를 보변 NotReady 인데 이는 CNI(Container Network Interface)가 설치가 안되어 있어서 그렇습니다.
Pod network add-on 설치
pod 네트워크 애드온 종류는 많습니다(calico, canal, flannel, romana, weave net 등).
본 문서에서는 weave network add on 을 설치합니다.
Weave Net을 설치하기 전에 TCP 6783 및 UDP 6783/6784 포트가 방화벽에 의해 차단되지 않았는지 확인해야 합니다.
아래 명령어로 weave network add-on을 설치합니다.
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
## 실행결과
serviceaccount/weave-net created
clusterrole.rbac.authorization.k8s.io/weave-net created
clusterrolebinding.rbac.authorization.k8s.io/weave-net created
role.rbac.authorization.k8s.io/weave-net created
rolebinding.rbac.authorization.k8s.io/weave-net created
daemonset.apps/weave-net created
참고) weave network를 삭제 방법
kubectl delete -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
serviceaccount "weave-net" deleted
clusterrole.rbac.authorization.k8s.io "weave-net" deleted
clusterrolebinding.rbac.authorization.k8s.io "weave-net" deleted
role.rbac.authorization.k8s.io "weave-net" deleted
rolebinding.rbac.authorization.k8s.io "weave-net" deleted
daemonset.apps "weave-net" deleted
weave network 가 설치되었는지 확인합니다. 아래 결과를 보면 weave-net-s6g8g 처럼 CNI가 설치된 것을 확인할 수 있습니다.
$ kubectl get pod --all-namespaces
## 명령어 수행결과
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-64897985d-ph9hp 0/1 ContainerCreating 0 32m
kube-system coredns-64897985d-rhz7x 0/1 ContainerCreating 0 32m
kube-system etcd-instance-2 1/1 Running 3 32m
kube-system kube-apiserver-instance-2 1/1 Running 3 32m
kube-system kube-controller-manager-instance-2 1/1 Running 3 32m
kube-system kube-proxy-n5ml2 1/1 Running 0 32m
kube-system kube-scheduler-instance-2 1/1 Running 3 32m
kube-system weave-net-s6g8g 2/2 Running 1 (4s ago) 7s
kubectl get nodes 명령어를 수행하면 status 가 Ready 상태가 됩니다.
kubectl get nodes
NAME STATUS ROLES AGE VERSION
instance-2 Ready control-plane,master 14m v1.23.6
worker node 구성
위에서 저장한 token.txt 내용을 복사합니다.
복사한 내용을 worker node에서 수행합니다.
에러 1) 처음 worker node 구성 시 아래와 같은 오류가 발생했는데, 이는 방화벽 때문에 발생한 오류입니다. 마스터 노드와 6443 port로 통신할 수 있는지 확인해 봅니다. 통신이 안될 경우 통신이 되도록 방화벽을 해제합니다.
sudo kubeadm join 10.10.10.210:6443 --token j0vdns.lqbq17k0rwbuvwqj \
> --discovery-token-ca-cert-hash sha256:acfc34d9d77a3b0b326de55f969f95f34779853ac34720526eef99357982750d
[preflight] Running pre-flight checks
[WARNING SystemVerification]: missing optional cgroups: hugetlb
error execution phase preflight: couldn't validate the identity of the API Server: Get "https://10.10.1.21:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
To see the stack trace of this error execute with --v=5 or higher
에러 2) woker node를 master node에 join 시 아래 오류가 발생하고,
kubeadm token list 명령어 수행 시 아무런 데이터가 조회되지 않을 경우에 대한 해결 방법입니다.
error execution phase preflight: couldn't validate the identity of the API Server:
could not find a JWS signature in the cluster-info ConfigMap for token ID "j0vdns"
해결방법 1) kubeadm reset 후 kubeadm init을 실행하여 token을 다시 생성한다.
$ kubeadm reset
$ kubeadm init
kubeadm join 10.10.1.21:6443 --token j0vdns.lqbq17k0rwbuvwqj \
--discovery-token-ca-cert-hash sha256:acfc34d9d77a3b0b326de55f969f95f34779853ac34720526eef99357982750d
## token list 확인
$ kubeadm token list
TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS
b962zm.9d6jh1g9dq0oroaq 23h 2022-05-03T14:00:04Z authentication,signing The default bootstrap token generated by 'kubeadm init'. system:bootstrappers:kubeadm:default-node-token
재생성된 token으로 다시 worker node에서 실행합니다.
sudo kubeadm join 10.10.1.21:6443 --token j0vdns.lqbq17k0rwbuvwqj \
--discovery-token-ca-cert-hash sha256:acfc34d9d77a3b0b326de55f969f95f34779853ac34720526eef99357982750d
해결방법 2) token 생성 후 hash 값을 확인한 다음 worker node를 join 합니다.
## token 생성
$ kubeadm token create
## hash 확인
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
## node 조인
kubeadm join <Kubernetes API Server:PORT> --token <Token 값> --discovery-token-ca-cert-hash sha256:<Hash 값>
worker node를 master에 join 시키기.
필요한 수 만큼 worker node를 추가합니다. 단, 위에서 설치한 순서대로 설치를 하고 worker node를 추가합니다.
kubeadm join 10.10.1.21:6443 --token b962zm.9d6jh1g9dq0oroaq \
--discovery-token-ca-cert-hash sha256:fc41fdaa4dfebf0d2c37a67aef3f3d69e88d9f6e3c9c73b510983dc7eb474276
[preflight] Running pre-flight checks
[preflight] Reading configuration from the cluster...
[preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
[kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
[kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
[kubelet-start] Starting the kubelet
[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.
Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
설치 확인
마스터 노드(control-plane 노드)에서 kubectl get nodes 로 node 정보를 확인합니다. 아래와 같이 조회되면 정상입니다.
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
instance-2 Ready control-plane,master 10h v1.23.6
instance-3 Ready <none> 9h v1.23.6
instance-4 Ready <none> 2m40s v1.23.6
선택사항으로 kubectl 명령어 자동완성 기능을 설정합니다. 명령어의 일부 글자만 타입핑한 후 "탭키"를 누르면 명령어가 완성되는 기능입니다.
echo "source <(kubectl completion bash)" >> ~/.bashrc
echo "source <(kubeadm completion bash)" >> ~/.bashrc
kubectl 예제
kubectl get 명령어로 클러스터를 구성하고 있는 node 정보를 볼 수 있습니다.
## node 정보조회
$ kubectl get nodes
## node 정보 상세조회
$ kubectl get nodes -o wide
컨테이너를 실행하면서 kubectl 명령어 사용하기
아래 명령어는 nginx 1.14 버전의 이미지로 webserver 라는 이름의 pod를 생성하고 실행하라는 내용입니다.
$ kubectl run webserver --image=nginx:1.14 --port 80
pod/webserver created
생성된 pod를 확인합니다. 아래 내용을 보면 현재 상태가 container creating 인 것을 확인할 수 있습니다. 현재 진행되는 상태를 보려면 kubectl describe pods 명령어를 수행합니다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 0/1 ContainerCreating 0 23s
## pods 상태 상세확인
$ kubectl describe pods
상세 정보를 확인하던 중 아래와 같은 오류가 발생했습니다. 방화벽 때문에 발생한 오류입니다. << 상세히 설명>>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 11m default-scheduler Successfully assigned default/webserver to instance-4
Warning FailedCreatePodSandBox 7m26s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "7d2b349d4a7bd47b5561422b67fcc0cef3b9935c034f69d6021077962c1fe807" network for pod "webserver": networkPlugin cni failed to set up pod "webserver_default" network: netplugin failed with no error message: signal: killed
Warning FailedCreatePodSandBox 3m45s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "4c89307a722068dd809a4024ba4a27e8228aa8df46ff06777b9a1a2b9573f201" network for pod "webserver": networkPlugin cni failed to set up pod "webserver_default" network: netplugin failed with no error message: signal: killed
Warning FailedCreatePodSandBox 4s kubelet Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container "a9e40c16daeed29b34607346c2bee142d47a2f4f47da8ba4416e08c6aabe0872" network for pod "webserver": networkPlugin cni failed to set up pod "webserver_default" network: netplugin failed with no error message: signal: killed
Normal SandboxChanged 3s (x3 over 7m26s) kubelet Pod sandbox changed, it will be killed and re-created.
pod 삭제
예제) kubectl delete pods <pod> : <pod> 부분에 삭제할 pod 이름을 입력합니다.
kubectl delete pods webserver
재수행
성공
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 62s default-scheduler Successfully assigned default/webserver to instance-4
Normal Pulling 61s kubelet Pulling image "nginx"
Normal Pulled 58s kubelet Successfully pulled image "nginx" in 2.296326487s
Normal Created 58s kubelet Created container webserver
Normal Started 58s kubelet Started container webserver
ypjeong@instance-2:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
webserver 1/1 Running 0 72s
cgroup 드라이버 구성
컨테이너 런타임과 kubelet은 "cgroup 드라이버"라는 속성을 갖고 있으며, cgroup 드라이버는 리눅스 머신의 cgroup 관리 측면에 있어서 중요하다.
kubeadm으로 클러스터 생성하기
Initializing control-plane node
control-plane 노드는 etcd(클러스터 데이터베이스) 및 API 서버(kubectl 명령줄 도구가 통신함)를 포함하여 control-plane 구성 요소가 실행되는 시스템입니다.
1. (권장) 이 단일 control-plane kubeadm 클러스터를 고가용성으로 업그레이드할 계획이 있는 경우 --control-plane-endpoint를 지정하여 모든 control-plane 노드에 대한 endpoint 설정해야 합니다. 이러한 endpoint 는 DNS 이름 또는 로드 밸런서의 IP 주소일 수 있습니다.
2. Pod 네트워크 추가 기능을 선택하고 kubeadm init에 전달되는 인수가 필요한지 확인합니다. 선택한 타사 공급자에 따라 --pod-network-cidr을 공급자별 값으로 설정해야 할 수도 있습니다.
3.
# initialize kubernetes with a Flannel compatible pod network CIDR
kubeadm init --pod-network-cidr=10.244.0.0/16;
# setup kubectl
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config;
# install Flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml;
# install Dashboard
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc2/aio/deploy/recommended.yaml;
cat > dashboard-admin.yaml <<EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubernetes-dashboard
namespace: kubernetes-dashboard
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubernetes-dashboard
namespace: kubernetes-dashboard
EOF
kubectl delete clusterrolebinding/kubernetes-dashboard;
kubectl apply -f dashboard-admin.yaml;
# get the dashboard secret and display it
kubectl get secret -n kubernetes-dashboard \
| grep kubernetes-dashboard-token- \
| awk '{print $1}' \
| xargs kubectl describe secret -n kubernetes-dashboard;
MAC 주소 및 product_uuid가 모든 노드에 대해 고유한지 확인