안녕하세요
오늘은 무엇을 적어야 하나..고민하다 선정한 주제 NAVER CLOUD PLATFORM을 활용한 Kubernetes 클러스터 구축입니다.
Kubernetes는 클라우드 업체들이 관리형 상품으로 출시하고 있고, 최근 Container Orchestration 툴 중 가장 핫한 녀석입니다.
대상이 컨테이너냐 VM이냐 차이는 있지만 컨테이너 간 overlay network 구성, 노드 리소스 및 label, affinity 등을 베이스로 한 Container 스케줄링 등등 오픈스택을 포함한 클라우드 플랫폼과 굉장히 유사한 느낌을 주는 녀석입니다.
공부할 내용도 적을 내용도 매우 많은 Kubernetes 인지라 네트워크 아키텍처나 컴포넌트에 대한 설명은 추후 적도록 하고 오늘은 Kubeadm을 이용하여 NAVER CLOUD PLATFORM 위에 클러스터 구성 및 웹서버 Container를 띄우고, NAVER CLOUD PLATFORM Load Balancer와 연동하는 딱!!! 거기까지 해보겠습니다.
시작하겠습니다.
1. 목적
Kubeadm을 활용한 Kubernetes Cluster 구축 및 서비스 올려보기
2. TB 환경
- 1 Master (1 etcd) + 1 Minion
- overlay network : flannel
- deploy tool : kubeadm
kubernetes 버전은 1.10.4, Container Runtime으로 사용한 Docker 버전은 1.13.1입니다.
테스트 목적이므로 kubeadm으로 구축한 1 Master, 1 etcd, 1 Minion 구성입니다.
overlay network addon은 flannel를 사용합니다. (ovs, calico를 포함하는 추가적인 network addon에 대한 자세한 설명은
Installing Addon 참고 부탁드립니다.)
3. VM 생성
NCP VM 2대를 먼저 생성합니다.
- OS : Ubuntu 16.04
- flavor : Master(2vCore 4Gram), Minion(4vCore 8Gram), 베이스 볼륨(HDD) (NCP VM 생성 가이드)
참고로 Minion은 실 Container가 구동되는 호스트로 다수의 컨테이너를 띄우시려면 더 높은 VM flavor를 선택하셔야 합니다.
4. 클러스터 구성
# 모든 노드에 yum repository 설정, docker, kubernetes 관련 패키지 설치
# kube-dns 상태 확인
# Minion join 후 Minion 노드에서 flannel.1 nic 확인 및 Master 노드에서 노드 상태 확인
Minion 접속 후
Kubeadm join
을 이용해서 Kubernetes Cluster에 Minion을 Join 합니다.
kubeadm join 10.41.29.88:6443 --token ljnule.yhpy7mrrovcbjd8v
--discovery-token-ca-cert-hash sha256:c59c04c3fab2d827821eb72b3d0e280717b32ae151dc456f0ec1f40e0f8d9160
Master 노드에서 확인 시 1 Master, 1 Minion 확인됩니다.
# 클러스터 상태 체크
클러스터 구성이 끝났습니다!
5. 웹서버 Container 구동하기
Container는 yaml로 정의하여 띄워보겠습니다.
테스트에서 사용한 yaml 파일입니다.
yaml 파일에 대한 설명을 간략히 하면
이미지는 bitnami/apache:latest, app 배포 타입으로 deployment(kind:deployment)으로 Pod과 replicaset을 함께 생성해주므로 Minoin 노드가 죽거나, Pod이 삭제되었을 경우에도 사전 정의한 수(spec.replicas) 만큼의 Pod 수를 유지해줍니다.
외부에서 클러스터 내부 Container에 접근하기 위해서는 kubernetes Service(kind:Service)를 사용해야 합니다. Service 타입은 ClusterIP, NodePort, LoadBalancer, ExternalName을 사용할 수 있습니다. 그 중 이번 예제에서는 ClusterIP, NodePort, LoadBalancer를 사용해볼 예정입니다.
상기 apache.yaml에 설정한 Service 타입(spec.type)은 ClusterIP로 Kubernetes 클러스터 내부에서만 접근 가능합니다.
그리고 Pod label(spec.selector)을 app:apache로 설정하고 동일 label의 Pod으로 인입되는 request를 분산합니다.
apache 네임스페이스를 생성한 후 Master 노드에서
kubectl create -f apache.yaml --namespace apache
를 실행하면 Minoin 노드(예제에서는 ansible002)에 신규 pod이 생성됩니다.
추가로 Kubernetes 클러스터 외부에서 내부 Cointainer와 통신 위해 Service 타입을 NodePort 변경했습니다.
kubectl edit svc {{service_name}}
외부 포트는 3만번 대로 랜덤 할당됩니다. ( 이 예제에서는 30655 )
해당 컨테이너에 index.html 파일 변경 후 웹브라우저에서 {{마스터 or 워커 노드 공인IP}}:30655 로 접속 확인 가능 합니다.
6. NAVER CLOUD PLATFORM Load Balancer와 연동해보기
그럼 이제 웹서버를 3대로 scale하고 NCP Load Balancer와 연동해볼까요?
눈치 채셨겠지만 default로 Master에는 Pod이 스케줄링 되지 않습니다. 이 부분은 설정을 통해 변경 가능합니다.
상기 apache.yaml 파일에 Service 타입을 LoadBalancer로 바꾸로 NCP Load Balancer의 서버 포트를 위에 랜덤 포트(예제에서는 30655)로 할당해줍니다. (
NCP Load Balancer 생성 가이드)
Load Balancer 엔드포인트로 접속 시도하면 Round Robin으로 분산처리됨을 확인할 수 있습니다.
이 예제는 테스트 목적으로 많은 부분을 생략했습니다. 프로덕션 환경에서는 보안, 로깅 등 무수히 많은 고민 포인트들이 있는 점 참고 부탁 드립니다.
오늘은 여기까지입니다.
감사합니다.