MEAN StackをKubernetesで動かす(その2)
前回はHTTPでアクセスするところまでを行いました。
hi1280.hatenablog.com
今回はHTTPS対応を行います。
MEAN Stackのプログラム一式はこちら
github.com
実運用に耐えうることを想定して、以下の内容を含めています。
MongoDBの内容が前回までで、今回はHTTPS対応の話になります。
- MongoDBは可用性を高めるためにReplica Setで構成する
- 外部公開を考慮して、HTTPS対応を行う
cert-managerというKubernetes上で自動的にSSL証明書を管理してくれるパッケージを使います。
github.com
なお、cert-managerはまだ安定版ではないようなので、今回の内容が無効になる可能性があります。
事前のインストール
cert-managerをインストールするためにHelmというKubernetesのパッケージ管理ツールが必要です。
各環境に応じたHelmのクライアント環境をインストールします。
docs.helm.sh
KubernetesのクラスタにHelmとcert-managerをインストールします。
$ kubectl create serviceaccount -n kube-system tiller $ kubectl create clusterrolebinding tiller-binding \ --clusterrole=cluster-admin \ --serviceaccount kube-system:tiller $ helm init --service-account tiller $ helm repo update $ helm install --name cert-manager --namespace kube-system stable/cert-manager
cert-managerにおけるLet's Encryptのセットアップ
自分のemailアドレスを環境変数にセットします。
$ export EMAIL=xxx@yyy.com
証明書の発行者をLet's Encryptにしてリソースを作成します。
$ curl -sSL https://rawgit.com/ahmetb/gke-letsencrypt/master/yaml/letsencrypt-issuer.yaml | \ sed -e "s/email: ''/email: $EMAIL/g" | \ kubectl apply -f-
先ほどのemailアドレスをセットしています。
証明書を取得する
これからの手順を行うにあたり、前回割り当てられたIngressのIPアドレスにドメイン名を登録しておく必要があります。
事前にドメイン登録業者などで設定しておきます。
ドメイン名が有効になったら、証明書を取得します。
certificate.yml
apiVersion: certmanager.k8s.io/v1alpha1 kind: Certificate metadata: name: webapp-tls namespace: default spec: secretName: webapp-tls issuerRef: name: letsencrypt-prod kind: ClusterIssuer commonName: mean-k8s-example.hi1280.site dnsNames: - mean-k8s-example.hi1280.site acme: config: - http01: ingress: webapp domains: - mean-k8s-example.hi1280.site
issuerRef
で証明書の発行者のリソースを指定しています。
ドメイン名はcommonName
、dnsNames
、domains
に指定します。
ingress
で前回作成したIngressのリソース名を指定します。
$ kubectl apply -f certificate.yml
ここで時間がかかりますので、5分から10分ほど待ちます。
webapp-tls
というSecretリソースが表示されれば、正常に完了しています。
$ kubectl get secrets
describe
コマンドでリソース作成の進行状況を確認することができます。
$ kubectl describe -f certificate.yaml
HTTPSに対応する
証明書を使うようにIngressを更新します。
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: webapp labels: app: webapp spec: backend: serviceName: svc1 servicePort: 80 tls: - secretName: webapp-tls hosts: - mean-k8s-example.hi1280.site
$ kubectl apply -f ingress-tls.yml
10分ほどでHTTPSでアクセスできるようになります。
まとめ
実運用に耐えうるコンテナ環境ができることをKubernetesを利用して確認できました。
今回はGKEを利用したので楽ができました。
逆に自前運用だと大変そうだと思いました。