Amazon EKS のカスタムパスで Kubernetes ダッシュボードにアクセスするにはどうすればよいですか?

所要時間4分
0

Amazon Elastic Kubernetes Service (Amazon EKS) のカスタムパスで Kubernetes ダッシュボードにアクセスしたいと考えています。

簡単な説明

Kubernetes ダッシュボードにアクセスするには、以下の手順を実行する必要があります。

1.    自己署名証明書を作成してから (または既存の証明書を使用して)、その証明書を AWS Certificate Manager (ACM) にアップロードします。

2.    NGINX Ingress Controller をデプロイし、NodePort サービスとして公開します。

3.    Application Load Balancer Ingress Controller 用にイングレスオブジェクトを作成します。イングレスオブジェクトに、Application Load Balancer からのすべてのリクエストを、マニフェストファイルを使用してデプロイした NGINX Ingress Controller に転送させます。

4.    Kubernetes ダッシュボードをデプロイします。

5.    NGINX Ingress Controller 用のイングレスを作成します。

解決方法の仕組みは次のとおりです。

1.    Application Load Balancer は、すべての着信トラフィックを NGINX Ingress Controller に転送します。

2.    NGINX Ingress Controller は、着信リクエストのパスパターンを評価します (例えば、/custom-path/additionalcustompath)。

3.    NGINX Ingress Controller は、リクエストを kubernetes-dashboard サービスに転送する前に、URL を /additonalcustompath に書き換えます。

注: このソリューションは、1.19 より古いバージョンの kubernetes を実行しているクラスターでは機能しません。

解決方法

自己署名証明書を作成するか、 または既存の自己署名証明書を使用して、ACM にアップロードする

Application Load Balancer で既存の ACM 証明書を使用する場合は、「NGINX Ingress Controller をデプロイし、NodePort サービスセクションとして公開する」に進んでください。

注: 次の手順は、Amazon Linux Amazon マシンイメージ (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

重要: [Common Name] (共通名) に完全修飾ドメインを指定します。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 Ingress Controller をデプロイし、NodePort サービスとして公開します

1.    次のように、名前空間 ingress-nginx を作成します。

kubectl create ns ingress-nginx

2.    Helm バージョン 3 をインストールします。

3.    Helm を使用して NGINX Ingress Controller をデプロイします。

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

注: nginx-ingress コントローラーを Fargate ノードで実行するには、「nginx-ingress-nginx-controller」デプロイで allowPrivilegeEscalation: false を設定してください

Application Load Balancer Ingress Controller 用のイングレスオブジェクトを作成する

マニフェストファイルを使用してイングレスオブジェクトを作成します。イングレスオブジェクトに、Application Load Balancer Ingress Controller からのすべてのリクエストを、以前にデプロイした NGINX Ingress Controller に転送させます。

1.    Application Load Balancer Ingress Controller をデプロイします。

2.    次の alb-ingress.yaml ファイルに基づいて、Application Load Balancer Ingress Controller 用のイングレスオブジェクトを作成します。

---
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 Ingress Controller 用のイングレスを作成する

1.    次の ingress-dashboard.yaml ファイルに基づいて、NGINX Ingress Controller 用のイングレスを作成します。

---
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」アノテーションは、リクエストをバックエンドポッドに転送する前に 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-ingressADDRESS にある Application Load Balancer の URL を確認します。

kubectl get ingress alb-ingress -n ingress-nginx

これで、ALB-URL/Dashboard/ を使用して Kubernetes ダッシュボードにアクセスできます。ALB-URL/dashboard にアクセスすると、末尾のスラッシュ (「/」) が URL に自動的に追加されます。

先に作成したリソースをクリーンアップする

1.    以下のように、NGINX Ingress Controller 用のイングレスを削除します。

helm uninstall nginx -n ingress-nginx

2.    次のように、Kubernetes ダッシュボードコンポーネントとメトリクスサーバーを削除します。

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-ngix 名前空間を削除します。

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公式更新しました 1年前
コメントはありません

関連するコンテンツ