Добрый день, я новичок в kubernetes и пытаюсь настроить свою первую среду. Я хочу следующую схему:
- У моей организации есть публичный IP (xxxx)
- Этот IP направляется на сервер в частной локальной сети (то есть
192.168.0.10
) с win server + IIS. В IIS у меня есть модуль перезаписи URL, и он действует как обратный прокси - У меня есть кластер kubernetes
- У меня есть служба, развернутая на k8s
- Я хочу получить доступ к этой службе изИнтернет с SSL, полученный из Давайте шифруем
Я уже настроил кластер k8s, развернул вход traefik (v1.7
) и настроил их для шифрования давайте (перенаправление настройки http->https
, вызов acme). Это работает нормально - я могу наблюдать это из локальной или глобальной сети, и нет никаких предупреждений о сертификате - я вижу зеленый замок. Теперь я развертываю службу (в моем случае это graylog). Опять же - я могу наблюдать это из LAN и WAN, но в этом случае я вижу предупреждение о сертификате (он был выдан TRAEFIK_DEFAULT_CERT
). После того, как я увидел это, я пытаюсь найти дополнительную информацию и обнаружил, что мне нужен сертификат-менеджер. Я развертываю cert-manager, создаю зашифрованный издатель (с ролью ClusterIssuer), но затем пытаюсь выдать сертификат, я получаю следующую ошибку (находится в описании вызова):
Waiting for http-01 challenge propagation: wrong status code '404', expected '200'
Моя карта конфигурации traefik:
apiVersion: v1
kind: ConfigMap
metadata:
name: traefik-conf
namespace: kube-system
data:
traefik.toml: |
# traefik.toml
defaultEntryPoints = ["http","https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
regex = "^http://(.*)"
replacement = "https://$1"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[acme]
email = "mymail@example.xyz"
storage = "/acme/acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
[[acme.domains]]
main = "my-public-domain.com"
Я также пытаюсь использовать там подстановочный знак:
apiVersion: v1
kind: ConfigMap
metadata:
name: traefik-conf
namespace: kube-system
data:
traefik.toml: |
# traefik.toml
defaultEntryPoints = ["http","https"]
[entryPoints]
[entryPoints.http]
address = ":80"
[entryPoints.http.redirect]
regex = "^http://(.*)"
replacement = "https://$1"
[entryPoints.https]
address = ":443"
[entryPoints.https.tls]
[acme]
email = "mymail@example.xyz"
storage = "/acme/acme.json"
entryPoint = "https"
onHostRule = true
[acme.httpChallenge]
entryPoint = "http"
[[acme.domains]]
main = "*.my-public-domain.com"
sans = ["my-public-domain.com"]
Мой эмитент кластера:
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-dev
spec:
acme:
email: mymail@example.xyz
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Secret resource used to store the account's private key.
name: example-issuer-account-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: traefik
И мой тестовый сертификат:
apiVersion: certmanager.k8s.io/v1alpha1
kind: Certificate
metadata:
name: example-com
namespace: default
spec:
secretName: example-com-tls
renewBefore: 360h # 15d
commonName: logger.my-public-domain.com
dnsNames:
- logger.my-public-domain.com
issuerRef:
name: letsencrypt-dev
kind: ClusterIssuer
У меня есть записи DNS для подстановочного домена, и я могу пропинговать его
Мои сертификаты застряли в состоянии OrderCreated
:
Status:
Conditions:
Last Transition Time: 2019-10-08T09:40:30Z
Message: Certificate issuance in progress. Temporary certificate issued.
Reason: TemporaryCertificate
Status: False
Type: Ready
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal OrderCreated 47m cert-manager Created Order resource "example-com-3213698372"
Заказ застрял в состоянии Created
:
Status:
Challenges:
Authz URL: <url>
Dns Name: logger.my-public-domain.com
Issuer Ref:
Kind: ClusterIssuer
Name: letsencrypt-dev
Key: <key>
Solver:
http01:
Ingress:
Class: traefik
Token: <token>
Type: http-01
URL: <url>
Wildcard: false
Finalize URL: <url>
State: pending
URL: <url>
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Created 48m cert-manager Created Challenge resource "example-com-3213698372-0" for domain "logger.my-public-domain.com"
И, наконец, по вызову:
Spec:
Authz URL: <url>
Dns Name: logger.my-public-domain.com
Issuer Ref:
Kind: ClusterIssuer
Name: letsencrypt-dev
Key: <key>
Solver:
http01:
Ingress:
Class: traefik
Token: <token>
Type: http-01
URL: <url>
Wildcard: false
Status:
Presented: true
Processing: true
Reason: Waiting for http-01 challenge propagation: wrong status code '404', expected '200'
State: pending
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Started 55m cert-manager Challenge scheduled for processing
Normal Presented 55m cert-manager Presented challenge using http-01 challenge mechanism
Я вижу, что есть 404 ответа, но я не могу понять причину этого. На моем IIS у меня есть следующие правила перезаписи: Давайте зашифруем обход - все URL, совпадающие с .well-known/*
, переписываются на хост kubernetes. http to https - все URL не совпадают с помощью шифрования, перенаправленного на перенаправление субдоменов https - все запросы субдоменов переписаны в kubernetes.
В моей локальной сети у меня есть собственный DNS-сервер, там все домены из my-public-domain.com
имеют сопоставлениена внутренние адреса, поэтому я могу перенаправить общедоступное имя хоста logger.my-public-domain.com (x.x.x.x)
на внутреннее logger.my-public-domain.com (192.168.0.y)
.
Когда вызов активен, я вижу новый бэкэнд и внешний интерфейс в панели мониторинга traefik.
Может быть, я неправильно понимаю, как этодолжно сработать, но я ожидал, что cert-manager выдаст сертификат с помощью команды «Зашифровать», и я смогу наблюдать за моим сервисом.