一、前言
在文章《Kubernetes生产实践系列之二十八:Kubernetes基础技术之容器关键技术介绍》中,对于Docker容器技术依赖的namespace、cgroup和UnionFS技术进行了基本的介绍,本文基于Centos进行上述关键技术的实践分析。
操作系统版本情况:
CentOS Linux release 7.5.1804 (Core)
Docker的版本情况:
转载自https://blog.csdn.net/cloudvtech
二、namespace的实践
2.1 查看系统是否支持相关的namespace技术
cat /boot/config-3.10.0-957.el7.x86_64 | grep CONFIG_*_NS
CONFIG_UTS_NS=y
CONFIG_IPC_NS=y
CONFIG_USER_NS=y
CONFIG_PID_NS=y
CONFIG_NET_NS=y
对于选定的容器fluentd-s3-t69tt
docker ps | grep fluentd-s3-t69tt
e5f276b4ffe1 d7fdad56bf1b "tini -- /fluentd/en…" 2 weeks ago Up 2 weeks k8s_fluentd-s3_fluentd-s3-t69tt_third-party_5ad2831a-ce36-11ea-9f78-d26db868d6e6_0
101b326ce184 registry-vpc.cn-shanghai.aliyuncs.com/acs/pause-amd64:3.0 "/pause" 2 weeks ago Up 2 weeks k8s_POD_fluentd-s3-t69tt_third-party_5ad2831a-ce36-11ea-9f78-d26db868d6e6_0
容器ID为e5f276b4ffe1,对应的外部PID:
docker inspect -f {
{.State.Pid}} 15132
15132
查看主机上PID之下namespaces的情况:
ls-l /proc/15132/ns
通过lsns可以反向查看ns对应的进程情况:
lsns | grep 4026532499
4026532499 uts 3 15132 root tini -- /fluentd/entrypoint.sh
通过nsenter可以进入某个进程的ns:
[root@iZukkkkf6gqdhf0dbbht8rtbmbZ ~]# nsenter -u -t 15132
[root@fluentd-s3-t69tt ~]# hostname
fluentd-s3-t69tt
nsenter的命令参考如下:
nsenter [options] [program [arguments]]
options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录如果没有给出program,则默认执行$SHELL。
使用nsenter进入某个进程的某一类namespace之后,就能使用主机上的工具操作该进程在该namespace下的资源,比如进入net namespace之后,可以使用tcpdump对容器内部网卡进行流量监控。
2.2 UTS namespace
UTSnamespace可以让各个容器拥有独立的主机名和域名,可以在docker内网以名字形式被稳定的发现
#容器内的hostname
[root@iZukkkkf6gqdhf0dbbht8rtbmbZ ~]# docker exec -it e5f276b4ffe1 bash
root@fluentd-s3-t69tt:/home/fluent# hostname
fluentd-s3-t69tt
root@fluentd-s3-t69tt:/home/fluent# cat /etc/hostname
fluentd-s3-t69tt
root@fluentd-s3-t69tt:/home/fluent# exit
exit
#主机的hostname
[root@iZukkkkf6gqdhf0dbbht8rtbmbZ ~]# hostname
iZukkkkf6gqdhf0dbbht8rtbmbZ
可以看到容器e5f276b4ffe1拥有独立的/etc/hostname
2.3 User namespace
这个namespace可以在容器内部定义root用户,但是映射到主机层面却是一般的用户,进一步完善容器内进程的权限体验。
User namespace在老的CentOS版本中是体验功能,需要修改kernel启动参数进行激活,在本文的测试环境“CentOS Linux release 7.5.1804 (Core) ”中是默认激活的,但是还是需要进行一些系统配置。
参考文档:《Isolate containers with a user namespace》
- 修改max_user_namespaces
在系统默认的情况下,max_user_namespaces的值是0:
ls /proc/sys/user/max_* -l
-rw-r--r-- 1 root root 0 8月 14 10:33 /proc/sys/user/max_ipc_namespaces
-rw-r--r-- 1 root root 0 8月 14 10:33 /proc/sys/user/max_mnt_namespaces
-rw-r--r-- 1 root root 0 8月 14 10:33 /proc/sys/user/max_net_namespaces
-rw-r--r-- 1 root root 0 8月 14 10:33 /proc/sys/user/max_pid_namespaces
-rw-r--r-- 1 root root 0 8月 13 18:16 /proc/sys/user/max_user_namespaces
-rw-r--r-- 1 root root 0 8月 14 10:33 /proc/sys/user/max_uts_namespaces
cat /proc/sys/user/max_*
63370
63370
63370
63370
0
63370
需要通过如下方式修改:
echo "user.max_user_namespaces = 2147483647" > /etc/sysctl.conf*
然后重启机器,并确认:
cat /proc/sys/user/max_user_namespaces
2147483647
- 增加一个可以访问docker daemon运行docker命令的用户
useradd dockerowner
groupadd docker
gpasswd -a dockerowner docker
版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: