쿠버네티스 Ingress 구축 (k3s / metallb / Raspberry Pi OS)

pipi·2023년 8월 10일
0

인프라

목록 보기
9/12

📌 1. 라즈베리파이 환경설정 + IP 할당

1.1 라즈베리파이 OS(Raspbian) 설치

https://www.raspberrypi.com/software/

wlan ip 할당 + ssh 설정을 위해, 오른쪽 하단 환경설정 버튼을 클릭하여


이때 wifi 이름이 "aaa_5G" 이런 식은 안된다.

모니터에 연결한 후, 3분 정도 기다리면 ip설정이 완료된다.
ifconfig -> 랜덤으로 ip가 할당되어있다.

1.2 고정 ip 할당 + 쿠버네티스 설정

먼저 sudo -i로 root권한으로 접속한다.
참고로, 해당 작업은 ssh연결해서 해도 된다. 그러나 고정 IP를 할당하고 원격 접속하는게 편하며,
swap, iptables, cgroup은 쿠버네티스에서 사용하기 위해 설정해준다.
어차피 나중에 하면서 재부팅 여러번 할 바에, 한번에 한다.
+) cgroup만 하면 된다!

cgroup

sudo nano /boot/cmdline.txt

$ cgroup_memory=1 cgroup_enable=memory 추가

고정 ip 할당

sudo nano /etc/dhcpcd.conf
해당 파일에 3줄을 추가해준다.

interface wlan0
static ip_address=192.168.123.118/24
static routers=192.168.123.1

sudo reboot 재부팅
ifconfig -> 설정한 ip '192.168.123.118'가 할당되어있다.

1.3 superputty를 통한 ssh 접속

id, pw는 앞서 라파이 imager에서 설정한 걸 입력하면 접속완료.

📌 2. 마스터, 워커노드 설치

여기 기록한건 아주 일부분이다. 해당 깃헙링크를 참고하자.

2.1 마스터 노드

sudo apt update
sudo apt install -y docker.io nfs-common dnsutils curl

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="\
    --disable traefik \
    --node-name master --docker  \
    --disable servicelb " sh -

2.2 워커 노드

마스터 IP, TOKEN 넣기 + worker noed 이름 변경
이때, 워커 노드도 cgroup설정 + sudo -i로 root권한에서 해줘야한다.
명령어에서 노드 이름 바꾸는거 잊지맙시다.

curl -sfL https://get.k3s.io | K3S_URL=https://<마스터노드 IP>:6443 \
K3S_TOKEN=<마스터노드 토큰> \
INSTALL_K3S_EXEC="--node-name <워커노드 이름> --docker"  sh -

kubectl get node 로 워커노드3개, 마스터노드 1개가 Ready인 상태면 완료.

📌 3. MetalLB 설치

3.1 MetalLB 설치

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.11.0/manifests/metallb.yaml

3.2 설치 확인

kubectl get pod -n metallb-system
만약 노드가 총 4개라면, speaker 4개가 Running 상태여야한다.

3.3 config 파일 적용

vi config.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.123.130-192.168.123.200  # IP 대역폭

kubectl apply -f config.yaml

📌 4. ingress 설치

4.1 ingress controller 설치

해당 유튜브깃헙자료를 참고한다.

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/baremetal/deploy.yaml
처음에 바보같이 baremetal이 아닌 cloud로 설치했었따.

+) 공식사이트 참고

+) 만약 controller를 지워야한다면...
kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/baremetal/deploy.yaml

4.2 결과확인

kubectl get svc -n ingress-nginx
다음 그림과 같이 type이 기본적으로 NodePort이다. 이를 LoadBalancer로 바꿔줄 것이다.

nginx controller 기본이 nodeport이므로, 이를 loadBalancer로 바꿔준다.

kubectl edit svc -n ingress-nginx ingress-nginx-controller

loadBalancer로 바뀐 것을 확인 가능하다. + loadBalancer이기 때문에, 외부 IP도 자동으로 할당되어있다.

4.3 ingress 설정

그렇다면, controller는 만들어졌고, ingress.yaml파일로 ingress를 만들고,
vi ingress.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: ingress-resource-3
spec:
  ingressClassName: nginx
  rules:
   - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-deploy-main
            port:
              number: 80
      - path: /blue
        pathType: Prefix
        backend:
          service:
            name: nginx-deploy-blue
            port:
              number: 80
      - path: /green
        pathType: Prefix
        backend:
          service:
            name: nginx-deploy-green
            port:
              number: 80

kubectl apply -f ingress.yaml 으로 apply
kubectl get ingress 으로 확인

`kubectl get all -n ingress-nginx 이걸로도 확인하면 좋다.

4.4 deployment 설정

이제 loadBalancer 와 연결할 deployment를 만들자.
vi nginx-deploy-main.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-main
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-main
  template:
    metadata:
      labels:
        run: nginx-main
    spec:
      containers:
      - image: nginx
        name: nginx

vi nginx-deploy-blue.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-blue
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-blue
  template:
    metadata:
      labels:
        run: nginx-blue
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=blue>BLUE</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"

vi nginx-deploy-green.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: nginx
  name: nginx-deploy-green
spec:
  replicas: 1
  selector:
    matchLabels:
      run: nginx-green
  template:
    metadata:
      labels:
        run: nginx-green
    spec:
      volumes:
      - name: webdata
        emptyDir: {}
      initContainers:
      - name: web-content
        image: busybox
        volumeMounts:
        - name: webdata
          mountPath: "/webdata"
        command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=green>GREEN</font></h1>" > /webdata/index.html']
      containers:
      - image: nginx
        name: nginx
        volumeMounts:
        - name: webdata
          mountPath: "/usr/share/nginx/html"

kubectl apply -f nginx-deploy-main.yaml
kubectl expose deploy nginx-deploy-main --port 80
3개 다 해준다.

4.6 결과 확인

curl [ingress controller 주소]

해당 명령어에서 정상적으로 뜨면, 1차로 완료되었다

kubectl describe ing

웹브라우저에서도 잘되는지 보자.
처음에 curl은 되지만 웹브라우저에서 계속 안됬었는데, metallb, ingress를 몇번이고 다시해도 안됐다.
그냥 sudo reboot 하니까 해결되었다...


1개의 댓글

comment-user-thumbnail
2023년 8월 10일

많은 도움이 되었습니다, 감사합니다.

답글 달기

관련 채용 정보