Rancher 를 통한 Kubernetes 클러스터 구축(With RKE)

leesj·2021년 9월 17일
0

kubernetes

목록 보기
2/8
post-thumbnail
  • Kubernets 클러스터 PoC 를 위해 RancherD 를 통해 Kubernetes 클러스터를 구축해보는 절차
  • Cloud 플랫폼과 On-premise 하이브리드 플랫폼으로 구성
  • Rancher 는 Cloud VM 머신에 설치
  • 쿠버네티스 클러스터는 On-premise, CloudVM 2군데에 설정
  • 랜처 메인서버 1대, 각 클러스터는 3개의 머신으로 구성. 총 7(1+3*2)논리적 머신을 사용
  • VM 머신의 OS 는 Ubuntu20.04LTS
  • 현재 RancherD 버전은 v2.5.4
  • 발전된 Idea
    - 전체 과정을 ansible playbook 으로 생성
    • stage 에 따라 상이한 클러스터를 구축하여 운영하는것도 고려
  • RancherD
    Rancher 클러스터 배포를 위한 더 간단한 도구.
    초기에 Rancher 구성을 하기 위해 RancherD 를 고려 했으나 RancherD는 RKE2 Kbernetes 배포판을 사용하기 때문에 제외
    RKE2 는 컨테이너 런타임으로 도커를 사용하지 않고 kubelet 을 사용하기 때문에 도커 컨테이너 기반으로 전체 플랫폼을 구축할 예정이기 때문에 제외

Rancher

(Rancher 의 인증 프록시를 통한 Kubernetes 클러스터 관리 아키텍처)

(Rancher 서버의 컴포넌트 및 소스코드)

시스템 요구사항

Rancher

Rancher 하드웨어 요구사항

  • 물론 Rancher 배포 규모에 따라 하드웨어 요구사항은 확장 될 수 있음
    배포 규모 기준은 아래와 같음
  • 또한 쿠버네티스 클러스터에 따라 요구사항은 달라질 수 있음
  • 현재 작업은 PoC 를 위한 것이므로 Small 로 진행

    RKE and Hosted kubernetes

Ports for Rancher Server Nodes on RKE

아래 포트들이 통신 가능하도록 방화벽정책이 허용되어야 있어야 함.
GCP 의 경우 동일 네트웍내 기본적으로 모든 허용 상태이기때문에 별도 작업 진행 안함

Rancher Server install

GCP VM 노드를 사용해 구축하며 rancher 가이드 문서에는 GCP 기반 rancher server 배포 방법도 가이드 되어 있음
하지만 이번 poc 를 위해서는 Manual 하게 VM 노드상에서 설치를 진행 해보는것으로 함

GCP) https://rancher.com/docs/rancher/v2.6/en/quick-start-guide/deployment/google-gcp-qs/
Manual) https://rancher.com/docs/rancher/v2.5/en/quick-start-guide/deployment/quickstart-manual-setup/

  • 사전 진행) Docker 설치
    시스템 요구사항에도 언급했지만 도커는 rancher 및 kubernetes 를 위한 필수요건
    사전에 설정되어있는 Ansible 을 통해 playerbook 생성하여 docker 설치 진행

Step1) Provision a Linux Host

  • 랜처에서는 리눅스 기반 호스트를 프로비저닝 하여 클러스터링 하기 때문에 Cloud VM, on-prem VM 및 bare-metal server 모두 가능

Step2) Install Rancher

sudo docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged rancher/rancher
Unable to find image 'rancher/rancher:latest' locally
latest: Pulling from rancher/rancher
162362c3fcbd: Pull complete
39a8ca7345fc: Pull complete
c79d065b1f4b: Pull complete
800e10249f2e: Pull complete
1142a9dac488: Pull complete
2250ae118454: Pull complete
1341c37b9eb8: Pull complete
55bcb280677a: Pull complete
bd581b0743bb: Pull complete
b72afc26dfc9: Pull complete
14679cbbedf6: Pull complete
f24c4dc3be34: Pull complete
17be3b0b6e61: Pull complete
5c94eb34e2cc: Pull complete
a556913627fb: Pull complete
93dbc7e527b6: Pull complete
3c1b899e0e3f: Pull complete
Digest: sha256:5da40c2b0e8706621bb58728901f3d7d0ca3b2354c4b870b2556d1b68bc6617f
Status: Downloaded newer image for rancher/rancher:latest
48f87a37d0560d7f5dd7bbf21371528842e754a31372319110d142b7ad2232a2

해당 포트로 Rancher server dashboard 접근을 위해 외부 고정 IP 및 80, 443 포트를 오픈(80, 443 모두 오픈해야 접근 가능)

80 포트로 접근 시 443 으로 리다이렉트


고급 버튼을 눌러 페이지 접근

Step3) Log in

  • 접속후 로그인 하여 일부 일회성 설정들을 진행 함

  • docker 명령어를 통해 현재 Rancher server 가 실행되는 컨테이너의 컨테이너ID 를 확인하고 해당 컨테이너ID 를 통해 아래 커맨드를 실행

$ docker logs [Container_ID] 2>&1 | grep "Bootstrap Password:"
01:41:31 [INFO] Bootstrap Password: [PASSWORD]
  • 위 커맨드 실행결과 출력되는 PASSWORD 로 로그인 수행
  • 랜덤으로 제공되는 패스워드와 새로운 패스워드 설정하여 사용 가능
  • ServerURL 을 지정하는데 이 경우는 클러스터링 될 Kubernetes 노드들이 해당 URL(IP 혹은 Domain) 을 통해 Rancher Server 에 접근 할 수 있어야 함
    Rancher Server 의 GCP 내부 IP 를 사용 함
    GCP 클러스터내의 노드들은 내부 IP 를 통해 통신이 가능하며
    * On-prem 클러스터내의 노드들은 GCP<>On-prem 간 VPN 연결을 통해 내부 IP 를 통해 접근이 가능 할 것으로 예상
  • 약관에 동의 후 Continue 버튼으로 다음 진행

Step4) Create the Cluster

  • 클러스터를 생성해보자

  • Custom 으로 진행

  • 클러스터 이름을 기재하고 Next 버튼 클릭

  • 2번 항목에 표시되는 Docker 명령어를 클립보드에 복사
  • GCP 상에서 새로운 VM 인스턴스를 신규 생성(과정 생략)
  • 쿠버네티스의 워커 노드가 될 인스턴스에서 도커 설치(역시 Ansible 로 설치) 후 위에서 복사한 커맨드를 실행
$ sudo docker run -d --privileged --restart=unless-stopped --net=host -v /etc/kubernetes:/etc/kubernetes -v /var/run:/var/run  rancher/rancher-agent:v2.6.0 --server (이하생략)
Unable to find image 'rancher/rancher-agent:v2.6.0' locally
v2.6.0: Pulling from rancher/rancher-agent
162362c3fcbd: Pull complete
a7d34ec4bef4: Pull complete
32c4e357d9c8: Pull complete
2ce70d959054: Pull complete
975660f44ba7: Pull complete
c7934bc84225: Pull complete
d5e13fc918c7: Pull complete
Digest: sha256:d2a2c5a6cd638d2cbb6fcd78bda19accf6d76ce27540846c4c222f8028ced64c
Status: Downloaded newer image for rancher/rancher-agent:v2.6.0
4420d12d4f833db614254673ea93d7538c9e1582f02cfa91b5d251bf4eb184

  • 위 이미지와 같이 1개의 node 가 추가되었다는 메시지가 노출됨
  • RKE 클러스터는 etcd, controleplane, worker 롤을 가진 노드가 필요하기 때문에 현재 생성된 worker 롤 노드에 추가적으로 controle plane, etcd 노드 2개를 더 생성해서 총 3개 노드로 진행
  • GCP VM 노드 2개를 더 추가해서 총 3개의 RKE 클러스터로 진행(GCP 상에서 유사하게 만들기를 이용)
  • 위에 복사해둔 커맨드의 제일 끝에 2번 서버는 --controleplane 을 3번 서버는 --etcd 로 수정하여 실행

단일 서버에 worker, controlplane, etcd 모두 체크하여 수행해도 될듯..

--etcd --controlplane --worker

  • Done 을 눌러 다음으로 진행
  • mlops-service 라는 클러스터가 생기고 RKE 노드 3개가 클러스터링 된 것이 보임

  • Provisoning 단계
    클러스터의 상태가 변경되는것이 보임
    각 노드에 대한 healthy check 및 network-plugin addmons 등을 실행 하는 것이 보임

  • Waiting 단계

  • Active 단계
    explore 버튼이 활성화 되고 클러스터링이 완료 된 것을 볼 수 있음
    Activate 단계까지 모두 완료 되는데 10분 이상의 시간이 소요됨

  • 클러스터 이름을 클릭해보면 Events 란에 노드의 상태 변화를 확인 할 수 있음

  • Capacity 에 worker node 1개의 리소스가 노출됨

추가적으로 각 노드의 Role 을 랜처 상에서 수정하는것이 가능한지 테스트 필요
다음 Step은 Rancher RKE 클러스터에 Deployments 를 생성하는 작업을 진행

On-premise(GPU) Infra Clustering

Custom Cluster 생성

Node 정리

# docker rm -f $(docker ps -qa)
# docker rmi -f $(docker images -q)
# docker volume rm $(docker volume ls -q)

# for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher; do umount $mount; done

# rm -rf /etc/ceph \
       /etc/cni \
       /etc/kubernetes \
       /opt/cni \
       /opt/rke \
       /run/secrets/kubernetes.io \
       /run/calico \
       /run/flannel \
       /var/lib/calico \
       /var/lib/etcd \
       /var/lib/cni \
       /var/lib/kubelet \
       /var/lib/rancher/rke/log \
       /var/log/containers \
       /var/log/kube-audit \
       /var/log/pods \
       /var/run/calico

Rancher server URL 변경

Rancher server 설정 중 server 노드의 IP 변경 이슈가 발생해 변경사항을 적용
rancher server IP: 10.1.1.5 -> 10.75.193.4
cluster node1 IP: 10.1.1.13 -> 10.75.193.5
cluster node2 IP: 10.1.1.10 -> 10.75.193.6
cluster node3 IP: 10.1.1.14 -> 10.75.193.7
cluster node4 IP: 10.1.1.15 -> 10.75.193.8

Cluster node 에서는 클러스터 컨테이너의 속성 변경이 필요하므로 컨테이너 종료 > 컨테이너의 ID 기준 설정파일 수정 > Docker 데몬 재실행 순서대로 작업한다.
(진행중 실패하여 클러스터 노드 삭제 후 신규 클러스터 생성으로 진행)

  • server 에서 수행
# To check current value
> kubectl get settings.management.cattle.io server-url
# To change to a new value
> kubectl patch settings.management.cattle.io server-url -p '{"value":"NEWVALUE"}' --type=merge
# 변경 전 URL 확인
> kubectl get settings.management.cattle.io server-url
NAME         VALUE
server-url   https://10.1.1.5

# URL 변경
> kubectl patch settings.management.cattle.io server-url -p '{"value":"https://10.75.193.4"}' --type=merge
setting.management.cattle.io/server-url patched

# 변경 후 URL 확인
> kubectl get settings.management.cattle.io server-url
NAME         VALUE
server-url   https://10.75.193.4

참고자료

0개의 댓글