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 } }
这里咱们能够关注几个事情:网络
pause容器和应用容器都是使用独自的uts namespace。应用容器之间也都是使用独立的namespace,所以任何一个容器启动后修改hostname并不会影响到其余的容器。spa
若是判断是使用物理机网络就是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