【问题标题】:Issues with Kubernetes multi-master using kubeadm on premisesKubernetes 多主机在本地使用 kubeadm 的问题
【发布时间】:2019-01-19 13:07:06
【问题描述】:

在 Kubernetes v1.11 documentation 之后,我设法使用 kubeadm、堆叠控制平面节点设置 Kubernetes 高可用性,其中 3 个主服务器在 CentOS7 虚拟机上运行。但由于没有可用的负载均衡器,我使用 Keepalived 为 apiserver 设置故障转移虚拟 IP (10.171.4.12),如 Kubernetes v1.10 documentation 中所述。结果,我用于引导控制平面的“kubeadm-config.yaml”具有以下标头:

apiVersion: kubeadm.k8s.io/v1alpha2  
kind: MasterConfiguration  
kubernetesVersion: v1.11.0  
apiServerCertSANs:  
- "10.171.4.12"  
api:  
    controlPlaneEndpoint: "10.171.4.12:6443"  
etcd:  
  ...

配置顺利,在提升所有 3 个 Master 时出现以下警告:

[endpoint] 警告:在 api.controlPlaneEndpoint 中指定的端口 覆盖控制平面地址中的 api.bindPort

加入工人时的这个警告:

[WARNING RequiredIPVSKernelModulesAvailable]:IPVS 代理将 不使用,因为以下需要的内核模块没有 已加载:[ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh] 或没有内置内核 ipvs 支持:map[ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{}] 您可以通过以下方式解决此问题 方法:
1. 运行“modprobe --”加载缺失的内核模块;
2.提供缺少的内置内核ipvs支持

之后,基本测试成功:

  • 当停止时,Keepalived 故障转移到另一个 Master 并且 apiserver 始终可以访问(所有 kubectl 命令都成功)。
  • 停止主 Master 时(具有最高 Keepalived 首选项),应用程序部署成功(通过 Kubernetes 训练营测试),并且当主 Master 重新联机时,一切都与主 Master 正确同步。
  • Kubernetes bootcamp 应用程序运行成功,当使用 NodePort 暴露 bootcamp 的服务 curl 时,所有 master 和 worker 节点都能正常响应。
  • 按照https://github.com/kubernetes/ingress-nginx/tree/master/docs/examples/docker-registry成功部署docker-registry

但随之而来的是这些问题:

  • Nginx Ingress Controller pod 无法运行并进入状态 CrashLoopBackOff(请参阅下面的事件)
  • 在任何 Master 上安装 helm 和 tiller 后,所有使用“helm install”或“helm list”的命令都无法执行(请参阅下面的命令输出)

我正在运行 Kubernetes v1.11.1,但 kubeadm-config.yaml 提到 1.11.0,这是我应该担心的吗?

我是否应该不遵循官方文档并寻求其他替代方案,例如:https://medium.com/@bambash/ha-kubernetes-cluster-via-kubeadm-b2133360b198

注意:使用最新版本 1.11.2(三个 master + 一个 worker)安装新的 Kubernetes HA 并部署 nginx 最新的入口控制器版本 0.18.0 时同样的问题。

-- Nginx 控制器 pod 事件和日志:

  Normal   Pulled     28m (x38 over 2h)  kubelet, node3.local  Container image "quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.17.1" already present on machine  
  Warning  Unhealthy  7m (x137 over 2h)  kubelet, node3.local  Liveness probe failed: Get http://10.240.3.14:10254/healthz: dial tcp 10.240.3.14:10254: connect: connection refused  
  Warning  BackOff    2m (x502 over 2h)  kubelet, node3.local  Back-off restarting failed container  

nginx version: nginx/1.13.12  
W0809 14:05:46.171066       5 client_config.go:552] Neither --kubeconfig nor --master was specified.  Using the inClusterConfig.  This might not work.  
I0809 14:05:46.171748       5 main.go:191] Creating API client for https://10.250.0.1:443

-- helm 命令输出:

'# helm install ...  
Error: no available release name found

'# helm list  
Error: Get https://10.250.0.1:443/api/v1/namespaces/kube-system/configmaps?labelSelector=OWNER%!D(MISSING)TILLER: dial tcp 10.250.0.1:443: i/o timeout

-- Kubernetes 服务和端点:

# kubectl describe svc kubernetes
Name:              kubernetes
Namespace:         default
Labels:            component=apiserver
                   provider=kubernetes
Annotations:       <none>
Selector:          <none>
Type:              ClusterIP
IP:                10.250.0.1
Port:              https  443/TCP
TargetPort:        6443/TCP
Endpoints:         10.171.4.10:6443,10.171.4.8:6443,10.171.4.9:6443
Session Affinity:  None
Events:            <none>


# kubectl get endpoints --all-namespaces
NAMESPACE       NAME                      ENDPOINTS                                               AGE
default         bc-svc                    10.240.3.27:8080                                        6d
default         kubernetes                10.171.4.10:6443,10.171.4.8:6443,10.171.4.9:6443        7d
ingress-nginx   default-http-backend      10.240.3.24:8080                                        4d
kube-system     kube-controller-manager   <none>                                                  7d
kube-system     kube-dns                  10.240.2.4:53,10.240.2.5:53,10.240.2.4:53 + 1 more...   7d
kube-system     kube-scheduler            <none>                                                  7d
kube-system     tiller-deploy             10.240.3.25:44134                                       5d 

【问题讨论】:

    标签: docker nginx kubernetes high-availability


    【解决方案1】:

    正如您在Kubernetes client-go code 中看到的,IP 地址和端口是从容器内的环境变量中读取的:

    host, port := os.Getenv("KUBERNETES_SERVICE_HOST"), os.Getenv("KUBERNETES_SERVICE_PORT")
    

    如果您运行以下提及其中任何健康 pod 的命令,您可以检查这些变量:

    $ kubectl exec <healthy-pod-name> -- printenv | grep SERVICE
    

    我认为问题的原因是变量KUBERNETES_SERVICE_HOST:KUBERNETES_SERVICE_PORT设置为10.250.0.1:443而不是10.171.4.12:6443

    您能通过检查集群中的这些变量来确认吗?

    【讨论】:

    • 确认,我得到的是 10.250.0.1:443 而不是 10.171.4.12:6443,根据以下摘录:# kubectl exec kubernetes-bootcamp-69bf88c8c-7h527 -- printenv | grep SERVICE KUBERNETES_SERVICE_PORT_HTTPS=443 BC_SVC_SERVICE_HOST=10.250.203.134 KUBERNETES_SERVICE_HOST=10.250.0.1 BC_SVC_SERVICE_PORT=8080 KUBERNETES_SERVICE_PORT=443 BC_SVC_SERVICE_PORT_PORT_1=8080
    • 您好,今天我使用最新版本 1.11.2(三个 master + 一个 worker)执行了新的 Kubernetes HA 安装并部署了 nginx 最新的 ingress 控制器版本 0.18.0,但仍然面临同样的问题上面报道,变量KUBERNETES_SERVICE_HOST和KUBERNETES_SERVICE_PORT设置为Kubernetes服务私有IP。这是否被视为最新 K8s 版本中的错误?还是可以通过简单的解决方法来解决?
    • 我已经在 Kubernetes 环境中检查了相同的 env 变量,它具有单个 Master 和健康的 Nginx Ingress Controller 和 Helm,变量 KUBERNETES_SERVICE_HOST 和 KUBERNETES_SERVICE_PORT 始终设置为 Kubernetes 服务私有 IP 和端口443;所以我认为这不是问题的根本原因。
    • 您能否在问题输出中添加以下两个命令:
    • 按照建议,我已将命令输出添加到初始问题中。谢谢
    【解决方案2】:

    重要补充说明:

    运行几个实验室后,我遇到了同样的问题: - 使用最新版本 1.11.2(三个 master + 一个 worker)和 nginx 最新入口控制器版本 0.18.0 安装新的 Kubernetes HA。 - 使用版本 1.11.1(一个主 + 两个工人)和 nginx 最新入口控制器版本 0.18.0 的独立 Kubernetes 主控,工人很少。 - 但是对于独立的 Kubernetes master 版本 1.11.0(一个 master + 两个 worker),nginx 入口控制器 0.17.1 没有任何抱怨,而 0.18.0 抱怨 Readiness 探测失败但 pod 进入了运行状态。

    => 因此,我认为这个问题可能与 Kubernetes 版本 1.11.1 和 1.11.2 相关,因为他们解释健康探测的方式可能

    【讨论】:

      【解决方案3】:

      将我的 POD 网络从 Flanneld 切换到 Calico 时问题已解决。 (在 Kubernetes 1.11.0 上测试;明天将在最新的 k8s 版本 1.11.2 上重复测试)

      【讨论】:

      • 在 k8s 版本 1.11.1 和 1.11.2 上测试成功
      猜你喜欢
      • 2017-12-26
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-06
      • 2018-07-09
      • 2011-05-30
      相关资源
      最近更新 更多