恢复 Kubectl 配置文件

分析 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

Copy