使用公钥基础设施 (PKI) 管理 swarm 安全性
Docker 内置的 Swarm 模式公钥基础设施 (PKI) 系统使得安全地部署容器编排系统变得简单。Swarm 中的节点使用相互传输层安全性 (TLS) 来验证、授权和加密与 Swarm 中其他节点的通信。
当您通过运行 docker swarm init 创建一个 Swarm 时,Docker 会将自己指定为管理节点。默认情况下,管理节点会生成一个新的根证书颁发机构 (CA) 以及一个密钥对,用于保护与加入 Swarm 的其他节点的通信。如果您愿意,您可以使用 docker swarm init 命令的 --external-ca 标志指定您自己的外部生成的根 CA。
管理节点还会生成两个令牌,用于将其他节点加入 Swarm:一个工作节点令牌和一个管理节点令牌。每个令牌都包含根 CA 证书的摘要和一个随机生成的密钥。当一个节点加入 Swarm 时,该加入节点会使用摘要来验证远程管理节点的根 CA 证书。远程管理节点会使用该密钥来确保加入的节点是经批准的节点。
每当有新节点加入 Swarm 时,管理节点都会向该节点颁发一个证书。该证书包含一个随机生成的节点 ID,用于在证书通用名称 (CN) 下标识该节点,以及在组织单位 (OU) 下的角色。对于该节点在当前 Swarm 中的生命周期而言,节点 ID 作为其加密安全的节点身份。
下图说明了管理节点和工作节点如何使用最低 TLS 1.2 来加密通信。

以下示例显示了来自一个工作节点证书的信息。
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
3b:1c:06:91:73:fb:16:ff:69:c3:f7:a2:fe:96:c1:73:e2:80:97:3b
Signature Algorithm: ecdsa-with-SHA256
Issuer: CN=swarm-ca
Validity
Not Before: Aug 30 02:39:00 2016 GMT
Not After : Nov 28 03:39:00 2016 GMT
Subject: O=ec2adilxf4ngv7ev8fwsi61i7, OU=swarm-worker, CN=dw02poa4vqvzxi5c10gm4pq2g
...snip...默认情况下,Swarm 中的每个节点每三个月更新一次证书。您可以通过运行 docker swarm update --cert-expiry <TIME PERIOD> 命令来配置此间隔。最小轮换值为 1 小时。详情请参阅 docker swarm update CLI 参考。
轮换 CA 证书
注意Mirantis Kubernetes Engine (MKE),前身为 Docker UCP,为 Swarm 提供外部证书管理服务。如果您在 MKE 上运行 Swarm,则不应手动轮换 CA 证书。相反,如果需要轮换证书,请联系 Mirantis 支持。
如果集群 CA 密钥或管理节点遭到泄露,您可以轮换 Swarm 的根 CA,这样任何节点都不再信任由旧根 CA 签名的证书。
运行 docker swarm ca --rotate 来生成新的 CA 证书和密钥。如果您愿意,可以传递 --ca-cert 和 --external-ca 标志来指定根证书并使用 Swarm 外部的根 CA。或者,您也可以传递 --ca-cert 和 --ca-key 标志来指定您希望 Swarm 使用的确切证书和密钥。
当您发出 docker swarm ca --rotate 命令时,会按顺序发生以下事情:
Docker 会生成一个交叉签名的证书。这意味着新根 CA 证书的一个版本会用旧根 CA 证书进行签名。这个交叉签名的证书被用作所有新节点证书的中间证书。这确保了仍然信任旧根 CA 的节点仍然可以验证由新 CA 签名的证书。
Docker 还会通知所有节点立即更新其 TLS 证书。此过程可能需要几分钟,具体取决于 Swarm 中节点的数量。
在 Swarm 中的每个节点都有了由新 CA 签名的新 TLS 证书后,Docker 会忘记旧的 CA 证书和密钥材料,并告诉所有节点只信任新的 CA 证书。
这也会导致 Swarm 的加入令牌发生变化。之前的加入令牌不再有效。
从此时起,所有新颁发的节点证书都将由新的根 CA 签名,并且不包含任何中间证书。