问题已解决…

问题已解决…

我在 IBM 云中有 2 个 kubernetes 集群,一个有 2 个节点,另一个有 4 个节点。

具有 4 个节点的那个运行正常,但在另一个节点上,由于金钱原因(闲置时不应付款),我不得不暂时移除工作节点。

当我重新激活这两个节点时,一切似乎都启动正常,只要我不尝试与 Pod 交互,表面上看起来仍然很好,没有关于不可用或严重健康状态的消息。好的,我删除了两个卡Namespace在该状态的过时节点Terminating,但我可以通过重新启动集群节点(不再确切知道是哪一个)来解决这个问题。

当一切看起来正常时,我尝试访问 kubernetes 仪表板(之前所做的一切都是在 IBM 管理级别或在命令行中完成的),但令人惊讶的是,我发现它无法访问,浏览器中出现错误页面,指出:

503服务不可用

该页面底部有一小段 JSON 消息,内容如下:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": { },
  "status": "Failure",
  "message": "error trying to reach service: read tcp 172.18.190.60:39946-\u003e172.19.151.38:8090: read: connection reset by peer",
  "reason": "ServiceUnavailable",
  "code": 503
}

我发送了一个显示正在运行的kubectl logs kubernetes-dashboard-54674bdd65-nf6w7 --namespace=kube-system消息Pod,但结果不是要查看的日志,而是此消息:

Error from server: Get "https://10.215.17.75:10250/containerLogs/kube-system/kubernetes-dashboard-54674bdd65-nf6w7/kubernetes-dashboard":
read tcp 172.18.135.195:56882->172.19.151.38:8090:
read: connection reset by peer

然后我发现我既不能得到任何 Pod在该集群中运行,也无法部署任何需要调度的新自定义 kubernetes 对象(我实际上可以应用Services 或ConfigMaps,但不能应用PodReplicaSetDeployment类似的)。

我已经尝试过

  • 重新加载工作池中的工作节点
  • 重新启动 workerpool 中的工作节点
  • 重新启动 kubernetes-dashboardDeployment

不幸的是,上述任何举措均未改变Pods 的可访问性。

还有另一件事可能与此相关(尽管我不太确定它是否确实相关):

在另一个运行良好的集群中,有三个 calicoPod正在运行,并且所有三个都处于启动状态,而在有问题的集群中,三个 calico 中只有两个Pod处于启动状态并运行,第三个保持Pending状态,并kubectl describe pod calico-blablabla-blabla揭示了原因,Event

Warning  FailedScheduling  13s   default-scheduler
0/2 nodes are available: 2 node(s) didn't have free ports for the requested pod ports.

有谁知道该集群中发生了什么,并能指出可能的解决方案吗?我真的不想删除该集群并生成一个新的集群。

编辑

的结果kubectl describe pod kubernetes-dashboard-54674bdd65-4m2ch --namespace=kube-system

Name:                 kubernetes-dashboard-54674bdd65-4m2ch
Namespace:            kube-system
Priority:             2000000000
Priority Class Name:  system-cluster-critical
Node:                 10.215.17.82/10.215.17.82
Start Time:           Mon, 15 Nov 2021 09:01:30 +0100
Labels:               k8s-app=kubernetes-dashboard
                      pod-template-hash=54674bdd65
Annotations:          cni.projectcalico.org/containerID: ca52cefaae58d8e5ce6d54883cb6a6135318c8db53d231dc645a5cf2e67d821e
                      cni.projectcalico.org/podIP: 172.30.184.2/32
                      cni.projectcalico.org/podIPs: 172.30.184.2/32
                      container.seccomp.security.alpha.kubernetes.io/kubernetes-dashboard: runtime/default
                      kubectl.kubernetes.io/restartedAt: 2021-11-10T15:47:14+01:00
                      kubernetes.io/psp: ibm-privileged-psp
Status:               Running
IP:                   172.30.184.2
IPs:
  IP:           172.30.184.2
Controlled By:  ReplicaSet/kubernetes-dashboard-54674bdd65
Containers:
  kubernetes-dashboard:
    Container ID:  containerd://bac57850055cd6bb944c4d893a5d315c659fd7d4935fe49083d9ef8ae03e5c31
    Image:         registry.eu-de.bluemix.net/armada-master/kubernetesui-dashboard:v2.3.1
    Image ID:      registry.eu-de.bluemix.net/armada-master/kubernetesui-dashboard@sha256:f14f581d36b83fc9c1cfa3b0609e7788017ecada1f3106fab1c9db35295fe523
    Port:          8443/TCP
    Host Port:     0/TCP
    Args:
      --auto-generate-certificates
      --namespace=kube-system
    State:          Running
      Started:      Mon, 15 Nov 2021 09:01:37 +0100
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:        50m
      memory:     100Mi
    Liveness:     http-get https://:8443/ delay=30s timeout=30s period=10s #success=1 #failure=3
    Readiness:    http-get https://:8443/ delay=10s timeout=30s period=10s #success=1 #failure=3
    Environment:  <none>
    Mounts:
      /certs from kubernetes-dashboard-certs (rw)
      /tmp from tmp-volume (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-sc9kw (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  kubernetes-dashboard-certs:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  kubernetes-dashboard-certs
    Optional:    false
  tmp-volume:
    Type:       EmptyDir (a temporary directory that shares a pod's lifetime)
    Medium:     
    SizeLimit:  <unset>
  kube-api-access-sc9kw:
    Type:                    Projected (a volume that contains injected data from multiple sources)
    TokenExpirationSeconds:  3607
    ConfigMapName:           kube-root-ca.crt
    ConfigMapOptional:       <nil>
    DownwardAPI:             true
QoS Class:                   Burstable
Node-Selectors:              <none>
Tolerations:                 node-role.kubernetes.io/master:NoSchedule
                             node.kubernetes.io/not-ready:NoExecute op=Exists for 600s
                             node.kubernetes.io/unreachable:NoExecute op=Exists for 600s
Events:                      <none>

答案1

问题已解决…

问题原因是集群更新到kubernetes版本1.21,而我的集群满足以下条件:

  • 已启用私有和公共服务端点
  • VRF 已禁用

根本原因:

在 Kubernetes 1.21 版中,Konnectivity 取代了 OpenVPN 作为网络代理,用于保护 Kubernetes API 服务器主节点与集群中的工作节点之间的通信。
使用 Konnectivity 时,如果满足上述所有条件,主节点与集群节点之间的通信就会出现问题。

解决步骤:

  • 使用命令禁用私有服务端点(公共端点似乎不是问题)
    ibmcloud ks cluster master private-service-endpoint disable --cluster <CLUSTER_NAME> (此命令是特定于提供商的,如果您在使用其他提供商或在本地安装时遇到同样的问题,请了解如何禁用该私有服务端点)
  • ibmcloud ks cluster master refresh --cluster <CLUSTER_NAME>最后使用刷新集群主节点
  • 重新加载所有工作节点(在 Web 控制台中,也可以通过命令完成)
  • 等待了大约30分钟:
    • 仪表板再次可用/可访问
    • Pod可以再次访问和安排

一般建议:

将任何集群更新到 kubernetes 1.21 后,请检查是否已启用私有服务端点。如果已启用,请禁用它或延迟更新,直到可以启用为止,或者启用 VRF(虚拟路由和转发),我做不到,但有人告诉我这很可能会解决问题。

相关内容