docker和kubernetes中hostname的使用和常见问题

hostname在docker中是使用UTS namespace进行隔离的。docker中主要有两种ns的用法,node

  • 一种是docker run --uts="" busybox。这种会新建立一个新的uts ns。
  • 一种是docekr run --uts="host" busybox。这种建立的容器将会使用物理机的uts ns。

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

func modifyHostNetworkOptionForContainer(hostNetwork bool, sandboxID string, hc *dockercontainer.HostConfig) {
    sandboxNSMode := fmt.Sprintf("container:%v", sandboxID)
    hc.NetworkMode = dockercontainer.NetworkMode(sandboxNSMode)
    hc.IpcMode = dockercontainer.IpcMode(sandboxNSMode)
    hc.UTSMode = ""

    if hostNetwork {
        hc.UTSMode = namespaceModeHost
    }
}

这里咱们能够关注几个事情:网络

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

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

固然,容器若是想要修改hostname(经过hostname命令),须要privileged权限才能够。code

修改后容器直接重启会致使恢复原来的hostname。这个的主要缘由是重启会致使从新建立新的uts namespace。ip

固然,若是容器重建了,好比exit后又被kubelet建立了一个新的容器,则hostname会再次恢复。string

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

经过修改/etc/hostname的方式动态修改运行容器的hostname无效。io

如下是完整实验过程:

//容器启动时hostname为busyboxtest
[root@node ~]# docker exec 6f5 hostname
busyboxtest
//修改/etc/hostname文件
[root@node ~]# docker exec 6f5 cat /etc/hostname
busyboxtest123
[root@node ~]# docker exec 6f5 hostname test123
//修改后查看hostname为test123
[root@node ~]# docker exec 6f5 hostname
test123
[root@node ~]# docker inspect 6f5|grep Pid
            "Pid": 15818,
[root@node ~]# ll /proc/15818/ns/
total 0
lrwxrwxrwx 1 root root 0 Jan 10 16:16 ipc -> ipc:[4026535715]
lrwxrwxrwx 1 root root 0 Jan 10 16:16 mnt -> mnt:[4026535789]
lrwxrwxrwx 1 root root 0 Jan 10 16:16 net -> net:[4026535718]
lrwxrwxrwx 1 root root 0 Jan 10 16:16 pid -> pid:[4026535791]
lrwxrwxrwx 1 root root 0 Jan 10 16:18 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jan 10 16:16 uts -> uts:[4026535790]
//重启容器
[root@node ~]# docker restart 6f5
6f5
[root@node ~]# docker inspect 6f5|grep Pid
            "Pid": 17553,
//能够看到uts的namespace变化了         
[root@node ~]# ll /proc/17553/ns/
total 0
lrwxrwxrwx 1 root root 0 Jan 10 16:19 ipc -> ipc:[4026535715]
lrwxrwxrwx 1 root root 0 Jan 10 16:19 mnt -> mnt:[4026535341]
lrwxrwxrwx 1 root root 0 Jan 10 16:19 net -> net:[4026535718]
lrwxrwxrwx 1 root root 0 Jan 10 16:19 pid -> pid:[4026535714]
lrwxrwxrwx 1 root root 0 Jan 10 16:19 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 Jan 10 16:19 uts -> uts:[4026535713]
//hostname恢复
[root@node ~]# docker exec 6f5 hostname
busyboxtest
[root@node ~]# docker exec 6f5 cat /etc/hostname
busyboxtest123
相关文章
相关标签/搜索