繁体   English   中英

“无法检索服务器 API 的完整列表:tap.linkerd.io/v1alpha1”在 GKE 中的私有集群上使用 Linkerd 时出错

[英]"unable to retrieve the complete list of server APIs: tap.linkerd.io/v1alpha1" error using Linkerd on private cluster in GKE

为什么我在GKE的私有集群上安装Linkerd 2.x会出现如下错误?

Error: could not get apiVersions from Kubernetes: unable to retrieve the complete list of server APIs: tap.linkerd.io/v1alpha1: the server is currently unable to handle the request

GKE 上私有集群的默认防火墙规则仅允许端口44310250上的流量。 这允许分别与kube-apiserverkubelet进行通信。

Linkerd使用端口84438089在控制和部署到数据平面的代理之间进行通信。

tap 组件使用端口8089处理对其apiserver的请求。

代理注入器服务配置文件验证器组件都是准入控制器的类型,使用端口8443来处理请求。

Linkerd 2 文档包括在 GKE 私有集群上配置防火墙的说明: https://linkerd.io/2/reference/cluster-configuration/

它们包括在下面:

获取集群名称:

CLUSTER_NAME=your-cluster-name
gcloud config set compute/zone your-zone-or-region

获取集群 MASTER_IPV4_CIDR:

MASTER_IPV4_CIDR=$(gcloud container clusters describe $CLUSTER_NAME \
  | grep "masterIpv4CidrBlock: " \
  | awk '{print $2}')

获取集群网络:

NETWORK=$(gcloud container clusters describe $CLUSTER_NAME \
  | grep "^network: " \
  | awk '{print $2}')

获取集群自动生成的 NETWORK_TARGET_TAG:

NETWORK_TARGET_TAG=$(gcloud compute firewall-rules list \
  --filter network=$NETWORK --format json \
  | jq ".[] | select(.name | contains(\"$CLUSTER_NAME\"))" \
  | jq -r '.targetTags[0]' | head -1)

验证值:

echo $MASTER_IPV4_CIDR $NETWORK $NETWORK_TARGET_TAG

# example output
10.0.0.0/28 foo-network gke-foo-cluster-c1ecba83-node

为代理注入器创建防火墙规则并点击:

gcloud compute firewall-rules create gke-to-linkerd-control-plane \
  --network "$NETWORK" \
  --allow "tcp:8443,tcp:8089" \
  --source-ranges "$MASTER_IPV4_CIDR" \
  --target-tags "$NETWORK_TARGET_TAG" \
  --priority 1000 \
  --description "Allow traffic on ports 8843, 8089 for linkerd control-plane components"

最后,验证防火墙是否已创建:

gcloud compute firewall-rules describe gke-to-linkerd-control-plane

解决方案:

我遵循的步骤是:

  1. kubectl get apiservices :如果链接 apiservice 因错误 CrashLoopBackOff 而关闭,请尝试按照步骤 2 进行操作,否则只需尝试使用 kubectl delete apiservice/"service_name" 重新启动链接服务。 对我来说,它是 v1alpha1.tap.linkerd.io。

  2. kubectl get pods -n kube-system并发现诸如 metrics-server、linkered、kubernetes-dashboard 等 pod 已关闭,因为主 coreDNS pod 已关闭。

对我来说是:

NAME                          READY   STATUS             RESTARTS   AGE
pod/coredns-85577b65b-zj2x2   0/1     CrashLoopBackOff   7          13m
  1. 使用 kubectl describe pod/"pod_name" 检查 coreDNS pod 中的错误,如果它因为/etc/coredns/Corefile:10 - Error during parsing: Unknown directive proxy ,那么我们需要在yaml 文件,其中有 coreDNS 配置。 因为镜像使用的 CoreDNS 版本 1.5x 不再支持 proxy 关键字了。

这对我来说是一个链接问题。 要诊断任何与 linkerd 相关的问题,您可以使用 linkerd CLI 并运行linkerd check这应该会显示 linkerd 是否存在问题以及修复它的说明链接。

对我来说,问题是 linkerd 根证书已经过期。 在我的例子中,linkerd 在开发集群中是实验性的,所以我删除了它。 但是,如果您需要更新证书,可以按照以下链接中的说明进行操作。

https://linkerd.io/2.11/tasks/replacing_expired_certificates/

感谢https://stackoverflow.com/a/59644120/1212371我走上了正确的道路。

在我的情况下,它与linkerd/linkerd2#3497相关,当 Linkerd 服务出现一些内部问题并且无法响应 API 服务请求时。 通过重新启动其 pod 来修复。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM