diff --git a/docs/zh/latest/discovery/kubernetes.md b/docs/zh/latest/discovery/kubernetes.md index 17342882082a..48dc57b94b2f 100644 --- a/docs/zh/latest/discovery/kubernetes.md +++ b/docs/zh/latest/discovery/kubernetes.md @@ -278,16 +278,6 @@ nodes("release/default/plat-dev:port") 调用会得到如下的返回值: ## Q&A -**Q: 为什么只支持配置 token 来访问 Kubernetes APIServer?** - -A: 一般情况下,我们有三种方式可以完成与 Kubernetes APIServer 的认证: - -- mTLS -- Token -- Basic authentication - -因为 lua-resty-http 目前不支持 mTLS, Basic authentication 不被推荐使用,所以当前只实现了 Token 认证方式。 - **Q: APISIX 继承了 NGINX 的多进程模型,是否意味着每个 APISIX 工作进程都会监听 Kubernetes Endpoints?** A: Kubernetes 服务发现只使用特权进程监听 Kubernetes Endpoints,然后将其值存储到 `ngx.shared.DICT` 中,工作进程通过查询 `ngx.shared.DICT` 来获取结果。 @@ -343,3 +333,75 @@ A: 假定你指定的 [_ServiceAccount_](https://kubernetes.io/docs/tasks/config ```shell kubectl -n apisix get secret kubernetes-discovery-token-c64cv -o jsonpath={.data.token} | base64 -d ``` + +**Q: 如何使用 mTLS 认证连接 Kubernetes?** + +A: 假定你在 Kubernetes 集群外启动 APISIX,请按如下步骤来获取 TLS 证书。 + +1. 从 Kubernetes 配置中取得证书、私钥及 CA 证书: + +获取客户端证书: + +```shell +kubectl config view --raw -o 'jsonpath={.users[0].user.client-certificate-data}'| base64 -d > k8s_mtls.pem +``` + +获取证书对应私钥: + +```shell +kubectl config view --raw -o 'jsonpath={.users[0].user.client-key-data}'| base64 -d > k8s_mtls.key +``` + +获取 CA 证书: + +```shell +kubectl config view --raw -o 'jsonpath={.clusters[0].cluster.certificate-authority-data}'| base64 -d > k8s_mtls_ca.pem +``` + +2. 在 APISIX 服务发现配置中配置 mTLS 方式连接 Kubernetes 集群。 + +单集群模式: + +```yaml +ssl: + ssl_trusted_certificate: /var/certs/k8s_mtls_ca.pem + ssl_protocols: TLSv1.2 TLSv1.3 +discovery: + kubernetes: + service: + schema: "https" + host: "" + port: "" + client: + cert_file: /var/certs/k8s_mtls.pem + key_file: /var/certs/k8s_mtls.key + ssl_verify: true +``` + +多集群模式: + +```yaml +ssl: + ssl_trusted_certificate: /var/certs/k8s_mtls_ca.pem + ssl_protocols: TLSv1.2 TLSv1.3 +discovery: + kubernetes: + - id: first + service: + schema: "https" + host: "" + port: "" + client: + cert_file: /var/certs/k8s_mtls.pem + key_file: /var/certs/k8s_mtls.key + ssl_verify: true + - id: second + service: + schema: "https" + host: "" + port: "" + client: + cert_file: /var/certs/k8s_mtls.pem + key_file: /var/certs/k8s_mtls.key + ssl_verify: true +```