Hyper-V 환경에서 1 master, 1 Worker 관계를 가지는 클러스터를 구축하고, Worker 머신에 Go application를 포함하는 Pod와 로드밸런스 서비스를 생성해 외부에서 접근할 수 있도록 합니다.
- Hyper-v 는 windows 10 home에서는 사용하실 수 없습니다.
Hyper-v 네트워크 설정하기
현재 연결된 네트워크 (이더넷 or 와이파이) 와 IP 대역을 공유하여 구성하겠습니다.
Hyper-v 이미지 생성하기
vm 2개를 만들고 각 vm에 마스터와 워커를 설치해봅니다.
여기에서 받으시면 됩니다.
— 2019 11/29
혹시
이런 에러가 나는 경우에는 vm setting 에서 enable secure boot을 해제해주시면 해결됩니다.
SSH 환경 구성
Xubuntu 설치가 끝났으면 SSH 연결을 위해 Openssh 패키지를 설치해줍니다.
각각의 vm에서
sudo apt-get updatesudo apt-get install openssh-server
를 실행합니다.
로컬 컴퓨터 Powershell 에서 아래와 같이 입력하여 SSH 연결을 합니다.
//example : ssh <your_VM_name> <your_VM_ip>ssh key@192.168.137.68
쿠버네티스 설치하기(공통)
- hyper-v로 환경구성을 끝낸 후 진행해주세요.
- worker, master 두 개의 vm 에서 모두 진행해주세요.
kubeadm 과 flannel 인터페이스를 사용하여 쿠버네티스 클러스터를 설치하겠습니다.
vim /etc/hosts를 열어 쿠버네티스 클러스터에 참여하는 머신들의 아이피를 입력해줍니다.
쿠버네티스에서 도커를 사용할 계획이므로 도커도 설치해줍니다.
// 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
위와 같이 작성해주세요.
쿠버네티스 설치하기 (마스터)
- 쿠버네티스 설치하기(공통)을 끝내고 진행해주세요.
먼저 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 스크립트를 작성합니다.
한 개의 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이 생성한 로그도 확인해봅니다.
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