From dde81d9808611a9717df99b0f362f8831f303862 Mon Sep 17 00:00:00 2001 From: DanielZhangQD <36026334+DanielZhangQD@users.noreply.github.com> Date: Fri, 21 Aug 2020 10:45:01 +0800 Subject: [PATCH] zh: update tls doc for tiflash (#654) * update tls doc for tiflash * Apply suggestions from code review Co-authored-by: Ran * Apply suggestions from code review Co-authored-by: Ran --- zh/enable-tls-between-components.md | 141 +++++++++++++++++++++++++--- 1 file changed, 130 insertions(+), 11 deletions(-) diff --git a/zh/enable-tls-between-components.md b/zh/enable-tls-between-components.md index e73de02369..1d08deaff4 100644 --- a/zh/enable-tls-between-components.md +++ b/zh/enable-tls-between-components.md @@ -9,11 +9,16 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/'] 本文主要描述了在 Kubernetes 上如何为 TiDB 集群组件间开启 TLS。TiDB Operator 从 v1.1 开始已经支持为 Kubernetes 上 TiDB 集群组件间开启 TLS。开启步骤为: 1. 为即将被创建的 TiDB 集群的每个组件生成证书: - - 为 PD/TiKV/TiDB/Pump/Drainer 组件分别创建一套 Server 端证书,保存为 Kubernetes Secret 对象:`${cluster_name}-${component_name}-cluster-secret` + - 为 PD/TiKV/TiDB/Pump/Drainer/TiFlash 组件分别创建一套 Server 端证书,保存为 Kubernetes Secret 对象:`${cluster_name}-${component_name}-cluster-secret` - 为它们的各种客户端创建一套共用的 Client 端证书,保存为 Kubernetes Secret 对象:`${cluster_name}-cluster-client-secret` 2. 部署集群,设置 `.spec.tlsCluster.enabled` 属性为 `true`; 3. 配置 `pd-ctl`,`tikv-ctl` 连接集群。 +> **注意:** +> +> * TiDB v4.0.5, TiDB Operator v1.1.4 及以上版本支持 TiFlash 开启 TLS。 +> * TiDB v4.0.3, TiDB Operator v1.1.3 及以上版本支持 TiCDC 开启 TLS。 + 其中,颁发证书的方式有多种,本文档提供两种方式,用户也可以根据需要为 TiDB 集群颁发证书,这两种方式分别为: - 使用 `cfssl` 系统颁发证书; @@ -36,13 +41,12 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/'] mkdir -p cfssl cd cfssl - cfssl print-defaults config > ca-config.json - cfssl print-defaults csr > ca-csr.json ``` -2. 在 `ca-config.json` 配置文件中配置 CA 选项: +2. 生成 `ca-config.json` 配置文件: - ``` json + ```shell + cat << EOF > ca-config.json { "signing": { "default": { @@ -69,15 +73,13 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/'] } } } + EOF ``` - > **注意:** - > - > 这里的 `profiles internal` 的 `usages` 必须添加上 `"client auth"`。因为这套证书会同时作为 Server 和 Client 端证书使用。 - -3. 您还可以修改 `ca-csr.json` 证书签名请求 (CSR): +3. 生成 `ca-csr.json` 配置文件: - ``` json + ```shell + cat << EOF > ca-csr.json { "CN": "TiDB", "key": { @@ -94,6 +96,7 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/'] } ] } + EOF ``` 4. 使用定义的选项生成 CA: @@ -383,6 +386,47 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/'] cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal ticdc-server.json | cfssljson -bare ticdc-server ``` + - TiFlash Server 端证书 + + 首先生成默认的 `tiflash-server.json` 文件: + + {{< copyable "shell-regular" >}} + + ```shell + cfssl print-defaults csr > tiflash-server.json + ``` + + 然后编辑这个文件,修改 `CN`、`hosts` 属性: + + ```json + ... + "CN": "TiDB", + "hosts": [ + "127.0.0.1", + "::1", + "${cluster_name}-tiflash", + "${cluster_name}-tiflash.${namespace}", + "${cluster_name}-tiflash.${namespace}.svc", + "${cluster_name}-tiflash-peer", + "${cluster_name}-tiflash-peer.${namespace}", + "${cluster_name}-tiflash-peer.${namespace}.svc", + "*.${cluster_name}-tiflash-peer", + "*.${cluster_name}-tiflash-peer.${namespace}", + "*.${cluster_name}-tiflash-peer.${namespace}.svc" + ], + ... + ``` + + 其中 `${cluster_name}` 为集群的名字,`${namespace}` 为 TiDB 集群部署的命名空间,用户也可以添加自定义 `hosts`。 + + 最后生成 TiFlash Server 端证书: + + {{< copyable "shell-regular" >}} + + ``` shell + cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal tiflash-server.json | cfssljson -bare tiflash-server + ``` + 6. 生成 Client 端证书。 首先生成默认的 `client.json` 文件: @@ -452,6 +496,22 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/'] kubectl create secret generic ${cluster_name}-drainer-cluster-secret --namespace=${namespace} --from-file=tls.crt=drainer-server.pem --from-file=tls.key=drainer-server-key.pem --from-file=ca.crt=ca.pem ``` + TiCDC 集群证书 Secret: + + {{< copyable "shell-regular" >}} + + ``` shell + kubectl create secret generic ${cluster_name}-ticdc-cluster-secret --namespace=${namespace} --from-file=tls.crt=ticdc-server.pem --from-file=tls.key=ticdc-server-key.pem --from-file=ca.crt=ca.pem + ``` + + TiFlash 集群证书 Secret: + + {{< copyable "shell-regular" >}} + + ``` shell + kubectl create secret generic ${cluster_name}-tiflash-cluster-secret --namespace=${namespace} --from-file=tls.crt=tiflash-server.pem --from-file=tls.key=tiflash-server-key.pem --from-file=ca.crt=ca.pem + ``` + Client 证书 Secret: {{< copyable "shell-regular" >}} @@ -910,6 +970,65 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/'] 创建这个对象以后,`cert-manager` 会生成一个名字为 `${cluster_name}-ticdc-cluster-secret` 的 Secret 对象供 TiDB 集群的 TiCDC 组件使用。 + - TiFlash 组件的 Server 端证书。 + + ```yaml + apiVersion: cert-manager.io/v1alpha2 + kind: Certificate + metadata: + name: ${cluster_name}-tiflash-cluster-secret + namespace: ${namespace} + spec: + secretName: ${cluster_name}-tiflash-cluster-secret + duration: 8760h # 365d + renewBefore: 360h # 15d + organization: + - PingCAP + commonName: "TiDB" + usages: + - server auth + - client auth + dnsNames: + - "${cluster_name}-tiflash" + - "${cluster_name}-tiflash.${namespace}" + - "${cluster_name}-tiflash.${namespace}.svc" + - "${cluster_name}-tiflash-peer" + - "${cluster_name}-tiflash-peer.${namespace}" + - "${cluster_name}-tiflash-peer.${namespace}.svc" + - "*.${cluster_name}-tiflash-peer" + - "*.${cluster_name}-tiflash-peer.${namespace}" + - "*.${cluster_name}-tiflash-peer.${namespace}.svc" + ipAddresses: + - 127.0.0.1 + - ::1 + issuerRef: + name: ${cluster_name}-tidb-issuer + kind: Issuer + group: cert-manager.io + ``` + + 其中 `${cluster_name}` 为集群的名字: + + - `spec.secretName` 请设置为 `${cluster_name}-tiflash-cluster-secret`; + - `usages` 请添加上 `server auth` 和 `client auth`; + - `dnsNames` 需要填写这些 DNS,根据需要可以填写其他 DNS: + - `${cluster_name}-tiflash` + - `${cluster_name}-tiflash.${namespace}` + - `${cluster_name}-tiflash.${namespace}.svc` + - `${cluster_name}-tiflash-peer` + - `${cluster_name}-tiflash-peer.${namespace}` + - `${cluster_name}-tiflash-peer.${namespace}.svc` + - `*.${cluster_name}-tiflash-peer` + - `*.${cluster_name}-tiflash-peer.${namespace}` + - `*.${cluster_name}-tiflash-peer.${namespace}.svc` + - `ipAddresses` 需要填写这两个 IP ,根据需要可以填写其他 IP: + - `127.0.0.1` + - `::1` + - `issuerRef` 请填写上面创建的 Issuer; + - 其他属性请参考 [cert-manager API](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1alpha2.CertificateSpec)。 + + 创建这个对象以后,`cert-manager` 会生成一个名字为 `${cluster_name}-tiflash-cluster-secret` 的 Secret 对象供 TiDB 集群的 TiFlash 组件使用。 + - 一套 TiDB 集群组件的 Client 端证书。 ``` yaml