安装calico网络插件之后,发现相关pod一直不能进入Ready状态,查看log,出现如下问题:
Hit error connecting to datastore - retry error=Get “https://10.96.0.1:443/api/v1/nodes/foo”: dial tcp 10.96.0.1:443: connect: connection refused
网上查资料都说是什么iptables配置的问题,各种尝试,发现完全不对。于是打算从根源了解这个东西。
那么这个10.96.0.1到底是什么呢?原来
在 kubernetes,可以从集群外部和内部两种方式访问 kubernetes API,在集群外直接访问 apiserver 提供的 API,在集群内即 pod 中可以通过访问 service 为 kubernetes 的 ClusterIP。kubernetes 集群在初始化完成后就会创建一个 kubernetes service,该 service 是 kube-apiserver 创建并进行维护的,如下所示:
[root@master1 dingpwen]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 2d20h
内置的 kubernetes service 无法删除,其 ClusterIP 为通过 --service-cluster-ip-range 参数指定的 ip 段中的首个 ip,kubernetes endpoints 中的 ip 以及 port 可以通过 --advertise-address 和 --secure-port 启动参数来指定。
那么我们Node上的pod又如何才能访问到这个服务呢?毕竟相对于master机器,Node机器通过ip访问相当于“外网”。
其实我们查看kube-proxy的代码就会发现
I0427 01:46:24.595581 1 config.go:233