프로그래밍

[K8S] Ingress 에서 다른 Namespace 의 Service 연결

tedhong 2023. 4. 11. 17:51

서론

  • 개발을 위해 develop namespace에서 만 ingress를 운영하다가 live 배포를 위해 live namespace 에도 ingress를 생성했습니다. 
  • 그런데 기존에 잘 접속이 되던 develop namespace 의  Service에 접속하면 502, 404 에러를 뱉어내며 연결이 되지 않았습니다. 
  • 알아보니 동일한 포트를 사용하는 ingress 가 여러개 생성되면 나중에 선언된 ingress의 port 가
    기존 port를 덮어써 버리기 때문에 발생하는 문제였습니다.
  • 그래서 ingress 는 하나로 운영하되 다른 namespace의 Service를 호출하는 방법을 사용하기로 했습니다.

내용

Sevice - ExternalName 사용

  1. ingress 와 동일한 namespace에 ExternalName type의 Service를 선언합니다. 
apiVersion: v1
kind: Service
metadata:
  name: {ingress에서불러올Service이름}
  namespace: {ingress와동일한namespace}
spec:
  type: ExternalName
  externalName: {서비스명}.{Namespace명}.svc.cluster.local

예시) live 라는 namespace에 있는 live-cms-be 서비스를
develop라는 namespace에 live-cms-service라는 이름의 Service로 선언합니다.

apiVersion: v1
kind: Service
metadata:
  name: live-cms-service
  namespace: develop
spec:
  type: ExternalName
  externalName: live-cms-be.live.svc.cluster.local

2. ingress에 위에서 등록한 Service를 추가합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dev-nginx-ingress
  namespace: develop
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false" 
spec:
  ingressClassName: nginx
  rules:
    - host : 'test.tedhome.net'
      http:
        paths:
          - path: /
            backend:
              service:
                name: live-cms-service #위에서 선언한 Service 명입니다. 
                port:
                  number: 80

Ingress의 이름은 dev-nginx-ingress,  Namespace 이름은 develop입니다.

 

이렇게 하면 develop이라는 Namespace에 등록된 Ingress에서

live라는 namespace의 live-cms-be라는 Service를 호출할 수 있게 됩니다.

 

더보기

환경정보

  • ncloud 의 Kubernetes Service 사용
  • K8S version : 1.23.9
  • nginx ingress Class 사용