[Kubernetes] NKS를 이용한 ALB Ingress Controller 연동
이번에는 Public Cloud의 Kubernetes 서비스와 로드밸런서 서비스의 연동을 진행해본다.
Naver Cloud Platform(이하 NCP)의 Kubernetes 서비스, NKS를 이용해볼 것이며 로드밸런서에 SSL 인증서까지 연결하는 과정까지 진행해보도록 한다.
사용된 예제
NKS 클러스터 생성
NKS에 클러스터를 생성하고, 이 클러스터에 접속해서 작업하기 위해 몇가지 선행작업이 필요하다.
1. ncp-iam-authenticator 설치 및 설정
NKS의 API를 호출하기 위해 IAM 인증이 필요하다. 이를 위해 ncp-iam-authenticator를 다운받아야한다.
이후 authenticator에 API 인증키를 등록한다.
이 부분은 AWS CLI에 profile을 등록하는 방법과 유사하므로 쉽게 적용할 수 있다.
2. kubeconfig 설정
이제 NKS 클러스터에 접근할 config파일을 작성해주어야 한다. kubectl에서 이 config파일을 통해 NKS 클러스터에 접근할 수 있도록 하는 것이다.
+) KubeConfig에 대한 내용은 이쪽에서 좀 더 보도록 하자
create-kubeconfig 명령을 통해 kubeconfig파일을 작성한다.
ncp-iam-authenticator create-kubeconfig --region <region-code> --clusterUuid <cluster-uuid> --output kubeconfig.yaml
생성한 kubeconfig파일을 바탕으로 NKS 클러스터에 접근할 수 있는 것을 확인할 수 있다.
해당 kubeconfig파일을 환경변수로 등록해서 사용하는 것도 가능하다고 한다.
ALB Ingress Controller 설치
클러스터에 ALB Ingress Controller를 먼저 설치해준다.
kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/NaverCloudPlatform/nks-alb-ingress-controller/main/docs/install/pub/install.yaml
예시용 Deployment&Service 생성
공식 Docs에서 제공해주는 가이드를 기반으로 예시용 Deployment와 Service를 생성한다.
원활한 구분을 위해 각 deployment의 이미지와 포트를 약간 변경을 해주었다.
- /naver → httpd
- /cloud → tomcat
- /platform → nginx
apiVersion: v1
kind: Service
metadata:
name: naver
spec:
type: NodePort
selector:
app: naver
ports:
- port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: naver
spec:
replicas: 1
selector:
matchLabels:
app: naver
template:
metadata:
labels:
app: naver
spec:
containers:
- name: naver
image: httpd
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: cloud
spec:
type: NodePort
selector:
app: cloud
ports:
- port: 80
targetPort: 8080
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloud
spec:
replicas: 1
selector:
matchLabels:
app: cloud
template:
metadata:
labels:
app: cloud
spec:
containers:
- name: cloud
image: tomcat
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: platform
spec:
type: NodePort
selector:
app: platform
ports:
- port: 80
targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: platform
spec:
replicas: 1
selector:
matchLabels:
app: platform
template:
metadata:
labels:
app: platform
spec:
containers:
- name: platform
image: nginx
ports:
- containerPort: 80
'naver', 'cloud', 'platform' 이름으로 deployment와 service가 각각 생성된다.
Ingress 생성
이제 본격적으로 Ingress를 생성해 예제용 서비스와 연결을 해보도록 한다.
생성해볼 Ingress는 총 3가지로 각각 내용은 아래와 같다.
- 라우팅 예시
- URI 경로 기반 라우팅
- host 기반 라우팅
- SSL 인증서 설정 예시
URI 경로 기반 라우팅
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: path-ingress
spec:
ingressClassName: alb # ALB Ingress Controller와 연결
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를 apply한 뒤, 잠깐 대기하면 ALB 주소를 할당받는 것을 볼 수 있다.
할당된 주소로 접근하면 Ingress에 설정한 바와 같이 path별로 각각의 서비스에 연결되는 것을 확인할 수 있다.
host 기반 라우팅
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-ingress
spec:
ingressClassName: alb
rules:
- host: svc.naver.com
http:
paths:
- path: /*
pathType: Prefix
backend:
service:
name: naver
port:
number: 80
- host: svc.platform.com
http:
paths:
- path: /*
pathType: Prefix
backend:
service:
name: platform
port:
number: 80
svc.naver.com 호스트로 들어오는 요청은 naver 서비스로, svc.platform.com 호스트로 들어오는 요청은 platform 서비스로 라우팅되도록 설정되었다.
SSL 인증서 설정 + HTTPS 리다이렉트
이제 Ingress에 SSL 인증서를 연결시키고 HTTP로 들어오는 트래픽을 HTTPS로 리다이렉트 시키는 예제를 구현해본다.
우선, 실제 도메인과 SSL 인증서가 필요하다. 그리고 이 SSL 인증서는 NCP의 Certificate Manager로 생성한 것이여야 한다.
먼저 Certificate Manager로 SSL 인증서를 생성한다.
서비스 사용 신청을 하고, 인증서 발급으로 넘어가면 인증서 이름과 이 인증서에 연결될 도메인이름을 지정해준다.
다음으로 해당 도메인에 대한 소유권 인증의 방법을 설정한다. 이 부분은 AWS에서의 Certificate Manager와 동일하다.
인증서 발급 신청 후 인증까지 마치면 인증서 세부 정보 밑에 위치한 인증서 번호(Certificate No)값을 확인해주자
Certificate Manager를 통해 SSL 인증서가 생성되었으면 Ingress를 생성하도록 한다.
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS":443}]' # Listener의 프로토콜 및 포트 설정 리스트
alb.ingress.kubernetes.io/ssl-certificate-no: "1111111" # 프로토콜이 HTTPS인 리스너에 적용할 Certificate Manager의 인증서 번호
alb.ingress.kubernetes.io/ssl-redirect: "443" # SSL Redirect 대상 포트 설정
name: redirect-ingress
spec:
ingressClassName: alb
defaultBackend:
service:
name: platform
port:
number: 80
위와 같이 annotation에 listen-ports와 ssl-certificate-no, ssl-redirect 설정해주고 Ingress를 생성한다.
해당 도메인에 이 Ingress로 연결시킬 레코드를 생성한 뒤, 접속을 테스트한다.
Naver 인증서가 정상적으로 달려있고, HTTP롤 연결해도 HTTPS로 리다이렉트해주는 것을 확인할 수 있다.
ALB Ingress Controller의 어노테이션에 관한 내용은 아래 Docs를 참고