HTTP01
📌 このページでは、ACME HTTP-01チャレンジの解決に焦点を当てています。IngressまたはGatewayリソースにアノテーションを付けることで、Certificateリソースを自動的に作成する方法については、「Ingressリソースの保護」と「Gatewayリソースの保護」を参照してください。
cert-managerは、HTTP01チャレンジを解決するために、既存のIngressまたはGateway構成を使用します。
HTTP01 Ingressソルバーの構成
このページでは、Issuer
リソースのHTTP01チャレンジソルバー構成で利用可能なさまざまなオプションについて詳しく説明します。ACME IssuerとそのAPI形式の構成の詳細については、「ACME Issuer」のドキュメントを参照してください。
HTTP01チャレンジタイプがどのように機能するかについては、Let's Encryptチャレンジタイプのページを参照してください。
以下に、より多くの構成オプションを備えた単純なHTTP01
ACME Issuerの例を示します。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: example-issuerspec:acme:server: https://acme-staging-v02.api.letsencrypt.org/directoryprivateKeySecretRef:name: example-issuer-account-keysolvers:- http01:ingress:ingressClassName: nginx
オプション
HTTP01 Issuerは、いくつかの追加オプションをサポートしています。利用可能なオプションの範囲の詳細については、リファレンスドキュメントを参照してください。
ingressClassName
📌 ingressClassName
フィールドは、cert-manager 1.12で追加されました。
ingressClassName
フィールドが指定されている場合、cert-managerは、ACMEチャレンジ検証リクエストに応答するacmesolver
ポッドにトラフィックをルーティングするために、新しいIngress
リソースを作成します。
これは、Ingressコントローラーを構成する推奨される方法です。ほとんどのIngressコントローラーは、ingressClassName
をサポートしており、ingress-gceは例外です(外部負荷分散のためのIngressの構成のページを参照)。
class
class
フィールドが指定されている場合、チャレンジを解決するために、ランダムに生成された名前を持つ新しいIngressリソースが作成されます。この新しいリソースには、キーkubernetes.io/ingress.class
と、class
フィールドの値に設定された値のアノテーションが付与されます。
このフィールドは、ingress-gceでのみ推奨されます。ingress-gceは、ingressClassName
フィールドをサポートしていません。
name
name
フィールドが指定されている場合、cert-managerは、HTTP01チャレンジを解決するために、指定されたIngressリソースを編集します。
これは、作成されたIngress
リソースごとに一意のIPアドレスを利用するingress-gce
などのIngressコントローラーとの互換性を保つために役立ちます。
このモードは、すべてのIngressリソースに対して単一のIPを公開するIngressコントローラーを使用する場合は避ける必要があります。これにより、特定のIngressコントローラー固有のアノテーションとの互換性の問題が発生する可能性があります。
class
とingressClassName
が指定されておらず、name
も指定されていない場合、cert-managerは新しいIngress
リソースを作成しますが、これらのリソースにIngressクラスを設定しません。つまり、クラスターにインストールされているすべてのIngressコントローラーがチャレンジソルバーのトラフィックを処理するため、追加コストが発生する可能性があります。
serviceType
まれに、Kubernetesの制限により、HTTP01チャレンジ応答サービスにNodePort
をタイプとして使用することが不可能/望ましくない場合があります。チャレンジ応答中に使用するKubernetesサービスタイプを定義するには、次のHTTP01構成を指定します。
http01:ingress:# Valid values are ClusterIP and NodePortserviceType: ClusterIP
デフォルトでは、HTTP01を設定しない場合、またはserviceType
を空の文字列に設定した場合、タイプNodePort
が使用されます。通常、これを変更する必要はありません。
podTemplate
ソルバーポッドのラベルとアノテーションを変更または追加したい場合があります。これらは、podTemplate
のmetadata
フィールドで構成できます。
同様に、podTemplate
のspec
フィールドで構成することにより、ソルバーポッドのnodeSelector
、tolerations、affinityを設定できます。他のspecフィールドは編集できません。
テンプレートを構成する方法の例を次に示します。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: ...spec:acme:server: ...privateKeySecretRef:name: ...solvers:- http01:ingress:podTemplate:metadata:labels:foo: "bar"env: "prod"spec:nodeSelector:bar: baz
追加されたラベルとアノテーションは、cert-managerのデフォルトの上にマージされ、同じキーのエントリを上書きします。
podTemplate
には他のフィールドは存在しません。
ingressTemplate
ソルバーIngressリソースにラベルとアノテーションを追加できます。クラスター全体で複数のIngressコントローラーを管理していて、適切なコントローラーがソルバーをピックアップして(解決すべき今後のチャレンジのために)公開することを保証したい場合に非常に役立ちます。これらは、ingressTemplate
のmetadata
フィールドで構成できます。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: ...spec:acme:server: ...privateKeySecretRef:name: ...solvers:- http01:ingress:ingressTemplate:metadata:labels:foo: "bar"annotations:"nginx.ingress.kubernetes.io/whitelist-source-range": "0.0.0.0/0,::/0""nginx.org/mergeable-ingress-type": "minion""traefik.ingress.kubernetes.io/frontend-entry-points": "http"
追加されたラベルとアノテーションは、cert-managerのデフォルトの上にマージされ、同じキーのエントリを上書きします。
Ingressの他のフィールドは編集できません。
HTTP-01 Gateway API ソルバーの設定
機能の状態: cert-manager 1.15 [beta]
Gateway および HTTPRoute リソースは、Gateway API の一部であり、Kubernetes クラスタにインストールする一連の CRD で、Ingress API に比べてさまざまな改善を提供します。
📌 この機能を使用するには、Gateway API バンドルのインストールと、cert-manager コントローラーへの追加フラグの渡しが必要です。
v1.5.1 Gateway API バンドル (Gateway CRD および webhook) をインストールするには、次のコマンドを実行します
kubectl apply -f "https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.0.0/standard-install.yaml"
cert-manager でこの機能を有効にするには、GatewayAPI
機能ゲートをオンにします。
-
Helm を使用している場合
helm upgrade --install cert-manager jetstack/cert-manager --namespace cert-manager \--set "extraArgs={--enable-gateway-api}" -
生の cert-manager マニフェストを使用している場合は、cert-manager コントローラーの Deployment に次のフラグを追加します
args:- --enable-gateway-api
Gateway API CRD は、cert-manager の起動前にインストールするか、Gateway API CRD のインストール後に cert-manager Deployment を再起動する必要があります。これは、cert-manager の一部のコンポーネントが起動時にのみ Gateway API チェックを実行するため重要です。次のコマンドで cert-manager を再起動できます。
kubectl rollout restart deployment cert-manager -n cert-manager
🚧 cert-manager 1.14+ は v1 Kubernetes Gateway API でテストされています。リソース変換のため v1beta1 および v1alpha2 でも動作するはずですが、テストはされていません。
Gateway API HTTPRoute HTTP-01 ソルバーは、指定されたラベルを使用して一時的な HTTPRoute を作成します。これらのラベルは、80 ポートでリスナーを持つ Gateway に一致する必要があります。
次に、Gateway API を使用した HTTP-01 ACME Issuer の例を示します。
apiVersion: cert-manager.io/v1kind: Issuermetadata:name: letsencryptnamespace: defaultspec:acme:solvers:- http01:gatewayHTTPRoute:parentRefs:- name: traefiknamespace: traefikkind: Gateway
Issuer は、クラスタに存在する既存の Gateway に依存します。cert-manager は Gateway リソースを編集しません。
たとえば、次の Gateway では、Issuer がチャレンジを解決できます。
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata:name: traefiknamespace: traefikspec:gatewayClassName: traefiklisteners:- name: httpprotocol: HTTPport: 80allowedRoutes:namespaces:from: All
上記の例では、Gateway は HTTP-01 チャレンジを解決する目的で特別に作成されていますが、ポート 80 にリスナーがある限り、既存の Gateway を再利用することもできます。
Issuer の labels
は、Gateway のポート 80 リスナーが from: All
で構成されている限り、別の名前空間にある Gateway を参照できます。証明書は Issuer と同じ名前空間に作成されるため、上記の Gateway でこの Secret を参照することはできないことに注意してください。
上記の Issuer に証明書が提示されると、cert-manager は一時的な HTTPRoute を作成します。たとえば、次の証明書の場合
apiVersion: cert-manager.io/v1kind: Certificatemetadata:name: example-tlsnamespace: defaultspec:issuerRef:name: letsencryptdnsNames:- example.net
HTTPRoute が表示されます
apiVersion: gateway.networking.k8s.io/v1kind: HTTPRoutemetadata:name: cm-acme-http-solver-gdhvgnamespace: defaultspec:parentRefs:- name: traefiknamespace: traefikkind: Gatewayhostnames:- example.netrules:- backendRefs:- port: 8089name: cm-acme-http-solver-gdhvgweight: 1matches:- path:type: Exactvalue: /.well-known/acme-challenge/YadC4gaAzqEPU1Yea0D2MrzvNRWiBCtUizCtpiRQZqI
証明書が発行されると、HTTPRoute は削除されます。
labels
これらのラベルは、HTTP-01 チャレンジを解決するために cert-manager によって作成された一時的な HTTPRoute にコピーされます。これらのラベルは、クラスタ上のいずれかの Gateway リソースと一致する必要があります。一致した Gateway には、ポート 80 にリスナーがあります。
ラベルがクラスタ上のいずれの Gateway にも一致しない場合、cert-manager は一時的な HTTPRoute チャレンジを作成しますが、何も起こらないことに注意してください。
serviceType
このフィールドは、http01.ingress.serviceType
と同じ意味を持ちます。
HTTP-01 ソルバーの伝播チェック用ネームサーバーの設定
cert-manager は、HTT01 チャレンジを試行する前に到達可能性テストを実行します。デフォルトでは、cert-manager は /etc/resolv.conf
から取得した再帰ネームサーバーを使用してチャレンジ URL をクエリします。
これが望ましくない場合 (たとえば、スプリットホライズン DNS の場合)、cert-manager コントローラーは、この動作を変更できるフラグを公開します
--acme-http01-solver-nameservers
cert-manager がクエリする必要がある再帰ネームサーバーのホストとポートをコンマで区切った文字列。
使用例
--acme-http01-solver-nameservers="8.8.8.8:53,1.1.1.1:53"
cert-manager
helm チャートを使用している場合は、.Values.extraArgs
を使用するか、helm install/upgrade 時に --set
を使用して再帰ネームサーバーを設定できます。
--set 'extraArgs={--acme-http01-solver-nameservers=8.8.8.8:53\,1.1.1.1:53}'