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

最終更新日: 2020 年 11 月 13 日

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

簡単な説明

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

  1. 自己署名証明書を作成してから (または既存の証明書を使用して)、その証明書を AWS Certificate Manager (ACM) にアップロードします。
  2. NGINX Ingress Controller をデプロイし、NodePort サービスとして公開します。
  3. Application Load Balancer イングレスコントローラー用のイングレスオブジェクトを作成します。これは、Application Load Balancer からのすべてのリクエストを、デプロイする NGINX イングレスコントローラーにマニフェストファイルを使って転送します。
  4. Kubernetes ダッシュボードをデプロイします。
  5. NGINX Ingress Controller 用のイングレスを作成します。

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

  1. Application Load Balancer は、すべての着信トラフィックを NGINX Ingress Controller に転送します。
  2. NGINX Ingress Controller は、着信リクエストのパスパターンを評価します (例えば、/custom-path/additonalcustompath)。
  3. NGINX Ingress Controller は、リクエストを kubernetes-dashboard サービスに転送する前に、URL を /additonalcustompath に書き換えます。

解決方法

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

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

注: 次の手順は、Amazon Linux Amazon マシンイメージ (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 にアタッチできるため、共通名に完全修飾ドメインを提供します。

出力は次のようになるはずです。

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 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 install nginx ingress-nginx/ingress-nginx --namespace ingress-nginx --set controller.service.type=NodePort

Application Load Balancer Ingress Controller 用の Ingress オブジェクトを作成します

Application Load Balancer Ingress Controller からマニフェストファイルを使用して先にデプロイした NGINX Ingress Controller にすべてのリクエストを転送する Ingress オブジェクトを作成する必要があります。

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

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

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 Ingress コントローラー用のイングレスを作成する

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

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」アノテーションは、リクエストをバックエンドポッドに転送する前に URL を書き換えます。path/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.    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


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?