Skip to content

Commit

Permalink
zh: add docs about TiDB-Lightning with TLS (#922)
Browse files Browse the repository at this point in the history
  • Loading branch information
csuzhangxc authored Dec 16, 2020
1 parent e45f6b0 commit 65e54d2
Show file tree
Hide file tree
Showing 3 changed files with 267 additions and 37 deletions.
190 changes: 189 additions & 1 deletion zh/enable-tls-between-components.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ 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/TiFlash 组件分别创建一套 Server 端证书,保存为 Kubernetes Secret 对象:`${cluster_name}-${component_name}-cluster-secret`
- 为 PD/TiKV/TiDB/Pump/Drainer/TiFlash/TiKV Importer/TiDB Lightning 组件分别创建一套 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` 连接集群。
Expand Down Expand Up @@ -427,6 +427,80 @@ 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 tiflash-server.json | cfssljson -bare tiflash-server
```
- TiKV Importer Server 端证书
如需要[使用 TiDB Lightning 恢复 Kubernetes 上的集群数据](restore-data-using-tidb-lightning.md),则需要为其中的 TiKV Importer 组件生成如下的 Server 端证书。
首先生成默认的 `importer-server.json` 文件:
{{< copyable "shell-regular" >}}
```shell
cfssl print-defaults csr > importer-server.json
```
然后编辑这个文件,修改 `CN``hosts` 属性:
```json
...
"CN": "TiDB",
"hosts": [
"127.0.0.1",
"::1",
"${cluster_name}-importer",
"${cluster_name}-importer.${namespace}",
"${cluster_name}-importer.${namespace}.svc"
],
...
```
其中 `${cluster_name}` 为集群的名字,`${namespace}` 为 TiDB 集群部署的命名空间,用户也可以添加自定义 `hosts`
最后生成 TiKV Importer Server 端证书:
{{< copyable "shell-regular" >}}
``` shell
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal importer-server.json | cfssljson -bare importer-server
```
- TiDB Lightning Server 端证书
如需要[使用 TiDB Lightning 恢复 Kubernetes 上的集群数据](restore-data-using-tidb-lightning.md),则需要为其中的 TiDB Lightning 组件生成如下的 Server 端证书。
首先生成默认的 `lightning-server.json` 文件:
{{< copyable "shell-regular" >}}
```shell
cfssl print-defaults csr > lightning-server.json
```
然后编辑这个文件,修改 `CN``hosts` 属性:
```json
...
"CN": "TiDB",
"hosts": [
"127.0.0.1",
"::1",
"${cluster_name}-lightning",
"${cluster_name}-lightning.${namespace}",
"${cluster_name}-lightning.${namespace}.svc"
],
...
```
其中 `${cluster_name}` 为集群的名字,`${namespace}` 为 TiDB 集群部署的命名空间,用户也可以添加自定义 `hosts`
最后生成 TiDB Lightning Server 端证书:
{{< copyable "shell-regular" >}}
``` shell
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal lightning-server.json | cfssljson -bare lightning-server
```
6. 生成 Client 端证书。
首先生成默认的 `client.json` 文件:
Expand Down Expand Up @@ -512,6 +586,22 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/']
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
```
TiKV Importer 集群证书 Secret:
{{< copyable "shell-regular" >}}
``` shell
kubectl create secret generic ${cluster_name}-importer-cluster-secret --namespace=${namespace} --from-file=tls.crt=importer-server.pem --from-file=tls.key=importer-server-key.pem --from-file=ca.crt=ca.pem
```
TiDB Lightning 集群证书 Secret:
{{< copyable "shell-regular" >}}
``` shell
kubectl create secret generic ${cluster_name}-lightning-cluster-secret --namespace=${namespace} --from-file=tls.crt=lightning-server.pem --from-file=tls.key=lightning-server-key.pem --from-file=ca.crt=ca.pem
```
Client 证书 Secret:
{{< copyable "shell-regular" >}}
Expand Down Expand Up @@ -1029,6 +1119,104 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-between-components/']
创建这个对象以后,`cert-manager` 会生成一个名字为 `${cluster_name}-tiflash-cluster-secret` 的 Secret 对象供 TiDB 集群的 TiFlash 组件使用。
- TiKV Importer 组件的 Server 端证书。
如需要[使用 TiDB Lightning 恢复 Kubernetes 上的集群数据](restore-data-using-tidb-lightning.md),则需要为其中的 TiKV Importer 组件生成如下的 Server 端证书。
```yaml
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-importer-cluster-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-importer-cluster-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
- PingCAP
commonName: "TiDB"
usages:
- server auth
- client auth
dnsNames:
- "${cluster_name}-importer"
- "${cluster_name}-importer.${namespace}"
- "${cluster_name}-importer.${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}-importer-cluster-secret`
- `usages` 请添加上 `server auth``client auth`
- `dnsNames` 需要填写这些 DNS,根据需要可以填写其他 DNS:
- `${cluster_name}-importer`
- `${cluster_name}-importer.${namespace}`
- `${cluster_name}-importer.${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}-importer-cluster-secret` 的 Secret 对象供 TiDB 集群的 TiKV Importer 组件使用。
- TiDB Lightning 组件的 Server 端证书。
如需要[使用 TiDB Lightning 恢复 Kubernetes 上的集群数据](restore-data-using-tidb-lightning.md),则需要为其中的 TiDB Lightning 组件生成如下的 Server 端证书。
```yaml
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-lightning-cluster-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-lightning-cluster-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
- PingCAP
commonName: "TiDB"
usages:
- server auth
- client auth
dnsNames:
- "${cluster_name}-lightning"
- "${cluster_name}-lightning.${namespace}"
- "${cluster_name}-lightning.${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}-lightning-cluster-secret`
- `usages` 请添加上 `server auth``client auth`
- `dnsNames` 需要填写这些 DNS,根据需要可以填写其他 DNS:
- `${cluster_name}-lightning`
- `${cluster_name}-lightning.${namespace}`
- `${cluster_name}-lightning.${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}-lightning-cluster-secret` 的 Secret 对象供 TiDB 集群的 TiDB Lightning 组件使用。
- 一套 TiDB 集群组件的 Client 端证书。
``` yaml
Expand Down
97 changes: 61 additions & 36 deletions zh/enable-tls-for-mysql-client.md
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,8 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-for-mysql-client/']
- PD Dashboard
- Backup
- Restore

如需要[使用 TiDB Lightning 恢复 Kubernetes 上的集群数据](restore-data-using-tidb-lightning.md),则也可以为其中的 TiDB Lightning 组件生成 Client 端证书。

下面就来生成这些组件的 Client 证书。

Expand All @@ -380,75 +382,75 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-for-mysql-client/']
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-tidb-initializer-client-secret
namespace: ${namespace}
name: ${cluster_name}-tidb-initializer-client-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-tidb-initializer-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
secretName: ${cluster_name}-tidb-initializer-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
- PingCAP
commonName: "TiDB Initializer client"
usages:
commonName: "TiDB Initializer client"
usages:
- client auth
issuerRef:
issuerRef:
name: ${cluster_name}-tidb-issuer
kind: Issuer
group: cert-manager.io
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-pd-dashboard-client-secret
namespace: ${namespace}
name: ${cluster_name}-pd-dashboard-client-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-pd-dashboard-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
secretName: ${cluster_name}-pd-dashboard-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
- PingCAP
commonName: "PD Dashboard client"
usages:
commonName: "PD Dashboard client"
usages:
- client auth
issuerRef:
issuerRef:
name: ${cluster_name}-tidb-issuer
kind: Issuer
group: cert-manager.io
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-backup-client-secret
namespace: ${namespace}
name: ${cluster_name}-backup-client-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-backup-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
secretName: ${cluster_name}-backup-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
- PingCAP
commonName: "Backup client"
usages:
commonName: "Backup client"
usages:
- client auth
issuerRef:
issuerRef:
name: ${cluster_name}-tidb-issuer
kind: Issuer
group: cert-manager.io
---
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-restore-client-secret
namespace: ${namespace}
name: ${cluster_name}-restore-client-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-restore-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
secretName: ${cluster_name}-restore-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
- PingCAP
commonName: "Restore client"
usages:
commonName: "Restore client"
usages:
- client auth
issuerRef:
issuerRef:
name: ${cluster_name}-tidb-issuer
kind: Issuer
group: cert-manager.io
Expand All @@ -462,6 +464,29 @@ aliases: ['/docs-cn/tidb-in-kubernetes/dev/enable-tls-for-mysql-client/']
- `issuerRef` 请填写上面创建的 Issuer;
- 其他属性请参考 [cert-manager API](https://cert-manager.io/docs/reference/api-docs/#cert-manager.io/v1alpha2.CertificateSpec)。

如需要为 TiDB Lignting 组件生成 Client 端证书,则可以使用以下内容并通过在 TiDB Lightning 的 Helm Chart `values.yaml` 中设置 `tlsCluster.tlsClientSecretName``${cluster_name}-lightning-client-secret`

```yaml
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
name: ${cluster_name}-lightning-client-secret
namespace: ${namespace}
spec:
secretName: ${cluster_name}-lightning-client-secret
duration: 8760h # 365d
renewBefore: 360h # 15d
organization:
- PingCAP
commonName: "Lightning client"
usages:
- client auth
issuerRef:
name: ${cluster_name}-tidb-issuer
kind: Issuer
group: cert-manager.io
```

2. 通过执行下面的命令来创建证书:

{{< copyable "shell-regular" >}}
Expand Down
17 changes: 17 additions & 0 deletions zh/restore-data-using-tidb-lightning.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ TiDB Lightning 包含两个组件:tidb-lightning 和 tikv-importer。在 Kuber

`clusterName` 必须匹配目标 TiDB 集群。

如果目标 TiDB 集群组件间开启了 TLS (`spec.tlsCluster.enabled: true`),则可以参考[为 TiDB 集群各个组件生成证书](enable-tls-between-components.md#第一步为-tidb-集群各个组件生成证书)为 TiKV importer 组件生成 Server 端证书,并在 `values.yaml` 中通过配置 `tlsCluster.enabled: true` 开启 TLS 支持。

4. 部署 tikv-importer:

{{< copyable "shell-regular" >}}
Expand All @@ -82,6 +84,21 @@ TiDB Lightning 包含两个组件:tidb-lightning 和 tikv-importer。在 Kuber
helm inspect values pingcap/tidb-lightning --version=${chart_version} > tidb-lightning-values.yaml
```

如果目标 TiDB 集群组件间开启了 TLS (`spec.tlsCluster.enabled: true`),则可以参考[为 TiDB 集群各个组件生成证书](enable-tls-between-components.md#第一步为-tidb-集群各个组件生成证书)为 TiDB Lightning 组件生成 Server 端证书,并在 `values.yaml` 中通过配置 `tlsCluster.enabled: true` 开启集群内部的 TLS 支持。

如果目标 TiDB 集群为 MySQL 客户端开启了 TLS (`spec.tidb.tlsClient.enabled: true`) 并配置了相应的 Client 端证书(对应的 Kubernetes Secret 对象为 `${cluster_name}-tidb-client-secret`),则可以通过在 `values.yaml` 中配置 `tlsClient.enabled: true` 以使 TiDB Lightning 通过 TLS 方式连接 TiDB Server。

如果需要 TiDB Lightning 使用不同的 Client 证书来连接 TiDB Server,则可以参考[为 TiDB 集群颁发两套证书](enable-tls-for-mysql-client.md#第一步为-tidb-集群颁发两套证书)为 TiDB Lightning 组件生成 Client 端证书,并在 `values.yaml` 中通过 `tlsCluster.tlsClientSecretName` 指定对应的 Kubernetes Sceret 对象。

> **注意:**
>
> 如果通过 `tlsCluster.enabled: true` 开启了集群内部的 TLS 支持,但未通过 `tlsClient.enabled: true` 开启 TiDB Lightning 到 TiDB Server 的 TLS 支持,则需要在 `values.yaml` 中的 `config` 内通过如下配置显式地禁用 TiDB Lightning 到 TiDB Server 的 TLS 连接支持。
>
> ```toml
> [tidb]
> tls="false"
> ```

tidb-lightning Helm chart 支持恢复本地或远程的备份数据。

* 本地模式:
Expand Down

0 comments on commit 65e54d2

Please sign in to comment.