Kubernetes는 마스터 노드와 워커노드로 구성되고, 마스터노드와 워커노드는 최소 1개씩 필요하다.
▣ 구성정보
과정 개발을 위한 환경으로, 마스터 노드 1개와 슬레이브 노드 2개로 구성한다.
- 운영체제 : Ubuntu 20.04 LTS
- 구성스펙
MasterNode1 (Worker)Node2 (Worker)
Model | n1-standard-2 | n1-standard-4 | n1-standard-4 |
CPU | 2 vCore | 4 vCore | 4 vCore |
RAM | 7.5 GB | 15 GB | 15 GB |
Storage | 200 GB | 200 GB | 200 GB |
GPU | - | NVIDIA Tesla T4 | NVIDIA Tesla T4 |
Kubernetes의 구성하는 방법은 다양하지만, 이번에는 kubedam 이라는 기본도구를 사용하여 구성한다.
kubeadm이란, kubernetes에서 제공하는 기본적인 도구이며, kubernetes 클러스터를 가장 빨리 구축하기 위한 다양한 기능을 제공한다.
kubeadm init
- Kubernetes 컨트롤 플레인 노드를 초기화한다.
- 마스터노드를 초기화 한다.
kubeadm join
- Kubernetes 워커 노드를 초기화하고 클러스터에 연결한다.
kubeadm upgrade
- Kubernetes 클러스터를 업그레이드 한다.
kubeadm configkubeadm token
- 부트 스트랩 토근을 사용한 인증에 설명된대로 부트 스트랩토근은 클러스터에 참여하는 노드와 제어 평면 노드 사이에 양방향 신뢰를 설정하는데 사용된다.
kubeadm reset
- kubeadm init 혹은 kubeadm join의 변경사항을 최대한 복귀한다.
kubeadm version
- kubeadm 버전을 보여준다.
kubeadm alpha
- 인증서 갱신, 인증서 만료확인, 사용자 생성, kubelet 설정등 다양한 alpha 기능 제공
▣ 포트 사용 정보
Kubernetes에서 사용하는 Port로 다른 서비스가 사용하지 않도록 주의 해야함.
대상대상 Port사용 내용
Master node |
6443 | Kubernetes API Server / Used By All |
2379 ~ 2380 | etcd server client API / Used By kube-apiserver, etcd | |
10250 | kube-scheduler / Used By Self | |
10251 | kube-scheduler / Used By Self | |
10252 | kube-controller-manager / Used By Self | |
Worker node |
10250 | Kubelet API / Used By Self, Control plane |
30000 ~ 32767 | Node Port Services / Used By All |
▣ Docker 설치하기
master/worker 공통 ( root user )
Install Docker
# root 권한으로 실행 $ sudo su -
# 패키지 관리 도구 업데이트 $ apt update $ apt-get update
# 기존 docker 설치된 리소스 확인 후 발견되면 삭제 $ apt-get remove docker docker-engine docker.io
# docker를 설치하기 위한 각종 라이브러리 설치 $ apt-get install apt-transport-https ca-certificates curl software-properties-common -y
# curl 명령어를 통해 gpg key 내려받기 $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
# 키를 잘 내려받았는지 확인 $ apt-key fingerprint 0EBFCD88
# 패키지 관리 도구에 도커 다운로드 링크 추가 $ add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
# 패키지 관리 도구 업데이트 $ apt-get update
# docker-ce 설치의 버젼을 최신으로 사용하는게 아니라 19.03.11~3의 버젼을 사용하는 이유는 # kubernetes에서 권장하는 버젼의 범위가 최대 v19.03 이기 때문이다. (최신버전은 19.03.13) $ apt-get install docker-ce -y
# Docker 설치 완료 후 테스트로 hello-world 컨테이너 구동 $ docker run hello-world |
▣ Kubernetes 설치하기
설치 패키지
- kubeadm
kubernetes 클러스터를 구하기 위해 사용하는 툴
구성요소 ( etcd, api server, controller manager, scheduler) - kubelet
클러스터의 모든 머신에 실행되며 Pod 및 컨테이너 시작 등의 작업을 수행하는 구성 요소. - kubectl
클러스터와 통신하는 커맨드라인 인터페이스 유틸
패키지 설치 (kubeadm, kubelet, kubectl)
Kubernetes 패키지
# root 권한으로 실행 (이미 했으면 생략) $ sudo su -
# update package repository $ apt update && apt upgrade -y
# google k8s 패키지 소스 등록 $ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list #deb https://apt.kubernetes.io/ kubernetes-xenial main deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main EOF
$ apt-get update $ apt install linux-image-extra-virtual ca-certificates curl software-properties-common -y
$ apt-get install -y kubelet kubeadm kubectl kubernetes-cni
# 패키지가 자동으로 설치, 업그레이드, 제거되지 않도록 hold함. $ apt-mark hold kubelet kubeadm kubectl
# 설치 완료 확인 $ kubeadm version
$ kubelet --version
$ kubectl version |
swap 제거 (master/worker 공통, root user)
swap 제거
# root 권한으로 실행 (이미 했으면 생략) $ sudo su -
$ swapoff -a $ vi /etc/fstab # swap에 해당하는 영역을 #로 커맨트 |
1. 마스터 노드 설치(Master Node)
1) kubeadmin init
마스터 노드를 실행시키려면, 다음과 같이 실행 가능
$ sudo kubeadm init --pod-network-cidr 192.168.0.0/16 --service-cidr 10.96.0.0/12 --service-dns-domain "k8s" --apiserver-advertise-address __master_node_ip_addr__ |
__master_node_ip_addr__ 자리에 master server의 IP를 넣고 실행시키면 token이 생성됨.
Master token
... Your Kubernetes control-plane 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/ Then you can join any number of worker nodes by running the following on each as root: kubeadm join 10.178.0.9:6443 --token b4uk6u.k3i4685pse6nj81r \ --discovery-token-ca-cert-hash sha256:265abbba4d77729825a7677c7f8b381c3c18a6c8e058b40bf9d25b5a19d65cad root@a-dev-master:~# |
여기 생성된 token을 잘 복사해 둘것.
kubeadm join 10.178.0.9:6443 --token b4uk6u.k3i4685pse6nj81r \
--discovery-token-ca-cert-hash sha256:265abbba4d77729825a7677c7f8b381c3c18a6c8e058b40bf9d25b5a19d65cad
2) kubeconfig 복사
kubeconfig
$ mkdir -p $HOME/.kube $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config $ sudo chown $(id -u):$(id -g) $HOME/.kube/config $ export KUBECONFIG=$HOME/.kube/config $ export KUBECONFIG=$HOME/.kube/config | tee -a ~/.bashrc |
3) pod network 설정
pod network
$ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml $ |
2. 워커 노드 설치(worker node)
node 1, 2
$ sudo su -
# master 설치시에 나온 명령을 그대로 복붙 $ kubeadm join 10.178.0.9:6443 --token b4uk6u.k3i4685pse6nj81r \ --discovery-token-ca-cert-hash sha256:265abbba4d77729825a7677c7f8b381c3c18a6c8e058b40bf9d25b5a19d65cad |
3. 확인하기
master node와 worker node 확인
Master에서 Node 확인
$ kubectl get nodes NAME STATUS ROLES AGE VERSION a-dev-master Ready master 9m v1.19.2 a-dev-node1 Ready <none> 30s v1.19.2 a-dev-node2 Ready <none> 25s v1.19.2 |
만약 NotReady 상태라면.
상태 조회.
kubectl get pods -n kube-system
kubectl get pods --all-namespaces
pod network add-on이 설치되어 있지 않은 상태에서는 CoreDNS가 아직 시작되지 않은 상태를 확인할 수 있다.
--상태
systemctl status kubelet
-- 로그
journalctl -xefu kubelet
Kubernetes 환경에서 Pod들이 통신하려면 pod network add-on이 있어야 합니다. pod network add-on이 설치되기 전에는 CoreDNS가 시작되지 않습니다. 'kubeadm init' 이후에 'kubectl get pods -n kube-system' 명령어로 확인해보면 CoreDNS가 아직 시작되지 않은 상태를 확인할 수 있습니다. (https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/)
만약 하다가 잘안된다면 쿠버네티스 공홈을 참고하자.
kubernetes.io/docs/concepts/cluster-administration/addons/
아래 calico를 사용시 문제가 발생하여, wave로 변경함
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"
따라서 우리는 Calico 를 사용합시다.
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
드디어 All Running
모두 Running 중이다!!!
▣ node 삭제 하기
node 혹은 cluster를 재조정하기가 어렵다. 우선 node를 제거 하거나. cluster를 재설정해야 한다.
1) kube cluster에서 node 삭제
nodelist 삭제
$ kubectl get nodes
$ NODENAME=node_name $ kubectl drain $NODENAME # kubectl drain $NODENAME --ignore-daemonsets --delete-local-data $ kubectl delete node $NODENAME $ kubectl get nodes |
2) kubectl 재설정
재설정
#preflight Run reset pre-flight checks #update-cluster-status Remove this node from the ClusterStatus object. #remove-etcd-member Remove a local etcd member. #cleanup-node Run cleanup node.
kubeadm reset [flags] |
kubectl get pods --all-namespaces
kubectl get nodes
kubectl get nodes -A
위의 초기화가 끝나고 나면 kubernetes를 위한 docker image를 다운로드 받아 실행하게 된다. 그러나 coredns 에서 pending 인 상태로 있게된다. 이를 해결하기 위하여 다음을 수행한다.
kubectl을 수행하기 위해서 설정한다.
- 일반사용자
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf
$HOME/.kube/config
$ sudo chown $(id -u):
$(id -g) $HOME/.kube/config - root 일 경우
$ export KUBECONFIG=/etc/kubernetes/admin.conf
현재 상태를 살펴본다.
$ kubectl get pods -A
kubectl get pods --all-namespaces
kubectl get pods -n kube-system
systemctl status kubelet
kubectl apply -f https://docs.projectcalico.org/v3.8/manifests/calico.yaml
Kubernetes Dashboard 설치
github.com/kubernetes/dashboard
Install
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.1.0/aio/deploy/recommended.yaml
Run
$ kubectl proxy
Access
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/