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

최종 업데이트 날짜: 2020년 11월 13일

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

간략한 설명

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

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

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

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

해결 방법

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

Application Load Balancer와 함께 기존 ACM 인증서를 사용하는 경우 NGINX 수신 컨트롤러 배포한 후 NodePort 서비스로 표시 섹션으로 건너뜁니다.

참고: 다음 단계는 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

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

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

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)를 설치하고 자격 증명을 설정합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 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.    네임 스페이스 ingress-nginx 생성:

kubectl create ns ingress-nginx

2.    Helm 버전 3을 설치합니다.

3.    Helm을 사용하여 NGINX 수신 컨트롤러 배포:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
helm install nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --set controller.service.type=NodePort

Application Load Balancer 수신 컨트롤러에 대한 수신 개체 생성

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

1.    Application Load Balancer 수신 컨트롤러를 배포합니다.

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

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/healthcheck-path: /dashboard/
    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: "nginx-ingress-nginx-controller"
              servicePort: 80

참고: alb.ingress.kubernetes.io/certificate-arn을 ACM 인증서의 Amazon 리소스 이름(ARN)으로 바꿉니다.

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

"alb.ingress.kubernetes.io/scheme" 주석은 인터넷 연결 Application Load Balancer를 생성합니다.
"alb.ingress.kubernetes.io/certificate-arn" 주석은 ACM 인증서의 ARN을 Application Load Balancer의 443 리스너와 연결합니다.
"alb.ingress.kubernetes.io/listen-ports" 주석은 포트 80 및 443에 대한 리스너를 생성합니다.
"alb.ingress.kubernetes.io/actions.ssl-redirect" 주석은 포트 80으로 수신되는 모든 요청을 443으로 리디렉션합니다.
"alb.ingress.kubernetes.io/healthcheck-path" 주석은 상태 확인 경로를 /dashboard/로 설정합니다.

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
    nginx.ingress.kubernetes.io/configuration-snippet: |
      rewrite ^(/dashboard)$ $1/ redirect;
  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에서 캡처된 데이터를 대체합니다. "nginx.ingress.kubernetes.io/configuration-snippet" 주석은 ALB-URL/dashboard에 엑세스될 때만 URL을 재작성하여 후행 슬래시("/")를 추가합니다.

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

kubectl apply -f ingress-dashboard.yaml

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

kubectl get ingress alb-ingress -n ingress-nginx

이제 ALB-URL/dashboard/를 사용하여 Kubernetes 대시보드에 액세스할 수 있습니다. ALB-URL/dashboard에 액세스하면 후행 슬래시 (“/”)가 자동으로 URL에 추가됩니다.

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

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

helm uninstall nginx -n ingress-nginx

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 https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.6/components.yaml>

3.    alb-ingress 삭제:

kubectl delete -f alb-ingress.yaml

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

4.    ingress-nginx 네임 스페이스를 삭제합니다.

kubectl delete ns ingress-nginx

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로 바꿉니다.</p


이 문서가 도움이 되었나요?


결제 또는 기술 지원이 필요합니까?