默认的kubernetes服务的由来
安装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] "Calling handler.OnEndpointSlicesSynced()" I0427 01:46:24.595902 1 service.go:419] "Adding new service port" portName="default/kubernetes:https" servicePort="10.96.0.1:443/TCP" I0427 01:46:24.595983 1 service.go:419] "Adding new service port" portName="kube-system/kube-dns:dns" servicePort="10.96.0.10:53/UDP" I0427 01:46:24.596036 1 service.go:419] "Adding new service port" portName="kube-system/kube-dns:dns-tcp" servicePort="10.96.0.10:53/TCP" I0427 01:46:24.596047 1 service.go:419] "Adding new service port" portName="kube-system/kube-dns:metrics" servicePort="10.96.0.10:9153/TCP" I0427 01:46:24.596056 1 service.go:419] "Adding new service port" portName="kubernetes-dashboard/dashboard-metrics-scraper" servicePort="10.101.210.188:8000/TCP" I0427 01:46:24.596065 1 service.go:419] "Adding new service port" portName="kubernetes-dashboard/kubernetes-dashboard" servicePort="10.98.70.204:443/TCP" I0427 01:46:24.596276 1 endpointslicecache.go:358] "Setting endpoints for service port name" portName="kubernetes-dashboard/kubernetes-dashboard" endpoints=[10.244.137.69:8443] I0427 01:46:24.596305 1 endpointslicecache.go:358] "Setting endpoints for service port name" portName="default/kubernetes:https" endpoints=[192.168.106.131:6443] I0427 01:46:24.596315 1 endpointslicecache.go:358] "Setting endpoints for service port name" portName="kube-system/kube-dns:dns" endpoints=[10.244.104.2:53] I0427 01:46:24.596321 1 endpointslicecache.go:358] "Setting endpoints for service port name" portName="kube-system/kube-dns:dns-tcp" endpoints=[10.244.104.2:53] I0427 01:46:24.596329 1 endpointslicecache.go:358] "Setting endpoints for service port name" portName="kube-system/kube-dns:metrics" endpoints=[10.244.104.2:9153] kube-proxy会把portName=“default/kubernetes:https” servicePort=“10.96.0.1:443/TCP” 注册到本服务中,那么Node端就可以通过kube-proxy来访问10.96.0.1:443这个服务。 所以出现标题所示问题,根源在该机器没有运行kube-proxy,或者kube-proxy运行异常。
时来天地皆同力,运去英雄不自由