정말 오랜만에 글을 작성하게 되었습니다.
워낙 덥다보니 퇴근하고 집에 오면 너무 지치더라구요.
오늘은 그동안 해본 것들 중에 k3s+rancher를 올리는 방법을 공유해보려고 합니다.

왜 kubernetes를 하게 되었을까?

PaaS를 다루는 회사에 다니고 있습니다.
PaaSPlatform as a service의 약자입니다.

그러다보니 단순하면서도 가장 중요한 기능들을 사용해보고 있어요.
그 중에 마음에 들었던 기능은 바로 Continuous Delivery 입니다.

PaaS를 배우기 전에도 docker-compose.yml 파일을 변경하면 자동으로 도커가 변경되게 하려고 구상했었습니다.
실제로 yml 파일이 변경되면 docker에 인식 시켜서 컨테이너의 설정을 변경하는 것을 구현했었어요.

하지만 Kubernetes에서 말하는 Continuous Deliverygit에서 yaml을 편집하고,
변경 사항을 자동으로 적용하게 해줍니다.

반면 독커 swarmyml 변경 사항 모니터링 도구가 존재한다고 해도,
yml 파일 편집할 수 있는 웹 서비스를 구성해서 올려야 하죠.

왜 K3s로 선택했을까?

Oracle Cloud Infrastructure의 메모리가 제한되어있기 때문에
가벼운 kubernetes를 생각하다가 제가 알고 있는 것이 k3s였기 때문입니다.

minikube는 프로덕션 용이 아니라고 나와서 안봤습니다.
HA 구현이 어려워보이더라구요.

microK8s를 검색해보면 대부분 ubuntu 얘기가 나오더군요.
제가 우분투를 선호하지 않기 때문에 k3s로 결정했습니다.

RKE1RKE2k3s 바이너리를 기반으로 kubernetes를 구성할 수 있게 해줍니다.
지금 보면 RKE2로 구성하는것도 좋아보이는데, 제가 구성할 때는 문제가 있었습니다.
바로 CPU 아키텍처 지원 문제였죠.

Rancher + RKE2는 ARM을 지원하지 않았습니다.
이 글 작성할 때도 지원하지 않았습니다.
대신 지원 될 예정인것을 확인했습니다.
k3s 구성할 때 지원 될 예정이라는 사실을 알았다면 좀더 기다렸다가 구성했을 것 같네요.
하지만 아쉽게도 RKE2 설치 중 아키텍처가 지원되지 않는다는 문구만 보고 RKE2 설치는 중단해버렸습니다.

이 글을 작성하면서 정확한 버전을 확인해보았습니다.
RKE2는 1.27.3부터 ARM을 지원하는 것을 확인했습니다.
Rancher 2.7.5는 쿠버네티스 1.26까지만 사용이 가능합니다.
Rancher 버전만 올라가면, arm에서도 가능하다는 것이죠.

K3s + Rancher 설치하기

설치 환경

Oracle Cloud Infrastructure에서 구성합니다.

세대의 A1 머신을 사용합니다.

Oracle Cloud Infrastructure의 NLB(Network Load Balancer)를 이용하여 kubeapi의 로드밸런싱을 수행합니다.
NLB는 6443 port(kube API), 443(rancher dashboard https), 80(rancher dashboard http)를 로드밸런싱 하고 있습니다.

NLB의 이름은  rancher-api로, Domain Name은 다음과 같습니다.
rancher-api.subnets.VCNname.oraclevcn.com

NLB의 IP 주소는 다음과 같습니다.
10.10.10.10

k3s 설치하기

정말 쉽습니다.

간단하게 명령어 한줄이면 됩니다.

# 첫번째 노드
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="660" INSTALL_K3S_VERSION=v1.26.6+k3s1 K3S_TOKEN=password-for-connect-from-other-nodes sh -s - server --cluster-init
# 두번째/세번째 노드
#cluster-init 대신 --server https://IP:6443을 사용한다.
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="660" INSTALL_K3S_VERSION=v1.26.6+k3s1 K3S_TOKEN=password-for-connect-from-other-nodes sh -s - server --server https://<ip or hostname of server1>:6443

k3s 설치 옵션 설명

옵션 설명 드리겠습니다.

K3S_KUBECONFIG_MODE는 kubectl을 비롯한 실행 파일의 권한을 의미합니다.
기본으로 600인데, 저는 non-root 계정에서 사용하기 위하여 660을 주었습니다.

INSTALL_K3S_VERSION은 Rancher를 설치할 수 있는 버전으로 지정해주었습니다.

K3S_TOKEN은 HA를 구성할 때 필요합니다.

kube config 복사

kubernetes 명령어는 cluster 외부에서도 사용할 수 있습니다.
이 기능을 구현하기 위해 kubectl 같은 명령은 cluster에 대한 정보를 파일에서 가져옵니다.

이 파일을 정확한 경로에 두지 않으면, 모든 kubernetes 명령어를 실행할 때 --kubeconfig /etc/rancher/rke2/rke2.yaml을 붙여줘야 합니다.

mkdir -p ~/.kube
sudo cp -f /etc/rancher/k3s/k3s.yaml ~/.kube/config; sudo chown `id -u` ~/.kube/config
# 어차피 권한이 600이므로 그룹은 상관이 없습니다.
chmod 600 ~/.kube/config

k3s CoreDNS 설정

coredns는 기본적으로 node의 IP와 hostname을 갖고 있습니다.
하지만 Load Balancer는 가지고 있지 않기 때문에 추가해주어야 합니다.

coredns configmap 수정

kubectl edit configmap coredns -n kube-system 명령을 사용하면 대략 다음과 같은 형식으로 작성되어있습니다.

apiVersion: v1
data:
  Corefile: |
    .:53 {
        errors
        health
        ready
        kubernetes cluster.local in-addr.arpa ip6.arpa {
          pods insecure
          fallthrough in-addr.arpa ip6.arpa
        }
        hosts /etc/coredns/NodeHosts {
          ttl 60
          reload 15s
          fallthrough
        }
        prometheus :9153
        forward . /etc/resolv.conf
        cache 30
        loop
        reload
        loadbalance
        import /etc/coredns/custom/*.override
    }
    import /etc/coredns/custom/*.server
  NodeHosts: |
    10.10.10.11 m1
    10.10.10.12 m2
    10.10.10.13 m3

여기서 바꾸어야 할 부분은 hosts 부분입니다.

       hosts /etc/coredns/NodeHosts VCNname.oraclevcn.com {
          10.10.10.10 rancher-api.subnets.VCNname.oraclevcn.com
          ttl 60
          reload 15s
          fallthrough
        }

coredns pod 재시작

coredns의 configmap은 바로 적용되지 않습니다.

coredns pod를 다시 실행하기 위해 제거해야 합니다.

kubectl get pod -n kube-system | grep coredns
kubectl delete pod coredns-59b4f5bbd5-hls6k -n kube-system

Rancher 설치

helm 설치 및 helm repository 구성

SUSE: sudo zypper in helm
RHEL/OL/RL/AL: sudo dnf in helm

helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
# kubernetes 내부 HTTPS 통신에서 사용할 인증서를 발급/관리해주는 도구입니다.
helm repo add jetstack https://charts.jetstack.io

rancher https를 위한 cert-manager 구성

저는 외부 접속은 모두 cloudflared를 이용할 예정입니다.
따라서 self signed 인증서로 구성하였습니다.

helm install cert-manager jetstack/cert-manager \
  --namespace cert-manager \
  --create-namespace \
  --set installCRDs=true 

rancher를 위한 name-space 생성

kubectl create namespace cattle-system

Rancher 설치

helm install rancher rancher-latest/rancher \
  --namespace cattle-system \
  --set bootstrapPassword=password-for-first-login \
  --set hostname=rancher-api.subnets.VCNname.oraclevcn.com

Rancher Ingress 변경

로그에 접속 도메인이 나올것인데, 이 도메인이 하필(?) NLB 도메인입니다.

저는 컴퓨터가 사용하는 DNS 서버의 설정을 변경하였습니다.
NLB 도메인을 추가하고, 도메인에 IP 주소를 할당해주었습니다.

하지만 대부분 개인 DNS 서버를 가지고 있지 않으실거예요.
그래서 hosts 파일을 변경하여 접속해야 합니다.

sudo nano /etc/hosts
# <k3s cluster node 중 하나의 IP> rancher-api.subnets.VCNname.oraclevcn.com

설치 완료

이것으로 Rancher를 사용할 수 있게 되었습니다.

rancher에서 RKE2의 경우 업데이트까지 관리가 되는 것 같더군요.

나중에 기회 된다면 RKE2로 바꿔봐야겠습니다.

감사합니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다


Ads Blocker Image Powered by Code Help Pro

광고 차단 감지됨!

닫기를 누르면 이용하실 수 있지만, 광고 차단은 해제해주시면 좋겠습니다.
Powered By
Best Wordpress Adblock Detecting Plugin | CHP Adblock