Kubernetes

kubernetes 설치

아르비스 2020. 9. 29. 09:32

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

$ kubectl apply -f https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.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

 

kubernetes/dashboard

General-purpose web UI for Kubernetes clusters. Contribute to kubernetes/dashboard development by creating an account on GitHub.

github.com

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/