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
相關文章
相關標籤/搜索