docker里面docker的namespacee作用是什么?

Network Namespace 是实现网络虚拟化的重要功能,它能创建多个隔离的网络空间,它们有独自的网络栈信息。不管是虚拟机还是容器,运行的时候仿佛自己就在独立的网络中。Linux Network Namespace 连接外网从大类上来讲主要有两种方法:网络地址转换(NAT) 和 桥接(bridging),而桥接根据使用的网桥又可以分为使用 linux bridge 和 Open

ip 命令管理的功能很多, 和 Network Namespace 有关的操作都是在子命令 ip netns 下进行的,可以通过 ip netns help 查看所有操作的帮助信息(ip 命令因为需要修改系统的网络配置,默认需要 sudo 权限)。

我们发现test1是没有ip地址的,并且状态是 DOWND

有了不同 network namespace 之后,也就有了网络的隔离,但是如果它们之间没有办法通信,也没有实际用处。要把两个网络连接起来,linux 提供了 veth pair 。可以把 veth pair 当做是双向的 pipe(管道),从一个方向发送的网络数据,可以直接被另外一端接收到;或者也可以想象成两个 namespace 直接通过一个特殊的虚拟网卡连接起来,可以直接通信。

我们再查看一下本机的ip link

}

在k8s中,是这样处理的uts的ns的:

这里我们可以关注几个事情:

  1. pause容器和应用容器都是使用独自的uts namespace。应用容器之间也都是使用独立的namespace,因此任何一个容器启动后修改hostname并不会影响到其他的容器。

  2. 如果判断是使用物理机网络就是hostNetwork,则会将uts的mode设置为"host",也就是使用物理机的uts ns。
    因此这时候容器修改hostname,也会影响到物理机。

修改后容器直接重启会导致恢复原来的hostname。这个的主要原因是重启会导致重新创建新的uts namespace。

当然,如果容器重建了,比如exit后又被kubelet创建了一个新的容器,则hostname会再次恢复。

一个pod内有两个容器,两个容器修改hostname并不会彼此影响,因为他们的uts namespace是各自独立的。

}

我在一个名为"a"的命名空间中有一个简单的pod,

我也有一个测试脚本,可以从"a""b"进行grpc调用。

    ,则此脚本确实可以工作

    我想DNS解析有些错误,

  • 您正在谈论的是在Pod之间拨打电话,而不是。虽然Kubernetes确实在您的应用程序之间提供了服务发现,但众所周知,它是通过DNS进行的。但是,仅因为Pod可以相互解析,一个容器的端 Eloquent 会暴露在Pod之外。为此,即使对于群集中无法解决的应用程序,也必须为每个Pod或Controller声明一个Service资源。
  • 在谈论进行引用您的B pod /服务的FQDN的 call 时,您没有指定默认的FQDN模式,也没有提及自定义此功能。

  • 首先,您能否为A和B容器在其中运行的两个 namespace 使用kubectl get svc -n NAMESPACE并确认已创建类型的服务,并且已将IP地址与该服务相关联?

    最后,如果一切恢复正常,我们可以开始对kube-dns进行故障排除。看来所有三个Pod都在运行。但是,您是否尝试过它们和/或?如果有什么有趣的地方,您可以尝试以下内容并分享摘要吗?


    我认为logs命令将为您提供所需的答案。让我知道您是否需要进一步澄清或帮助解决此问题。我很乐意提供帮助。
}

我要回帖

更多关于 docker的namespace 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信