变更 Rancher Server IP 或域名
#
步骤 1:准备全部集群的直连 kubeconfig 配置文件在默认情况下, Rancher UI 上复制的 kubeconfig 通过cluster agent
代理连接到 K8S 集群。变更 SSL 证书会导致cluster agent
无法连接 Rancher Server,从而导致kubectl
无法使用 Rancher UI 上复制的 kubeconfig 去操作 K8S 集群。用户需要通过kubectl
命令行修改配置,解决这个问题。在执行域名或 IP 变更之前,请准备好所有集群的直连 kubeconfig 配置文件,详情考参考:恢复 kubectl 配置文件
警告
如果您使用的是 2.1.x 以前的版本,可以在 Master 节点的
/etc/kubernetes/.tmp
路径下找到kubecfg-kube-admin.yml
文件。该文件是具有集群管理员权限的直连 kubeconfig 配置文件;执行域名变更或 IP 变更之前,请备份 Rancher Server,详情请参考备份和恢复。
#
步骤 2:准备证书SSL 证书与域名或IP
之间存在绑定关系,客户端通过域名或IP
访问 Server 端时,需要进行 SSL 证书校验。如果客户端访问的域名或IP
与 SSL 证书中预先绑定的域名或IP
不一致,那么 SSL 会认为这个 Server 端是伪造的,导致证书校验失败,客户端无法连接 Server 端。如果您更换了域名或 IP,而且在生成 SSL 证书时没有绑定新的域名或 IP,出现上述问题就是一个正常的现象。解决该问题的方法也非常直接明了:生成一个新的 SSL 证书,绑定新的域名或 IP,替换已有的证书。如果您已经有后续域名或 IP 变更的具体规划,也可以在生成 SSL 证书 时绑定这次和以后需要替换的域名或 IP,这样可以减轻下次变更的工作量。总而言之,如果更换了 Server 端的域名或IP
,一般会涉及到 SSL 证书更换。请参考下文,替换自签名 SSL 证书或权威认证证书。
自签名 ssl 证书
复制以下代码另存为
create_self-signed-cert.sh
或者其他您喜欢的文件名。修改代码开头的CN
(域名),如果需要使用 ip 去访问 Rancher Server,那么需要给 ssl 证书添加扩展 IP,多个 IP 用逗号隔开。如果想实现多个域名访问 Rancher Server,则添加扩展域名(SSL_DNS),多个SSL_DNS
用逗号隔开。
help () { echo ' ================================================================ ' echo ' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为www.rancher.local,如果是ip访问服务,则可忽略;' echo ' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;' echo ' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;' echo ' --ssl-size: ssl加密位数,默认2048;' echo ' --ssl-cn: 国家代码(2个字母的代号),默认CN;' echo ' --ca-cert-recreate: 是否重新创建 ca-cert,ca 证书默认有效期 10 年,创建的 ssl 证书有效期如果是一年需要续签,那么可以直接复用原来的 ca 证书,默认 false;' echo ' 使用示例:' echo ' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ ' echo ' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650' echo ' ================================================================' }
case "$1" in -h|--help) help; exit;; esac
if [[ $1 == '' ]];then help; exit; fi
CMDOPTS="$*" for OPTS in $CMDOPTS; do key=$(echo ${OPTS} | awk -F"=" '{print $1}' ) value=$(echo ${OPTS} | awk -F"=" '{print $2}' ) case "$key" in --ssl-domain) SSL_DOMAIN=$value ;; --ssl-trusted-ip) SSL_TRUSTED_IP=$value ;; --ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;; --ssl-size) SSL_SIZE=$value ;; --ssl-date) SSL_DATE=$value ;; --ca-date) CA_DATE=$value ;; --ssl-cn) CN=$value ;; --ca-cert-recreate) CA_CERT_RECREATE=$value ;; --ca-key-recreate) CA_KEY_RECREATE=$value ;; esac done
#
CA相关配置CA_KEY_RECREATE=${CA_KEY_RECREATE:-false} CA_CERT_RECREATE=${CA_CERT_RECREATE:-false}
CA_DATE=${CA_DATE:-3650} CA_KEY=${CA_KEY:-cakey.pem} CA_CERT=${CA_CERT:-cacerts.pem} CA_DOMAIN=cattle-ca
#
ssl相关配置SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf} SSL_DOMAIN=${SSL_DOMAIN:-'www.rancher.local'} SSL_DATE=${SSL_DATE:-3650} SSL_SIZE=${SSL_SIZE:-2048}
#
国家代码(2个字母的代号),默认CN;CN=${CN:-CN}
SSL_KEY=$SSL_DOMAIN.key SSL_CSR=$SSL_DOMAIN.csr SSL_CERT=$SSL_DOMAIN.crt
echo -e "\033[32m ---------------------------- \033[0m" echo -e "\033[32m | 生成 SSL Cert | \033[0m" echo -e "\033[32m ---------------------------- \033[0m"
#
如果存在 ca-key, 并且需要重新创建 ca-keyif [[ -e ./${CA_KEY} ]] && [[ ${CA_KEY_RECREATE} == 'true' ]]; then
#
如果存在 ca-key,并且不需要重新创建 ca-keyelif [[ -e ./${CA_KEY} ]] && [[ ${CA_KEY_RECREATE} == 'false' ]]; then
#
如果不存在 ca-keyelse
fi
echo -e "\033[32m ====> 3. 生成 Openssl 配置文件 ${SSL_CONFIG} \033[0m" cat > ${SSL_CONFIG} <<EOM [req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name][ v3_req ] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = clientAuth, serverAuth EOM
if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} || -n ${SSL_DOMAIN} ]]; then cat >> ${SSL_CONFIG} <<EOM subjectAltName = @alt_names [alt_names] EOM IFS="," dns=(${SSL_TRUSTED_DOMAIN}) dns+=(${SSL_DOMAIN}) for i in "${!dns[@]}"; do echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG} done
fi
echo -e "\033[32m ====> 4. 生成服务 SSL KEY ${SSL_KEY} \033[0m" openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
echo -e "\033[32m ====> 5. 生成服务 SSL CSR ${SSL_CSR} \033[0m" openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}
echo -e "\033[32m ====> 6. 生成服务 SSL CERT ${SSL_CERT} \033[0m" openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \ -CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \ -days ${SSL_DATE} -extensions v3_req \ -extfile ${SSL_CONFIG}
echo -e "\033[32m ====> 7. 证书制作完成 \033[0m" echo echo -e "\033[32m ====> 8. 以 YAML 格式输出结果 \033[0m" echo "----------------------------------------------------------" echo "ca_key: |" cat $CA_KEY | sed 's/^/ /' echo echo "ca_cert: |" cat $CA_CERT | sed 's/^/ /' echo echo "ssl_key: |" cat $SSL_KEY | sed 's/^/ /' echo echo "ssl_csr: |" cat $SSL_CSR | sed 's/^/ /' echo echo "ssl_cert: |" cat $SSL_CERT | sed 's/^/ /' echo
echo -e "\033[32m ====> 9. 附加 CA 证书到 Cert 文件 \033[0m" cat ${CA_CERT} >> ${SSL_CERT} echo "ssl_cert: |" cat $SSL_CERT | sed 's/^/ /' echo
echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m" echo "cp ${SSL_DOMAIN}.key tls.key" cp ${SSL_DOMAIN}.key tls.key echo "cp ${SSL_DOMAIN}.crt tls.crt" cp ${SSL_DOMAIN}.crt tls.crt
#
步骤 3:更新证书(可选)提示
证书与域名或 IP 有绑定关系,一般情况更换域名或 IP 需更换证书。如果之前配置的证书是一个通配证书或者之前配置的证书已经包含了需要变更的域名或 IP,那么证书则可以不用更换。
#
3.1. Rancher 单节点运行(默认容器自动生成自签名 SSL 证书)默认情况,通过docker run
运行的 Rancher Server 容器,会自动为 Rancher 生成 SSL 证书,这个证书会自动绑定 Rancher 系统设置中server-url
配置的域名或IP
。如果更换了域名或IP
,证书会自动更新,无需单独操作。
#
3.2. Rancher 单节点运行(外置自签名 SSL 证书)注意:操作前先备份,备份和恢复。
如果是以映射证书文件
的方式运行的单容器 Rancher Server,只需要停止原有 Rancher Server 容器,用新证书替换旧证书,保持文件名不变,然后重新运行容器即可。
#
3.3. Rancher HA 运行注意:操作前先备份,备份和恢复。
备份原有证书 YAML 文件
删除旧的 secret,然后创建新的 secret
重要提示: 如果环境不是按照标准的 rancher 安装文档安装,
secret
名称可能不相同,请根据实际 secret 名称操作。
#
步骤 4:修改 Rancher Server IP 或域名依次访问
全局 > 系统设置
,页面往下翻找到server-url
文件;单击右侧的省略号菜单,选择升级;
修改
server-url
地址;最后单击
保存
#
步骤 5:更新 ingress 配置文件将 ingress 中的 host 字段修改成新的域名
#
步骤 6:更新 agent 配置文件通过
新域名或IP
登录 Rancher Server;警告
这一步非常重要!
通过浏览器地址栏查询
集群ID
,c/
后面以c
开头的字段即为集群 ID;访问
https://<新的server_url>/v3/clusters/<集群ID>/clusterregistrationtokens
页面;打开clusterRegistrationTokens页面后,定位到
data
字段;找到
insecureCommand
字段,复制 YAML 连接备用;
可能会有多组
"baseType": "clusterRegistrationToken"
,如下图。这种情况以createdTS
最大、时间最新的一组为准,一般是最后一组。
使用
kubectl
工具,通过第一步准备的直连kubeconfig配置文件
和上面步骤中获取的 YAML 文件,执行以下命令更新agent
相关配置。
#
后续操作上述步骤 1~6 演示了如何为单个集群更新 agent 配置,您需要按照这些步骤,为所有集群更新 agent 配置,才能够完成域名或 IP 变更。