目的
- EKSで公開したサービスをhttpsにしたい!
目次
httpsを行う核心部分
前提
- ドメインを取得済み
- 便宜上
example5.com
を持っているとします - Route53でのドメインが簡単
- 便宜上
- ドメインの証明書はAmazon Certificate Manager(ACM)を使ってる
- 便宜上
*.example5.com
に対する証明書を持っているとします - ぽちぽちクリックするだけで取得可能
- 便宜上
参考
Route53でドメインを取る方法 dev.classmethod.jp
ACMでドメインに対する証明書を取得する blog.serverworks.co.jp
EKSへのログイン方法
クラスタをEKS作成している状態で、aws cli
を使います
$ aws sts get-caller-identity
これで自分のawsアカウントにログインできている状態で(aws cliのセットアップは割愛)
$ aws eks --region ap-northeast-1 update-kubeconfig --name sample
EKSでnginxをデプロイします
- deployment
cat <<EOF | kubectl apply -f - apiVersion: apps/v1 kind: Deployment metadata: name: my-nginx spec: selector: matchLabels: app: my-nginx replicas: 1 template: metadata: labels: app: my-nginx spec: containers: - name: my-nginx image: nginx ports: - containerPort: 80 EOF
確認
k8sクラスタ内からしかアクセスできないので、クラスタ内にbusybox
コンテナを立てて確認する
まずはipアドレスを確認(EKSクラスタ内のプライベートなIPアドレス)
kubectl get po -o=wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES my-nginx-75897978cd-kxmhn 1/1 Running 0 96s 172.31.9.104 ip-172-31-7-95.ap-northeast-1.compute.internal <none> <none> my-nginx-75897978cd-sxs6k 1/1 Running 0 96s 172.31.7.192 ip-172-31-7-95.ap-northeast-1.compute.internal <none> <none>
Podが2個たっていて、172.31.9.104
と172.31.7.192
だということがわかる
busyboxをたてる
$ kubectl run --rm -it --image=busybox --restart=Never nginx-test sh
これでコンテナに入れるので、ここからwget
で確認する
/ # wget -O - 172.31.9.104 Connecting to 172.31.9.104 (172.31.9.104:80) writing to stdout <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...略
無事にnginxのメッセージが帰ってきました
serviceをたてる
とりあえずはhttp
で通信できるサービスをたてる
$ cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: my-nginx ports: - name: http port: 80 targetPort: 80 type: LoadBalancer EOF
$ kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.100.0.1 <none> 443/TCP 15m my-service LoadBalancer 10.100.4.181 a127d8af5450f4f43bfb21d5fe3a7800-1476400784.ap-northeast-1.elb.amazonaws.com 80:31724/TCP 5m17s
EC2のロードバランサをAWSのコンソールから確認
自動的にロードバランサが作られています
a127d8af5450f4f43bfb21d5fe3a7800-1476400784.ap-northeast-1.elb.amazonaws.com
これがELBのエンドポイント
この名前が伝搬するまでちょとっとかかりますので、watchしながらIPアドレスが帰ってくるまで待つ
$ watch nslookup a127d8af5450f4f43bfb21d5fe3a7800-1476400784.ap-northeast-1.elb.amazonaws.com
** server can't find hogehoge.ap-northeast-1.elb.amazonaws.com: NXDOMAIN
という表示ではなく、
こんなふうにレスポンスが来たら準備完了
Non-authoritative answer: Name: a127d8af5450f4f43bfb21d5fe3a7800-1476400784.ap-northeast-1.elb.amazonaws.com Address: 52.196.124.185 Name: a127d8af5450f4f43bfb21d5fe3a7800-1476400784.ap-northeast-1.elb.amazonaws.com Address: 52.198.121.155
$ curl a127d8af5450f4f43bfb21d5fe3a7800-1476400784.ap-northeast-1.elb.amazonaws.com
さきほどのnginxと同じレスポンスがあるはず
名前をつける
Route53でルーティングをする 以下のように設定する
レコードセットを作成
を選択する名前を
nginx.example5.com
として登録- エイリアスを「はい」
- 先程作られたCLBを選択
- [作成]をクリック
確認する
しばらく待ってみると
$ curl nginx.example5.com
でnginxの返答がある
httpsにする
httpsにする
- 参考にしたのはこちら
kubernetes.io
上記を参考に、service
のyamlを変更
$ cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Service metadata: name: my-service annotations: service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012 spec: selector: app: my-nginx ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 80 type: LoadBalancer EOF
このような感じになりました。
解説
annotations: service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https" service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:us-east-1:123456789012:certificate/12345678-1234-1234-1234-123456789012
このannotations
の部分がキモのようで
この情報にあわせてLoadBalancerを作ってくれます
service.beta.kubernetes.io/aws-load-balancer-backend-protocol
service.beta.kubernetes.io/aws-load-balancer-ssl-ports
- ELBが何で受けるか、という指定
https
で受ける指定
service.beta.kubernetes.io/aws-load-balancer-ssl-cert
確認
$ curl nginx.example5.com
これでnginxのレスポンスがあればOK
まとめ
service
のanotations
で色々書くとLB設定に反映される