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