直到几个月前,我才发现the "hostPort" configuration for Pods was not going to work with CNI based integrations。这意味着,对于任何使用Calico的Kubernetes集群来说,如果不使用Service或标记hostNetwork=true
(这有点极端),就不可能直接在某个Node的端口上直接公开Pod的端口。
从Kubernetes 1.7.0开始,这是可能的,但是有必要更改Calico配置,以使the new "portmap" CNI plugin进入,这是我试图做的,但没有成功。我从一个新的IBM Bluemix Container Service集群开始。
我的calico节点DaemonSet具有以下CNI_NETWORK_CONFIG环境变量:
{
"name": "k8s-pod-network",
"cniVersion": "0.3.1",
"type": "calico",
"etcd_endpoints": "__ETCD_ENDPOINTS__",
"etcd_key_file": "__ETCD_KEY_FILE__",
"etcd_cert_file": "__ETCD_CERT_FILE__",
"etcd_ca_cert_file": "__ETCD_CA_CERT_FILE__",
"log_level": "info",
"mtu": 1480,
"ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s",
"k8s_api_root": "https://__KUBERNETES_SERVICE_HOST__:__KUBERNETES_SERVICE_PORT__",
"k8s_auth_token": "__SERVICEACCOUNT_TOKEN__"
},
"kubernetes": {
"kubeconfig": "__KUBECONFIG_FILEPATH__"
}
}
我在这里所做的只是尝试用以下配置替换它:
{
"name": "k8s-pod-network",
"cniVersion": "0.3.1",
"plugins": [{
"type": "calico",
"etcd_endpoints": "__ETCD_ENDPOINTS__",
"etcd_key_file": "__ETCD_KEY_FILE__",
"etcd_cert_file": "__ETCD_CERT_FILE__",
"etcd_ca_cert_file": "__ETCD_CA_CERT_FILE__",
"log_level": "info",
"mtu": 1480,
"ipam": {
"type": "calico-ipam"
},
"policy": {
"type": "k8s",
"k8s_api_root": "https://__KUBERNETES_SERVICE_HOST__:__KUBERNETES_SERVICE_PORT__",
"k8s_auth_token": "__SERVICEACCOUNT_TOKEN__"
},
"kubernetes": {
"kubeconfig": "__KUBECONFIG_FILEPATH__"
}
},
{
"type": "portmap",
"snat": true,
"capabilities": {
"portMappings": true
}
}
]
}
强制重新启动后,
calico-node
pods 已成功运行,但是我自己的 pods 在初始化期间始终处于“待定”状态,事件来自“kubelet NODE_IP”事件“错误同步 pods ”。我希望在此问题上有所帮助。提前致谢。
最佳答案
就内容而言,您看起来很合理,我认为问题可能是您需要将配置文件的名称从.conf
结尾更改为.conflist
。 PR包含一些WIP更改https://github.com/projectcalico/calico/pull/903,用于在印花布 list 中启用主机端口,您可以将其与已完成的操作进行比较。
如果通过守护程序设置文件名,则应在主机上删除以前的配置文件,因为发布的install-cni容器不会清除以前的配置,并且我不确定kubelet将使用哪个配置文件。
关于kubernetes - 无法在Kubernetes集群上更新Calico CNI配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47080266/