Study/K8s

[Kubernetes] NKS를 이용한 ALB Ingress Controller 연동

Omoknooni 2024. 3. 10. 17:24

이번에는 Public Cloud의 Kubernetes 서비스와 로드밸런서 서비스의 연동을 진행해본다.

Naver Cloud Platform(이하 NCP)의 Kubernetes 서비스, NKS를 이용해볼 것이며 로드밸런서에 SSL 인증서까지 연결하는 과정까지 진행해보도록 한다.

 

사용된 예제

 

ALB Ingress Controller 활용 예제

 

guide.ncloud-docs.com

 

NKS 클러스터 생성

NKS에 클러스터를 생성하고, 이 클러스터에 접속해서 작업하기 위해 몇가지 선행작업이 필요하다.

 

1. ncp-iam-authenticator 설치 및 설정

NKS의 API를 호출하기 위해 IAM 인증이 필요하다. 이를 위해 ncp-iam-authenticator를 다운받아야한다.

 

ncp-iam-authenticator 설치

 

guide.ncloud-docs.com

 

 

이후 authenticator에 API 인증키를 등록한다.

이 부분은 AWS CLI에 profile을 등록하는 방법과 유사하므로 쉽게 적용할 수 있다.

 

IAM 인증 kubeconfig 생성/업데이트

 

guide.ncloud-docs.com

 

2. kubeconfig 설정

이제 NKS 클러스터에 접근할 config파일을 작성해주어야 한다. kubectl에서 이 config파일을 통해 NKS 클러스터에 접근할 수 있도록 하는 것이다.

 

+) KubeConfig에 대한 내용은 이쪽에서 좀 더 보도록 하자

 

[Kubernetes] Security - Context, KubeConfig

kube 커맨드를 실행하기 위해 Kube API Server에 명령어를 Query해주어야한다.API Server에 Query하기 위해서는 User 인증을 위해 매번 User Certificate를 함께 보내주어야한다. kubectl get pods --server kubernetes.docker

blog.omoknooni.me

 

 

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가지로 각각 내용은 아래와 같다.

 

  1. 라우팅 예시
    1. URI 경로 기반 라우팅
    2. host 기반 라우팅
  2. 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를 참고

 

ALB Ingress Controller 설정

 

guide.ncloud-docs.com