如何在具有多个网络接口的节点中为kube-proxy和kubelet指定接口?

时间:2017-08-30 11:25:55

标签: kubernetes

我在一些具有三个网络接口的服务器中部署了kubernetes环境。除了关于kube-apiserver的集群ip的iptables规则外,一切顺利。

由于所有服务器都有三个带子网的接口

10.0.41.0/24
10.0.42.0/24
192.168.247.0/24

我只是为kube-apiserver随机选择了一个,使apiserver使用证书,并为https请求打开10.0.41.4:6443。所以apiserver配置如下:

KUBE_API_ADDRESS="--insecure-bind-address=10.0.41.4 --advertise-address=10.0.41.4 --bind-address=10.0.41.4"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_API_ARGS="--authorization-mode=RBAC --runtime-config=rbac.authorization.k8s.io/v1beta1 --kubelet-https=true --experimental-bootstrap-token-auth --token-auth-file=/etc/kubernetes/token.csv --service-node-port-range=30000-32767 --tls-cert-file=/etc/kubernetes/ssl/kubernetes.pem --tls-private-key-file=/etc/kubernetes/ssl/kubernetes-key.pem --client-ca-file=/etc/kubernetes/ssl/ca.pem --service-account-key-file=/etc/kubernetes/ssl/ca-key.pem --enable-swagger-ui=true --apiserver-count=3 --audit-log-maxsize=100 --audit-log-maxbackup=0 --audit-log-path=/home/kube/audit.log --event-ttl=1h --runtime-config=batch/v2alpha1=true"
...

kubelet和kube-proxy就像这样开始了

/usr/bin/kubelet --logtostderr=true --v=0 --api-servers=http://10.0.41.4:8080 --address=10.0.41.1 --hostname-override=10.0.41.1 --allow-privileged=true --cgroup-driver=systemd --cluster-dns=10.254.0.2 --experimental-bootstrap-kubeconfig=/etc/kubernetes/bootstrap.kubeconfig --kubeconfig=/etc/kubernetes/kubelet.kubeconfig --require-kubeconfig --cert-dir=/etc/kubernetes/ssl --cluster-domain=cluster.local. --hairpin-mode promiscuous-bridge --serialize-image-pulls=false --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin --node-ip=10.0.41.1
/usr/bin/kube-proxy --logtostderr=true --v=0 --bind-address=10.0.41.1 --hostname-override=10.0.41.1 --kubeconfig=/etc/kubernetes/kube-proxy.kubeconfig --cluster-cidr=10.254.0.0/16

然后我无法将10.254.0.1:443与curl联系起来,因为会有一些iptables nat规则,其中包含所有网络接口的最新和随机模块

Chain KUBE-SVC-NPX46M4PTMTKRN6Y (1 references)
pkts      bytes target     prot opt in     out     source               destination         
   0        0 KUBE-SEP-FA7AX7V3VYKS4DYK  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ recent: CHECK seconds: 10800 reap name: KUBE-SEP-FA7AX7V3VYKS4DYK side: source mask: 255.255.255.255
   0        0 KUBE-SEP-WRH6L36KL6VQULQ6  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ recent: CHECK seconds: 10800 reap name: KUBE-SEP-WRH6L36KL6VQULQ6 side: source mask: 255.255.255.255
   0        0 KUBE-SEP-NQ46EZO2HBXVI7ID  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ recent: CHECK seconds: 10800 reap name: KUBE-SEP-NQ46EZO2HBXVI7ID side: source mask: 255.255.255.255
   0        0 KUBE-SEP-FA7AX7V3VYKS4DYK  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ statistic mode random probability 0.33332999982
   0        0 KUBE-SEP-WRH6L36KL6VQULQ6  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ statistic mode random probability 0.50000000000
   0        0 KUBE-SEP-NQ46EZO2HBXVI7ID  all  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */

Chain KUBE-SEP-FA7AX7V3VYKS4DYK (2 references)
pkts      bytes target     prot opt in     out     source               destination         
   0        0 KUBE-MARK-MASQ  all  --  *      *       10.0.41.4            0.0.0.0/0            /* default/kubernetes:https */
   0        0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ recent: SET name: KUBE-SEP-FA7AX7V3VYKS4DYK side: source mask: 255.255.255.255 tcp to:10.0.41.4:6443

Chain KUBE-SEP-NQ46EZO2HBXVI7ID (2 references)
pkts      bytes target     prot opt in     out     source               destination         
   0        0 KUBE-MARK-MASQ  all  --  *      *       192.168.247.19       0.0.0.0/0            /* default/kubernetes:https */
   0        0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ recent: SET name: KUBE-SEP-NQ46EZO2HBXVI7ID side: source mask: 255.255.255.255 tcp to:192.168.247.19:6443

Chain KUBE-SEP-WRH6L36KL6VQULQ6 (2 references)
pkts      bytes target     prot opt in     out     source               destination         
   0        0 KUBE-MARK-MASQ  all  --  *      *       10.0.42.4            0.0.0.0/0            /* default/kubernetes:https */
   0        0 DNAT       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            /* default/kubernetes:https */ recent: SET name: KUBE-SEP-WRH6L36KL6VQULQ6 side: source mask: 255.255.255.255 tcp to:10.0.42.4:6443

只有在iptables将其转换为10.254.0.1:443时才能连接10.0.41.4:6443。其他服务,我的意思是用于测试的nginx服务器,可以一直连接。因为ip提供了网络插件(calico),并且它是唯一的。

现在我的问题是,我可以做些什么来让kube-proxy或kubelet或其他东西只在10.0.41.0/24的界面上运行?

我试图删除不需要的iptables规则,但它们会立即恢复。可悲的是不行。

我还检查了this中kube *的参数,但什么都没有。

1 个答案:

答案 0 :(得分:0)

好吧,我想我有理由。问题是由'--apiserver-count'参数引起的。

当我将'--apiserver-count'设置为3时,kube-apiserver将收集多个接口(不完全是3个,可能是2个)作为名为'kubernetes'的服务的端点。并且kube-proxy将添加每个端点的iptables nat规则。删除'--apiserver-count'将修复它。

所以kube-proxy运行良好,我想也许这是kube-apiserver的错误。