我正在尝试使用openstack-cloud-控制器管理器使用 Rancher RKE。我使用应用程序凭据访问 OpenStack,因此,我认为我无法使用openstack-供应商RKE 默认具有此功能,因为没有相关参数。不过,我注意到这些参数在官方openstack-cloud-控制器管理器安装在该global
部分下。
现在我尝试按以下方式安装 OpenStack 提供程序:
- 安装不带自己的 openstack 提供程序的 RKE(v1.24),并将 kubelet 参数设置
cloud-provider
为external
:
services {
kubelet {
extra_args = {
cloud-provider = "external"
}
}
}
controlplane
具有同时具有和角色的主节点etcd
。
- 安装openstack-cloud-控制器管理器(受 openmetal 帖子启发的步骤这里):
创建配置文件:
[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 问题。