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

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

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

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

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

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并不会影响到其他的容器。
  2. 如果判断是使用物理机网络就是hostNetwork,则会将uts的mode设置为"host",也就是使用物理机的uts ns。

    因此这时候容器修改hostname,也会影响到物理机。

当然,容器如果想要修改hostname(通过hostname命令),需要privileged权限才可以。

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

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

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

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

以下是完整实验过程:

//容器启动时hostname为busyboxtest
[[email protected] ~]# docker exec 6f5 hostname
busyboxtest
//修改/etc/hostname文件
[[email protected] ~]# docker exec 6f5 cat /etc/hostname
busyboxtest123
[[email protected] ~]# docker exec 6f5 hostname test123
//修改后查看hostname为test123
[[email protected] ~]# docker exec 6f5 hostname
test123
[[email protected] ~]# docker inspect 6f5|grep Pid
            "Pid": 15818,
[[email protected] ~]# 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]
//重启容器
[[email protected] ~]# docker restart 6f5
6f5
[[email protected] ~]# docker inspect 6f5|grep Pid
            "Pid": 17553,
//可以看到uts的namespace变化了
[[email protected] ~]# 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恢复
[[email protected] ~]# docker exec 6f5 hostname
busyboxtest
[[email protected] ~]# docker exec 6f5 cat /etc/hostname
busyboxtest123

原文地址:https://www.cnblogs.com/lonelyxmas/p/10646644.html

时间: 2024-09-27 19:48:26

docker和kubernetes中hostname的使用和常见问题的相关文章

大神教你轻松玩转Docker和Kubernetes中如何运行MongoDB微服务

本文介绍了利用Docker和Kubernetes搭建一套具有冗余备份集合的MongoDB服务,从容器对CI和CD引发的改变入手,讨论了容器技术对MongoDB带来的挑战和机会,然后实战如何部署一套稳定的MongoDB服务,非常的干货 介绍 想尝试在笔记本电脑上运行MongoDB么?希望通过执行一个简单的命令,然后就有一个轻量级.自组织的沙盒么?并可再通过一条命令就可以移除所有的痕迹么? 需要在多个环境中运行相同的应用程序栈?创建自己的容器镜像,使得开发.测试.操作和支持团队启动一份完全相同的环境

kubernetes中的Pod简述与实践

Pod的概念详细的Pod解释可参考k8s官网,关于Pod的概念主要有以下几点:(1)Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程:(2)在Kubrenetes集群中Pod的使用方式:(3)Pod中如何管理多个容器 理解Pod上面已经说了"Pod是kubernetes中你可以创建和部署的最小也是最简的单位.一个Pod代表着集群中运行的一个进程."Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP,管理容器如

redis,docker和kubernetes留言簿案例实战

kubernetes实战-基于redis和docker的留言簿案例 [置顶] kubernetes实战-基于redis和docker的留言簿案例 标签: dockerkubernetesredis 2015-06-22 19:41 7570人阅读 评论(5) 收藏 举报 本文章已收录于:  Docker知识库  分类: docker(7)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.介绍 本案例基于Kubernetes和Docker,其中包括 1.web前端 2.redis ma

大型网站技术-3. 容器Docker与kubernetes

大型网站技术基石篇-容器Docker与kubernetes Docker和Kubernetes的关系就如Xen与OpenStack. Docker是一种容器技术,和Hypervisor(KVM/Xen这类)不同的是,Docker不会提供一整个操作系统,他能提供隔离的程序运行环境.对一个应用来说这已经够了. Kubernetes是Google的一个开源容器管理项目,他能利用Docker/其他技术部署/管理容器集群.   Docker          项目地址:https://www.docker

kubernetes中网络报错问题

系统环境 #系统版本 cat /etc/redhat-release CentOS Linux release 7.4.1708 (Core) #kubelet版本 kubelet --version Kubernetes v1.10.0 #selinux状态 getenforce Disabled #系统防火墙状态 systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemon Loade

Kubernetes中,两种常见类型的Volume深度实践

一.背景 存储资源在所有计算资源中扮演着十分重要的角色,大部分业务场景下都有可能使用到各类存储资源.在Kubernetes中,系统通过Volume对集群中的容器动态或静态提供存储资源.通常情况下,我们可以认为容器或者Pod的生命周期时短暂的,当容器被销毁时,容器内部的数据也同时被清除.为了持久化保存容器的数据,Kubernetes引入了Volume,类似于Docker的Volume(Docker also has a concept of volumes, though it is somewh

Docker和Kubernetes

Docker和Kubernetes Docker Docker是一个容器的开放平台,但它不是最早的.自20世纪70年代以来,容器平台一直存在.他们的开发可以追溯到Unix中的chroot系统调用.在2000年代早期,FreeBSD Jails和Linux服务器的开发导致了2008年的Linux容器(LXC).Docker在2013年左右出现在容器领域,并立即取得了成功.原因是Docker使得运行容器变得简单:使用Docker,开发人员可以轻松启动,停止和销毁容器.而且带来的低学习曲线和易用性,使

Kubernetes中的PodIP、ClusterIP和外部IP

Kubernetes是Google开源的容器集群管理系统,是Docker容器的主要集群管理系统之一. 其中,Kubernetes中管理主要有三种类型的IP:Pod IP .Cluster IP 和 外部IP. Pod IP Kubernetes的最小部署单元是Pod.利用Flannel作为不同HOST之间容器互通技术时,由Flannel和etcd维护了一张节点间的路由表.Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得"同属一个内网&qu

Kubernetes中Pod间共享内存方案

摘要:一些公共服务组件在追求性能过程中,与业务耦合太紧,造成在制作基础镜像时,都会把这些基础组件都打包进去,因此当业务镜像启动后,容器里面一大堆进程,这让Kubernetes对Pod的管理存在很大隐患.为了让业务容器瘦身,更是为了基础组件自身的管理更独立和方便,将基础组件从业务镜像中剥离并DaemonSet容器化部署.然而一些基础组件Agent与业务Pod之间通过共享内存的方式进行通信,同一Node中跨Pod的共享内存方案是首先要解决的问题. 为什么要将公共基础组件Agent进行DaemonSe