본문 바로가기

NCP

[NCP] NKS 에서 Ingress 활용하기

반응형

 

Kubernetes에서 Ingress는 클러스터의 외부의 요청을 Ingresss 리소스에 정의된 규칙에 따라 클러스터 내부의 서비스로 연결합니다.

Kubectl을 통한 Ingress 를 배포해보려고 합닌다.

 

아래의 모든 예제는 네이버클라우드플랫폼의 가이드에 자세히 적혀있으니 참고하시며 따라가시는 것을 추천드립니다.

https://guide.ncloud-docs.com/docs/k8s-k8sexamples-ingress

Kubectl을 통한 Ingresss 배포 예제

 

Ingress-nginx 를 설치합니다.

root@ptty-nks-mgmt:~# k apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
serviceaccount/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
configmap/ingress-nginx-controller created
service/ingress-nginx-controller created
service/ingress-nginx-controller-admission created
deployment.apps/ingress-nginx-controller created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
ingressclass.networking.k8s.io/nginx created
validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

 

 

ingress-nginx 파드의 상태를 확인합니다.

root@ptty-nks-mgmt:~# k get pod -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-g2snw        0/1     Completed   0          38s
ingress-nginx-admission-patch-t95vp         0/1     Completed   1          38s
ingress-nginx-controller-79d66f886c-mrvj8   1/1     Running     0          38s

 

 

LoadBalancer의 생성 여부를 확인합니다.

root@ptty-nks-mgmt:~# k get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   198.19.226.240   ingress-ngi-ingress-ngin-fb648-23327455-3478a148d4bd.kr.lb.naverncp.com   80:30634/TCP,443:31877/TCP   83s
ingress-nginx-controller-admission   ClusterIP      198.19.163.235   <none>                                                                    443/TCP                      83s

 

  • Load Balancer의 생성이 완료되면 EXTERNAL-IP의 값이 pending에서 실제 IP 주소로 변경됩니다.

라우팅 예제

라우팅 예제에서는 서로 다른 정보를 가진 예제용 Deployment와 Service를 사용합니다. 예제용 Deployment들은 자신의 호스트 정보를 표시하기 위한 nginx container이며, 예제용 Service들은 NodePort 타입으로 생성된 Service 입니다.

Deployment와 Service를 생성합니다.

root@ptty-nks-mgmt:~# k apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/examples/pub/nks-alb-ingress-sample-services.yaml
service/naver created
deployment.apps/naver created
service/cloud created
deployment.apps/cloud created
service/platform created
deployment.apps/platform created

 

Deployment와 Service의 상태를 확인합니다.

root@ptty-nks-mgmt:~# k get pod
NAME                        READY   STATUS    RESTARTS   AGE
cloud-6655659687-s6ml7      1/1     Running   0          6m26s
naver-5675f76cf-4qb4x       1/1     Running   0          6m26s
platform-5985bd5cb7-2xngt   1/1     Running   0          6m26s
root@ptty-nks-mgmt:~# k get svc
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
cloud        NodePort    198.19.222.134   <none>        80:32582/TCP   6m28s
kubernetes   ClusterIP   198.19.128.1     <none>        443/TCP        28d
naver        NodePort    198.19.245.253   <none>        80:30996/TCP   6m28s
platform     NodePort    198.19.209.119   <none>        80:30555/TCP   6m28s

 

 

ingress-nginx의 로드밸런서 접속 정보를 저장합니다.

root@ptty-nks-mgmt:~# export nginx_address=$(kubectl get svc -n ingress-nginx ingress-nginx-controller -o jsonpath={.status.loadBalancer.ingress[*].hostname})
root@ptty-nks-mgmt:~# echo $nginx_address
ingress-ngi-ingress-ngin-fb648-23327455-3478a148d4bd.kr.lb.naverncp.com

 

 

 

URI 기반 라우팅 예제

생성한 Ingress Service의 External IP에 표시되는 path 별로 라우팅하여 /naver, /cloud, /platform 으로 요청할 때 각각 다른 서비스로 연결되도록 설정할 수 있습니다.

 

아래와 같이 Ingress의 리소스를 각 path에 따라 다른 backend를 갖도록 설정하여 파일로 저장합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: path-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /naver
        pathType: Prefix
        backend:
          service:
            name: naver
            port:
              number: 80
      - path: /cloud
        pathType: Prefix
        backend:
          service:
            name: cloud
            port:
              number: 80
      - path: /platform
        pathType: Prefix
        backend:
          service:
            name: platform
            port:
              number: 80

 

Ingress를 생성합니다.

root@ptty-nks-mgmt:~# k apply -f path-ingress.yaml 
ingress.networking.k8s.io/path-ingress created

 

*주의 : 예제에서는 TLS 설정을 하지 않았기 때문에 강제 리다이렉션을 막기 위해서 Ingress의 어노테이션에 nginx.ingress.kubernetes.io/ssl-redirect: "false"를 추가하였습니다. 만약 TLS를 설정할 시에는 해당 어노테이션을 제거하면 됩니다.

 

Ingress 를 확인합니다.

root@ptty-nks-mgmt:~# k get ingress
NAME           CLASS   HOSTS   ADDRESS                                                                   PORTS   AGE
path-ingress   nginx   *       ingress-ngi-ingress-ngin-fb648-23327455-3478a148d4bd.kr.lb.naverncp.com   80      2m7s

 

 

curl 을 통해 접속 결과를 확인하여 각자 다른 Service의 Pod로 접근하는 것을 확인합니다.

root@ptty-nks-mgmt:~# curl $nginx_address/naver
Server address: 198.18.0.202:80
Server name: naver-5675f76cf-4qb4x
Date: 29/Mar/2024:01:40:59 +0000
URI: /
Request ID: b3fcf987566da1ddb6bc937bbfb3ae4b

root@ptty-nks-mgmt:~# curl $nginx_address/cloud
Server address: 198.18.0.18:80
Server name: cloud-6655659687-s6ml7
Date: 29/Mar/2024:01:41:09 +0000
URI: /
Request ID: 458a1ea3ebcce11f774b9ad8d81a32e5

root@ptty-nks-mgmt:~# curl $nginx_address/platform
Server address: 198.18.0.150:80
Server name: platform-5985bd5cb7-2xngt
Date: 29/Mar/2024:01:41:20 +0000
URI: /
Request ID: 9b7919b126d5c315c8df81804f50cf4b

 

 

호스트 기반 라우팅 예제

동일한 External IP에 대해 각각 다른 도메인으로 요청 시 각각 다른 서비스로 연결되도록 설정할 수 있습니다.

호스트 기반 라우팅 예제입니다.

Ingress의 리소스를 각 host에 따라 다른 backend를 갖도록 설정하여 파일로 저장합니다.

 

svc.naver.com 으로 요청하라 경우 naver로, svc.cloud.com으로 요청할 경우 cloud로, 기본 요청의 경우 platform으로 연결하도록 설정합니다.

 

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: host-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
  ingressClassName: nginx
  rules:
  - host: "svc.naver.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: naver
            port:
              number: 80
  - host: "svc.cloud.com"
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: cloud
            port:
              number: 80
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: platform
            port:
              number: 80

 

 

Ingress 를 생성합니다.

root@ptty-nks-mgmt:~# k apply -f host-ingress.yaml 
ingress.networking.k8s.io/host-ingress created

 

 

Ingress를 확인합니다.

root@ptty-nks-mgmt:~# k get ingress
NAME           CLASS   HOSTS                         ADDRESS                                                                   PORTS   AGE
host-ingress   nginx   svc.naver.com,svc.cloud.com   ingress-ngi-ingress-ngin-fb648-23327455-3478a148d4bd.kr.lb.naverncp.com   80      33s

 

 

curl 명령에 -H host 옵션을 추가한 후 호스트별 접속 결과를 확인하여 각각 다른 서비스로 연결 되는지 확인합니다.

 

root@ptty-nks-mgmt:~# curl -H host:svc.naver.com $nginx_address
Server address: 198.18.0.202:80
Server name: naver-5675f76cf-4qb4x
Date: 29/Mar/2024:01:49:14 +0000
URI: /
Request ID: 70670e88a9f37279c7432189d315f140

root@ptty-nks-mgmt:~# curl -H host:svc.cloud.com $nginx_address
Server address: 198.18.0.18:80
Server name: cloud-6655659687-s6ml7
Date: 29/Mar/2024:01:49:20 +0000
URI: /
Request ID: ba3e34ec5718c57edb3dbc73140d6524

root@ptty-nks-mgmt:~# curl $nginx_address
Server address: 198.18.0.150:80
Server name: platform-5985bd5cb7-2xngt
Date: 29/Mar/2024:01:49:26 +0000
URI: /
Request ID: 010f6297c247a5ce7685c2cc8dde7b78

 

*참고 : 위 예제에서 호스트로 설정한 도메인은 실제로는 존재하지 않는 도메인이므로 실행하기 위해서는 curl 명령에 -H host 옵션이 포함되어야 합니다.

 

 

 

Kubernetes에서 Ingress를 배포하고 라우팅을 설정하는 방법에 대해 자세히 알아보았습니다. 이를 통해 외부에서 클러스터 내의 서비스로 트래픽을 안전하게 라우팅할 수 있습니다. Ingress를 활용하면 여러 도메인 또는 경로에 따라 다른 서비스로 연결할 수 있으며, 이는 애플리케이션의 유연성을 높이고 관리를 용이하게 합니다.

Kubernetes의 Ingress는 클러스터의 외부와 내부를 연결하고 트래픽을 효율적으로 관리하는 중요한 기능입니다. Ingress를 올바르게 구성하고 관리함으로써 애플리케이션의 가용성과 확장성을 향상시킬 수 있습니다.

많은 Kubernetes 관련된 지식을 습득하여 나은 애플리케이션 배포 관리를 위해 노력하시기 바랍니다! 문제가 있거나 궁금한 점이 있으면 언제든지 물어보세요. 함께 해결해 나가겠습니다!