AWS Certificate Manager (ACM) を使用して Amazon Elastic Kubernetes Service (Amazon EKS) ワークロードの HTTPS トラフィックを終了したいと考え考えています。
簡単な説明
Kubernetes Service オブジェクトの Elastic Load Balancing レベルで HTTPS トラフィックを終了するには、以下を実行する必要があります。
- カスタムドメインのパブリック ACM 証明書をリクエストします。
- タイプフィールドを LoadBalancer に設定して Kubernetes Service を公開します。
- Kubernetes ウェブサイトの service.beta.kubernetes.io/aws-load-balancer-ssl-cert アノテーションを使用して、Kubernetes Service で ACM 証明書の Amazon リソースネーム (ARN) を指定します。このアノテーションにより、Kubernetes API サーバーが証明書の作成時にその証明書を Classic Load Balancer に関連付けることができます。
- カスタムドメインをロードバランサーに関連付けます。
次の解決策の前提は以下のとおりです。
- ワーカーノードが関連付けられたアクティブな Amazon EKS クラスターがあること。
- Classic Load Balancer を使用していること。
**注:**Application Load Balancer を使用するには、Amazon EKS にアプリケーションロードバランシングをデプロイする必要があります。
**注:**Network Load Balancer での TLS 接続の終了は、Kubernetes 1.15 以降でのみサポートされています。詳細については、Kubernetes ウェブサイトのSupport TLS termination with AWS NLB」を参照してください。
解決策
1.カスタムドメインのパブリック ACM 証明書をリクエストします。
2.ロードバランサーの HTTPS リスナーで使用する証明書の ARN を特定します。
3.Amazon EKS クラスターに登録されているノードを識別するには、kubectl が設定されている環境で次のコマンドを実行します。
$ kubectl get nodes
4.テキストエディターで、以下に基づいて deployment.yamlマニフェストファイルを作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo-deployment
spec:
replicas: 3
selector:
matchLabels:
app: echo-pod
template:
metadata:
labels:
app: echo-pod
spec:
containers:
- name: echoheaders
image: k8s.gcr.io/echoserver:1.10
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
5.次のコマンドを実行して、Kubernetes Deploymentオブジェクトを作成します。
$ kubectl create -f deployment.yaml
6.次のコマンドを実行して、Kubernetes ポッド が Amazon EKS クラスターにデプロイされていることを確認します。
$ kubectl get pods
**注:**ポッドには app=echo-podというラベルが付いています。このラベルを Service オブジェクトのセレクタとして使用して、一連のポッドを特定できます。
7.テキストエディターで、次の例に基づいて service.yaml マニフェストファイルを作成します。次に、service.beta.kubernetes.io/aws-load-balancer-ssl-cert アノテーションを編集して、ステップ 2 の ACM ARN を指定します。
apiVersion: v1
kind: Service
metadata:
name: echo-service
annotations:
# Note that the backend talks over HTTP.
service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
# TODO: Fill in with the ARN of your certificate.
service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
# Only run SSL on the port named "https" below.
service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
selector:
app: echo-pod
ports:
- name: http
port: 80
targetPort: 8080
- name: https
port: 443
targetPort: 8080
type: LoadBalancer
8.次のコマンドを実行して、Service オブジェクトを作成します。
$ kubectl create -f service.yaml
9.次のコマンドを実行して、LoadBalancer タイプのサービスの DNS URL を返すように設定します。
$ kubectl get service
**注:**クラスターで多数のアクティブなサービスが実行されている場合は、コマンド出力から LoadBalancer タイプの正しいサービスの URL を取得します。
10.Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開き、[ロードバランサー] を選択します。
11.ロードバランサーを選んで、**[リスナー]**を選択します。
12.[リスナー ID] で、ロードバランサーのポートが 443に設定されていることを確認します。
13.SSL 証明書については、YAML ファイルで定義した SSL 証明書がロードバランサーにアタッチされていることを確認します。
14. カスタムドメイン名をロードバランサー名に関連付けます。
15.ウェブブラウザで、次の HTTPS プロトコルを使用してカスタムドメインをテストします。
https://yourdomain.com
正常に応答すると、クライアントの詳細が記載された Web ページが返されます。この応答には、ホスト名、ポッド情報、サーバー値、リクエスト情報、およびリクエストヘッダーが含まれます。
**重要:**ACM との統合によって4096 ビットの RSA キーまたは EC キーを含む証明書をロードバランサーにインストールすることはできません。ロードバランサーでキーを使用するには、4096 ビット RSA キーまたは EC キーを含む証明書を AWS ID AWS Identity and Access Management (IAM) にアップロードする必要があります。次に、service.beta.kubernetes.io/aws-load-balancer-ssl-cert アノテーションが付いた対応する ARN を使用します。