반갑습니다. 저는|기업가이자, 엔지니어입니다.
k8s 이용해서 웹 서버 구축하기 - 1부. install k3s with Calico

k8s 이용해서 웹 서버 구축하기 - 1부. install k3s with Calico

Tags
k8s
k3s
Linux
Calico
Published
발행일 - 2022년 8월 16일
Author
Eugene Jeon (전유진)
AuthorLink

 
 

개요

요즘 가성비가 좋다는 ARM 아키텍처 서버를 확보했다.
Ubuntu 22.04 LTS 를 설치해둔 상태이며, 1대의 서버로 여러개의 서비스를 구축해보고자 한다.
그래서 Docker 대신 가용성이 더 좋고, 추가 노드(*PC) 를 붙여서 확장할 수 있는 Kubernetes 를 설치 및 운영 하려 한다.
 
준비된 사양은 CPU 4 Core - RAM 24gb - Storage 160gb 이다.

k3s

k3s 는 Rancher Labs 에서 개발, 배포중인 서비스이며, 경량화된 K8s 이다. 비교되는 것 중에는 minikube, microk8s 등이 있다.
 

Why k3s?

프로덕션환경으로 사용가능한 경량 K8s 로 microk8s 와 고민을 했었다.
microk8s 는 Canonical 에서 개발하였다. Canonical 은 Ubuntu 를 개발하고 배포한 신뢰할 수 있는 곳이다. 후발주자이며, minikube 를 본따 만들었기에 조금 더 K8s 와 비슷한 부분이 많다고 할 수 있다.
하지만, snap 패키지로만 설치가 가능하다는 점 때문인지 여론이 좋지 않았다. 그래서 자료 또한 많지 않았다.
개발하다가 막히면 레퍼런스와 문서를 찾아보면서 해결해야 한다. 이점에서 microk8s 보다 k3s 가 조금 더 유리하다. 자료가 많기 때문이다. 그래서 k3s 를 선택하였다.
 
💡
k3s 는 sqlite 를 사용하여 경량화를 시켰는데, 최근 ETCD 를 적용할 수 있게 되었다. HA (고가용성) 을 위한 옵션 변경이 가능하다는 의미이다. 👉 이 링크를 확인하여, 자세히 살펴볼 수 있다.
 

Install k3s

(plain text)
curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" INSTALL_K3S_EXEC="--flannel-backend=none --cluster-cidr=192.168.0.0/16 --disable-network-policy --disable=traefik --disable=servicelb" sh -
  • K3S_KUBECONFIG_MODE: sudo 명령어 없이도 kubectl 명령어를 자유롭게 쓰기 위해서 설정
  • INSTALL_K3S_EXEC
    • --flannel-backend=none: Calico 를 사용하기위해서 none 설정
    • --cluster-cidr: 10.x.x.x 대신 인지하기 쉬운 192.168.0.0/16 설정
      • (기본값은 다음과 같다. --cluster-cidr 10.42.0.0/16,2001:cafe:42:0::/56 --service-cidr 10.43.0.0/16,2001:cafe:42:1::/112)
    • --disable-network-policy: 기본 네트워크 정책 비활성화
    • --disable=traefik: k3s v1.21 이전버전은 traefik 1.x 이부터는 traefik 이 2.x 으로 설치되는데, Calico 를 사용할 것이라서 비활성화
    • --disable=servicelb: MetalLB 를 사용할 것이라서 기본 LB 비활성화
 
💡
버전을 직접 지정하고 싶으면, INSTALL_K3S_VERSION 을 추가하면 된다. ex) curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=v1.25.2+k3s1 K3S_KUBECONFIG_MODE="644" INSTALL_K3S_EXEC="--flannel-backend=none --cluster-cidr=192.168.0.0/16 --disable-network-policy --disable=traefik" sh -
 
  • 아래 옵션은 나중에 추가할 것들이다. 확인만 하고 설치 옵션으로 주면 안된다!!!
    • --kube-proxy-arg proxy-mode=ipvs: Bare Metal Linux Server 에서는 MetalLB 를 사용하기 위한 설정 중 하나이다.
    • --kube-proxy-arg=ipvs-strict-arp : MetalLB 을 사용하고자 할 때, ipvs 모드라면 해당 옵션은 필수이다.
 
 
 
💡
Calico 의 네트워크 성능이 좋은 것으로 알려져 있다. 👉 이곳을 확인하면, 더 자세한 비교글을 볼 수 있다.
 
위 명령어로 설치하면, 다음과 같이 pod 들이 pending 상태로 유지된다.
(bash)
$ kubectl get pod -n kube-system -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES local-path-provisioner-7b7dc8d6f5-q4mgb 0/1 Pending 0 47s <none> <none> <none> <none> metrics-server-668d979685-wvm95 0/1 Pending 0 47s <none> <none> <none> <none> coredns-b96499967-jcxnc 0/1 Pending 0 47s <none> <none> <none> <none>
 

Install Calico operator

 
두 가지 방법이 존재하며, 다음 사이트 문서를 참고하여 원하는 방법대로 설치하면 된다.
 
다만, 두 가지 방법의 차이점은 분명이 존재한다.
 
그래서 Calico operator 를 설치하기로 한다.
(bash)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/tigera-operator.yaml # 아래는 항상 최신버전을 설치하는 코드이다. kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
(bash)
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.24.1/manifests/custom-resources.yaml # 아래는 항상 최신버전을 설치하는 코드이다. kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml
만약, k3s 에서 -cluster-cidr 값을 변경했다면, calico 의 custom-resources 에서 ipPools.cidr 값도 함께 변경해주어야 한다. 주의!
 
Calico CNI 등이 설치되고 pending 상태에 있던 pod 도 모두 Running 상태로 변경됨을 확인할 수 있다.
(bash)
$ watch kubectl get pods --all-namespaces tigera-operator tigera-operator-6995cc5df5-b8n2x 1/1 Running 0 102s calico-system calico-typha-74d86d4b44-jp2hb 1/1 Running 0 89s calico-system calico-node-4rkck 1/1 Running 0 89s kube-system local-path-provisioner-7b7dc8d6f5-k9k6r 1/1 Running 0 2m48s kube-system coredns-b96499967-2hz7b 1/1 Running 0 2m48s calico-system calico-kube-controllers-87df8958b-crdvg 1/1 Running 0 89s kube-system metrics-server-668d979685-cjsnb 1/1 Running 0 2m48s calico-apiserver calico-apiserver-bb4f6f5f4-7llhk 1/1 Running 0 29s calico-apiserver calico-apiserver-bb4f6f5f4-sn2vs 1/1 Running 0 29s
 

Install clicoctl

참고

k3s 삭제

만약, 잘 못 설치한 경우 깔끔하게 k3s 를 삭제할 수 있다.

Master Node 의 경우

(bash)
/usr/local/bin/k3s-uninstall.sh

Worker Node 의 경우

(bash)
/usr/local/bin/k3s-agent-uninstall.sh

[모두] 남아 있는 Symlink 파일 삭제

(bash)
sudo rm -rf /usr/local/bin/kubectl /usr/bin/kubectl /usr/local/bin/crictl /usr/bin/crictl /usr/local/bin/ctr /usr/bin/ctr
 

Node 를 추가할 경우

동일하게 Calico 를 설정해주어야 한다.
 

k3sup

조금 더 쉽게 k3s 를 설치할 수 있다. 그 중 하나의 사례로는 Worker Node 추가 할 때, 토큰 을 획득하고 수동으로 입력하는 등의 과정을 생략할 수 있다는 것이다.
 

x509 오류

tls-san 옵션으로 허용하는 IP 를 추가해야 한다. 재 설치하지 않고, 아래 두 가지 방법을 이용하여 손 쉽게 해결할 수 있다.

방법 1. Secrets 파일 수정

(bash)
kubectl -n kube-system edit secrets/k3s-serving
(yaml)
# Please edit the object below. Lines beginning with a '#' will be ignored, # and an empty file will abort the edit. If an error occurs while saving this file will be # reopened with the relevant failures. # apiVersion: v1 data: tls.crt: # tls.key: # kind: Secret metadata: annotations: listener.cattle.io/cn-127.0.0.1: 127.0.0.1 listener.cattle.io/cn-public-ip: x.x.x.x #...

방법2. CURL 이용 (추천🫰)

(bash)
curl -vk --resolve x.x.x.x:6443:127.0.0.1 https://x.x.x.x:6443/ping
 

Containerd 이미지 확인

Running Containers

(bash)
sudo k3s crictl ps

Downloaded Images

(bash)
sudo k3s crictl images
 

방화벽 - UFW 로 관리하기

상태 확인하기

(yaml)
sudo ufw status

SSH 포트 허용하기

(yaml)
sudo ufw allow ssh comment "SSH"

활성화 하기

(yaml)
sudo ufw enable

k8s 를 위한 추가 포트 허용하기

(yaml)
sudo ufw allow 6443/tcp comment "k3s" sudo ufw allow 443/tcp comment "HTTPS & K8s Ingress" sudo ufw allow 80/tcp comment "HTTP & K8s Ingress" sudo ufw allow from 10.0.0.0/8 to any comment "k3s & nginx-ingress = 10.43.0.0/16 & 10.42.0.0/16 & ..." sudo ufw allow from 192.168.0.0/16 to any comment "Local Connection"

Loading Comments...