簡體   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