【问题标题】:Cannot update Calico CNI config on Kubernetes cluster无法更新 Kubernetes 集群上的 Calico CNI 配置
【发布时间】:2018-04-15 06:29:24
【问题描述】:

直到几个月前,我才发现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-node 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 pod 在强制重启后运行成功,但我自己的 Pod 在初始化期间一直卡在“Pending”状态,并出现来自“kubelet NODE_IP”的“Error syncing pod”事件。

我希望能在这个问题上提供一些帮助。提前致谢。

【问题讨论】:

    标签: kubernetes ibm-cloud project-calico cni


    【解决方案1】:

    就内容而言,您的内容看起来很合理,我认为问题可能是您需要将配置文件的名称从以.conf 结尾更改为.conflist。有一个 PR 有一些 WIP 更改 https://github.com/projectcalico/calico/pull/903 用于在 calico 清单中启用主机端口,您可以将其与您所做的进行比较。

    如果你通过 daemonset 设置文件名,你应该删除主机上以前的配置文件,因为发布的 install-cni 容器不会清理以前的配置,我不确定 kubelet 会使用哪个配置文件。

    【讨论】:

    • 我已将文件名从 .conf 更改为 .conflist,现在,至少 calico-node 可以正常运行,其他 pod 也是如此。不幸的是,我仍然无法访问节点的端口。也许是旧的配置文件产生了冲突,或者更有可能是堆栈中某处的防火墙规则。仍在调查这部分,但谢谢。
    • 好的,我已经在集群中添加了一个普通的新节点,但我仍然无法访问该端口,因此很可能是防火墙配置错误或类似情况。我仍然无法弄清楚确切的问题出在哪里。
    • 由于您不确定您的流量发生了什么,您可以使用 tcpdump 和 sudo iptables-save -c | grep DROP(查看流量是否到达主机以及是否被主机丢弃) .
    • 原来 IBM 的云存在问题,因此在他们修复之前,此配置无法正常工作。 :(
    猜你喜欢
    • 2020-05-31
    • 2019-05-05
    • 1970-01-01
    • 2021-12-21
    • 2017-09-28
    • 1970-01-01
    • 2022-08-24
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多