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를 생성합니다.
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와 관련된 지식을 습득하여 더 나은 애플리케이션 배포 및 관리를 위해 노력하시기 바랍니다! 문제가 있거나 궁금한 점이 있으면 언제든지 물어보세요. 함께 해결해 나가겠습니다!
'NCP' 카테고리의 다른 글
[NCP] NKS 에서 블록스토리지 CSI 기능 사용하기 (1) | 2024.03.28 |
---|---|
[NCP] Clova Studio 사용하기 - 플레이그라운드 (0) | 2024.03.07 |
[NCP] 서버 접근 제어를 통해 Object Storage 사용하기 (0) | 2024.01.25 |
[NCP] API Gateway를 활용한 API 개발과 비즈니스 로직 실행 (0) | 2023.12.05 |
[NCP] 공공클라우드 환경 Redis Cluster 연동 오류 관련 (0) | 2023.11.20 |