问题描述
我正在尝试从部署 pod 内部访问位于另一台服务器(但在我的网络上)中的主机,并且我正在使用 microk8s
。
问题是,在我安装了 microk8s
的服务器上,我可以轻松地通过 ping my-network-host.qa.local
ping 它。但是当我使用 microk8s kubectl exec -it pod_name -- /bin/bash
进入 Pod 并执行 ping my-network-host.qa.local
时,它说:Name or service not kNown
。
当我连接到计算机上的 VPN 以进入该网络并使用 docker-desktop kubernetes
在本地部署它时,我可以从 Pod 内 ping 该主机。所以我认为问题出在 microk8s
上,它不允许我的 pod 使用我的网络。
有什么方法可以告诉 microk8s 使用我网络中的主机吗?
附言我可以从 pod ping 该服务器的 ip
,但我无法从 pod ping 主机
解决方法
根据我在 StackOverflow 上找到的 another answer,我设法修复了它。
需要进行 2 处更改才能使其正常工作:
更新 kubelet 配置以使用 resolv-conf
:
sudo echo "--resolv-conf=/run/systemd/resolve/resolv.conf" >> /var/snap/microk8s/current/args/kubelet
重启kubelet服务:
sudo service snap.microk8s.daemon-kubelet restart
然后将 CoreDNS forward 更改为指向您的域名服务器:
首先打开 coredns 配置映射,以便您可以对其进行编辑
sudo microk8s.kubectl edit configmap coredns -n kube-system
并在
处更新文件forward . 8.8.8.8 8.8.4.4 #REMOVE THIS LINE
forward . xxx.xxx.xxx.xxx #ADD THIS WITH YOUR IP
可以得到eth0的DNS地址:
nmcli dev show 2>/dev/null | grep DNS | sed 's/^.*:\s*//'
就我而言,我已经在 /run/systemd/resolve/resolv.conf
上将 ip 作为名称服务器。
现在只需保存更改,然后进入您的 Pod,以便您可以访问它们。
另一篇文章中有一条评论建议添加
forward . /etc/resolv.conf
但这对我的情况不起作用。
,当您创建 k8s 网络时,k8s 会为该网络创建一个 LAN,并且每个 pod 都会获得网络内的 IP 地址和主机名,该 k8s 网络通过为 k8s 提供的 my-network-host.qa.local
与您的本地 LAN 通信网络。
因此,当您在 Pod 内bash
时,您看不到my-network-host.qa.local
,您会看到连接所有 Pod 的 k8s LAN,并且每个 Pod 都有一个特定的 IP 地址和一个k8s 网络 IP 空间中的主机名。
因此,不要使用 LAN 上的 IP,您应该使用来自 k8s LAN 的 IP 或主机名来从 k8s 网络内访问特定的 pod。
如果您的 pod 需要访问不同网络上的服务,则该网络需要可从 k8s 网络内访问。你也可以创建一个 k8s headless-service
假设您想连接到本地主机上的 Mongolen
。在这种情况下,我们可以在集群内为它创建一个 [headless service][1]
和端点……mongodb-service.yaml
文件应该如下所示:
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
clusterIP: None
ports:
- protocol: TCP
port: the-port
targetPort: the-port
selector:
name: example
type: ClusterIP
---
apiVersion: v1
kind: Endpoints
metadata:
name: mongodb-service
subsets:
- addresses:
- ip: the-kluster-ip
ports:
- port: the-port
创建服务和端点后,您可以在该集群的任何 Pod 内使用 mongodb-service 名称和端口作为目标点。