我有以下入口清單文件:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
namespace: fsm
name: fsm
labels:
app: fsm
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /$2
cert-manager.io/issuer: "letsencrypt-staging"
spec:
tls:
- hosts:
- k8s-cluster.int
secretName: quickstart-example-tls
rules:
- host: k8s-cluster.int
http:
paths:
- path: /fsm(/|$)(.*)
backend:
serviceName: fsm
servicePort: 8081
我正在使用 VMware 和 Vsphere。我沒有類似的域名www.google.com,只是一個 DNS 名稱,即 k8s-cluster 和網域 .int(在我公司內部)。當我嘗試生成證書時,我收到此錯誤:
"msg"="error waiting for authorization" "error"="acme: authorization error for k8s-cluster.int: 400 urn:ietf:params:acme:error:dns: DNS problem: NXDOMAIN looking up A for k8s-cluster.int - check that a DNS record exists for this domain" "dnsName"="k8s-cluster.int" "resource_kind"="Challenge" "resource_name"="quickstart-example-tls-w7vj9-4141989927-3312743172" "resource_namespace"="fsm" "resource_version"="v1" "type"="HTTP-01"
這個問題會因為k8s-cluster.int在內網而出現嗎?如果我捲曲 k8s-cluster.int
<html>
<head><title>308 Permanent Redirect</title></head>
<body>
<center><h1>308 Permanent Redirect</h1></center>
<hr><center>nginx/1.19.1</center>
</body>
</html>
所以,我認為 DNS 是有效的。
答案1
您嘗試使用 ACME,這是 Let's Encrypt 使用的。 ACME 協定基本上是一個自動 DNS 網域驗證,它為您提供「網域驗證」憑證。它檢查帶有請求名稱的 DNS 記錄是否確實指向請求伺服器(或在請求伺服器的控制之下),這「證明」該伺服器被允許擁有此類憑證。
這意味著只能對全域 DNS 樹中的網域驗證。您使用的“.int”後綴在全域 DNS 樹中不存在(或它存在,但您的名字不存在或不屬於您)。這不是 ACME 可以進行「網域驗證」的內容。
因此您無法使用 ACME 為該名稱產生憑證。對不起。
您的選擇是:
- 實例化您自己的「內部」CA,使其根憑證在每台相關電腦上受信任,然後用它產生憑證。例如,這可能是 MS AD 認證服務。這將需要一些工作來實例化和支援 CA,但您將能夠繼續使用“.int”;
- 使用全域註冊網域的子網域,即將您的「.int」字尾變更為「.int.example.com」之類的內容,其中 example.com 是您購買和委託的網域。例如,您可以設定一些反向代理並將所有「內部」名稱指向全域 DNS 中該代理程式的公共位址,以便能夠將 ACME 用於您的「內部」主機。
經過多年的網路工程師經驗,我最終選擇了第二個選項。我從不在內部服務中使用“獨立的私有內部”名稱,例如“.int”、“.local”、“.lan”等,即使我知道我不會將它們與“外部世界”連接起來,即使它們物理上與互聯網斷開連接。我總是使用源自我擁有的全球域名的名稱。這為我節省了很多工作。當我有時遇到使用這些「獨立」名稱的網路時,幾乎總是有一些骯髒的怪癖來解決晦澀的問題,如果他們使用全域名稱,則不需要這些怪癖。