我在一些具有三个网络接口的服务器中部署了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 *的参数,但什么都没有。
答案 0 :(得分:0)
好吧,我想我有理由。问题是由'--apiserver-count'参数引起的。
当我将'--apiserver-count'设置为3时,kube-apiserver将收集多个接口(不完全是3个,可能是2个)作为名为'kubernetes'的服务的端点。并且kube-proxy将添加每个端点的iptables nat规则。删除'--apiserver-count'将修复它。
所以kube-proxy运行良好,我想也许这是kube-apiserver的错误。