0

我正在将 k3d 与 calico 一起使用,并尝试使用它calicoctl来设置网络策略。我可以在 Ubuntu 上运行它,但在 Windows 上却不行。为了设置它,我做了以下事情:

# Download Calico YAML
# DOWNLOAD: https://raw.githubusercontent.com/rancher/k3d/main/docs/usage/guides/calico.yaml

# Create k3d cluster
k3d cluster create "dev" --k3s-server-arg '--flannel-backend=none' --volume "$(pwd)/calico.yaml:/var/lib/rancher/k3s/server/manifests/calico.yaml

# Download Windows version
# DOWNLOAD: https://github.com/projectcalico/calicoctl/releases/download/v3.18.2/calicoctl-windows-amd64.exe 
 
# Make an Alias
Set-Alias -Name calicoctl -Value ".\calicoctl-windows-amd64.exe"

然后,当我尝试运行以应用NetWorkPolicywith 时calicoctl apply -f my-policy.yaml,出现错误:

创建 Calico API 客户端失败:无效配置:未提供配置,尝试设置 KUBERNETES_MASTER 环境变量

所以我尝试使用我的 Kubeconfig 的值来设置它:

# Get the IP/Port from Kubeconfig (Gives https://0.0.0.0:60776)
$kmaster=(kubectl config view -o jsonpath="{.clusters[?(@.name=='k3d-dev')].cluster.server}")

# Set the kubernetes master env variable from what's in kube config
[Environment]::SetEnvironmentVariable(“KUBERNETES_MASTER”, $kmaster, “User”)

这仍然给出了同样的错误。(注意:来自 Kubeconfig 的 ip 是“https://0.0.0.0:60776”)

因此,我尝试了以下所有方法,但均无效:

set KUBECONFIG=~/.kube/config
SET CALICO_KUBECONFIG=C:\Users\myname\.kube\config
SET KUBE_CONFIG_PATH=C:\Users\myname\.kube\config
$env:KUBERNETES_MASTER=(kubectl config view -o jsonpath="{.clusters[?(@.name=='k3d-dev')].cluster.server}")

如何让“calicoctl-windows-amd64.exe”找到我的 Kubernetes 集群?

4

2 回答 2

1

虽然官方文档声称:

  1. Calico 在默认用户位置查找配置~/.kube/config
  2. 它还将查看KUBERNETES_MASTER (错误输出说明了这一点)
  3. 它也会看KUBECONFIG

它不是!以上均不适用于 Windows。(在 Ubuntu 上,我不需要做任何特别的事情,它找到了我的配置)

我找到的唯一解决方案是执行以下操作:

  1. 创建配置文件
  2. calicoctl在每次调用中传递配置文件

calico.cfg.yaml

apiVersion: projectcalico.org/v3
kind: CalicoAPIConfig
metadata:
spec:
  datastoreType: "kubernetes"
  kubeconfig: "C:/users/myusername/.kube/config"

注意:如果您通过“~/.kube/config”,它将失败并说它找不到该路径

现在调用它需要:

# NOTICE THE "--config=calico.cfg.yaml"
calicoctl apply -f some-policy.yaml --config=calico.cfg.yaml

认为,从配置文件工作但在用作 kubeconfig 路径时抛出错误判断"~/.kube/config",它正在查看该“默认”路径但使用的是不理解~别名的 Windows API。

于 2021-04-28T01:23:17.300 回答
0

我尝试了上面提到的三个选项,我发现第三个选项对我有用。

以下是我遵循的步骤:

  1. 定义环境变量 KUBECONFIG:
$env:KUBECONFIG="C:\Users\myusername\.kube\config"
  1. 像往常一样调用 calicoctl。例如:
calicoctl get ippools

注意:我使用的是 calicoctl 版本 v3.22.0

于 2022-03-03T11:57:10.333 回答