kubeadm으로 VM환경으로 노드를 구성하기 위해 VirtualBox를 설치하고 머신을 추가하여 다수의 노드를 구성합니다. OS는 CentOS 7환경으로 구성하며 마스터 1, 노드 2개의 VM으로 구성합니다. 다른 리눅스 배포판도 사용할 수 있으며 http://kubernetes.io 웹사이트에서 지원 여부를 확인할 수 있습니다.
가상머신 생성
쿠버네티스 마스터용 가상머신을 먼저 구성합니다. VirtualBox를 실행하고 왼쪽 상단 모서리의 새로 만들기를 클릭하여 이름을 k8s-master로 입력합니다. 아래와 같이 Linux를 선택하고 유형을 Red Hat(64-bit)으로 선택하면 이후 메모리 크기와 하드 디스크를 설정하게 됩니다. 메모리는 적어도 4GB로 선택하도록 합니다(로컬의 메모리 여유가 없다면 2GB도 가능). 하드 디스크는 기본 옵션 선택 상태로 둡니다(크기는 기본이 8GB이지만 여유가 있다면 더 크게 설정하는 것이 좋습니다).
가상머신용 네트워크 어댑터 구성
가상머신을 생성하고 나면 네트워크 어댑터를 구성해야 합니다. 브릿지 어댑터 모드를 사용하도록 어댑터를 구성해야 가상머신이 호스트 머신이 있는 것과 동일한 네트워크에 연결됩니다. 네트워크 어댑터를 구성하려면 VirtualBox 창에서 가상머신을 선택하고 설정에서 네트워크를 선택하면 됩니다. 아래와 같이 다음에 연결됨(A)를 어댑터에 브릿지로 선택하고 네트워크에 연결된 호스트의 어댑터를 선택합니다.
운영체제 설치
VirtualBox의 메인 창의 시작 아이콘을 클릭하면 아래와 같이 시동 디스크 선택 창이 나타납니다. 드롭다운 목록 옆의 아이콘을 클릭하여 CentOS ISO 이미지를 찾아 선택한 후 시작버튼을 클릭하여 가상머신을 부팅합니다.
설치가 시작되면 잠시 후 CentOS Linux 7 Welcome 화면이 나타납니다. 언어는 영어로 유지하고 나머지는 기존의 설정을 유지합니다. NETWORK & HOST NAME 을 선택하여 아래와 같이 호스트 네임을 master.k8s로 적용하고 Ethernet을 활성화 합니다.
모든 설정이 끝나면 Begin Installation이 활성화 됩니다. 해당 버튼을 클릭하여 CentOS 7을 설치합니다. 설치되는 동안 루트 암호를 설정하고 사용자 계정을 만들고, 설치가 완료되면 재부팅 합니다.
도커 및 쿠버네티스 설치
루트권한으로 시스템에 로그인해야 합니다. 먼저 SELinux와 방화벽 두 가지 보안 기능을 비활성 해야 합니다.
SELinux 비활성화
SELinux를 비활성화 하려면 다음 명령을 실행합니다.
# setenforce 0
이 방법은 일시적으로 비활성 하는 방법이며 영구적으로 비활성화하기 위해서는 /etc/selinux/config 파일을 열어 SELINUX=enforcing 줄을 SELINUX=permissive로 변경하면 됩니다.
방화벽을 사용하지 않도록 설정하기
방화벽 관련 문제로 실행되지 않는 상황을 방지하기 위해 방화벽을 비활성화 합니다. 아래의 명령을 실행합니다.
# systemctl disable firewalld && systemctl stop firewalld Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1... Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service. |
가상머신 복제
마스터 노드는 생성이 되었으므로 워커 노드를 구성해야 합니다. 워커 노드는 마스터 노드의 가상머신을 복제해서 만들 수 있습니다. VirtualBox UI에서 마우스 오른쪽 버튼을 클릭하고 복제를 선택합니다. 그리고 새로운 시스템의 이름을 아래와 같이 입력합니다.
[그림-6] 마스터 가상머신 복제
각각의 가상머신은 서로 다른 MAC 주소를 사용해야하므로 모든 네트워크 어댑터의 새 MAC 주소 생성으로 선택하고 다음 버튼을 클릭하여 복제를 수행합니다. 워커 노드는 두 개를 생성하기로 했으므로 두번째는 k8s-node2로 동일하게 생성해 줍니다.
가상머신 호스트 이름 변경 및 구성
마스터 가상머신에서 두 개의 복제본을 생성했으므로 현재는 가상머신 세 개의 호스트 이름이 모두 같습니다. 따라서 두 복제본의 호스트 이름을 변경해야 합니다. 이렇게 하려면 두 노드(워크노드1,2)에 각각 로그인하여 아래의 명령을 실행합니다.
# hostnamectl --static set-hostname node1.k8s |
두 번째 노드에서 호스트 이름은 node2.k8s로 설정해 줍니다.
새 호스트 이름 구성
DNS 서버에 레코드를 추가하거나 모든 노드에서 /etc/hosts 파일을 편집해 세 노드를 모드 확인할 수 있어야 합니다. 여기서는 hosts 파일에 아래와 같이 세 줄을 추가하여 추가합니다.
192.168.20.138 master.k8s 192.168.20.139 node1.k8s 192.168.20.140 node2.k8s |
각 노드에 로그인하여 ip addr을 통해 enp4s0 어댑터에 연결된 각각의 IP주소를 찾을 수 있습니다.
kubeadm을 이용한 마스터 구성
마스터 노드에서 쿠버네티스의 컨트롤 패널을 구성하도록 합니다.
kubeadm 도구를 사용해 마스터를 초기화 하기 위해 아래와 같이 간단하게 명령을 실행할 수 있습니다.
# kubeadm init |
kubeadm init 의 가장 마지막 줄에 표시된 명령을 꼭 기억해두어야 합니다.
kubeadm은 etcd, API서버, 스케줄러 및 컨트롤러 매니저를 포함해 필요한 모든 컴포넌트를 배포합니다. 또한 kube-proxy를 배포해 쿠버네티스 서비스를 마스터 노드에서 사용할수 있게 해 줍니다.
kubeadm으로 컴포넌트 실행
kubeadm은 도커를 직접 실행하지 않습니다. kubeadm은 YAML 디스크립터를 /etc/kubernetes/manifests 디렉터리에 배포하고 이 디렉터리는 kubelet에 의해 모니터링되며, 도커를 통해 컴포넌트를 실행합니다. kubectl get 명령을 통해 볼 수 있으며 먼저 구성이 필요합니다.
마스터의 kubectl 실행
앞의 설치 단계에서 이미 도커, kubeadm, 그 외의 패키지와 함께 kubectl을 설치했습니다. 하지만 kubeconfig 파일을 통해 먼저 구성하지 않았기에 kubectl을 사용하면 클러스터와 통신을 할 수 없습니다. 필요한 설정은 /etc/kubernetes/admin.conf에 저장되어 있으며 KUBECONFIG 환경변수를 설정함으로서 클러스터와의 통신이 가능해 집니다. 아래와 같이 환경 변수를 설정합니다.
# export KUBECONFIG=/etc/kubernetes/admin.conf |
환경 변수를 설정하고 아래와 같이 컨트롤 패널의 포드를 나열해 봅니다.
# kubectl get po -n kube-system
|
노드 나열하기
마스터 설정을 모두 끝냈으므로 노드 설정이 필요합니다. 두 워커 노드에 이미 kubelet을 설치했지만(초기 가상머신을 복제해) 아직 쿠버네티스 클러스터에 포함되지 않았습니다. 아래와 같이 kubectl로 노드를 나열해 확인할 수 있습니다.
# kubectl get node
|
마스터 노드만 표시되며 마스터도 NotReady로 표시됩니다. 그 이유는 나중에 알 수 있습니다. 이제 두 워커노드를 설정합니다.
kubeadm을 이용한 워커 노드 구성
kubeadm을 사용할 때 워커 노드를 구성하는 것이 마스터를 구성하는 것보다 훨씬 간단합니다. 이미 이전에 kubeadm init 명령을 실행할 때 마지막 메세지를 기억해야 한다고 언급했지만 두 개의 노드에서 지정된 토큰과 마스터 IP 주소를 사용해 kubeadm join 명령을 실행해야 합니다. 아까 본 명령 그대로 워커 노드에서 각각 아래와 같이 실행합니다.
# kubeadm join --token eb3877.3583f0423978c549 192.168.66.138:6443 --discovery-token-ca-cert-hash sha256:037d2c5505294af196048a17f184a79411c7b1eac48aaa0ad137075be3d7a847 |
이렇게 하면 마스터에 노드를 등록하게 되며 아래와 같이 마스터에서 확인할 수 있습니다.
# kubectl get nodes
|
이제 세 개의 노드로 구성이 되었지만 모두 준비가 되지 않았습니다. 그 이유를 아래의 명령어를 통해 알아보도록 합니다. 아래 명령은 현재 노드의 상태를 보여주며 이유(reason)와 메세지(message)를 보여줄 것입니다.
# kubectl describe node node1.k8s |
메세지를 보면 CNI(컨테이너 네트워크) 플러그인이 준비되지 않았고, CNI 플러그인이 아직 배포되지 않았음을 알 수 있습니다. 이제 해당 플러그인을 배포해 볼 것입니다.
컨테이너 네트워크 설정
CNI플러그인이란 Container Network Interface이며 리눅스 컨테이너 간의 네트워크를 제어하는 플러그인입니다. Calico, Flannel, Weave 등 여러가지 CNI 플러그인이 있으며 여기서는 Weave Net을 사용하도록 하겠습니다. 다른 대안이 되는 플러그인의 목록은 http://kubernetes.io/docs/admin/addons/ 에서 참조하실 수 있습니다. 아래와 같이 Weave Net을 이용하여 플러그인을 배포해 보겠습니다.
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" |
그러면 데몬셋과 몇 가지 보안 관련 리소스가 배포됩니다. 데몬셋 컨트롤러가 팟(pod)을 만들고 모든 노드가 준비상태가 됩니다.
# kubectl get nodes
|
이제 Weave Net에서 제공하는 오버레이 네트워크를 갖춘 완전한 세 개의 쿠버네티스 노드 클러스터를 구성하게 되었습니다. kubelet을 제외한 모든 필수 컴포넌트는 아래와 같이 kubelet에서 관리하는 팟(pod)으로 실행됩니다.
# kubectl get po --all-namespaces
|
로컬 시스템의 클러스터 사용
지금까지 마스터 노드에서 kubectl을 사용해 클러스터와 통신했습니다. 로컬 시스템에서 kubectl을 구성해서 사용하고 싶으면 마스터의 /etc/kubernetes/admin.conf 파일을 복사해서 가져오면 됩니다. 아래와 같이 명령합니다.
$ scp root@192.168.64.138:/etc/kubernetes/admin.conf ~/.kube/config2 |
마스터의 ip로 변경한 후 다음과 같이 KUBECONFIG 환경변수를 /.kube/config2 파일로 지정합니다.
$ export KUBECONFIG=~/.kube/config2 |
kubectl은 이 설정파일을 사용할 것이며 이전으로 되돌리고 싶으면 환경변수의 설정을 해제하면 됩니다. 이제 로컬머신에서 클러스터를 사용할 수 있도록 모든 설정이 완료되었습니다.
<참고> Kubernetes in Action 서적
'최신기술 > 도커 & 쿠버네티스' 카테고리의 다른 글
클라이언트 라이브러리로 Kubernetes 애플리케이션 개발하기 (0) | 2021.03.03 |
---|---|
쿠버네티스 한글화 기여 (0) | 2019.06.25 |
레플리케이션으로 스케일링(확장) 하기 (0) | 2019.01.31 |
[쿠버네티스] 쿠버네티스 마스터 소개 (0) | 2018.09.13 |
[쿠버네티스]다양한 클러스터 환경으로 전환하는 방법 (0) | 2018.09.12 |