分析 Rancher UI 生成的 kubecfg 文件可以发现,第一个server对应的是 Rancher Server 的url 或者 IP。当 kubectl 访问K8S API SERVER的时候,请求是先发送到 Rancher,然后再通过cluster agent转发给K8S API SERVER

    image-20190514185322798

    在 Rancher v2.2.2 以前的版本,Rancher UI 生成的 kubecfg 文件中只设置了一个server。从 Rancher v2.2.2 开始,从 Rancher UI 创建的集群默认开启授权集群访问地址。创建好集群后 Rancher UI 生成的 kubecfg 文件中将显示多个 master 节点 IP 对应的server

    image-20190514185026706

    image-20190514184126478

    因此,Rancher v2.2.2以及之后版本通过 Rancher UI 创建的集群,如果 Rancher Server 无法访问,那么可以通过kubectl --kubeconfig=xxx --context=xxx来切换server

    对于Rancher v2.2.2之前的版本,则需要通过以下方式找回kube-admin配置文件。

    注意: 以下脚本需要在业务集群上执行,任意一个节点即可。保存以下文本为restore-kube-config.sh

    1. #!/bin/bash
    2. help ()
    3. {
    4. echo ' ================================================================ '
    5. echo ' --master-ip: 指定Master节点IP,任意一个K8S Master节点IP即可。'
    6. echo ' 使用示例:bash restore-kube-config.sh --master-ip=1.1.1.1 '
    7. echo ' ================================================================'
    8. }
    9. case "$1" in
    10. -h|--help) help; exit;;
    11. esac
    12. if [[ $1 == '' ]];then
    13. help;
    14. exit;
    15. fi
    16. CMDOPTS="$*"
    17. for OPTS in $CMDOPTS;
    18. do
    19. key=$(echo ${OPTS} | awk -F"=" '{print $1}' )
    20. value=$(echo ${OPTS} | awk -F"=" '{print $2}' )
    21. case "$key" in
    22. --master-ip) K8S_MASTER_NODE_IP=$value ;;
    23. esac
    24. done
    25. # 获取Rancher Agent镜像
    26. RANCHER_IMAGE=$( docker images --filter=label=io.cattle.agent=true |grep 'v2.' | \
    27. grep -v -E 'rc|alpha|<none>' | head -n 1 | awk '{print $3}' )
    28. if [ -d /opt/rke/etc/kubernetes/ssl ]; then
    29. K8S_SSLDIR=/opt/rke/etc/kubernetes/ssl
    30. else
    31. K8S_SSLDIR=/etc/kubernetes/ssl
    32. fi
    33. CHECK_CLUSTER_STATE_CONFIGMAP=$( docker run --rm --entrypoint bash --net=host \
    34. -v $K8S_SSLDIR:/etc/kubernetes/ssl:ro $RANCHER_IMAGE -c '\
    35. if kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
    36. -n kube-system get configmap full-cluster-state | grep full-cluster-state > /dev/null; then \
    37. echo 'yes'; else echo 'no'; fi' )
    38. if [ $CHECK_CLUSTER_STATE_CONFIGMAP != 'yes' ]; then
    39. docker run --rm --net=host \
    40. --entrypoint bash \
    41. -e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \
    42. -v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \
    43. $RANCHER_IMAGE \
    44. -c '\
    45. kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
    46. -n kube-system \
    47. get secret kube-admin -o jsonpath={.data.Config} | base64 --decode | \
    48. sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml
    49. if [ -s kubeconfig_admin.yaml ]; then
    50. echo '恢复成功,执行以下命令测试:'
    51. echo ''
    52. echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes"
    53. else
    54. echo "kubeconfig恢复失败。"
    55. fi
    56. else
    57. docker run --rm --entrypoint bash --net=host \
    58. -e K8S_MASTER_NODE_IP=$K8S_MASTER_NODE_IP \
    59. -v $K8S_SSLDIR:/etc/kubernetes/ssl:ro \
    60. $RANCHER_IMAGE \
    61. -c '\
    62. kubectl --kubeconfig /etc/kubernetes/ssl/kubecfg-kube-node.yaml \
    63. -n kube-system \
    64. get configmap full-cluster-state -o json | \
    65. jq -r .data.\"full-cluster-state\" | \
    66. jq -r .currentState.certificatesBundle.\"kube-admin\".config | \
    67. sed -e "/^[[:space:]]*server:/ s_:.*_: \"https://${K8S_MASTER_NODE_IP}:6443\"_"' > kubeconfig_admin.yaml
    68. if [ -s kubeconfig_admin.yaml ]; then
    69. echo '恢复成功,执行以下命令测试:'
    70. echo ''
    71. echo "kubectl --kubeconfig kubeconfig_admin.yaml get nodes"
    72. else
    73. echo "kubeconfig恢复失败。"
    74. fi
    75. fi