为 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

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

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

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

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

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

    1. 首先下载 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 文件:

        然后编辑这个文件,修改 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 端证书

        如需要,则需要为其中的 TiKV Importer 组件生成如下的 Server 端证书。

        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/v1alpha2
      2. kind: Issuer
      3. metadata:
      4. name: ${cluster_name}-selfsigned-ca-issuer
      5. namespace: ${namespace}
      6. spec:
      7. selfSigned: {}
      8. ---
      9. kind: Certificate
      10. metadata:
      11. name: ${cluster_name}-ca
      12. namespace: ${namespace}
      13. spec:
      14. secretName: ${cluster_name}-ca-secret
      15. commonName: "TiDB"
      16. isCA: true
      17. duration: 87600h # 10yrs
      18. renewBefore: 720h # 30d
      19. issuerRef:
      20. name: ${cluster_name}-selfsigned-ca-issuer
      21. kind: Issuer
      22. ---
      23. apiVersion: cert-manager.io/v1alpha2
      24. kind: Issuer
      25. metadata:
      26. name: ${cluster_name}-tidb-issuer
      27. spec:
      28. ca:
      29. 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 颁发并保持更新。

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

      • PD 组件的 Server 端证书。

        其中 ${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/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "${cluster_name}-tikv"
        18. - "${cluster_name}-tikv.${namespace}"
        19. - "${cluster_name}-tikv.${namespace}.svc"
        20. - "${cluster_name}-tikv-peer"
        21. - "${cluster_name}-tikv-peer.${namespace}"
        22. - "${cluster_name}-tikv-peer.${namespace}.svc"
        23. - "*.${cluster_name}-tikv-peer"
        24. - "*.${cluster_name}-tikv-peer.${namespace}"
        25. - "*.${cluster_name}-tikv-peer.${namespace}.svc"
        26. ipAddresses:
        27. - 127.0.0.1
        28. - ::1
        29. issuerRef:
        30. name: ${cluster_name}-tidb-issuer
        31. kind: Issuer
        32. 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 会生成一个名字为 ${cluster_name}-tikv-cluster-secret 的 Secret 对象供 TiDB 集群的 TiKV 组件使用。

      • TiDB 组件的 Server 端证书。

        1. apiVersion: cert-manager.io/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "${cluster_name}-tidb"
        18. - "${cluster_name}-tidb.${namespace}"
        19. - "${cluster_name}-tidb.${namespace}.svc"
        20. - "${cluster_name}-tidb-peer"
        21. - "${cluster_name}-tidb-peer.${namespace}"
        22. - "${cluster_name}-tidb-peer.${namespace}.svc"
        23. - "*.${cluster_name}-tidb-peer"
        24. - "*.${cluster_name}-tidb-peer.${namespace}"
        25. - "*.${cluster_name}-tidb-peer.${namespace}.svc"
        26. ipAddresses:
        27. - 127.0.0.1
        28. - ::1
        29. issuerRef:
        30. name: ${cluster_name}-tidb-issuer
        31. kind: Issuer
        32. 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/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "*.${cluster_name}-pump"
        18. - "*.${cluster_name}-pump.${namespace}"
        19. - "*.${cluster_name}-pump.${namespace}.svc"
        20. ipAddresses:
        21. - 127.0.0.1
        22. - ::1
        23. issuerRef:
        24. name: ${cluster_name}-tidb-issuer
        25. kind: Issuer
        26. 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 会生成一个名字为 ${cluster_name}-pump-cluster-secret 的 Secret 对象供 TiDB 集群的 Pump 组件使用。

      • Drainer 组件的 Server 端证书。

        如果部署的时候设置 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/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "*.${drainer_name}"
        18. - "*.${drainer_name}.${namespace}"
        19. - "*.${drainer_name}.${namespace}.svc"
        20. ipAddresses:
        21. - 127.0.0.1
        22. - ::1
        23. issuerRef:
        24. name: ${cluster_name}-tidb-issuer
        25. kind: Issuer
        26. group: cert-manager.io

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

        1. apiVersion: cert-manager.io/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "*.${cluster_name}-${release_name}-drainer"
        18. - "*.${cluster_name}-${release_name}-drainer.${namespace}"
        19. - "*.${cluster_name}-${release_name}-drainer.${namespace}.svc"
        20. ipAddresses:
        21. - 127.0.0.1
        22. - ::1
        23. issuerRef:
        24. name: ${cluster_name}-tidb-issuer
        25. kind: Issuer
        26. 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/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "${cluster_name}-ticdc"
        18. - "${cluster_name}-ticdc.${namespace}"
        19. - "${cluster_name}-ticdc.${namespace}.svc"
        20. - "${cluster_name}-ticdc-peer"
        21. - "${cluster_name}-ticdc-peer.${namespace}"
        22. - "${cluster_name}-ticdc-peer.${namespace}.svc"
        23. - "*.${cluster_name}-ticdc-peer"
        24. - "*.${cluster_name}-ticdc-peer.${namespace}"
        25. - "*.${cluster_name}-ticdc-peer.${namespace}.svc"
        26. ipAddresses:
        27. - 127.0.0.1
        28. - ::1
        29. issuerRef:
        30. name: ${cluster_name}-tidb-issuer
        31. kind: Issuer
        32. 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}.svc
        • ipAddresses 需要填写这两个 IP,根据需要可以填写其他 IP:
          • 127.0.0.1
          • ::1
        • issuerRef 请填写上面创建的 Issuer;
        • 其他属性请参考 。

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

      • TiFlash 组件的 Server 端证书。

        1. apiVersion: cert-manager.io/v1alpha2
        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. - PingCAP
        11. commonName: "TiDB"
        12. usages:
        13. - server auth
        14. - client auth
        15. dnsNames:
        16. - "${cluster_name}-tiflash"
        17. - "${cluster_name}-tiflash.${namespace}"
        18. - "${cluster_name}-tiflash.${namespace}.svc"
        19. - "${cluster_name}-tiflash-peer"
        20. - "${cluster_name}-tiflash-peer.${namespace}"
        21. - "${cluster_name}-tiflash-peer.${namespace}.svc"
        22. - "*.${cluster_name}-tiflash-peer"
        23. - "*.${cluster_name}-tiflash-peer.${namespace}"
        24. - "*.${cluster_name}-tiflash-peer.${namespace}.svc"
        25. ipAddresses:
        26. - 127.0.0.1
        27. - ::1
        28. issuerRef:
        29. name: ${cluster_name}-tidb-issuer
        30. kind: Issuer
        31. 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 端证书。

        如需要,则需要为其中的 TiKV Importer 组件生成如下的 Server 端证书。

        1. apiVersion: cert-manager.io/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "${cluster_name}-importer"
        18. - "${cluster_name}-importer.${namespace}"
        19. - "${cluster_name}-importer.${namespace}.svc"
        20. - "*.${cluster_name}-importer"
        21. - "*.${cluster_name}-importer.${namespace}"
        22. - "*.${cluster_name}-importer.${namespace}.svc"
        23. ipAddresses:
        24. - 127.0.0.1
        25. - ::1
        26. issuerRef:
        27. name: ${cluster_name}-tidb-issuer
        28. kind: Issuer
        29. 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 组件生成如下的 Server 端证书。

        1. apiVersion: cert-manager.io/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - server auth
        15. - client auth
        16. dnsNames:
        17. - "${cluster_name}-lightning"
        18. - "${cluster_name}-lightning.${namespace}"
        19. - "${cluster_name}-lightning.${namespace}.svc"
        20. ipAddresses:
        21. - 127.0.0.1
        22. - ::1
        23. issuerRef:
        24. name: ${cluster_name}-tidb-issuer
        25. kind: Issuer
        26. 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/v1alpha2
        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. organization:
        11. - PingCAP
        12. commonName: "TiDB"
        13. usages:
        14. - client auth
        15. issuerRef:
        16. name: ${cluster_name}-tidb-issuer
        17. kind: Issuer
        18. group: cert-manager.io

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

        • spec.secretName 请设置为 ${cluster_name}-cluster-client-secret
        • usages 请添加上 client auth
        • dnsNamesipAddresses 不需要填写;
        • issuerRef 请填写上面创建的 Issuer;
        • 其他属性请参考 。

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

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

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

    • 创建一套 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.2.1
      10. timezone: UTC
      11. pvReclaimPolicy: Retain
      12. pd:
      13. baseImage: pingcap/pd
      14. replicas: 1
      15. requests:
      16. storage: "1Gi"
      17. config:
      18. security:
      19. cert-allowed-cn:
      20. - TiDB
      21. tikv:
      22. baseImage: pingcap/tikv
      23. replicas: 1
      24. requests:
      25. storage: "1Gi"
      26. config:
      27. security:
      28. cert-allowed-cn:
      29. - TiDB
      30. tidb:
      31. baseImage: pingcap/tidb
      32. replicas: 1
      33. service:
      34. type: ClusterIP
      35. config:
      36. security:
      37. cluster-verify-cn:
      38. - TiDB
      39. pump:
      40. baseImage: pingcap/tidb-binlog
      41. replicas: 1
      42. requests:
      43. storage: "1Gi"
      44. config:
      45. security:
      46. cert-allowed-cn:
      47. - TiDB
      48. ---
      49. apiVersion: pingcap.com/v1alpha1
      50. kind: TidbMonitor
      51. metadata:
      52. name: ${cluster_name}
      53. namespace: ${namespace}
      54. spec:
      55. clusters:
      56. - name: ${cluster_name}
      57. prometheus:
      58. baseImage: prom/prometheus
      59. version: v2.11.1
      60. grafana:
      61. baseImage: grafana/grafana
      62. version: 6.0.1
      63. initializer:
      64. baseImage: pingcap/tidb-monitor-initializer
      65. version: v5.2.1
      66. reloader:
      67. baseImage: pingcap/tidb-monitor-reloader
      68. version: v1.0.1
      69. 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
    1. 挂载证书。

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

      1. kubectl edit tc ${cluster_name} -n ${namespace}
    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