지난 포스팅에서 넷필터 브릿지 설정을 완료하였다.
이번 포스팅에서는 본격적으로 쿠버네티스 클러스터를 구성해보겠다.
1) 마스터 노드 생성하기
sudo kubeadm init
마스터 노드로 설정할 노드를 선택하여 sudo kubeadm init 을 입력한다. 성공문구가 뜨면 클러스터에 마스터노드(Control-Plane)가 생성된 것이다. 그러면 성공 문구와 함께 가이드 하나가 제공된다.
가이드(Guide)
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
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
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.138.0.24:6443 --token 3yhxmo.w7attv7go3zeefus \
--discovery-token-ca-cert-hash sha256:b464e0dd394257e9b7b7bfdf4fc5806528266b47a8b4c9e2fae6052f8302d40b
가이드를 따라 설정을 진행해보자.
2) 리눅스 사용자 계정을 클러스터 관리자 계정으로 설정하기
마스터 노드에 kubectl 명령을 내리면 커넥션 에러가 발생한다. 이는 클러스터 관리자 권한이 없는 계정이 마스터 노드에 kubectl 명령을 내렸기 때문이다. 그럼 마스터노드에 kubectl 명령을 내릴 수 있는 관리자 권한을 가진 계정을 생성해보자.
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo kubeadm init을 실행하면 /etc/kuvernetes/admin.conf 파일이 생성된다. admin.conf에는 클러스터 및 admin 정보가 들어있고 이 파일에 접근 가능한 계정이 클러스터 관리자 계정이다. /etc/kuvernetes/admin.conf 파일은 root계정 전용파일이다. 일반 사용자 계정이 접근할 수 있는 admin.conf 파일은 따로 복사하여 만들어야 한다.
$HOME/.kube/config 폴더는 일반 사용자 계정의 admin.conf 파일이 위치하도록 약속된 장소이다. 그곳에 sudo 권한으로 admin.conf 파일을 복사(cp)하고 config 폴더의 소유주를 일반 사용자계정으로 전환(chown)한다. 이후 일반 사용자 계정으로 kubectl 명령을 수행하면 약속된 위치의 admin.conf 파일을 읽어 클러스터 관리자 계정임을 확인하고 명령을 수행한다.
kubectl 명령이 정상 수행되었음을 확인할 수 있다. 이로써 리눅스 사용자 계정을 클러스터 관리자 계정으로 사용가능해졌다. 만약 루트 계정이라면 아래 명령으로 환경변수에 admin.conf 파일 위치를 고정한다.
export KUBECONFIG=/etc/kubernetes/admin.conf
3) 워커노드 클러스터에 조인하기
마스터 노드 설정이 마무리 되었다. 그럼 워커노드를 클러스터에 조인시켜 보자.
sudo kubeadm join 10.138.0.24:6443 --token 3yhxmo.w7attv7go3zeefus \
--discovery-token-ca-cert-hash sha256:b464e0dd394257e9b7b7bfdf4fc5806528266b47a8b4c9e2fae6052f8302d40b
가이드(Guide) 가장 아래를 보면 조인할 워커노드에 실행해야 하는 명령이 있다.
10.138.0.24:6443는 마스터 노드의 ip주소와 포트번호이다. 워커노드는 마스터노드에 토큰을 가지고 접속한다. 토큰은 클러스터에 조인할 워커노드를 인증하는 수단이다. 토큰을 가지고 접근하는 워커노드는 클러스터에 조인된다.
kubectl get nodes를 수행하면 클러스터에 조인된 노드를 확인할 수 있다. 워커노드 2개가 조인 되었다.
그런데 Status를 보면 NotReady 상태이다. 아직까지는 노드만 클러스터에 합류했을 뿐이다. 쿠버네티스는 노드 안 컨테이너 간 네트워킹이 중요하고 복잡하다. 그러므로 컨테이너간 네트워크 폴리시를 제공하는 플러그인이 필요하다.
대표적으로 Cilium, WeavNet, Calico 등이 있다.
4) 컨테이너 간 네트워크 설정하기
curl -LO https://github.com/cilium/cilium-cli/releases/latest/download/cilium-linux-amd64.tar.gz
sudo tar xzvfC cilium-linux-amd64.tar.gz /usr/local/bin
rm cilium-linux-amd64.tar.gz
cilium install
Cilium이 제공하는 웹리소스에 curl 명령어로 접속하여 tar를 파일을 하나 가져온다.
tar 압축을 풀고 install을 진행한다.
cilium status
cilium status 명령으로 cilium이 잘 설치되었는지 확인 한다.
kubectl get nodes
잘 설치 되었으면 위와 같이, Node의 Status가 Ready로 바뀐다.
여기까지 클러스터 구성을 완료하였다.
그럼 클러스터를 테스트 하기위해 컨테이너를 생성 및 배포해보자.
5) 컨테이너 생성 및 배포하기
kubectl create deploy tc --image=consol/tomcat-7.0 --replicas=5
kubectl expose deploy tc --type=NodePort --port=80 --target-port=8080
create deploy 명령으로 컨테이너를 생성 및 배포하고 expose deploy 명령으로 서비스를 생성 및 배포하였다.
그럼 사진과 같이, tc컨테이너 5개와 tc 서비스 1개가 생성됨을 확인할 수 있다.
여기까지가 일반적인 우분투 환경에서 쿠버네티스 클러스터 구성을 해보았다. 그 간의 과정을 살펴보면 아래와 같다.
1) swap 설정 및 컨테이너 런타임 환경 구성하기
2) kubeadm, kubectl, kubelet 구성하기
3) 넷필터 브릿지 구성하기
4) 마스터 노드 및 워커노드 설정하기
구글쿠버네티스엔진(GKE)에서 제공하는 클러스터를 사용하면 위 설정 및 구성 과정은 생략해도 되지만 비어있는 환경에서 클러스터를 구성하려면 위와 같은 복잡한 과정을 거쳐야 한다.
참고자료
'DevOps > K8S' 카테고리의 다른 글
[Kubernetes] Minikube 설치 및 인그레스 설치 및 설정하기 (0) | 2023.10.12 |
---|---|
[Kubernetes] 인그레스(Ingress)란 무엇인가? (0) | 2023.10.11 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(3) - 넷필터 브릿지 (0) | 2023.09.25 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(2) - kubeadm, kubelet, kubectl (0) | 2023.09.22 |
[Kubernetes] 우분투 환경에서 클러스터 구성하기(1) - 컨테이너D 설치하기 (0) | 2023.09.22 |