为 TiDB 组件间开启 TLS

本文主要描述了在 Kubernetes 上如何为 TiDB 集群组件间开启 TLS。TiDB Operator 从 v1.1 开始已经支持为 Kubernetes 上 TiDB 集群组件间开启 TLS。开启步骤为:

  1. 为即将被创建的 TiDB 集群的每个组件生成证书:

    • 为 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

    为 TiDB 组件间开启 TLS - 图1注意

    创建的 Secret 对象必须符合上述命名规范,否则将导致各组件部署失败。

  2. 部署集群,设置 .spec.tlsCluster.enabled 属性为 true

    为 TiDB 组件间开启 TLS - 图2注意

    在集群创建后,不能修改此字段,否则将导致集群升级失败,此时需要删除已有集群,并重新创建。

  3. 配置 pd-ctltikv-ctl 连接集群。

为 TiDB 组件间开启 TLS - 图3注意

  • TiDB v4.0.5, TiDB Operator v1.1.4 及以上版本支持 TiFlash 开启 TLS。
  • TiDB v4.0.3, TiDB Operator v1.1.3 及以上版本支持 TiCDC 开启 TLS。

其中,颁发证书的方式有多种,本文档提供两种方式,用户也可以根据需要为 TiDB 集群颁发证书,这两种方式分别为:

  • 使用 cfssl 系统颁发证书;
  • 使用 cert-manager 系统颁发证书;

当需要更新已有 TLS 证书时,可参考更新和替换 TLS 证书

第一步:为 TiDB 集群各个组件生成证书

使用 cfssl 系统颁发证书

  1. 首先下载 cfssl 软件并初始化证书颁发机构:

    1. mkdir -p ~/bin
    2. curl -s -L -o ~/bin/cfssl https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
    3. curl -s -L -o ~/bin/cfssljson https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
    4. chmod +x ~/bin/{cfssl,cfssljson}
    5. export PATH=$PATH:~/bin
    6. mkdir -p cfssl
    7. cd cfssl
  2. 生成 ca-config.json 配置文件:

    1. cat << EOF > ca-config.json
    2. {
    3. "signing": {
    4. "default": {
    5. "expiry": "8760h"
    6. },
    7. "profiles": {
    8. "internal": {
    9. "expiry": "8760h",
    10. "usages": [
    11. "signing",
    12. "key encipherment",
    13. "server auth",
    14. "client auth"
    15. ]
    16. },
    17. "client": {
    18. "expiry": "8760h",
    19. "usages": [
    20. "signing",
    21. "key encipherment",
    22. "client auth"
    23. ]
    24. }
    25. }
    26. }
    27. }
    28. EOF
  3. 生成 ca-csr.json 配置文件:

    1. cat << EOF > ca-csr.json
    2. {
    3. "CN": "TiDB",
    4. "CA": {
    5. "expiry": "87600h"
    6. },
    7. "key": {
    8. "algo": "rsa",
    9. "size": 2048
    10. },
    11. "names": [
    12. {
    13. "C": "US",
    14. "L": "CA",
    15. "O": "PingCAP",
    16. "ST": "Beijing",
    17. "OU": "TiDB"
    18. }
    19. ]
    20. }
    21. EOF
  4. 使用定义的选项生成 CA:

    1. cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
  5. 生成 Server 端证书。

    这里需要为每个 TiDB 集群的组件生成一套 Server 端证书。

    • PD Server 端证书

      首先生成默认的 pd-server.json 文件:

      1. cfssl print-defaults csr > pd-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "${cluster_name}-pd",
      7. "${cluster_name}-pd.${namespace}",
      8. "${cluster_name}-pd.${namespace}.svc",
      9. "${cluster_name}-pd-peer",
      10. "${cluster_name}-pd-peer.${namespace}",
      11. "${cluster_name}-pd-peer.${namespace}.svc",
      12. "*.${cluster_name}-pd-peer",
      13. "*.${cluster_name}-pd-peer.${namespace}",
      14. "*.${cluster_name}-pd-peer.${namespace}.svc"
      15. ],
      16. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 PD Server 端证书:

      1. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal pd-server.json | cfssljson -bare pd-server
    • TiKV Server 端证书

      首先生成默认的 tikv-server.json 文件:

      1. cfssl print-defaults csr > tikv-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "${cluster_name}-tikv",
      7. "${cluster_name}-tikv.${namespace}",
      8. "${cluster_name}-tikv.${namespace}.svc",
      9. "${cluster_name}-tikv-peer",
      10. "${cluster_name}-tikv-peer.${namespace}",
      11. "${cluster_name}-tikv-peer.${namespace}.svc",
      12. "*.${cluster_name}-tikv-peer",
      13. "*.${cluster_name}-tikv-peer.${namespace}",
      14. "*.${cluster_name}-tikv-peer.${namespace}.svc"
      15. ],
      16. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 TiKV Server 端证书:

      1. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal tikv-server.json | cfssljson -bare tikv-server
    • TiDB Server 端证书

      首先生成默认的 tidb-server.json 文件:

      1. cfssl print-defaults csr > tidb-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "${cluster_name}-tidb",
      7. "${cluster_name}-tidb.${namespace}",
      8. "${cluster_name}-tidb.${namespace}.svc",
      9. "${cluster_name}-tidb-peer",
      10. "${cluster_name}-tidb-peer.${namespace}",
      11. "${cluster_name}-tidb-peer.${namespace}.svc",
      12. "*.${cluster_name}-tidb-peer",
      13. "*.${cluster_name}-tidb-peer.${namespace}",
      14. "*.${cluster_name}-tidb-peer.${namespace}.svc"
      15. ],
      16. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 TiDB Server 端证书:

      1. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal tidb-server.json | cfssljson -bare tidb-server
    • Pump Server 端证书

      首先生成默认的 pump-server.json 文件:

      1. cfssl print-defaults csr > pump-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "*.${cluster_name}-pump",
      7. "*.${cluster_name}-pump.${namespace}",
      8. "*.${cluster_name}-pump.${namespace}.svc"
      9. ],
      10. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 Pump Server 端证书:

      1. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal pump-server.json | cfssljson -bare pump-server
    • Drainer Server 端证书

      首先生成默认的 drainer-server.json 文件:

      1. cfssl print-defaults csr > drainer-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "<hosts 列表请参考下面描述>"
      7. ],
      8. ...

      现在 Drainer 组件是通过 Helm 来部署的,根据 values.yaml 文件配置方式不同,所需要填写的 hosts 字段也不相同。

      如果部署的时候设置 drainerName 属性,像下面这样:

      1. ...
      2. # Change the name of the statefulset and pod
      3. # The default is clusterName-ReleaseName-drainer
      4. # Do not change the name of an existing running drainer: this is unsupported.
      5. drainerName: my-drainer
      6. ...

      那么就这样配置 hosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "*.${drainer_name}",
      7. "*.${drainer_name}.${namespace}",
      8. "*.${drainer_name}.${namespace}.svc"
      9. ],
      10. ...

      如果部署的时候没有设置 drainerName 属性,需要这样配置 hosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "*.${cluster_name}-${release_name}-drainer",
      7. "*.${cluster_name}-${release_name}-drainer.${namespace}",
      8. "*.${cluster_name}-${release_name}-drainer.${namespace}.svc"
      9. ],
      10. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,${release_name}helm install 时候填写的 release name${drainer_name}values.yaml 文件里的 drainerName,用户也可以添加自定义 hosts

      最后生成 Drainer Server 端证书:

      1. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=internal drainer-server.json | cfssljson -bare drainer-server
    • TiCDC Server 端证书

      首先生成默认的 ticdc-server.json 文件:

      1. cfssl print-defaults csr > ticdc-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "${cluster_name}-ticdc",
      7. "${cluster_name}-ticdc.${namespace}",
      8. "${cluster_name}-ticdc.${namespace}.svc",
      9. "${cluster_name}-ticdc-peer",
      10. "${cluster_name}-ticdc-peer.${namespace}",
      11. "${cluster_name}-ticdc-peer.${namespace}.svc",
      12. "*.${cluster_name}-ticdc-peer",
      13. "*.${cluster_name}-ticdc-peer.${namespace}",
      14. "*.${cluster_name}-ticdc-peer.${namespace}.svc"
      15. ],
      16. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 TiCDC Server 端证书:

      1. 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 文件:

      1. cfssl print-defaults csr > tiflash-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "${cluster_name}-tiflash",
      7. "${cluster_name}-tiflash.${namespace}",
      8. "${cluster_name}-tiflash.${namespace}.svc",
      9. "${cluster_name}-tiflash-peer",
      10. "${cluster_name}-tiflash-peer.${namespace}",
      11. "${cluster_name}-tiflash-peer.${namespace}.svc",
      12. "*.${cluster_name}-tiflash-peer",
      13. "*.${cluster_name}-tiflash-peer.${namespace}",
      14. "*.${cluster_name}-tiflash-peer.${namespace}.svc"
      15. ],
      16. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 TiFlash Server 端证书:

      1. 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 上的集群数据,则需要为其中的 TiKV Importer 组件生成如下的 Server 端证书。

      首先生成默认的 importer-server.json 文件:

      1. cfssl print-defaults csr > importer-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "${cluster_name}-importer",
      7. "${cluster_name}-importer.${namespace}",
      8. "${cluster_name}-importer.${namespace}.svc",
      9. "*.${cluster_name}-importer",
      10. "*.${cluster_name}-importer.${namespace}",
      11. "*.${cluster_name}-importer.${namespace}.svc"
      12. ],
      13. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 TiKV Importer Server 端证书:

      1. 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 上的集群数据,则需要为其中的 TiDB Lightning 组件生成如下的 Server 端证书。

      首先生成默认的 lightning-server.json 文件:

      1. cfssl print-defaults csr > lightning-server.json

      然后编辑这个文件,修改 CNhosts 属性:

      1. ...
      2. "CN": "TiDB",
      3. "hosts": [
      4. "127.0.0.1",
      5. "::1",
      6. "${cluster_name}-lightning",
      7. "${cluster_name}-lightning.${namespace}",
      8. "${cluster_name}-lightning.${namespace}.svc"
      9. ],
      10. ...

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,用户也可以添加自定义 hosts

      最后生成 TiDB Lightning Server 端证书:

      1. 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 文件:

    1. cfssl print-defaults csr > client.json

    然后编辑这个文件,修改 CNhosts 属性,hosts 可以留空:

    1. ...
    2. "CN": "TiDB",
    3. "hosts": [],
    4. ...

    最后生成 Client 端证书:

    1. cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client
  7. 创建 Kubernetes Secret 对象。

    假设你已经按照上述文档为每个组件创建了一套 Server 端证书,并为各个客户端创建了一套 Client 端证书。通过下面的命令为 TiDB 集群创建这些 Secret 对象:

    PD 集群证书 Secret:

    1. kubectl create secret generic ${cluster_name}-pd-cluster-secret --namespace=${namespace} --from-file=tls.crt=pd-server.pem --from-file=tls.key=pd-server-key.pem --from-file=ca.crt=ca.pem

    TiKV 集群证书 Secret:

    1. kubectl create secret generic ${cluster_name}-tikv-cluster-secret --namespace=${namespace} --from-file=tls.crt=tikv-server.pem --from-file=tls.key=tikv-server-key.pem --from-file=ca.crt=ca.pem

    TiDB 集群证书 Secret:

    1. kubectl create secret generic ${cluster_name}-tidb-cluster-secret --namespace=${namespace} --from-file=tls.crt=tidb-server.pem --from-file=tls.key=tidb-server-key.pem --from-file=ca.crt=ca.pem

    Pump 集群证书 Secret:

    1. kubectl create secret generic ${cluster_name}-pump-cluster-secret --namespace=${namespace} --from-file=tls.crt=pump-server.pem --from-file=tls.key=pump-server-key.pem --from-file=ca.crt=ca.pem

    Drainer 集群证书 Secret:

    1. 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:

    1. 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:

    1. 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:

    1. 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:

    1. 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:

    1. kubectl create secret generic ${cluster_name}-cluster-client-secret --namespace=${namespace} --from-file=tls.crt=client.pem --from-file=tls.key=client-key.pem --from-file=ca.crt=ca.pem

    这里给 PD/TiKV/TiDB/Pump/Drainer 的 Server 端证书分别创建了一个 Secret 供他们启动时加载使用,另外一套 Client 端证书供他们的客户端连接使用。

使用 cert-manager 系统颁发证书

  1. 安装 cert-manager。

    请参考官网安装:cert-manager installation in Kubernetes

  2. 创建一个 Issuer 用于给 TiDB 集群颁发证书。

    为了配置 cert-manager 颁发证书,必须先创建 Issuer 资源。

    首先创建一个目录保存 cert-manager 创建证书所需文件:

    1. mkdir -p cert-manager
    2. cd cert-manager

    然后创建一个 tidb-cluster-issuer.yaml 文件,输入以下内容:

    1. apiVersion: cert-manager.io/v1
    2. kind: Issuer
    3. metadata:
    4. name: ${cluster_name}-selfsigned-ca-issuer
    5. namespace: ${namespace}
    6. spec:
    7. selfSigned: {}
    8. ---
    9. apiVersion: cert-manager.io/v1
    10. kind: Certificate
    11. metadata:
    12. name: ${cluster_name}-ca
    13. namespace: ${namespace}
    14. spec:
    15. secretName: ${cluster_name}-ca-secret
    16. commonName: "TiDB"
    17. isCA: true
    18. duration: 87600h # 10yrs
    19. renewBefore: 720h # 30d
    20. issuerRef:
    21. name: ${cluster_name}-selfsigned-ca-issuer
    22. kind: Issuer
    23. ---
    24. apiVersion: cert-manager.io/v1
    25. kind: Issuer
    26. metadata:
    27. name: ${cluster_name}-tidb-issuer
    28. namespace: ${namespace}
    29. spec:
    30. ca:
    31. secretName: ${cluster_name}-ca-secret

    其中 ${cluster_name} 为集群的名字,上面的文件创建三个对象:

    • 一个 SelfSigned 类型的 Issuer 对象(用于生成 CA 类型 Issuer 所需要的 CA 证书);
    • 一个 Certificate 对象,isCa 属性设置为 true
    • 一个可以用于颁发 TiDB 组件间 TLS 证书的 Issuer。

    最后执行下面的命令进行创建:

    1. kubectl apply -f tidb-cluster-issuer.yaml
  3. 创建 Server 端证书。

    cert-manager 中,Certificate 资源表示证书接口,该证书将由上面创建的 Issuer 颁发并保持更新。

    根据官网文档:Enable TLS Authentication,我们需要为每个组件创建一个 Server 端证书,并且为他们的 Client 创建一套公用的 Client 端证书。

    • PD 组件的 Server 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-pd-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-pd-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "${cluster_name}-pd"
      19. - "${cluster_name}-pd.${namespace}"
      20. - "${cluster_name}-pd.${namespace}.svc"
      21. - "${cluster_name}-pd-peer"
      22. - "${cluster_name}-pd-peer.${namespace}"
      23. - "${cluster_name}-pd-peer.${namespace}.svc"
      24. - "*.${cluster_name}-pd-peer"
      25. - "*.${cluster_name}-pd-peer.${namespace}"
      26. - "*.${cluster_name}-pd-peer.${namespace}.svc"
      27. ipAddresses:
      28. - 127.0.0.1
      29. - ::1
      30. issuerRef:
      31. name: ${cluster_name}-tidb-issuer
      32. kind: Issuer
      33. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-pd-cluster-secret

      • usages 请添加上 server authclient auth

      • dnsNames 需要填写这些 DNS,根据需要可以填写其他 DNS:

        • ${cluster_name}-pd
        • ${cluster_name}-pd.${namespace}
        • ${cluster_name}-pd.${namespace}.svc
        • ${cluster_name}-pd-pee
        • ${cluster_name}-pd-peer.${namespace}
        • ${cluster_name}-pd-peer.${namespace}.svc
        • *.${cluster_name}-pd-peer
        • *.${cluster_name}-pd-peer.${namespace}
        • *.${cluster_name}-pd-peer.${namespace}.svc
      • ipAddresses 需要填写这两个 IP ,根据需要可以填写其他 IP:

        • 127.0.0.1
        • ::1
      • issuerRef 请填写上面创建的 Issuer;

      • 其他属性请参考 cert-manager API

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-pd-cluster-secret 的 Secret 对象供 TiDB 集群的 PD 组件使用。

    • TiKV 组件的 Server 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-tikv-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-tikv-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "${cluster_name}-tikv"
      19. - "${cluster_name}-tikv.${namespace}"
      20. - "${cluster_name}-tikv.${namespace}.svc"
      21. - "${cluster_name}-tikv-peer"
      22. - "${cluster_name}-tikv-peer.${namespace}"
      23. - "${cluster_name}-tikv-peer.${namespace}.svc"
      24. - "*.${cluster_name}-tikv-peer"
      25. - "*.${cluster_name}-tikv-peer.${namespace}"
      26. - "*.${cluster_name}-tikv-peer.${namespace}.svc"
      27. ipAddresses:
      28. - 127.0.0.1
      29. - ::1
      30. issuerRef:
      31. name: ${cluster_name}-tidb-issuer
      32. kind: Issuer
      33. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-tikv-cluster-secret

      • usages 请添加上 server authclient auth

      • dnsNames 需要填写这些 DNS,根据需要可以填写其他 DNS:

        • ${cluster_name}-tikv
        • ${cluster_name}-tikv.${namespace}
        • ${cluster_name}-tikv.${namespace}.svc
        • ${cluster_name}-tikv-peer
        • ${cluster_name}-tikv-peer.${namespace}
        • ${cluster_name}-tikv-peer.${namespace}.svc
        • *.${cluster_name}-tikv-peer
        • *.${cluster_name}-tikv-peer.${namespace}
        • *.${cluster_name}-tikv-peer.${namespace}.svc
      • ipAddresses 需要填写这两个 IP ,根据需要可以填写其他 IP:

        • 127.0.0.1
        • ::1
      • issuerRef 请填写上面创建的 Issuer;

      • 其他属性请参考 cert-manager API

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-tikv-cluster-secret 的 Secret 对象供 TiDB 集群的 TiKV 组件使用。

    • TiDB 组件的 Server 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-tidb-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-tidb-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "${cluster_name}-tidb"
      19. - "${cluster_name}-tidb.${namespace}"
      20. - "${cluster_name}-tidb.${namespace}.svc"
      21. - "${cluster_name}-tidb-peer"
      22. - "${cluster_name}-tidb-peer.${namespace}"
      23. - "${cluster_name}-tidb-peer.${namespace}.svc"
      24. - "*.${cluster_name}-tidb-peer"
      25. - "*.${cluster_name}-tidb-peer.${namespace}"
      26. - "*.${cluster_name}-tidb-peer.${namespace}.svc"
      27. ipAddresses:
      28. - 127.0.0.1
      29. - ::1
      30. issuerRef:
      31. name: ${cluster_name}-tidb-issuer
      32. kind: Issuer
      33. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-tidb-cluster-secret

      • usages 请添加上 server authclient auth

      • dnsNames 需要填写这些 DNS,根据需要可以填写其他 DNS:

        • ${cluster_name}-tidb
        • ${cluster_name}-tidb.${namespace}
        • ${cluster_name}-tidb.${namespace}.svc
        • ${cluster_name}-tidb-peer
        • ${cluster_name}-tidb-peer.${namespace}
        • ${cluster_name}-tidb-peer.${namespace}.svc
        • *.${cluster_name}-tidb-peer
        • *.${cluster_name}-tidb-peer.${namespace}
        • *.${cluster_name}-tidb-peer.${namespace}.svc
      • ipAddresses 需要填写这两个 IP ,根据需要可以填写其他 IP:

        • 127.0.0.1
        • ::1
      • issuerRef 请填写上面创建的 Issuer;

      • 其他属性请参考 cert-manager API

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-tidb-cluster-secret 的 Secret 对象供 TiDB 集群的 TiDB 组件使用。

    • Pump 组件的 Server 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-pump-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-pump-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "*.${cluster_name}-pump"
      19. - "*.${cluster_name}-pump.${namespace}"
      20. - "*.${cluster_name}-pump.${namespace}.svc"
      21. ipAddresses:
      22. - 127.0.0.1
      23. - ::1
      24. issuerRef:
      25. name: ${cluster_name}-tidb-issuer
      26. kind: Issuer
      27. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-pump-cluster-secret

      • usages 请添加上 server authclient auth

      • dnsNames 需要填写这些 DNS,根据需要可以填写其他 DNS:

        • *.${cluster_name}-pump
        • *.${cluster_name}-pump.${namespace}
        • *.${cluster_name}-pump.${namespace}.svc
      • ipAddresses 需要填写这两个 IP ,根据需要可以填写其他 IP:

        • 127.0.0.1
        • ::1
      • issuerRef 请填写上面创建的 Issuer;

      • 其他属性请参考 cert-manager API

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-pump-cluster-secret 的 Secret 对象供 TiDB 集群的 Pump 组件使用。

    • Drainer 组件的 Server 端证书。

      现在 Drainer 组件是通过 Helm 来部署的,根据 values.yaml 文件配置方式不同,所需要填写的 dnsNames 字段也不相同。

      如果部署的时候设置 drainerName 属性,像下面这样:

      1. ...
      2. # Change the name of the statefulset and pod
      3. # The default is clusterName-ReleaseName-drainer
      4. # Do not change the name of an existing running drainer: this is unsupported.
      5. drainerName: my-drainer
      6. ...

      那么就需要这样配置证书:

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-drainer-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-drainer-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "*.${drainer_name}"
      19. - "*.${drainer_name}.${namespace}"
      20. - "*.${drainer_name}.${namespace}.svc"
      21. ipAddresses:
      22. - 127.0.0.1
      23. - ::1
      24. issuerRef:
      25. name: ${cluster_name}-tidb-issuer
      26. kind: Issuer
      27. group: cert-manager.io

      如果部署的时候没有设置 drainerName 属性,需要这样配置 dnsNames 属性:

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-drainer-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-drainer-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "*.${cluster_name}-${release_name}-drainer"
      19. - "*.${cluster_name}-${release_name}-drainer.${namespace}"
      20. - "*.${cluster_name}-${release_name}-drainer.${namespace}.svc"
      21. ipAddresses:
      22. - 127.0.0.1
      23. - ::1
      24. issuerRef:
      25. name: ${cluster_name}-tidb-issuer
      26. kind: Issuer
      27. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字,${namespace} 为 TiDB 集群部署的命名空间,${release_name}helm install 时候填写的 release name${drainer_name}values.yaml 文件里的 drainerName,用户也可以添加自定义 dnsNames

      • spec.secretName 请设置为 ${cluster_name}-drainer-cluster-secret

      • usages 请添加上 server authclient auth

      • dnsNames 请参考上面的描述;

      • ipAddresses 需要填写这两个 IP ,根据需要可以填写其他 IP:

        • 127.0.0.1
        • ::1
      • issuerRef 请填写上面创建的 Issuer;

      • 其他属性请参考 cert-manager API

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-drainer-cluster-secret 的 Secret 对象供 TiDB 集群的 Drainer 组件使用。

    • TiCDC 组件的 Server 端证书。

      TiCDC 从 v4.0.3 版本开始支持 TLS,TiDB Operator v1.1.3 版本同步支持 TiCDC 开启 TLS 功能。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-ticdc-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-ticdc-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "${cluster_name}-ticdc"
      19. - "${cluster_name}-ticdc.${namespace}"
      20. - "${cluster_name}-ticdc.${namespace}.svc"
      21. - "${cluster_name}-ticdc-peer"
      22. - "${cluster_name}-ticdc-peer.${namespace}"
      23. - "${cluster_name}-ticdc-peer.${namespace}.svc"
      24. - "*.${cluster_name}-ticdc-peer"
      25. - "*.${cluster_name}-ticdc-peer.${namespace}"
      26. - "*.${cluster_name}-ticdc-peer.${namespace}.svc"
      27. ipAddresses:
      28. - 127.0.0.1
      29. - ::1
      30. issuerRef:
      31. name: ${cluster_name}-tidb-issuer
      32. kind: Issuer
      33. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-ticdc-cluster-secret

      • usages 请添加上 server authclient auth

      • dnsNames 需要填写这些 DNS,根据需要可以填写其他 DNS:

        • ${cluster_name}-ticdc
        • ${cluster_name}-ticdc.${namespace}
        • ${cluster_name}-ticdc.${namespace}.svc
        • ${cluster_name}-ticdc-peer
        • ${cluster_name}-ticdc-peer.${namespace}
        • ${cluster_name}-ticdc-peer.${namespace}.svc
        • *.${cluster_name}-ticdc-peer
        • *.${cluster_name}-ticdc-peer.${namespace}
        • *.${cluster_name}-ticdc-peer.${namespace}.svc
      • ipAddresses 需要填写这两个 IP,根据需要可以填写其他 IP:

        • 127.0.0.1
        • ::1
      • issuerRef 请填写上面创建的 Issuer;

      • 其他属性请参考 cert-manager API

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-ticdc-cluster-secret 的 Secret 对象供 TiDB 集群的 TiCDC 组件使用。

    • TiFlash 组件的 Server 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-tiflash-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-tiflash-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "${cluster_name}-tiflash"
      19. - "${cluster_name}-tiflash.${namespace}"
      20. - "${cluster_name}-tiflash.${namespace}.svc"
      21. - "${cluster_name}-tiflash-peer"
      22. - "${cluster_name}-tiflash-peer.${namespace}"
      23. - "${cluster_name}-tiflash-peer.${namespace}.svc"
      24. - "*.${cluster_name}-tiflash-peer"
      25. - "*.${cluster_name}-tiflash-peer.${namespace}"
      26. - "*.${cluster_name}-tiflash-peer.${namespace}.svc"
      27. ipAddresses:
      28. - 127.0.0.1
      29. - ::1
      30. issuerRef:
      31. name: ${cluster_name}-tidb-issuer
      32. kind: Issuer
      33. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-tiflash-cluster-secret

      • usages 请添加上 server authclient 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

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-tiflash-cluster-secret 的 Secret 对象供 TiDB 集群的 TiFlash 组件使用。

    • TiKV Importer 组件的 Server 端证书。

      如需要使用 TiDB Lightning 恢复 Kubernetes 上的集群数据,则需要为其中的 TiKV Importer 组件生成如下的 Server 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-importer-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-importer-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "${cluster_name}-importer"
      19. - "${cluster_name}-importer.${namespace}"
      20. - "${cluster_name}-importer.${namespace}.svc"
      21. - "*.${cluster_name}-importer"
      22. - "*.${cluster_name}-importer.${namespace}"
      23. - "*.${cluster_name}-importer.${namespace}.svc"
      24. ipAddresses:
      25. - 127.0.0.1
      26. - ::1
      27. issuerRef:
      28. name: ${cluster_name}-tidb-issuer
      29. kind: Issuer
      30. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-importer-cluster-secret

      • usages 请添加上 server authclient 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

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-importer-cluster-secret 的 Secret 对象供 TiDB 集群的 TiKV Importer 组件使用。

    • TiDB Lightning 组件的 Server 端证书。

      如需要使用 TiDB Lightning 恢复 Kubernetes 上的集群数据,则需要为其中的 TiDB Lightning 组件生成如下的 Server 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-lightning-cluster-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-lightning-cluster-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - server auth
      16. - client auth
      17. dnsNames:
      18. - "${cluster_name}-lightning"
      19. - "${cluster_name}-lightning.${namespace}"
      20. - "${cluster_name}-lightning.${namespace}.svc"
      21. ipAddresses:
      22. - 127.0.0.1
      23. - ::1
      24. issuerRef:
      25. name: ${cluster_name}-tidb-issuer
      26. kind: Issuer
      27. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-lightning-cluster-secret

      • usages 请添加上 server authclient 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

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-lightning-cluster-secret 的 Secret 对象供 TiDB 集群的 TiDB Lightning 组件使用。

    • 一套 TiDB 集群组件的 Client 端证书。

      1. apiVersion: cert-manager.io/v1
      2. kind: Certificate
      3. metadata:
      4. name: ${cluster_name}-cluster-client-secret
      5. namespace: ${namespace}
      6. spec:
      7. secretName: ${cluster_name}-cluster-client-secret
      8. duration: 8760h # 365d
      9. renewBefore: 360h # 15d
      10. subject:
      11. organizations:
      12. - PingCAP
      13. commonName: "TiDB"
      14. usages:
      15. - client auth
      16. issuerRef:
      17. name: ${cluster_name}-tidb-issuer
      18. kind: Issuer
      19. group: cert-manager.io

      其中 ${cluster_name} 为集群的名字:

      • spec.secretName 请设置为 ${cluster_name}-cluster-client-secret

      • usages 请添加上 client auth

      • dnsNamesipAddresses 不需要填写;

      • issuerRef 请填写上面创建的 Issuer;

      • 其他属性请参考 cert-manager API

        创建这个对象以后,cert-manager 会生成一个名字为 ${cluster_name}-cluster-client-secret 的 Secret 对象供 TiDB 组件的 Client 使用。

第二步:部署 TiDB 集群

在部署 TiDB 集群时,可以开启集群间的 TLS,同时可以设置 cert-allowed-cn 配置项(TiDB 为 cluster-verify-cn),用来验证集群间各组件证书的 CN (Common Name)。

为 TiDB 组件间开启 TLS - 图4注意

目前 PD 的 cert-allowed-cn 配置项只能设置一个值。因此所有 Certificate 对象的 commonName 都要设置成同样一个值。

在这一步中,需要完成以下操作:

  • 创建一套 TiDB 集群
  • 为 TiDB 组件间开启 TLS,并开启 CN 验证
  • 部署一套监控系统
  • 部署 Pump 组件,并开启 CN 验证
  1. 创建一套 TiDB 集群(监控系统和 Pump 组件已包含在内):

    创建 tidb-cluster.yaml 文件:

    1. apiVersion: pingcap.com/v1alpha1
    2. kind: TidbCluster
    3. metadata:
    4. name: ${cluster_name}
    5. namespace: ${namespace}
    6. spec:
    7. tlsCluster:
    8. enabled: true
    9. version: v5.4.0
    10. timezone: UTC
    11. pvReclaimPolicy: Retain
    12. pd:
    13. baseImage: pingcap/pd
    14. maxFailoverCount: 0
    15. replicas: 1
    16. requests:
    17. storage: "10Gi"
    18. config:
    19. security:
    20. cert-allowed-cn:
    21. - TiDB
    22. tikv:
    23. baseImage: pingcap/tikv
    24. maxFailoverCount: 0
    25. replicas: 1
    26. requests:
    27. storage: "100Gi"
    28. config:
    29. security:
    30. cert-allowed-cn:
    31. - TiDB
    32. tidb:
    33. baseImage: pingcap/tidb
    34. maxFailoverCount: 0
    35. replicas: 1
    36. service:
    37. type: ClusterIP
    38. config:
    39. security:
    40. cluster-verify-cn:
    41. - TiDB
    42. pump:
    43. baseImage: pingcap/tidb-binlog
    44. replicas: 1
    45. requests:
    46. storage: "100Gi"
    47. config:
    48. security:
    49. cert-allowed-cn:
    50. - TiDB
    51. ---
    52. apiVersion: pingcap.com/v1alpha1
    53. kind: TidbMonitor
    54. metadata:
    55. name: ${cluster_name}
    56. namespace: ${namespace}
    57. spec:
    58. clusters:
    59. - name: ${cluster_name}
    60. prometheus:
    61. baseImage: prom/prometheus
    62. version: v2.27.1
    63. grafana:
    64. baseImage: grafana/grafana
    65. version: 7.5.11
    66. initializer:
    67. baseImage: pingcap/tidb-monitor-initializer
    68. version: v5.4.0
    69. reloader:
    70. baseImage: pingcap/tidb-monitor-reloader
    71. version: v1.0.1
    72. prometheusReloader:
    73. baseImage: quay.io/prometheus-operator/prometheus-config-reloader
    74. version: v0.49.0
    75. imagePullPolicy: IfNotPresent

    然后使用 kubectl apply -f tidb-cluster.yaml 来创建 TiDB 集群。

  2. 创建 Drainer 组件并开启 TLS 以及 CN 验证。

    • 第一种方式:创建 Drainer 的时候设置 drainerName

      编辑 values.yaml 文件,设置好 drainer-name,并将 TLS 功能打开:

      1. ...
      2. drainerName: ${drainer_name}
      3. tlsCluster:
      4. enabled: true
      5. certAllowedCN:
      6. - TiDB
      7. ...

      然后部署 Drainer 集群:

      1. helm install ${release_name} pingcap/tidb-drainer --namespace=${namespace} --version=${helm_version} -f values.yaml
    • 第二种方式:创建 Drainer 的时候不设置 drainerName

      编辑 values.yaml 文件,将 TLS 功能打开:

      1. ...
      2. tlsCluster:
      3. enabled: true
      4. certAllowedCN:
      5. - TiDB
      6. ...

      然后部署 Drainer 集群:

      1. helm install ${release_name} pingcap/tidb-drainer --namespace=${namespace} --version=${helm_version} -f values.yaml
  3. 创建 Backup/Restore 资源对象。

    • 创建 backup.yaml 文件:

      1. apiVersion: pingcap.com/v1alpha1
      2. kind: Backup
      3. metadata:
      4. name: ${cluster_name}-backup
      5. namespace: ${namespace}
      6. spec:
      7. backupType: full
      8. br:
      9. cluster: ${cluster_name}
      10. clusterNamespace: ${namespace}
      11. sendCredToTikv: true
      12. from:
      13. host: ${host}
      14. secretName: ${tidb_secret}
      15. port: 4000
      16. user: root
      17. s3:
      18. provider: aws
      19. region: ${my_region}
      20. secretName: ${s3_secret}
      21. bucket: ${my_bucket}
      22. prefix: ${my_folder}

      然后部署 Backup:

      1. kubectl apply -f backup.yaml
    • 创建 restore.yaml 文件:

      1. apiVersion: pingcap.com/v1alpha1
      2. kind: Restore
      3. metadata:
      4. name: ${cluster_name}-restore
      5. namespace: ${namespace}
      6. spec:
      7. backupType: full
      8. br:
      9. cluster: ${cluster_name}
      10. clusterNamespace: ${namespace}
      11. sendCredToTikv: true
      12. to:
      13. host: ${host}
      14. secretName: ${tidb_secret}
      15. port: 4000
      16. user: root
      17. s3:
      18. provider: aws
      19. region: ${my_region}
      20. secretName: ${s3_secret}
      21. bucket: ${my_bucket}
      22. prefix: ${my_folder}

      然后部署 Restore:

      1. kubectl apply -f restore.yaml

第三步:配置 pd-ctltikv-ctl 连接集群

  1. 挂载证书。

    通过下面命令配置 spec.pd.mountClusterClientSecret: truespec.tikv.mountClusterClientSecret: true

    1. kubectl patch tc ${cluster_name} -n ${namespace} --type merge -p '{"spec":{"pd":{"mountClusterClientSecret": true},"tikv":{"mountClusterClientSecret": true}}}'

    为 TiDB 组件间开启 TLS - 图5注意

    • 上面配置改动会滚动升级 PD 和 TiKV 集群。
    • 上面配置从 TiDB Operator v1.1.5 开始支持。
  2. 使用 pd-ctl 连接集群。

    进入 PD Pod:

    1. kubectl exec -it ${cluster_name}-pd-0 -n ${namespace} sh

    使用 pd-ctl

    1. cd /var/lib/cluster-client-tls
    2. /pd-ctl --cacert=ca.crt --cert=tls.crt --key=tls.key -u https://127.0.0.1:2379 member
  3. 使用 tikv-ctl 连接集群。

    进入 TiKV Pod:

    1. kubectl exec -it ${cluster_name}-tikv-0 -n ${namespace} sh

    使用 tikv-ctl

    1. cd /var/lib/cluster-client-tls
    2. /tikv-ctl --ca-path=ca.crt --cert-path=tls.crt --key-path=tls.key --host 127.0.0.1:20160 cluster