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

cpr*_*zer 5 kubernetes google-kubernetes-engine linkerd gke-networking

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

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
Run Code Online (Sandbox Code Playgroud)

San*_*ngh 5

解决方案:

我遵循的步骤是:

  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
Run Code Online (Sandbox Code Playgroud)
  1. 使用 kubectl describe pod/"pod_name" 检查 coreDNS pod 中的错误,如果是因为 pod 宕机/etc/coredns/Corefile:10 - Error during parsing: Unknown directive proxy,那么我们需要在 coreDNS 配置所在的 yaml 文件中使用转发而不是代理。因为镜像使用的CoreDNS 1.5x版本不再支持proxy关键字。


cpr*_*zer 3

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

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
Run Code Online (Sandbox Code Playgroud)

获取集群MASTER_IPV4_CIDR:

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

获取集群网络:

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

获取集群自动生成的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)
Run Code Online (Sandbox Code Playgroud)

验证值:

echo $MASTER_IPV4_CIDR $NETWORK $NETWORK_TARGET_TAG

# example output
10.0.0.0/28 foo-network gke-foo-cluster-c1ecba83-node
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)

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

gcloud compute firewall-rules describe gke-to-linkerd-control-plane
Run Code Online (Sandbox Code Playgroud)