Amazon EKS의 사용자 지정 경로에서 Kubernetes 대시보드에 액세스하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2020년 4월 6일

Amazon Elastic Kubernetes Service(Amazon EKS)의 사용자 지정 경로에서 Kubernetes 대시보드에 액세스하려고 합니다.

간략한 설명

Kubernetes 대시보드에 액세스하려면 다음을 완료해야 합니다.

  1. 기존 자체 서명된 인증서를 생성하거나 사용한 다음 AWS Certificate Manager(ACM)에 인증서를 업로드합니다.
  2. NGINX 수신 컨트롤러를 배포하고 NodePort 서비스로 노출합니다.
  3. Application Load Balancer(ALB)의 모든 요청을 매니페스트 파일을 사용하여 앞서 배포한 NGINX 수신 컨트롤러로 전달하는 Application Load Balancer(ALB) 수신 컨트롤러에 대한 수신 객체를 생성합니다.
  4. Kubernetes 대시보드를 배포합니다.
  5. NGINX 수신 컨트롤러에 대한 수신을 생성합니다.

해결 방법은 다음과 같습니다.

  1. ALB는 모든 수신 트래픽을 NGINX 수신 컨트롤러로 전달합니다.
  2. NGINX 수신 컨트롤러는 수신 요청의 경로 패턴을 평가합니다(예: /custom-path/additonalcustompath).
  3. NGINX 수신 컨트롤러는 요청을 kubernetes-dashboard 서비스로 전달하기 전에 URL을 /additonalcustompath에 다시 작성합니다.

​해결 방법

기존의 자체 서명된 인증서를 생성 또는 사용한 다음 인증서를 ACM에 업로드

ALB와 함께 기존 ACM 인증서를 사용하려는 경우 이 단원의 단계를 건너뛸 수 있습니다.

참고: 다음 단계는 Amazon Linux Amazon Machine Image(AMI) 릴리스 2018.03에 적용됩니다.

1.    OpenSSL을 사용하여 프라이빗 키를 생성합니다.

openssl genrsa 2048 > kube-dash-private.key

2.    1단계에서 생성된 키를 사용하여 인증서를 생성합니다.

openssl req -new -x509 -nodes -sha1 -days 3650 -extensions v3_ca -key kube-dash-private.key > kube-dash-public.crt

중요: ALB는 정규화된 도메인 이름이 포함된 ACM 인증서만 리스너 443에 연결할 수 있도록 허용하므로 [일반 이름]에 정규화된 도메인을 제공해야 합니다.

출력은 다음과 비슷해야 합니다.

Country Name (2 letter code) [XX]:
State or Province Name (full name) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:   
Common Name (eg, your name or your server's hostname) []:kube-dashboard.com         ==>This is important
Email Address []:

3.    AWS 명령줄 인터페이스(AWS CLI)를 설치하고 자격 증명을 설정합니다.

4.    프라이빗 키와 인증서를 AWS 리전의 ACM에 업로드합니다.

aws acm import-certificate --certificate file://kube-dash-public.crt --private-key file://kube-dash-private.key --region us-east-1

참고: us-east-1을 사용자의 AWS 리전으로 바꿉니다.

출력은 다음과 유사합니다.

{
    "CertificateArn": "arn:aws:acm:us-east-1:your-account:certificate/your-certificate-id"
}

5.    ACM 콘솔을 열고 가져온 ACM 인증서에 도메인 이름이 표시되는지 확인합니다.

팁: 도메인 이름이 ACM 콘솔에 표시되지 않으면 유효한 정규화된 도메인 이름으로 인증서를 다시 생성합니다.

NGINX 수신 컨트롤러를 배포하고 NodePort 서비스로 노출

1.    NGINX 수신 컨트롤러 배포:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

2.    NGINX 수신 컨트롤러를 NodePort 서비스로 노출하려면 다음을 기반으로 ingress-controller-service.yaml 파일을 생성합니다.

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  # this setting is to make sure the source IP address is preserved.
  type: NodePort
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https

3.    매니페스트 파일을 적용합니다.

kubectl apply -f ingress-controller-service.yaml

ALB 수신 컨트롤러의 모든 요청을 매니페스트 파일을 사용하여 앞서 배포한 NGINX 수신 컨트롤러로 전달하는 ALB 수신 컨트롤러에 대한 수신 객체를 생성합니다.

1.    ALB 수신 컨트롤러 배포

2.    다음 alb-ingress.yaml 파일을 기반으로 ALB 수신 컨트롤러에 대한 수신 객체를 생성합니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: "alb-ingress"
  namespace: "ingress-nginx"
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:your-region:your-account-id:certificate/XXXX-XXXX-XXXX-XXXX-XXXXX
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
  labels:
    app: dashboard
spec:
  rules:
    - http:
        paths:
          - path: /*
            backend:
              serviceName: ssl-redirect
              servicePort: use-annotation
          - path: /*
            backend:
              serviceName: "ingress-nginx"
              servicePort: 80

참고: "alb.ingress.kubernetes.io/certificate-arn" 값을 ACM 인증서 ARN으로 바꿉니다.

앞의 매니페스트 파일은 다음 주석을 사용합니다.

A)"alb.ingress.kubernetes.io/scheme" 주석은 인터넷 연결 ALB를 생성합니다.
B)"alb.ingress.kubernetes.io/certificate-arn" 주석은 ACM 인증서 Amazon 리소스 이름(ARN)을 ALB의 443 리스너와 연결합니다.
C)"alb.ingress.kubernetes.io/listen-ports" 주석은 포트 80 및 443에 대한 리스너를 생성합니다.
D)"alb.ingress.kubernetes.io/actions.ssl-redirect" 주석은 포트 80으로 수신되는 모든 요청을 443으로 리디렉션합니다.

3.    이전 2단계의 매니페스트 파일을 적용합니다.

kubectl apply -f alb-ingress.yaml

Kubernetes 대시보드 배포

Kubernetes 대시보드를 배포하려면 자습서: Kubernetes 웹 UI 배포(대시보드)의 지침을 따르십시오.

NGINX 수신 컨트롤러에 대한 수신 생성

1.    다음 ingress-dashboard.yaml 파일을 기반으로 NGINX 수신 컨트롤러에 대한 수신을 생성합니다.

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: dashboard
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
  namespace: kubernetes-dashboard
spec:
  rules:
  - http:
      paths:
      - path: /dashboard(/|$)(.*)
        backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

참고: "nginx.ingress.kubernetes.io/rewrite-target" 주석은 요청을 백엔드 Pod로 전달하기 전에 URL을 다시 작성합니다. 경로의 경우 /dashboard(/|$)(.*)에서 (.*)는 Kubernetes 대시보드에 액세스하는 동안 생성되는 동적 URL을 저장합니다. "nginx.ingress.kubernetes.io/rewrite-target" 주석은 요청을 kubernetes-dashboard 서비스로 전달하기 전에 URL에서 캡처된 데이터를 대체합니다.

2.    매니페스트 파일 ingress-dashboard.yaml을 적용합니다.

kubectl apply -f ingress-dashboard.yaml

3.    앞서 생성한 alb-inressADDRESS에서 ALB URL을 확인합니다.

kubectl get ingress alb-ingress -n ingress-nginx

이제 ALB-URL/dashboard/를 사용하여 Kubernetes 대시보드에 액세스할 수 있습니다.

중요: 사용자가 대시보드에 액세스할 수 있도록 하려면 URL에 후행 슬래시를 추가해야 합니다.

참고: ALB 상태 확인은 기본적으로 경로 "/"에서 수행되고 200 성공 코드가 예상되므로 ALB 대상은 비정상 상태를 보고합니다. 하지만 NGINX 수신 컨트롤러는 경로 "/"에서 404를 반환합니다. /대시보드(/|$)(.*) 경로만 구성했기 때문입니다. 모든 대상이 비정상 상태이기 때문에 요청은 여전히 대상으로 라우팅됩니다.

앞서 생성한 리소스를 정리합니다.

1.    NGINX 수신 컨트롤러에 대한 수신 삭제:

kubectl delete -f ingress-dashboard.yaml

2.    Kubernetes 대시보드 구성 요소 및 Metrics Server 삭제:

kubectl delete -f eks-admin-service-account.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta8/aio/deploy/recommended.yaml

kubectl delete -f metrics-server-$DOWNLOAD_VERSION/deploy/1.8+/

3.    alb-ingressalb-ingress-controller 구성 요소 삭제:

kubectl delete -f alb-ingress.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/alb-ingress-controller.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller/v1.1.4/docs/examples/rbac-role.yaml

참고: AWS Identity and Access Management(IAM) 리소스를 생성한 경우 IAM 역할과 IAM 정책을 삭제할 수 있습니다.

4.    NodePort 서비스 및 NGINX 수신 컨트롤러 삭제:

kubectl delete -f ingress-controller-service.yaml

kubectl delete -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/mandatory.yaml

5.    ACM 인증서를 생성했고 인증서를 삭제하려면 다음 명령 실행:

aws acm delete-certificate --certificate-arn arn:aws:acm:us-east-1:your-account-id:certificate/XXXX-XXXX-XXXX-XXXX-XXXXX --region us-east-1

참고: certificate-arn을 사용자의 인증서 ARN으로 바꿉니다. us-east-1을 사용자의 AWS 리전으로 바꿉니다. your-account-id를 사용자의 계정 ID로 바꿉니다.


이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?