본문 바로가기

Devops/Kubernetes

[Kubernetes] ingress 설정

Ingress

  • 클러스터 외부에서 내부로 접근 요청을 어떻게 처리할 지 정의해 둔 규칙
  • L7 어플리케이션 수준의 접근 요청 처리 방법 제공
    • URL 제공, 트래픽 로드밸런스, SSL 인증처리, 도메인 기반 가상 호스팅 등
  • HAProxy, Envoy, Kong 같은 소프트웨어 프록시 등 3rd-party 소프트웨어 제공사에 의해서 제공되기도 함.
  • 인그레스 : 접근 규칙(Rule)이 정의된 자원
  • 인그레스 컨트롤러 : 인그레스 접근 규칙을 기반으로 제어
  • 현재 공식적으로 제공하는 인그레스 컨트롤러
    • ingress-gce : Google Compute Engine용
    • ingress-nginx : nginx 웹 서비스로 들어오는 요청을 처리

https://kubernetes.io/docs/concepts/services-networking/ingress/

 

Ingress 생성 전 Sample Backend Service 생성

Ingress 를 생성하기 전에 path rule에 맞게 수행될 backend service/pod를 우선 생성한다.

 

blue-app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: blue-app
  labels:
    app: blue-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: blue-app
  template:
    metadata:
      labels:
        app: blue-app
    spec:
      containers:
      - name: blue-app
        image: takytaky/web:blue
        ports:
        - containerPort: 80

 

green-app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: green-app
  labels:
    app: green-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: green-app
  template:
    metadata:
      labels:
        app: green-app
    spec:
      containers:
      - name: green-app
        image: takytaky/web:green
        ports:
        - containerPort: 80

 

yellow-app.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: yellow-app
  labels:
    app: yellow-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: yellow-app
  template:
    metadata:
      labels:
        app: yellow-app
    spec:
      containers:
      - name: yellow-app
        image: takytaky/web:yellow
        ports:
        - containerPort: 80

 

blue-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: blue-svc
spec:
  type: NodePort
  selector:
    app: blue-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30081

 

green-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: green-svc
spec:
  type: NodePort
  selector:
    app: green-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30082

 

yellow-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: yellow-svc
spec:
  type: NodePort
  selector:
    app: yellow-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30083

 

위 deployment와 service를 생성하고 나서 결과를 확인해본다.

root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f blue-app.yaml
deployment.apps/blue-app created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f green-app.yaml
deployment.apps/green-app created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f yellow-app.yaml
deployment.apps/yellow-app created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f blue-svc.yaml
service/blue-svc created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f green-svc.yaml
service/green-svc created
root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f yellow-svc.yaml
service/yellow-svc created

root@master:~/k8s_lab/ingress/ingress-color# kubectl get svc,pods-o wide
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/blue-svc     NodePort    10.107.199.200   <none>        80:30081/TCP   4m42s   app=blue-app
service/green-svc    NodePort    10.109.245.115   <none>        80:30082/TCP   4m4s    app=green-app
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        59m     <none>
service/yellow-svc   NodePort    10.103.132.156   <none>        80:30083/TCP   3m16s   app=yellow-app

NAME                              READY   STATUS    RESTARTS   AGE     IP                NODE      NOMINATED NODE   READINESS GATES
pod/blue-app-74948d8f76-27wlr     1/1     Running   0          5m59s   192.168.189.90    worker2   <none>           <none>
pod/green-app-5c8f4cd489-ngzsg    1/1     Running   0          5m38s   192.168.235.158   worker1   <none>           <none>
pod/yellow-app-559d9bf8cb-nk2cz   1/1     Running   0          5m13s   192.168.235.159   worker1   <none>           <none>

 

현재 구성된 Cluster의 마스터 Node의 IP는 172.30.1.25이다. 위 각 서비스의 NodePort가 각각 30081, 30082, 30083으로 맵핑 되어있으므로 Cluster 외부에서 아래와 같이 접근을 해보면 정상적으로 각 서비스가 수행 됨을 볼 수 있다.

 

Ingress 생성

  • 인그레스의 내용에는 LoadBalancer또는 Proxy 서버를 구성하는데 필요한 정보 작성
  • 인그레스 컨트롤러를 통해서 접근하는 요청에 대한 처리할 규칙(rule) 을 정의

 

ingress-color-web.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: color-web
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx
  defaultBackend:
    service:
      name: blue-svc
      port:
        number: 80
  rules:
  - host: example.com
    http:
      paths:
      - pathType: Prefix
        path: /blue
        backend:
          service:
            name: blue-svc
            port:
              number: 80
      - pathType: Prefix
        path: /green
        backend:
          service:
            name: green-svc
            port:
              number: 80
  - host: color.com
    http:
      paths:
      - pathType: Prefix
        path: /
        backend:
          service:
            name: yellow-svc
            port:
              number: 80

 

  • Ingress Annotation
    • 인그레스 설정 시 추가적인 항목인 어노테이션을 통해서 설정
Name Description
nginx.ingress.kubernetes.io/rewrite-target: / Target URI where the traffic must be redirected

 

https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md

 

  • .spec.rules[] : 어떤 규칙을 적용할 지 지정
  • .spec.rues[].host : example.com 주소로 요청이 들어온 경우 다음 규칙에 따라 처리
  • .spec.rules[].http.paths[].path : example.com/blue로 요청이 들어오면 backend 서비스로 전달한다.
  • .spec.ingressClassName : networking.k8s.io의 ingress-nginx를 사용한다면 nginx 로 명시해준다.

ingress-color-web.yaml을 실행하고 실행결과를 확인한다.

root@master:~/k8s_lab/ingress/ingress-color# kubectl apply -f ingress-color-web.yaml
ingress.networking.k8s.io/color-web created

root@master:~/k8s_lab/ingress/ingress-color# kubectl get svc,pods,ing -o wide
NAME                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE   SELECTOR
service/blue-svc     NodePort    10.107.199.200   <none>        80:30081/TCP   11m   app=blue-app
service/green-svc    NodePort    10.109.245.115   <none>        80:30082/TCP   10m   app=green-app
service/kubernetes   ClusterIP   10.96.0.1        <none>        443/TCP        66m   <none>
service/yellow-svc   NodePort    10.103.132.156   <none>        80:30083/TCP   10m   app=yellow-app

NAME                              READY   STATUS    RESTARTS   AGE   IP                NODE      NOMINATED NODE   READINESS GATES
pod/blue-app-74948d8f76-27wlr     1/1     Running   0          12m   192.168.189.90    worker2   <none>           <none>
pod/green-app-5c8f4cd489-ngzsg    1/1     Running   0          12m   192.168.235.158   worker1   <none>           <none>
pod/yellow-app-559d9bf8cb-nk2cz   1/1     Running   0          11m   192.168.235.159   worker1   <none>           <none>

NAME                                  CLASS   HOSTS                   ADDRESS   PORTS   AGE
ingress.networking.k8s.io/color-web   nginx   example.com,color.com             80      16s

 

ingress-nginx (Ingress Controller) 생성

 

nginx 인그레스 컨트롤러를 제어하기위한 파드 및 리소스 생성 파일 다운로드

#git clone https://github.com/kubernetes/ingress-nginx

#cd ./ingress-nginx/deploy/static/provider/baremetal

 

ingress-controller를 생성하고 생성 결과를 확인한다. 생성 결과 ingress-controller의 NodePort 주소는 http의 경우 31208로 생성되었음을 알 수 있다.

root@master:~/ingress-nginx/deploy/static/provider/baremetal# kubectl apply -k .
namespace/ingress-nginx unchanged
serviceaccount/ingress-nginx unchanged
serviceaccount/ingress-nginx-admission unchanged
role.rbac.authorization.k8s.io/ingress-nginx unchanged
role.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx unchanged
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission unchanged
configmap/ingress-nginx-controller unchanged
service/ingress-nginx-controller unchanged
service/ingress-nginx-controller-admission unchanged
deployment.apps/ingress-nginx-controller configured
job.batch/ingress-nginx-admission-create unchanged
job.batch/ingress-nginx-admission-patch unchanged
ingressclass.networking.k8s.io/nginx unchanged
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission configured
root@master:~/ingress-nginx/deploy/static/provider/baremetal#
root@master:~/ingress-nginx/deploy/static/provider/baremetal#
root@master:~/ingress-nginx/deploy/static/provider/baremetal# kubectl get deploy,svc,rs,pods,ing -n ingress-nginx
NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           33h

NAME                                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             NodePort    10.107.89.28   <none>        80:31208/TCP,443:32615/TCP   13h
service/ingress-nginx-controller-admission   ClusterIP   10.97.39.71    <none>        443/TCP                      13h

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-5f68dd5779   1         1         1       33h

NAME                                            READY   STATUS      RESTARTS   AGE
pod/ingress-nginx-admission-create-g5h4d        0/1     Completed   0          2d7h
pod/ingress-nginx-admission-patch-5lgx2         0/1     Completed   0          2d7h
pod/ingress-nginx-controller-5f68dd5779-7t4c7   1/1     Running     0          33h

 

생성된 ingress 테스트

 

윈도우 PC에서 테스트를 한다면 C:\Windows\System32\drivers\etc\hosts 파일을 열어서 아래 두 url 정보를 넣어준다. (앞에 노드 IP는 각자 환경에 맞게 넣는다.)

172.30.1.25 example.com
172.30.1.10 color.com

 

 

 

 

Rule에 example.com path에는 /yellow 가 정의 되어있지 않으므로 404 Not Found가 뜸을 볼 수 있다.

 

color.com:31208/ 접근 시 ingress rule에 맞게 yellow svc로 맵핑이 되는것을 볼 수 있다.

 

 

-- The End --