10 - 变更Racnher server域名


重要提示

一、准备证书

更换域名后,会涉及到证书无法验证的问题,所以更换证书也一般会涉及到证书的更换。

  • 自签名ssl证书复制以下代码另存为create_self-signed-cert.sh或者其他您喜欢的文件名。修改代码开头的CN(域名),如果需要使用ip去访问rancher server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开。如果想实现多个域名访问rancher server,则添加扩展域名(SSL_DNS),多个SSL_DNS用逗号隔开。
  1. #!/bin/bash -e
  2. help ()
  3. {
  4. echo ' ================================================================ '
  5. echo ' --ssl-domain: 生成ssl证书需要的主域名,如不指定则默认为localhost,如果是ip访问服务,则可忽略;'
  6. echo ' --ssl-trusted-ip: 一般ssl证书只信任域名的访问请求,有时候需要使用ip去访问server,那么需要给ssl证书添加扩展IP,多个IP用逗号隔开;'
  7. echo ' --ssl-trusted-domain: 如果想多个域名访问,则添加扩展域名(SSL_TRUSTED_DOMAIN),多个扩展域名用逗号隔开;'
  8. echo ' --ssl-size: ssl加密位数,默认2048;'
  9. echo ' --ssl-date: ssl有效期,默认10年;'
  10. echo ' --ca-date: ca有效期,默认10年;'
  11. echo ' --ssl-cn: 国家代码(2个字母的代号),默认CN;'
  12. echo ' 使用示例:'
  13. echo ' ./create_self-signed-cert.sh --ssl-domain=www.test.com --ssl-trusted-domain=www.test2.com \ '
  14. echo ' --ssl-trusted-ip=1.1.1.1,2.2.2.2,3.3.3.3 --ssl-size=2048 --ssl-date=3650'
  15. echo ' ================================================================'
  16. }
  17. case "$1" in
  18. -h|--help) help; exit;;
  19. esac
  20. if [[ $1 == '' ]];then
  21. help;
  22. exit;
  23. fi
  24. CMDOPTS="$*"
  25. for OPTS in $CMDOPTS;
  26. do
  27. key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
  28. value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
  29. case "$key" in
  30. --ssl-domain) SSL_DOMAIN=$value ;;
  31. --ssl-trusted-ip) SSL_TRUSTED_IP=$value ;;
  32. --ssl-trusted-domain) SSL_TRUSTED_DOMAIN=$value ;;
  33. --ssl-size) SSL_SIZE=$value ;;
  34. --ssl-date) SSL_DATE=$value ;;
  35. --ca-date) CA_DATE=$value ;;
  36. --ssl-cn) CN=$value ;;
  37. esac
  38. done
  39. # CA相关配置
  40. CA_DATE=${CA_DATE:-3650}
  41. CA_KEY=${CA_KEY:-cakey.pem}
  42. CA_CERT=${CA_CERT:-cacerts.pem}
  43. CA_DOMAIN=localhost
  44. # ssl相关配置
  45. SSL_CONFIG=${SSL_CONFIG:-$PWD/openssl.cnf}
  46. SSL_DOMAIN=${SSL_DOMAIN:-localhost}
  47. SSL_DATE=${SSL_DATE:-3650}
  48. SSL_SIZE=${SSL_SIZE:-2048}
  49. ## 国家代码(2个字母的代号),默认CN;
  50. CN=${CN:-CN}
  51. SSL_KEY=$SSL_DOMAIN.key
  52. SSL_CSR=$SSL_DOMAIN.csr
  53. SSL_CERT=$SSL_DOMAIN.crt
  54. echo -e "\033[32m ---------------------------- \033[0m"
  55. echo -e "\033[32m | 生成 SSL Cert | \033[0m"
  56. echo -e "\033[32m ---------------------------- \033[0m"
  57. if [[ -e ./${CA_KEY} ]]; then
  58. echo -e "\033[32m ====> 1. 发现已存在CA私钥,备份"${CA_KEY}"为"${CA_KEY}"-bak,然后重新创建 \033[0m"
  59. mv ${CA_KEY} "${CA_KEY}"-bak
  60. openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
  61. else
  62. echo -e "\033[32m ====> 1. 生成新的CA私钥 ${CA_KEY} \033[0m"
  63. openssl genrsa -out ${CA_KEY} ${SSL_SIZE}
  64. fi
  65. if [[ -e ./${CA_CERT} ]]; then
  66. echo -e "\033[32m ====> 2. 发现已存在CA证书,先备份"${CA_CERT}"为"${CA_CERT}"-bak,然后重新创建 \033[0m"
  67. mv ${CA_CERT} "${CA_CERT}"-bak
  68. openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
  69. else
  70. echo -e "\033[32m ====> 2. 生成新的CA证书 ${CA_CERT} \033[0m"
  71. openssl req -x509 -sha256 -new -nodes -key ${CA_KEY} -days ${CA_DATE} -out ${CA_CERT} -subj "/C=${CN}/CN=${CA_DOMAIN}"
  72. fi
  73. echo -e "\033[32m ====> 3. 生成Openssl配置文件 ${SSL_CONFIG} \033[0m"
  74. cat > ${SSL_CONFIG} <<EOM
  75. [req]
  76. req_extensions = v3_req
  77. distinguished_name = req_distinguished_name
  78. [req_distinguished_name]
  79. [ v3_req ]
  80. basicConstraints = CA:FALSE
  81. keyUsage = nonRepudiation, digitalSignature, keyEncipherment
  82. extendedKeyUsage = clientAuth, serverAuth
  83. EOM
  84. if [[ -n ${SSL_TRUSTED_IP} || -n ${SSL_TRUSTED_DOMAIN} ]]; then
  85. cat >> ${SSL_CONFIG} <<EOM
  86. subjectAltName = @alt_names
  87. [alt_names]
  88. EOM
  89. IFS=","
  90. dns=(${SSL_TRUSTED_DOMAIN})
  91. dns+=(${SSL_DOMAIN})
  92. for i in "${!dns[@]}"; do
  93. echo DNS.$((i+1)) = ${dns[$i]} >> ${SSL_CONFIG}
  94. done
  95. if [[ -n ${SSL_TRUSTED_IP} ]]; then
  96. ip=(${SSL_TRUSTED_IP})
  97. for i in "${!ip[@]}"; do
  98. echo IP.$((i+1)) = ${ip[$i]} >> ${SSL_CONFIG}
  99. done
  100. fi
  101. fi
  102. echo -e "\033[32m ====> 4. 生成服务SSL KEY ${SSL_KEY} \033[0m"
  103. openssl genrsa -out ${SSL_KEY} ${SSL_SIZE}
  104. echo -e "\033[32m ====> 5. 生成服务SSL CSR ${SSL_CSR} \033[0m"
  105. openssl req -sha256 -new -key ${SSL_KEY} -out ${SSL_CSR} -subj "/C=${CN}/CN=${SSL_DOMAIN}" -config ${SSL_CONFIG}
  106. echo -e "\033[32m ====> 6. 生成服务SSL CERT ${SSL_CERT} \033[0m"
  107. openssl x509 -sha256 -req -in ${SSL_CSR} -CA ${CA_CERT} \
  108. -CAkey ${CA_KEY} -CAcreateserial -out ${SSL_CERT} \
  109. -days ${SSL_DATE} -extensions v3_req \
  110. -extfile ${SSL_CONFIG}
  111. echo -e "\033[32m ====> 7. 证书制作完成 \033[0m"
  112. echo
  113. echo -e "\033[32m ====> 8. 以YAML格式输出结果 \033[0m"
  114. echo "----------------------------------------------------------"
  115. echo "ca_key: |"
  116. cat $CA_KEY | sed 's/^/ /'
  117. echo
  118. echo "ca_cert: |"
  119. cat $CA_CERT | sed 's/^/ /'
  120. echo
  121. echo "ssl_key: |"
  122. cat $SSL_KEY | sed 's/^/ /'
  123. echo
  124. echo "ssl_csr: |"
  125. cat $SSL_CSR | sed 's/^/ /'
  126. echo
  127. echo "ssl_cert: |"
  128. cat $SSL_CERT | sed 's/^/ /'
  129. echo
  130. echo -e "\033[32m ====> 9. 附加CA证书到Cert文件 \033[0m"
  131. cat ${CA_CERT} >> ${SSL_CERT}
  132. echo "ssl_cert: |"
  133. cat $SSL_CERT | sed 's/^/ /'
  134. echo
  135. echo -e "\033[32m ====> 10. 重命名服务证书 \033[0m"
  136. echo "cp ${SSL_DOMAIN}.key tls.key"
  137. cp ${SSL_DOMAIN}.key tls.key
  138. echo "cp ${SSL_DOMAIN}.crt tls.crt"
  139. cp ${SSL_DOMAIN}.crt tls.crt
  • 权威认证证书把证书重命名为需要的文件名称
  1. cp xxx.key tls.key
  2. cp xxx.crt tls.crt

二、更新证书

1、Rancher单节点运行

注意:操作前先备份,https://www.cnrancher.com/docs/rancher/v2.x/cn/backups-and-restoration/backups/

如果是以容器映射证书文件运行的rancher server,只需要停止原有rancher server容器,然后使用相同的运行配置,替换新证书后重新运行新容器即可,注意容器名称不要相同。

2、Rancher HA运行

注意:操作前先备份,https://www.cnrancher.com/docs/rancher/v2.x/cn/backups-and-restoration/backups/

  • 保存原有证书yaml文件
  1. kubectl --kubeconfig=kube_configxxx.yml -n cattle-system \
  2. get secret tls-rancher-ingress -o yaml > tls-ingress.yaml
  3. kubectl --kubeconfig=kube_configxxx.yml -n cattle-system \
  4. get secret tls-ca -o yaml > tls-ca.yaml
  • 删除旧的secret,然后创建新的secret
  1. # 指定kube配置文件路径
  2. kubeconfig=
  3. # 删除旧的secret
  4. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  5. delete secret tls-rancher-ingress
  6. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  7. delete secret tls-ca
  8. # 创建新的secret
  9. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  10. create secret tls tls-rancher-ingress --cert=./tls.crt --key=./tls.key
  11. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  12. create secret generic tls-ca --from-file=cacerts.pem
  13. # 重启Pod
  14. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  15. delete pod `kubectl --kubeconfig=$kubeconfig -n cattle-system \
  16. get pod |grep -E "cattle-cluster-agent|cattle-node-agent|rancher" | awk '{print $1}'`

重要提示:如果环境不是按照标准的rancher安装文档安装,secret名称可能不相同,请根据实际secret名称操作。

三、更新local集群的密文cattle-credentials-xxxx

  • 查看集群API image
  • 点击clusterRegistrationTokensimage-20190309184052331
  • 此处找到新的TOKEN 和CA-CHECKSUM,记下来备用image-20190309184523316

  • system项目\资源\密文 路径页面下,找到并编辑密文cattle-credentials-xxxx

image

  • url字段修改为新的域名
  • token字段修改为查找到的新token

四、修改local集群agent的域名和CA-CHECKSUM

  • system项目下找到cattle-system命名空间,分别编辑cattle-cluster-agent和cattle-node-agentimage-20190309185550237

  • 修改CATTLE_SERVER为新的域名,检查CA-CHECKSUM是否有变化,如果有则需要一并修改。image

五、修改业务集群agent pod

因为token和域名的更改,业务集群的agent pod无法连接rancher server,这个时候需要通过命令行工具去编辑yaml文件。

  • 执行以下命令:
  1. kubeconfig=''
  2. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  3. edit deployments cattle-cluster-agent
  4. kubectl --kubeconfig=$kubeconfig -n cattle-system \
  5. edit daemonsets cattle-node-agent
  • 然后编辑环境变量image-20190309190814057