Linux 如何从microk8s部署吊舱访问网络中的主机

Linux 如何从microk8s部署吊舱访问网络中的主机,linux,kubernetes,networking,microk8s,Linux,Kubernetes,Networking,Microk8s,我试图从部署吊舱内访问位于另一台服务器(但在我的网络上)的主机,我使用的是microk8s 问题是,在我安装了microk8s的服务器上,我可以通过ping我的网络主机.qa.local轻松ping它。但是当我带着microk8s kubectl exec-it pod_name--/bin/bash进入pod时,我会用ping我的网络主机.qa.local它会说:名称或服务未知 当我连接到我计算机上的VPN以进入该网络,并使用docker desktop kubernetes在本地部署它时,我

我试图从部署吊舱内访问位于另一台服务器(但在我的网络上)的主机,我使用的是
microk8s

问题是,在我安装了
microk8s
的服务器上,我可以通过
ping我的网络主机.qa.local
轻松ping它。但是当我带着microk8s kubectl exec-it pod_name--/bin/bash进入pod时,我会用
ping我的网络主机.qa.local
它会说:
名称或服务未知

当我连接到我计算机上的VPN以进入该网络,并使用docker desktop kubernetes在本地部署它时,我可以从pod内ping该主机。所以我认为问题出在microk8s上,它不允许我的pod使用我的网络

有没有办法告诉microk8s从我的网络使用我的主机


p、 s.我可以从pod ping该服务器的
ip
,但我无法从pod ping主机

当您创建k8s网络时,k8s为该网络创建一个LAN,每个pod在网络中获得一个ip地址和主机名,k8s网络通过为k8s网络提供的
my network host.qa.local
与本地LAN通信

因此,当您在pod内的
bash
上时,您不会看到
my-network-host.qa.local
,您会看到k8s LAN,其中所有pod都已连接,每个pod在k8s网络IP空间中将有一个特定的IP地址和主机名

因此,您不应该在LAN上使用IP,而应该使用来自k8s LAN的IP或主机名从k8s网络中访问特定的pod

如果您的pods需要访问不同网络上的服务,则需要从k8s网络中访问该网络。您还可以创建k8s
无头服务

假设您想连接到本地主机上的
mongulen
。在这种情况下,我们可以在集群内为它创建一个
[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服务名称和端口作为目标点。

基于我在StackOverflow上找到的结果,我成功地修复了它

要使其正常工作,需要进行两项更改:

更新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作为名称服务器

现在只需保存更改,并进入您的播客,以便您能够访问它们

另一篇帖子中有一条评论建议添加

forward . /etc/resolv.conf

但这在我的案例中不起作用。

问题是我不想去特定的pod,我需要从pod内部访问我的网络。因此,当我转到
kubectl exec-it pod\u name--/bin/bash
时,我可以访问
服务器网络
中的任何
主机
。由于我的网络有很多服务器,我需要能够从pod内部访问另一台服务器。因此,在pod内运行的应用程序需要访问
我的网络主机.qa.local
,这是另一台服务器(但它不是pod)中的一个数据库,而我正试图使用本地机器上的
docker desktop kubernetes
来实现这一点,我认为这应该只是
microk8s
中的配置问题,我通常使用无头服务来解决这个问题。我改进了答案。看看无头服务。答案中提供了链接。好的,我明白了。这是否意味着在这种情况下,我只需要使用
ip的
,并且我不能在
地址
部分中使用主机名?找到了解决方案,我将添加它作为答案:)