[Retry, k8s] 19. 서비스 API - 인그레스(Ingress) (1)

Date:     Updated:

카테고리:

태그:

[Retry, k8s] 19. 서비스 API - 인그레스(Ingress) (1)


네트워크 트래픽은 외부로부터 내부로 유입되는 트래픽을 인그레스(Ingress), 내부에서 외부로 나가는 트래픽을 이그레스(Egress)로 구분한다.

시작하기 전 “MetalLB 내용” https://revenge1005.github.io/kubernetes/ch04-05/#-metallb 확인…


🔔 인그레스(Ingress)

k8s의 인그레스는 인그레스 API 오브젝트와 인그레스 컨트롤러로 구성된다.

  • 인그레스 API 오브젝트는 인그레스 API 오브젝트는 클러스터 외부에서 내부 서비스로 접근하기 위한 원하는 상태를 기술하는 것이고, 실제로 수행하는 것은 인그레스 컨트롤러라고 부르는 클러스터 내부에서 동작하는 파드로 파드이지만, 클러스터 외부에서 들어오는 요청을 인그레스에 정의된 규칙들을 기반으로 서비스 파드로 전달한다.

  • 기존 NodePort 등의 서비스는 Layer 4까지의 요청만을 처리하므로 네트워크 요청에 대한 세부적인 처리 로직을 구현하기 어렵다.

  • 하지만 인그레스는 Layer 7까지의 요청을 처리할 수 있으며, 외부로부터 들어오는 요청에 대한 로드 밸런싱, TLS/SSL 인증처리, 특정 HTTP 경로나 도메인의 라우팅 등을 자세하게 정의할 수 있다.

232332


🔔 인그레스(Ingress)의 대표적인 기능

  1. 기존의 로드밸런서나 리버스 프록시를 대체, 공개 URL과 애플리케이션 매핑

  2. 복수의 도메인 이름을 가지고 가상 호스트 기능

  3. 클라이언트의 요청을 여러 파드에 분산

  4. SSL/TSL 암호화 통신 HTTPS

  5. 세션 어피니티


🔔 공개 URL과 애플리케이션의 매핑

  • 사용자 입장에서는 하나의 URL이지만 내부적으로 애플리케이션이 적절히 분리되어 있어 마이크로 서비스 처럼 애플리케이션을 분할하고 느슨하게 연결함으로써 각 모듈의 변경에 의한 영향을 최소화할 수 있고 개발 생산성에도 유리하다.

예시


🔔 인그레스(Ingress) 종류

(1) 클러스터 외부 로드 밸런서를 사용한 인그레스 (GKE 인그레스, 그 외 여러가지)

  • GKE 처럼 클러스터 외부 로드 밸런서를 사용한 인그레스의 경우 인그레스 리소스 생성만으로 로드 밸런서의 가상 IP가 할당되고, 로드 밸런서가 NodePort를 통해 트래픽을 전송한다.

2323232

(2) 클러스터 내부 인그레스용 파드를 배포하는 인그레스 (Nginx 인그레스)

  • “클러스터 내부 인그레스용 파드를 배포하는 인그레스 패턴”은 인그레스용 파드에 대해 LoadBalancer 서비스를 생성하고, 인그레스용 파드가 L7 수준의 처리를 수행한 후 파드 IP 주소로 트래픽을 전송한다.

323232


🔔 Nginx 인그레스(Ingress) 설치전 주의사항

https://kubernetes.github.io/ingress-nginx/deploy/baremetal/

베어메탈 환경에서는 클라우드 환경과 달리 네트워크 로드 밸런서가 제공되지 않기 때문에 nginx ingress controller를 설치하는 방법이 다르다.

  • 베어메탈 환경에서 nginx ingress controller를 설치하는 방법은 크게 두 가지가 있는데, 하나는 MetalLB라는 소프트웨어 네트워크 로드 밸런서를 사용하는 방법이고, 다른 하나는 NodePort, LoadBalancer 또는 HostNetwork와 같은 서비스 타입을 사용하는 방법이다.

  • 여기서는 MetalLB를 사용하는 것으로 진행한다.


🔔 Nginx 인그레스(Ingress) 설치


https://github.com/kubernetes/ingress-nginx/blob/main/README.md#readme

https://kubernetes.github.io/ingress-nginx/deploy/


(1) Nginx 인그레스(Ingress) 설치 (MetalLB를 선행 설치해야 함)

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.7.0/deploy/static/provider/cloud/deploy.yaml

(2) 설치 확인

kubectl get all -n ingress-nginx
NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-czb2z        0/1     Completed   0          71s
pod/ingress-nginx-admission-patch-sz6z4         0/1     Completed   2          71s
pod/ingress-nginx-controller-6bdb654777-rqq8l   1/1     Running     0          71s

NAME                                         TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   10.99.113.110   192.168.219.190   80:30694/TCP,443:30928/TCP   71s
service/ingress-nginx-controller-admission   ClusterIP      10.100.13.201   <none>            443/TCP                      71s

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           71s

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-6bdb654777   1         1         1       71s

NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           14s        71s
job.batch/ingress-nginx-admission-patch    1/1           25s        71s

(3) 테스트용 매니페스트 파일

cat <<EOF > app01.yaml
kind: Deployment
metadata:
  name: helloworld-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: hello-world
    spec:
      containers:
        - image: "strm/helloworld-http"
          name: hello-world-container
          ports:
            - containerPort: 80
  selector:
    matchLabels:
      app: hello-world
---
apiVersion: v1
kind: Service
metadata:
  name: helloworld-svc
spec:
  type: NodePort
  ports:
     -  port: 8080
        protocol: TCP
        targetPort: 80
        nodePort: 31445
  selector:
    app: hello-world
EOF
cat <<EOF > app02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - image: nginx
          name:  nginx
          ports:
            - containerPort: 80
  selector:
    matchLabels:
      app: nginx
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
     -  port: 9080
        targetPort: 80
EOF
cat <<EOF > app03.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: java-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: liberty
    spec:
      containers:
        - image: openliberty/open-liberty:javaee8-ubi-min-amd64
          name:  open-liberty
          ports:
            - containerPort: 9080
              name: httpport
  selector:
    matchLabels:
      app: liberty
---
apiVersion: v1
kind: Service
metadata:
  name: java-svc
spec:
  selector:
    app: liberty
  ports:
     -  port: 9080
        targetPort: 9080
EOF

(4) 인그레스 매니페스트 작성

cat <<EOF > ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: hello-ingress
  annotations:
    kubernetes.io/ingress.class: 'nginx'
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: abc.sample.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: helloworld-svc
            port:
              number: 8080
      - path: /apl2
        pathType: Prefix
        backend:
          service:
            name: nginx-svc
            port:
              number: 9080
  - host: xyz.sample.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: java-svc
            port:
              number:  9080
EOF

(5) 매니페스트 적용

$ kubectl get all,ingress
NAME                                         READY   STATUS    RESTARTS   AGE
pod/helloworld-deployment-7757b448c4-q2zdd   1/1     Running   0          12m
pod/java-deployment-65f66f77b-gtsgx          1/1     Running   0          12m
pod/nginx-deployment-7f456874f4-2rsn4        1/1     Running   0          12m
pod/nginx-deployment-7f456874f4-kmrf9        1/1     Running   0          12m
pod/nginx-deployment-7f456874f4-vg5pk        1/1     Running   0          12m

NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
service/helloworld-svc   NodePort    10.103.193.1     <none>        8080:31445/TCP   12m
service/java-svc         ClusterIP   10.103.196.241   <none>        9080/TCP         12m
service/kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP          20m
service/nginx-svc        ClusterIP   10.109.159.252   <none>        9080/TCP         12m

NAME                                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/helloworld-deployment   1/1     1            1           12m
deployment.apps/java-deployment         1/1     1            1           12m
deployment.apps/nginx-deployment        3/3     3            3           12m

NAME                                               DESIRED   CURRENT   READY   AGE
replicaset.apps/helloworld-deployment-7757b448c4   1         1         1       12m
replicaset.apps/java-deployment-65f66f77b          1         1         1       12m
replicaset.apps/nginx-deployment-7f456874f4        3         3         3       12m

NAME                                      CLASS    HOSTS                           ADDRESS           PORTS   AGE
ingress.networking.k8s.io/hello-ingress   <none>   abc.sample.com,xyz.sample.com   192.168.219.190   80      11m



$ kubectl describe ingress
Name:             hello-ingress
Labels:           <none>
Namespace:        default
Address:          192.168.219.190
Ingress Class:    <none>
Default backend:  <default>
Rules:
  Host            Path  Backends
  ----            ----  --------
  abc.sample.com
                  /       helloworld-svc:8080 (10.46.0.2:80)
                  /apl2   nginx-svc:9080 (10.40.0.2:80,10.40.0.3:80,10.46.0.3:80)
  xyz.sample.com
                  /   java-svc:9080 (10.46.0.4:9080)
Annotations:      kubernetes.io/ingress.class: nginx
                  nginx.ingress.kubernetes.io/rewrite-target: /
Events:
  Type    Reason  Age                    From                      Message
  ----    ------  ----                   ----                      -------
  Normal  Sync    4m18s (x2 over 4m59s)  nginx-ingress-controller  Scheduled for sync

(5) 결과 확인

OS hosts 경로
윈도우(windows) C:\Windows\System32\drivers\etc\hosts
리눅스(Linux) /etc/hosts
# hosts 파일에 아래 내용 추가
192.168.219.190  abc.sample.com xyz.sample.com


test

KUBERNETES 카테고리 내 다른 글 보러가기

댓글 남기기