APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

AKSでContour Ingress Controllerを導入してみる(2)httpsアクセス

はじめに

今回はContour Ingress Controllerを導入した前回からの引き続きです。

前回の終わりで、

 AKSにインストールし、一般的なReverse proxy機能だけを実現しました。 次回は 「もうちょっと(プラスアルファ)」な機能を加えていきたいと思います。 どんな機能を追加するはは次回のお楽しみということで。

と匂わせていましたが、実際に「もうちょっと」を実現する前にやらなければならないことが出てきたので そちらを今回はご紹介したいと思います。「やらなければならないこと」とは・・・ httpsアクセスできるようにすることです。

証明書の管理には cert-manager を利用することが多いと思います。contourもcert-manager との組み合わせを紹介しています。こちらのガイドに沿って構成していきます。 なお、今回証明書は Let's Encryptの ACME HTTP-01 Challenge を利用しますので、そちらも併せて紹介します。

ということで今回は

cert-manager + Let's Encrypt証明書を使って
ContourにSecureにアクセスする

です。

導入

cert-managerの導入

cert-managerのインストールにはいくつか方法がありますが、 今回のContour等一連のインストールにはhelmを利用していますので今回も同じようにhelmを利用します。

いまのところあまり設定項目のデフォルトからの変更はありませんが、今後の拡張もあると考え一応config.yamlを作成しておきます。installCRDsはhelmによるインストール作業でCRDもあわせてインストールするオプションです(指定しない場合 kubectlを使って手作業でCRDをインストールします)。

config.yaml

installCRDs: true

あとはいつものようにhelm upgrade --installを実行するのみ。namespaceは cert-manager という名称にします。

export CERT_MANAGER_VERSION="v1.8.0"
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm upgrade --install cert-manager jetstack/cert-manager \
  --namespace cert-manager --create-namespace \
  --version ${CERT_MANAGER_VERSION} \
  --values config.yaml

これでインストールは完了です。

Let's encryptの設定

letsencrypt.yaml

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
  # name: letsencrypt-staging
  namespace: cert-manager
spec:
  acme:
    email: ${ISSUER_CONTACT_EMAIL}
    privateKeySecretRef:
      name: letsencrypt-prod
      # name: letsencrypt-staging
    server: https://acme-v02.api.letsencrypt.org/directory
    # server: https://acme-staging-v02.api.letsencrypt.org/directory
    solvers:
    - http01:
        ingress:
          class: contour

まずLet's Encryptのstagingエンドポイントで動作確認を実行した後productionエンドポイントを 利用するようにしてください(staging用の設定をコメントとして残しています)

# Let's Encryptのアカウント(連絡先)を設定
export ISSUER_CONTACT_EMAIL="your email"
cat letsencrypt.yaml | envsubst | kubectl apply -f -

これで証明書を取得・利用する準備は整いました。 続いてそれぞれのホストで証明書を利用する設定を加えます。 手順は Contourのページにも記載されています。

Ingress で指定する場合

まずIngressを利用する場合です。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: cont-ingress
  namespace: web
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    ingress.kubernetes.io/force-ssl-redirect: "true"
    kubernetes.io/ingress.class: contour
    kubernetes.io/tls-acme: "true"
spec:
  tls:
  - secretName: aggregator
    hosts:
    - aggregator.${DOMAIN_NAME}
  rules:
  - host: aggregator.${DOMAIN_NAME}
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: aggregator
            port:
              number: 8080

metadata.annotationsに cert-managerに関する指定をします。加えてspec.tlsにsecretNameを追加します。

  • cert-manager.io/cluster-issuer: 先程作成したLet's EncryptのClusterIssuer名称を指定します。
  • kubernetes.io/tls-acme: cert-managerにACME TLS(Let's Encrypt)を利用することを通知します。
  • ingress.kubernetes.io/foce-ssl-redirect: "true" HTTPをHTTPSにリダイレクトします
  • kubernetes.io/ingress.class: contour 今回はContour ingress controllerを利用しているので "contour" を指定します。
  • secretName: cert-managerが受信した証明書を共有するSecret名称となります。

設定をデプロイしてみましょう。

cat ingress.yaml | envsubst | kubectl apply -f -

デプロイ後、 curl -v https://aggregator.${DOMAIN_NAME}/service などでアクセスして HTTPSアクセスができるかどうかを確認してください。

また curl -v http://aggregator.${DOMAIN_NAME}/service でアクセスすると https にリダイレクトすることも確認できると思います。

HTTPProxyで指定する場合

続いてHTTPProxyを利用する場合の指定方法です。 まずはIngressの設定を削除しておきましょう。

cat ingress.yaml | envsubst | kubectl delete -f -

HTTPProxy修正とそれにCertificateの指定を追加します。

http-proxy.yaml

apiVersion: projectcontour.io/v1
kind: HTTPProxy
metadata:
  name: aggregator
  namespace: web
spec:
  virtualhost:
    fqdn: aggregator.${DOMAIN_NAME}
    tls:             # 追加部分
      secretName: aggregator
  routes:
    - services:
      - name: aggregator
        port: 8080
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: aggregator
  namespace: web
spec:
  commonName: aggregator.${DOMAIN_NAME}
  dnsNames:
  - aggregator.${DOMAIN_NAME}
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer
  secretName: aggregatorl

VirtualHostに対応する証明書情報を Certificateに記載し、対応するSecret名を HTTPProxyのspec.virtualhost.tls.secretName に記載します。

以下のコマンドでデプロイしてみましょう。

cat http-proxy.yaml | envsubst | kubectl apply -f -

デプロイ後、 curl -v https://aggregator.${DOMAIN_NAME}/service などでアクセスして HTTPSアクセスができるかどうかを確認してください。

HTTPProxyでは force-ssl-redirect annotationなしにリダイレクトが有効になります。 curl -v http://aggregator.${DOMAIN_NAME}/service でアクセスすると https にリダイレクトすることが確認できると思います。

IngressまたはHTTPProxyでHTTPSを有効にすることができました。これで今回の目的は達成。

さいごに(お知らせ)

次回お知らせ
変に匂わせてしまっていますが、次回こそは「もうちょっと(プラスアルファ)」な機能を Contour に加えていきたいと思います。もうしばらくお待ち下さいませ。

いつものように設定ファイル等は以下のGitHub Repositoryで公開しています。

その他お知らせ
来たる5月25日〜26日(日本時間)、Microsoft Buildが開催されます。皆様は登録をお済みでしょうか? Microsoftの製品・サービスに関する開発の情報が多数紹介されると思います。お時間のある方はぜひご参加ください。

宣伝
最後に宣伝。 私たちは、Azure・AKSを活用したシステムのSIや内製化のお手伝いをさせていただいております。 Azureやコンテナ技術の知見を持つエンジニアが対応いたします。ご相談等ありましたらぜひご連絡ください。

www.ap-com.co.jp