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

5분 분량
0

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

간략한 설명

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

1.    기존 자체 서명된 인증서를 생성하거나 사용한 다음 AWS Certificate Manager (ACM)에 인증서를 업로드합니다.

2.    NGINX 수신 컨트롤러를 배포하고 NodePort 서비스로 노출합니다.

3.    Application Load Balancer 수신 컨트롤러에 대한 수신 객체 생성 수신 객체가 Application Load Balancer의 모든 요청을 매니페스트 파일을 사용하여 배포한 NGINX 수신 컨트롤러로 전달하도록 합니다.

4.    Kubernetes 대시보드를 배포합니다.

5.    NGINX 수신 컨트롤러에 대한 수신을 생성합니다.

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

1.    Application Load Balancer는 모든 수신 트래픽을 NGINX 수신 컨트롤러로 전달합니다.

2.    NGINX 수신 컨트롤러는 수신 요청의 경로 패턴을 평가합니다(예: /custom-path/additonalcustompath).

3.    NGINX 수신 컨트롤러는 요청을 kubernetes-대시보드 서비스로 전달하기 전에 URL을 /additonalcustompath에 다시 작성합니다.

참고: 이 솔루션은 1.19 이전의 kubernetes 버전을 실행하는 클러스터에서는 작동하지 않습니다.

해결 방법

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

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

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

1.    OpenSSL을 사용하여 자체 서명된 인증서 생성:

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout kube-dash-private.key -out kube-dash-public.crt

중요:****일반 이름에 대해 정규화된 도메인을 제공하십시오. Application Load Balancer는 정규화된 도메인 이름을 가진 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 Command Line Interface(AWS CLI)를 설치하고 자격 증명을 설정합니다.

참고: AWS CLI 명령을 실행할 때 오류가 발생하는 경우, 최신 버전의 AWS CLI를 사용하고 있는지 확인합니다.

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

aws acm import-certificate --certificate fileb://kube-dash-public.crt --private-key fileb://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 repo update
helm install nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --set controller.service.type=NodePort

참고: Fargate 노드에서 nginx-ingress 컨트롤러를 실행하려면 "nginx-ingress-nginx-controller" 배포에서 allowPrivilegeEscalation: false를 설정하세요.

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

매니페스트 파일을 사용하여 Ingress 객체 생성 수신 객체가 Application Load Balancer 수신 컨트롤러의 모든 요청을 이전에 배포한 NGINX 수신 컨트롤러로 전달하도록 합니다.

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

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

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: "alb-ingress"
  namespace: "ingress-nginx"
  annotations:
    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:
  ingressClassName: alb
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ssl-redirect
            port:
              name: use-annotation
      - path: /
        pathType: Prefix
        backend:
          service:
            name: "nginx-ingress-nginx-controller"
            port:
              number: 80

참고: alb.ingress.kubernetes.io/certificate-arn을 ACM 인증서의 Amazon 리소스 이름(ARN)으로 바꿉니다. Fargate에서 주석에 "alb.ingress.kubernetes.io/target-type: ip" 추가

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

"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: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard
  namespace: kubernetes-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;
spec:
  ingressClassName: nginx
  rules:
  - http:
      paths:
      - path: /dashboard(/|$)(.*)
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 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.    AWS Load Balancer Controller 삭제:

helm uninstall aws-load-balancer-controller -n kube-system

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

kubectl delete ns ingress-nginx

6.    생성한 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 공식
AWS 공식업데이트됨 일 년 전