Transport Layer Security (TLS) 証明書を使用して Amazon Elastic Kubernetes Service (Amazon EKS) アプリケーションの HTTPS 接続を有効にしたいと考えています。
簡単な説明
Amazon EKS アプリケーションの HTTPS 接続を有効にするには、以下を行う必要があります。
解決方法
カスタムドメインの有効な TLS 証明書を取得します。
1. カスタムドメインのパブリック AWS Certificate Manager (ACM) 証明書をリクエストするか、独自の TLS 証明書を ACM にアップロードします。
2. ロードバランサーの HTTPS リスナーで使用する証明書の Amazon リソースネーム (ARN) を特定します。
3. 次のコマンドを実行し、サンプルの NGINX デプロイを作成します。
$ kubectl create deploy web --image=nginx --port 80 --replicas=3
4. Kubernetes ポッドが Amazon EKS クラスターにデプロイされていることを確認するには、次のコマンドを実行します。
$ kubectl get pods -l app=web
注: ポッドには app=webというラベルが付いています。このラベルを Kubernetes サービスのオブジェクトのセレクタとして使用して、一連のポッドを特定できます。
ロードバランサーサービスタイプを使用して Kubernetes サービスを公開する
注: 入力オブジェクトを使用してアプリケーションを公開するには、「入力オブジェクトを使用して Kubernetes** サービスを公開する**」セクションに進んでください。
1. service.yaml マニフェストファイルを作成するには、サービスタイプ** LoadBalancer**を使用します。
cat <<EOF > loadbalancer.yaml
apiVersion: v1
kind: Service
metadata:
name: lb-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-tls-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
# Only run TLS on the port named "https" below.
service.beta.kubernetes.io/aws-load-balancer-tls-ports: "https"
# By default In-tree controller will create a Classic LoadBalancer if you require a NLB uncomment below annotation.
# service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
selector:
app: web
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 80
type: LoadBalancer
EOF
2. アノテーション service.beta.kubernetes.io/aws-load-balancer-tls-cert を編集して ACM の ARN を含めます。
3. loadbalancer.yaml ファイルを適用するには、次のコマンドを実行します。
$ kubectl create -f loadbalancer.yaml
4. 「カスタムドメインをロードバランサーの DNS に関連付ける」 セクションに進んでください。
入力オブジェクトを使用して Kubernetes サービスを公開する
注: 以下の解決方法では、Amazon EKS クラスターに AWS Load Balancer Controller がインストールされていることを前提としています。
1. 次の例に基づいて、NodePort タイプの Kubernetes サービスを作成します。
cat <<EOF > ingressservice.yaml
apiVersion: v1
kind: Service
metadata:
name: web-nginx
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: NodePort
selector:
app: web
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: "web-nginx-ingress"
annotations:
# Below annotation is to specify if the loadbalancer is "internal" or "internet-facing"
alb.ingress.kubernetes.io/scheme: internet-facing
# TODO: Fill in with the ARN of your certificate.
alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
# TODO: Fill in the listening ports.
alb.ingress.kubernetes.io/listen-ports: '\[{"HTTP": 80}, {"HTTPS":443}\]'
# Set HTTP to HTTPS redirects. Every HTTP listener configured will be redirected to below mentioned port over HTTPS.
alb.ingress.kubernetes.io/ssl-redirect: '443'
labels:
app: web
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: "web-nginx"
port:
number: 80
EOF
注: 前述の入力マニフェストは HTTP と HTTPS をリスニングルし、ALB で TLS を終了して、HTTP を HTTPS にリダイレクトします。
2. ingressservice.yaml ファイルを適用するには、次のコマンドを実行します。
$ kubectl create -f ingressservice.yaml
カスタムドメインをロードバランサーの DNS に関連付ける
1. LoadBalancer タイプのサービスの DNS URL を返すには、次のコマンドを実行します。
$ kubectl get service
2. Ingress タイプのサービスの DNS URL を返すには、次のコマンドを実行します。
$ kubectl get ingress/web-nginx-ingress
3. カスタムドメイン名をロードバランサー名に関連付けます。
4. ウェブブラウザで、次の HTTPS プロトコルを使用してカスタムドメインをテストします。
https://yourdomain.com