Raspberry Pi의 K3s - Ingress

이 게시물에서는 K3s 클러스터에서 인그레스가 어떻게 작동하는지 살펴보겠습니다. 배경 지식으로 K3s 문서의 Networking Section을 읽는 것이 좋습니다.

인그레스 개요



K3s는 Traefik Ingress Controller을 자동으로 배포하고 Klipper라는 서비스 로드 밸런서를 제공합니다. kube-system 네임스페이스에 배포된 모든 항목을 보려면 다음 명령을 실행합니다.

kubectl get all --namespace kube-system


참고: 기본 컨텍스트가 rpi-k3s로 설정되어 있으므로 모든 명령에 --context를 지정할 필요가 없습니다.

이것은 Traefik과 관련된 다음 리소스를 보여줍니다.

pod/traefik-97b44b794-dbmz2  
service/traefik
deployment.apps/traefik
replicaset.apps/traefik-97b44b794


그리고 Klipper 로드 밸런서와 관련된 다음 리소스:

pod/svclb-traefik-fc57n
pod/svclb-traefik-mj4md
pod/svclb-traefik-4qnbh
daemonset.apps/svclb-traefik


traefik 배포에는 이미지rancher/library-traefik:2.4.8를 사용하고 컨테이너 포트8000(웹) 및 8443(웹 보안)가 있는 하나의 컨테이너가 있는 포드에 대한 사양이 포함되어 있습니다.

traefik 서비스는 트래픽 포드에 대한 LoadBalancer를 지정하고 서비스의 포트80를 traefik 컨테이너의 포트8000에 매핑하고 서비스의 포트443를 traefik 컨테이너의 포트8443에 매핑합니다.

그런 다음 Klipper는 svclb-traefik라는 DaemonSet를 생성합니다. 이 DaemonSet는 각 노드에서 서비스에 대한 프록시 역할을 하는 포드를 생성합니다. 이러한 각 포드는 노드의 외부 IP 주소에서 액세스할 수 있으며 서비스의 각 포트에 매핑되는 포트80443를 노출합니다.

전체 설정은 다음과 같습니다.



다음으로 예제 애플리케이션을 배포하고 Traefik을 통해 노출할 수 있습니다.

침투 테스트



이 예제는 Traefik 문서에서 수정되었습니다.
whoami라는 네임스페이스를 만듭니다.

kind: Namespace
apiVersion: v1
metadata:
  name: whoami

whoami 컨테이너로 두 개의 팟(Pod)을 실행하기 위한 배치를 작성하십시오.

kind: Deployment
apiVersion: apps/v1
metadata:
  name: whoami
  namespace: whoami
  labels:
    app: traefiklabs
    name: whoami

spec:
  replicas: 2
  selector:
    matchLabels:
      app: traefiklabs
      task: whoami
  template:
    metadata:
      labels:
        app: traefiklabs
        task: whoami
    spec:
      containers:
        - name: whoami
          image: traefik/whoami
          ports:
            - containerPort: 80

whoami 배포를 위한 서비스를 만듭니다.

apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: whoami

spec:
  ports:
    - name: http
      port: 80
  selector:
    app: traefiklabs
    task: whoami

whoami 서비스를 Traefik에 연결하는 인그레스를 만듭니다.

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: whoami
  namespace: whoami
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web

spec:
  rules:
    - http:
        paths:
          - path: /bar
            pathType: Prefix
            backend:
              service:
                name: whoami
                port:
                  number: 80
          - path: /foo
            pathType: Prefix
            backend:
              service:
                name: whoami
                port:
                  number: 80


위의 수신으로 이제 모든 노드의 외부 IP 주소를 사용하여 포트 80에서 경로/foo 또는 /bar에 액세스할 수 있어야 합니다. 이제 전체 설정은 다음과 같습니다.



브라우저를 열고 http://192.168.1.244/bar 로 이동하면 다음과 같은 결과가 표시됩니다.

Hostname: whoami-7d666f84d8-4fs7c
IP: 127.0.0.1
IP: ::1
IP: 10.42.1.4
IP: fe80::c414:76ff:fe4c:75cc
RemoteAddr: 10.42.2.3:39256
GET /bar HTTP/1.1
Host: 192.168.1.244
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:88.0) Gecko/20100101 Firefox/88.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Dnt: 1
Sec-Gpc: 1
Upgrade-Insecure-Requests: 1
X-Forwarded-For: 10.42.0.0
X-Forwarded-Host: 192.168.1.244
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-97b44b794-dbmz2
X-Real-Ip: 10.42.0.0


이것은 요청이 whoami 에서 10.42.1.4 컨테이너 중 하나에 도달했음을 보여줍니다.

페이지를 새로 고치면 whoami 의 다른 10.42.2.5 컨테이너에서 응답이 온 것을 볼 수 있습니다.

Traefik이 라운드 로빙 로드 밸런싱을 수행하고 있으므로 요청이 계속해서 두 컨테이너whoami 간에 번갈아 나타납니다.

좋은 웹페이지 즐겨찾기