无计划 Pod 的 RKE OpenStack 云提供商

无计划 Pod 的 RKE OpenStack 云提供商

我正在尝试使用openstack-cloud-控制器管理器使用 Rancher RKE。我使用应用程序凭据访问 OpenStack,因此,我认为我无法使用openstack-供应商RKE 默认具有此功能,因为没有相关参数。不过,我注意到这些参数在官方openstack-cloud-控制器管理器安装在该global部分下。

现在我尝试按以下方式安装 OpenStack 提供程序:

  • 安装不带自己的 openstack 提供程序的 RKE(v1.24),并将 kubelet 参数设置cloud-providerexternal
  services {
    kubelet {
      extra_args = {
        cloud-provider = "external"
      }
    }
  }

controlplane具有同时具有和角色的主节点etcd

创建配置文件:

[Global]
cloud=openstack
auth-url=https://openstack.com:5000
username=username
user-id=id
password=pass
tenant-id=tenant_id
tenant-name=tenant_name
region=RegionOne
ca-file=/my/local/adacloud.ca.chain
application-credential-id=cred_id
application-credential-secret=cred_secret

[LoadBalancer]
use-octavia=true
floating-network-id=ext_network_id
subnet-id=cluster_subnet_id

从中创建一个秘密:

kubectl create secret -n kube-system generic cloud-config --from-file=local/openstack.conf

下载清单:

wget https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/controller-manager/cloud-controller-manager-roles.yaml
wget https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/controller-manager/cloud-controller-manager-role-bindings.yaml
wget https://raw.githubusercontent.com/kubernetes/cloud-provider-openstack/master/manifests/controller-manager/openstack-cloud-controller-manager-ds.yaml

我按以下方式更改了spec.template.spec.nodeSelector文件中的内容:openstack-cloud-controller-manager-ds.yaml

node-role.kubernetes.io/controlplane: "true"

这是因为节点默认标记为controlplane=true

文件中的容忍度openstack-cloud-controller-manager-ds.yaml如下:

tolerations:
- key: node.cloudprovider.kubernetes.io/uninitialized
value: "true"
effect: NoSchedule
- key: node-role.kubernetes.io/master
effect: NoSchedule
- key: node-role.kubernetes.io/control-plane
effect: NoSchedule

然后我应用了它们:

kubectl apply -f cloud-controller-manager-roles.yaml
kubectl apply -f cloud-controller-manager-role-bindings.yaml
kubectl apply -f openstack-cloud-controller-manager-ds.yaml

最后,当我检查守护进程集时,没有 pod。

$ kubectl get -n kube-system ds
NAME                                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                               AGE
canal                                4         4         4       4            4           kubernetes.io/os=linux                      17m
openstack-cloud-controller-manager   0         0         0       0            0           node-role.kubernetes.io/controlplane=true   11s

我在主节点上有以下标签,注释和污点:

Labels:             app=ingress
                    beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=k8s-master-0
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/controlplane=true
                    node-role.kubernetes.io/etcd=true
Annotations:        flannel.alpha.coreos.com/backend-data: {"VNI":1,"VtepMAC":"3e:96:d7:c9:94:f8"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 192.168.4.165
                    node.alpha.kubernetes.io/ttl: 0
                    projectcalico.org/IPv4Address: 192.168.4.165/24
                    projectcalico.org/IPv4IPIPTunnelAddr: 10.42.0.1
                    rke.cattle.io/external-ip: 192.168.4.165
                    rke.cattle.io/internal-ip: 192.168.4.165
                    volumes.kubernetes.io/controller-managed-attach-detach: true
Taints:             node-role.kubernetes.io/etcd=true:NoExecute
                    node-role.kubernetes.io/controlplane=true:NoSchedule
                    node.cloudprovider.kubernetes.io/uninitialized=true:NoSchedule

我不明白为什么这些 Pod 没有被安排。有人已经遇到过这个问题吗?

PS. 我也尝试不使用 kubelet arg cloud-provider=external,但是没有任何变化。

答案1

查看了一下,似乎 openstack-cloud-controller-manager 需要 node-role.kubernetes.io/controlplane=true:NoSchedule 容忍度

答案2

好的,我知道如何解决这个问题。

问题是我创建了具有两个角色的控制平面节点controlplane etcd. 如上所述SUSE 支持网站通过查看污点,我们可以看到,不仅存在node-role.kubernetes.io/controlplane=true:NoSchedule,而且node-role.kubernetes.io/etcd=true:NoExecute还会阻止任何 pod 被调度:

kubectl get node k8s-master -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
NAME                    TAINTS
k8s-master              [map[effect:NoSchedule key:node-role.kubernetes.io/controlplane value:true] map[effect:NoExecute key:node-role.kubernetes.io/etcd value:true]]

通过在 中添加以下容忍度openstack-cloud-controller-manager DaemonSet,Pod 可以被正确调度:

spec:
  ...
    spec:
      nodeSelector:
        node-role.kubernetes.io/controlplane: "true"
      tolerations:
      ...
      - key: node-role.kubernetes.io/controlplane
        value: "true"
        effect: NoSchedule
      - key: node-role.kubernetes.io/etcd
        value: "true"
        effect: NoExecute

我还链接了我在GitHub 问题

相关内容