1. 아키텍처
- ExternalName SVC를 활용하여 서로 다른 Namespace에 있는 SVC로 Nginx Ingress를 설정한다.
2. ExternalName 서비스란?
- ExternalName는 클러스터 내부의 Pod가 외부 서비스에 도메인 이름을 통해 접근하는 데 사용된다.
- 이와 반대로 NodePort 및 LoadBalancer는 외부에서 클러스터 내부의 서비스에 접근하기 위해 사용된다.
- ExternalName 서비스 생성 시 셀렉터가 없고 DNS 이름을 사용한다.
- 사용 이유
- 외부 FQDN 주소가 바뀌더라도, CNAME은 그대로 유지할 수 있어 애플리케이션을 다시 작성하거나 빌드하지 않아도 된다.
- 외부 Domain을 마치 동일한 내부 서비스인 것처럼 참조할 수 있어 편리하다.
- 클러스터 내부에서도 내부 서비스를 다른 이름으로 참조할 수 있다.
# Example01
apiVersion: v1
kind: Service
metadata:
name: externalname-service
spec:
type: ExternalName
externalName: google.com #연결하려는 외부 도메인
# Example02
apiVersion: v1
kind: Service
metadata:
name: externalname-service
spec:
type: ExternalName
externalName: my.database.example.com #연결하려는 외부 도메인
# Example03
apiVersion: v1
kind: Service
metadata:
name: test02-svc-bridge
namespace: test01-ns
spec:
type: ExternalName
externalName: test02-svc.test02-ns #연결하려는 내부 서비스
3. 테스트 환경 구성
※ 본 테스트은 AKS(Azure Kubernetes Service)를 사용하여 Kubernetes 환경을 구성하였다.
1) test01-deploy와 test01-svc를 생성하는 yaml 파일
- kubectl apply -f test01.yaml 명령어로 리소스 배포
# test01.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test01-deploy
namespace: test01-ns
spec:
replicas: 1
selector:
matchLabels:
app: test01
template:
metadata:
labels:
app: test01
spec:
containers:
- name: test01
image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
ports:
- containerPort: 80
env:
- name: TITLE
value: "Hello Test01"
---
apiVersion: v1
kind: Service
metadata:
name: test01-svc
namespace: test01-ns
spec:
selector:
app: test01
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
2) test02-deploy와 test02-svc를 생성하는 yaml 파일
- kubectl apply -f test02.yaml 명령어로 리소스 배포
# test02.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: test02-deploy
namespace: test02-ns
spec:
replicas: 1
selector:
matchLabels:
app: test02
template:
metadata:
labels:
app: test02
spec:
containers:
- name: test02
image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
ports:
- containerPort: 80
env:
- name: TITLE
value: "Hello Test02"
---
apiVersion: v1
kind: Service
metadata:
name: test02-svc
namespace: test02-ns
spec:
selector:
app: test02
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
3) externalname type의 service를 생성하는 yaml 파일
- test02-svc를 test02-svc-bridge 라는 이름으로 externalname 서비스를 생성하여 클러스터 내부에서 참조한다.
- kubectl apply -f externalname.yaml 명령어로 리소스 배포
# externalname.yaml
apiVersion: v1
kind: Service
metadata:
name: test02-svc-bridge
namespace: test01-ns
spec:
type: ExternalName
externalName: test02-svc.test02-ns
4) Ingress를 생성하는 yaml 파일
- 외부에서 test01.lilyhub.shop으로 접속 시 test01-svc로 분기한다.
- 외부에서 test02.lilyhub.shop으로 접속 시 test02-svc-bridge으로 분기한다. 이때, test02-svc-bridge은 test02-svc을 참조한다.
- kubectl apply -f externalname.yaml 명령어로 리소스 배포
# ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: test01-ingress
namespace: test01-ns
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: “false”
spec:
ingressClassName: nginx
rules:
- host: test01.lilyhub.shop
http:
paths:
- path: /
backend:
service:
name: test01-svc
port:
number: 80
pathType: Prefix
- host: test02.lilyhub.shop
http:
paths:
- path: /
backend:
service:
name: test02-svc-bridge
port:
number: 80
pathType: Prefix
4. 도메인 레코드 설정
- 가비아에서 도메인 구매 후 DNS 설정 진행
- A 레코드로 각 도메인에 대한 IP를 Azure Application Gateway의 Frontend IP 주소로 등록한다.
5. 테스트 결과
1. 도메인으로 사이트 접속 테스트
a. http://test01.lilyhub.shop/
b. http://test02.lilyhub.shop/
2. nslookup 테스트
a. nslookup test01.lilyhub.shop
b. nslookup test02.lilyhub.shop
- 각 도메인 주소로 nslookup을 하게 되면 두 도메인 주소가 동일하게 Azure Application Gateway의 Frontend IP로 Lookup 되는 것을 확인할 수 있다.
- Azure Application Gateway의 Backend Pool은 ingress-nginx-controller의 EXTERNAL-IP로 설정되어 있다.
- ingress-nginx-controller SVC의 EXTERNAL-IP는 AKS에서 자동으로 생성되는 kubernetes-internal LB의 Frontend IP다.
참고
'Container > Kubernetes' 카테고리의 다른 글
[Kubernetes] AKS 클러스터 노드 접속 방법 (0) | 2024.03.07 |
---|---|
[AKS] Azure Key Vault Provider for Secrets Store CSI Driver 테스트 (0) | 2024.01.22 |
[Kubernetes] Network Policy 개념 및 적용 방법 (0) | 2024.01.09 |
[Kubernetes] Docker 및 Container 개념 정리 (1) | 2024.01.04 |
[Kubernetes] Helm을 사용하여 Nginx Ingress 설치 (0) | 2024.01.02 |