なになれ

IT系のことを記録していきます

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アドレスをセットしています。

証明書を取得する

これからの手順を行うにあたり、前回割り当てられたIngressIPアドレスドメイン名を登録しておく必要があります。
事前にドメイン登録業者などで設定しておきます。

ドメイン名が有効になったら、証明書を取得します。

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で証明書の発行者のリソースを指定しています。
ドメイン名はcommonNamednsNamesdomainsに指定します。
ingressで前回作成したIngressのリソース名を指定します。

$ kubectl apply -f certificate.yml

ここで時間がかかりますので、5分から10分ほど待ちます。

webapp-tlsというSecretリソースが表示されれば、正常に完了しています。

$ kubectl get secrets

describeコマンドでリソース作成の進行状況を確認することができます。

$ kubectl describe -f certificate.yaml

HTTPSに対応する

証明書を使うようにIngressを更新します。

ingress-tls.yml

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

ドメイン名やSecret名をtls追記しています。

$ kubectl apply -f ingress-tls.yml

10分ほどでHTTPSでアクセスできるようになります。

まとめ

実運用に耐えうるコンテナ環境ができることをKubernetesを利用して確認できました。
今回はGKEを利用したので楽ができました。
逆に自前運用だと大変そうだと思いました。

参考にした資料

github.com