Hyper-v 환경에서 쿠버네티스 master-worker 클러스터 구축하기

Key Kim
15 min readNov 28, 2019

--

Hyper-V 환경에서 1 master, 1 Worker 관계를 가지는 클러스터를 구축하고, Worker 머신에 Go application를 포함하는 Pod와 로드밸런스 서비스를 생성해 외부에서 접근할 수 있도록 합니다.

  • Hyper-v 는 windows 10 home에서는 사용하실 수 없습니다.
이렇게 만들어볼겁니다.

Hyper-v 네트워크 설정하기

현재 연결된 네트워크 (이더넷 or 와이파이) 와 IP 대역을 공유하여 구성하겠습니다.

hyper-v manager를 실행합니다.
위 숫자를 따라서 진행해 주세요.
이름을 정하고, Internal network에 체크해준 후 Apply로 스위치를 생성합니다.
아까 생성했던 kuber 스위치가 있어야 합니다.
이더넷 (혹은 현재 사용중인 네트워크 인터페이스)의 공유탭에서 위와같이 설정해줍니다.

Hyper-v 이미지 생성하기

vm 2개를 만들고 각 vm에 마스터와 워커를 설치해봅니다.

hyper-v manager를 실행합니다.
Action탭에서 New->Virtual machine를 실행합니다.
Generation 2 머신을 선택합니다.
적당히 초기 램을 잡아줍니다.
네트워크는 아까 생성했던 스위치를 선택합니다.
vm 이미지를 선택해줍니다. 이 예제에서는 Xubuntu를 사용했습니다.

여기에서 받으시면 됩니다.

쿠버네티스는 최소한 2개의 프로세서가 있어야 실행이 됩니다. Processor를 2개 이상으로 잡아주세요.
설치 완료

— 2019 11/29

혹시

시큐어 부트가 켜져있으면 나옴.

이런 에러가 나는 경우에는 vm setting 에서 enable secure boot을 해제해주시면 해결됩니다.

SSH 환경 구성

Xubuntu 설치가 끝났으면 SSH 연결을 위해 Openssh 패키지를 설치해줍니다.

각각의 vm에서

sudo apt-get updatesudo apt-get install openssh-server

를 실행합니다.

ifconfig 에서 자신의 네트워크 어댑터의 IP를 확인합니다.

로컬 컴퓨터 Powershell 에서 아래와 같이 입력하여 SSH 연결을 합니다.

//example : ssh <your_VM_name> <your_VM_ip>ssh key@192.168.137.68
Powershell에서 ssh 연결

쿠버네티스 설치하기(공통)

  • hyper-v로 환경구성을 끝낸 후 진행해주세요.
  • worker, master 두 개의 vm 에서 모두 진행해주세요.

kubeadm 과 flannel 인터페이스를 사용하여 쿠버네티스 클러스터를 설치하겠습니다.

vim /etc/hosts를 열어 쿠버네티스 클러스터에 참여하는 머신들의 아이피를 입력해줍니다.

각 머신에서 ifconfig로 ip를 확인하여 입력해주세요

쿠버네티스에서 도커를 사용할 계획이므로 도커도 설치해줍니다.

// docker 설치
sudo apt-get install docker.io -y
sudo systemctl start docker
sudo systemctl enable docker

쿠버네티스 설치에 앞서, 쿠버네티스 레포지토리를 등록합니다.

sudo apt-get install apt-transport-https curl -ycurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key addsudo apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"

쿠버네티스 클러스터 생성 시 가상메모리를 비활성화해야합니다.

쿠버네티스에서 노드들의 상태를 예측하고 유지해야하기때문에 가상메모리는 끄는것이 좋다고 합니다.

// 일시적으로 swap 기능을 끔
sudo swapoff -a
//재부팅해도 swap을 끄도록 함sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

위 과정이 끝났으면 쿠버네티스를 설치합니다.

sudo apt-get install kubeadm -y

설치가 제대로 되었다면 아래 명령어로 확인합니다.

kubeadm version

쿠버네티스에서 컨테이너로 도커 런타임을 사용하기 위해, 데몬파일을 작성해줍니다.

vim /etc/docker/daemon.json
https://gist.github.com/KimKiHyuk/692803efd97da482cd9c4b0bbe96a18d

위와 같이 작성해주세요.

쿠버네티스 설치하기 (마스터)

  • 쿠버네티스 설치하기(공통)을 끝내고 진행해주세요.

먼저 worker노드와 통신이 되는지 확인합니다.

ping kuber-node-1-host

클러스터 생성을 위해 아래 명령을 입력합니다.

sudo kubeadm init --pod-network-cidr=10.244.0.0/16

정상적으로 init이 되면, 위 그림과 같이 나오게 됩니다.

1번 박스의 명령들은 마스터노드에서 실행해주시면 됩니다.

mkdir -p $HOME/.kube 
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

2번은 나중에 워커노드에서 실행해주시면 워커노드를 클러스터에 참여시킬 수 있습니다.

혹시 쉘을 다시 시작해 토큰값을 알 수 없다면 아래 명령어로 찾을 수 있습니다.

// 토큰
kubeadm token list
// 해쉬 찾기openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’

마지막으로 flannel CNI를 아래 명령어를 통해 설치합니다.

sudo kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

쿠버네티스 설치하기 (워커)

  • 쿠버네티스 설치하기(공통)과 쿠버네티스 설치하기(마스터)를 끝내고 진행해주세요.

마스터 노드와 통신이 되는지 확인합니다.

ping kuber-master-host

쿠버네티스 설치하기(마스터)에서 언급한 2번 명령어를 워커에서 실행합니다.

sudo kubeadm join 192.168.137.68:6443 — token ahuxct.fg92uokvqqx288pb — discovery- 
sh sha256:ab16f0e9fcf346da56369bbb3fc799faf883a7b467f0ae5d63e4f77af025da65

쿠버네티스에 어플리케이션 배포하기

  • 모든 작업은 master shell에서 진행합니다.
  • 위 모든 과정을 마치고 진행해주세요.

kubectl로 현재 클러스터에 참여중인 노드를 확인합니다.

kubectl get nodes

쿠버네티스에서 node는 물리머신, 혹은 가상머신과 같이 쿠버네티스가 설치된 컴퓨터들을 의미합니다. 저희는 마스터 한대와 워커 한대를 설치하였으므로 총 2개의 노드를 가집니다.

kubectl로 모든 pod를 확인합니다.

 kubectl get pods --all-namespaces

pod는 쿠버네티스에서 실행되는 프로세스입니다. 하나의 pod에는 여러개의 어플리케이션들이 들어갈 수 있습니다.

클러스터를 유지하기위한 필수 pod들이 잘 동작하는지 확인합니다.

이제 우리만의 pod를 생성하기 위해 yaml 스크립트를 작성합니다.

https://gist.github.com/KimKiHyuk/1baba7d6937ccd8c7febb36fdb77a933

한 개의 pod와 한 개의 로드밸런서를 생성합니다. pod는 docker hub에서 미리 빌드된 go application을 다운받아 생성합니다.

pod는 nodeName property에 기재된 kuber-node-1 머신에 올라갑니다.

로드밸런서는 pod를 외부에서 접속할 수 있도록 도와줍니다.

아래 명령어를 통해 yaml 스크립트를 실행합니다.

kubectl create -f deployment.yaml

우리가 방금 만든 pod는 8080 포트로 접근하면 “Hello World!” 를 출력하고, 로그를 남기는 간단한 Go application입니다.

사용된 Go application의 코드는 아래에 있습니다.

방금 만든 pod를 아래 명령어로 확인해봅니다.

kubectl get pods -o wide

kuber-node-1 에 pod가 있는것을 확인할 수 있습니다.

pod를 외부로 노출시키는 로드밸런서도 확인해봅니다.

kubectl get svc go-healthcheck

현재 상황에서 위 그림과 같이 Cluster-IP를 통해 클러스터 내부에서

Go application에 접근할 수 있습니다.

클러스터 네트워크안에서 GO application을 호출할 수 있음.

Go application이 생성한 로그도 확인해봅니다.

kubectl logs go-healthcheck

우리의 목표는 클러스터 외부에서 접근하는 것 이므로 아래와 같이 로드밸런서에 외부 아이피를 열어줍니다.

아이피는 마스터 vm(kuber-master-host) 의 IP입니다.

kubectl patch svc go-healthcheck -p ‘{“spec”:{“externalIPs”:[“192.168.137.68”]}}’

이제는 로컬 컴퓨터에서 Go application 에 접근할 수 있습니다.

CNI 제거하기

가끔 클러스터가 꼬여서 처음부터 다시 네트워크를 설정할 일이 있습니다.

아래 명령어 모음은 flannel CNI를 수동으로 제거하는 방법입니다.

kubeadm resetsystemctl stop kubeletsystemctl stop dockerrm -rf /var/lib/cni/rm -rf /var/lib/kubelet/*rm -rf /etc/cni/ifconfig cni0 downifconfig flannel.1 downifconfig docker0 downip link delete cni0ip link delete flannel.1

Reference

--

--