본문 바로가기
Kubernetes

Ingress에서 다른 Namespace에 있는 Service로 라우팅 하기

by beann 2023. 7. 25.
반응형

기본적으로 Kubernetes에서 Ingress는 Namespace에 종속적입니다.

따라서 A-namespace에 있는 Ingress는 B-Namespace에 있는 Service로 라우팅을 하지 못하는데요.

 

이를 해결하기 위해서는 External Name을 이용하면 됩니다.

 

그럼 External Name이란?

쉽게얘기하면 DNS의 CNAME 레코드라고 보시면 됩니다.

 

external-name.svc.namepsace-a.svc.cluster.local을 호출하면 Kubernets 클러스터 DNS서버는 해당 External Name에 대한 CNAME Record를 반환하게 됩니다. 다른 Service Object와 접근하는 방식은 동일하나, 프록시 or Forwarding 형태의 Service Object가 아니라, 단순히 DNS 매핑, Alias의 역할만 한다는 점에서 차이가 있습니다.

 

 

 

 

실습 진행


실습 목표: default namespace에 있는 Ingress에서 namespace-a에 있는 ade Service 와 연결 해보도록 하겠습니다.

 

목차

1. Deployment - ClusterIP 배포

2. ExternalName 배포

3. Ingress 배포

 

 

 

 

 

[Deployment]

* coffee, tea 서비스는 모두 이미 배포가 되어있는 상황입니다.

1. ade Deployment, Service를 배포합니다.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: ade
  namespace: namespace-a
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ade
  template:
    metadata:
      labels:
        app: ade
    spec:
      containers:
      - name: ade
        image: nginxdemos/nginx-hello:plain-text
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: ade-svc
  namespace: namespace-a
spec:
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP
    name: http
  selector:
    app: ade

 

 

 

[External Name 배포]

1. External Name 서비스 오브젝트를 배포합니다.

apiVersion: v1
kind: Service
metadata:
  annotations:
  name: my-ade-svc
spec:
  type: ExternalName

  # {Service Name}.{Namespace}.svc.cluster.local 형식으로 작성
  externalName: ade-svc.namespace-a.svc.cluster.local

 

 

 

[Ingress 배포]

1. Ingress 매니페스트 파일을 작성 및 수정합니다.

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cafe-ingress-uri
  annotations:
    cert-manager.io/cluster-issuer: "letsencrypt"
    cert-manager.io/acme-challenge-type: http01
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - kong-lab.site
    secretName: cafe-secret
  rules:
  - host: kong-lab.site
    http:
      paths:
      - path: /tea
        pathType: Prefix
        backend:
          service:
            name: tea-svc
            port:
              number: 80
      - path: /coffee
        pathType: Prefix
        backend:
          service:
            name: coffee-svc
            port:
              number: 80
      - path: /ade
        pathType: Prefix
        backend:
          service:

            # External Name Service의 이름을 입력합니다.
            name: my-ade-svc
            port:
              number: 80

 

 

 

[확인]

아래처럼 domain/ade 확인 결과 정상적으로 접속 되는 것을 확인할 수 있습니다.

 

[최종 아키텍처]

 

반응형