【问题标题】:How to access hosts in my network from microk8s deployment pods如何从 microk8s 部署 pod 访问我网络中的主机
【发布时间】:2021-06-19 20:54:48
【问题描述】:

我正在尝试从部署 pod 内部访问位于另一台服务器(但在我的网络上)的主机,并且我正在使用 microk8s

问题是在我安装了microk8s 的服务器上,我可以轻松地通过ping my-network-host.qa.local ping 它。但是当我使用microk8s kubectl exec -it pod_name -- /bin/bash 进入吊舱并使用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 主机

【问题讨论】:

    标签: linux kubernetes networking microk8s


    【解决方案1】:

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

    所以当你在bash在 pod 内时,你看不到my-network-host.qa.local ,你会看到连接了所有 pod 的 k8s LAN,每个 pod 在 k8s 中都有一个特定的 IP 地址和一个主机名网络IP空间。

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

    如果您的 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 名称和端口作为目标点。

    【讨论】:

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

    根据我在 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 转发 更改为指向您的域名服务器:

    首先打开 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
    

    但这对我的情况不起作用。

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 1970-01-01
      • 2020-05-03
      • 2019-11-03
      • 2015-08-05
      • 2018-02-15
      • 2022-11-10
      • 2023-01-24
      • 1970-01-01
      相关资源
      最近更新 更多