AWS Certificate Manager (ACM) を使用して Amazon Elastic Kubernetes Service (Amazon EKS) ワークロードの HTTPS トラフィックを終了しようと考えています。
簡単な説明
Kubernetes Service オブジェクト用 Elastic Load Balancing レベルで HTTPS トラフィックを終了するには、以下を行う必要があります。
- カスタムドメインのパブリック ACM 証明書をリクエストします。
- [type] フィールドを LoadBalancer に設定して Kubernetes のサービスを公開します。
- Kubernetes ウェブサイトから、service.beta.kubernetes.io/aws-load-balancer-ssl-cert 注釈を使用して、Kubernetes サービスで 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) コンソールを開き、[Load Balancers] (ロードバランサー) を選択します。
11. ロードバランサーを選んで、[Listeners] を選択します。
12. [Listener ID] で、ロードバランサーポートが 443 に設定されていることを確認します。
13. [SSL Certificate] では、YAML ファイルで定義した SSL 証明書がロードバランサーにアタッチされていることを確認します。
14. カスタムドメイン名をロードバランサー名に関連付けます。
15. ウェブブラウザで、以下の HTTPS プロトコルを使用してカスタムドメインをテストします。
https://yourdomain.com
成功の応答は、クライアントの詳細が記載されたウェブページを返します。この応答には、ホスト名、ポッド情報、サーバー値、リクエスト情報、およびリクエストヘッダーが含まれます。
重要: ACM との統合により、4096 ビット RSA キーまたは EC キーを含む証明書をロードバランサーにインストールすることはできません。ロードバランサーでキーを使用するには、4096 ビット RSA または EC キーを含む証明書を AWS Identity and Access Management (IAM) にアップロードする必要があります。次に、対応する ARN を service.beta.kubernetes.io/aws-load-balancer-ssl-cert アノテーションと組み合わせて使用します。