연재 시리즈

쿠버네티스 네트워크 스터디 6주차 - Ingress 컨셉 이해

악분 2022. 2. 21. 19:50
반응형

스터디 목차

 

안녕하세요. 이 글은 facebook 쿠버네티스 그룹에서 올라온 "쿠버네티스 네트워크 스터디" 5주차 내용을 정리했습니다.

스터디 모집글: https://www.facebook.com/groups/k8skr/posts/3202691746679143

 

1. 6주차 첫번째 주제

6주차 첫번째 주제는 Ingress controller 컨셉 이해입니다. 상세동작은 두번째 주제에서 다룹니다.

 

2. Ingress 컨셉

공식문서에서 Ingress는 언급된것처럼 pod를 도메인으로 접속할 수 있도록 가상 호스팅 기능을 제공합니다. Ingress를 제어하는 주체가 ingress controller입니다. ingress controller은 로드밸런서 등 L7기능을 수행합니다. 많이 알려진 ingress controller는 nginx, traefik 등이 있습니다. 쿠버네티스는 ingress 동작을 ingress controller에게 위임하고 있습니다.

문서링크: https://kubernetes.io/ko/docs/concepts/services-networking/ingress/#%EC%9D%B8%EA%B7%B8%EB%A0%88%EC%8A%A4%EB%9E%80

 

ingress는 라우팅 기능도 있어서 도메인 뒤에 subpath를 붙일 수 있습니다.

 

3. Ingress controller 접근

ingress를 제어하는 주체가 ingress controller이므로, 사용자는 결국 ingress controller에 접근해야 합니다. ingress controller는 쿠버네티스 클러스터 내부뿐만 아니라 외부에서도 접근을 위해 nodeport 또는 loadbalancer타입 서비스를 사용합니다.

 

4. Ingress 실습

실습은 nginx ingress controller을 사용합니다.

 

4.1 실습환경

스터디에서 공유된 vagrantfile을 이용하여 구성했습니다.

 

4.2 MetalLB 설치

저는 클라우드환경을 사용하지 않기 때문에 로드밸런서 서비스를 사용하기 위해 MetalLB를 설치했습니다.

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

 

MetalLB configmap은 아래처럼 설정했습니다.

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.10.200-192.168.10.210

 

metalLB 설치가 잘 되었는지 확인합니다.

kubectl get all -n metallb-system

 

4.3 nginx ingress controller 설치

저는 helm으로 설치했습니다.

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm repo update
helm install ingress-nginx \
ingress-nginx/ingress-nginx \
--version 4.0.17 \
--create-namespace \
--namespace ingress-nginx

 

잘 설치되었는지 확인합니다. 서비스 타입이 로드밸런서로잘 인식이 되었습니다.

kubectl -n ingress-nginx get all

 

4.4 샘플 파드, 서비스, 인그레스 생성

echoserver 도커 이미지로 파드, 서비스, 인그레스를 배포했습니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy3-adminsrv
spec:
  replicas: 1
  selector:
    matchLabels:
      app: adminsrv
  template:
    metadata:
      labels:
        app: adminsrv
    spec:
      containers:
      - name: pod-admin
        image: k8s.gcr.io/echoserver:1.5
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: svc3-admin
spec:
  ports:
    - name: admin-port
      port: 9003
      targetPort: 8080
  selector:
    app: adminsrv
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-demo
  annotations:
spec:
  ingressClassName: nginx
  rules:
  - host: "demo.choilab.com"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: svc3-admin
            port:
              number: 8080

 

리소스가 잘 배포되었는지 확인합니다.

kubectl get all

 

4.5 hosts파일 수정

네임서버를 따로 구매하지 않았기 때문에 hosts파일에 [챕터 4.4]에 설정한 도메인을 설정해야 합니다. IP는 [챕터 4.3]에서 생성한 ingress controller external IP입니다.

 

저는 윈도우를 사용하므로 C:/Windows/System32/drivers/etc/hosts파일을 수정했습니다.

192.168.10.200  demo.choilab.com

 

4.6 ingress 접속

hosts파일을 수정한 곳에서 웹브라우저를 이용하여 demo.choilab.com으로 접속합니다. 정상적으로 설정되면 응답결과가 보입니다.

 

4.7 요청과정 분석

metalLB로 구성했기 때문에 leader speaer pod가 있는 곳으로 먼저 트래픽이 전달됩니다. leader speaker pod가 있는 곳이 controlplane이므로 client address가 192.168.10.10으로 출력되었습니다. 요청PC인 윈도우 IP가 192.168.25.23인데에 불구하고요!

그 다음, nginx ingress controller pod로 전달되고 목적지 pod로 트래픽이 전달됩니다.

반응형