はじめに
今回は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やコンテナ技術の知見を持つエンジニアが対応いたします。ご相談等ありましたらぜひご連絡ください。