Amazon EKS のカスタムパスで Kubernetes ダッシュボードにアクセスする方法を教えてください。

最終更新日: 2020 年 4 月 6 日

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

簡単な説明

Kubernetes ダッシュボードにアクセスするには、以下を完了する必要があります。

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

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

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

解決方法

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

ALB で既存の ACM 証明書を使用する場合は、このセクションの手順をスキップできます。

注意: 以下の手順は、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

重要: ALB では、完全修飾ドメイン名を持つ 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) をインストールし、認証情報を設定します。

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.    NGINX Ingress Controller をデプロイします。

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

2.    NGINX Ingress Controller を 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 Ingress Controller からのすべてのリクエストをマニフェストファイルを使用して以前にデプロイした NGINX Ingress Controller に転送する ALB Ingress Controller の Ingress オブジェクトを作成する

1.    ALB Ingress Controller をデプロイします。

2.    次の alb-ingress.yaml ファイルに基づいて ALB 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/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 Ingress Controller の Ingress を作成する

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

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」の注釈は、リクエストをバックエンドポッドに転送する前に 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-ingressADDRESS の ALB URL を確認します。

kubectl get ingress alb-ingress -n ingress-nginx

これで ALB-URL/dashboard/ を使用して Kubernetes ダッシュボードにアクセスできるようになりました。

重要: ユーザーがダッシュボードにアクセスできるようにするには、URL の末尾にスラッシュを追加する必要があります。

注意: ALB ターゲットは異常な状態を報告します。デフォルトでは、ALB ヘルスチェックはパス「/」で実行され、200 の成功コードが予期されるためです。ただし、NGINX Ingress Controller はパス「/」で 404 を返します。これは、/dashboard(/|$)(.*) パスのみを設定したためです。すべてのターゲットのステータスが異常であるため、リクエストはターゲットにルーティングされます。

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

1.    NGINX Ingress Controller の Ingress を削除します。

kubectl delete -f ingress-dashboard.yaml

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 metrics-server-$DOWNLOAD_VERSION/deploy/1.8+/

3.    alb-ingress コンポーネントと alb-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 Ingress Controller を削除します。

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 に置き換えます。


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

改善できることはありますか?


さらにサポートが必要な場合