정말 오랜만에 글을 작성하게 되었습니다.
워낙 덥다보니 퇴근하고 집에 오면 너무 지치더라구요.
오늘은 그동안 해본 것들 중에 k3s+rancher를 올리는 방법을 공유해보려고 합니다.
왜 kubernetes를 하게 되었을까?
PaaS
를 다루는 회사에 다니고 있습니다.PaaS
는 Platform as a service
의 약자입니다.
그러다보니 단순하면서도 가장 중요한 기능들을 사용해보고 있어요.
그 중에 마음에 들었던 기능은 바로 Continuous Delivery
입니다.
PaaS
를 배우기 전에도 docker-compose.yml
파일을 변경하면 자동으로 도커가 변경되게 하려고 구상했었습니다.
실제로 yml
파일이 변경되면 docker
에 인식 시켜서 컨테이너의 설정을 변경하는 것을 구현했었어요.
하지만 Kubernetes
에서 말하는 Continuous Delivery
는 git
에서 yaml
을 편집하고,
변경 사항을 자동으로 적용하게 해줍니다.
반면 독커 swarm
과 yml
변경 사항 모니터링 도구가 존재한다고 해도,yml
파일 편집할 수 있는 웹 서비스를 구성해서 올려야 하죠.
왜 K3s로 선택했을까?
Oracle Cloud Infrastructure
의 메모리가 제한되어있기 때문에
가벼운 kubernetes
를 생각하다가 제가 알고 있는 것이 k3s
였기 때문입니다.
minikube
는 프로덕션 용이 아니라고 나와서 안봤습니다.
HA 구현이 어려워보이더라구요.
microK8s를 검색해보면 대부분 ubuntu 얘기가 나오더군요.
제가 우분투를 선호하지 않기 때문에 k3s
로 결정했습니다.
RKE1
과 RKE2
는 k3s
바이너리를 기반으로 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로 바꿔봐야겠습니다.
감사합니다.
답글 남기기