深入剖析 linux 容器 & Pod(上)| 学习笔记

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 快速学习深入剖析 linux 容器 & Pod(上)

开发者学堂课程【企业级运维之云原生与 Kubernets 实战课程:深入剖析 linux 容器 & Pod(上) 】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/913/detail/14532


深入剖析 linux 容器 & Pod(上)

本章目标

Ÿ 理解容器和 pod 的基本原理以及差异

Ÿ 理解 pod 创建的过程

Ÿ 理解各个控制器的作用

Ÿ 理解 ack 集群的网络原理以及 coredns 的原理

 

本章目录

Ÿ 深入剖析 linux 容器 & Pod

Ÿ 集群创建 Pod 的过程

Ÿ 阿里云 ACK 集群控制器

Ÿ 阿里云 ACK 集群网络

 

第三章第1讲 深入剖析linux容器&Pod(上)

 

目录

Ÿ 什么是容器

Ÿ 资源隔离( namespace )

Ÿ 资源限制( cgroup )

Ÿ Init 容器

Ÿ Pause 容器

Ÿ 最佳实践

 

一、什么是容器

容器提供了一种逻辑打包机制,以这种机制打包的应用,可以脱离其实际运行的环境。

image.png

传统OS上应用的特点:

Ÿ 应用进程可以互相看到,互相通信,意味着进程可以相互攻击;

Ÿ 进程使用的同一个文件系统,可以对其他进程的文件进行增删改查;除此之外,进程间的依赖也可能会存在冲突;

Ÿ 使用相同的宿主机资源,存在资源抢占的问题。

容器具有视图隔离、资源可限制、独立文件系统等特点,容器中用到的主要技术是命名空间隔离 Namespace 和控制器组 Cgroup。

 

二、命名空间隔离( namespace )

1. 什么是命名空间隔离

命名空间是对全局资源的一种抽象,命名空间使得一些进程只能看到自己相关的资源,但是对于命名空间外的其它进程是不可见的。使用命名空间隔离技术的一个例子就是容器。

image.png

2. Namespace 类型

Linux 内核实现了 6 种 Namespace:

Ÿ mount:隔离文件系统挂载点

Ÿ Network:隔离网络资源

Ÿ PID:隔离进程 ID

Ÿ UTS:隔离主机名和域名

Ÿ User:隔离用户和用户组

Ÿ IPC:进程间通信隔离

问题:不同的 Pod 之间资源是隔离的,而在同一个 Pod 里,多个容器间哪些资源是共享的?哪些是隔离的呢?

3. Pod 中共享的命名空间

UTS:hostname 和 NIS 域名;IPC:进程间通信。

Yaml 文件示例:

Pod 编排文件,Pod 中创建了 nginx 和 busybox 两个容器:

apiversion:apps/v1

kind: Deployment

metadata:

labels:

app: multi-containers

name: multi-containers

spec:

replicas:1

selector:

matchLabels:

app:multi-containers

template:

metadata:

labels:

app:multi-containers

spec:

containers:

- command:

- sleep

- '36000'

image: 'nginx:1.7.9'

imagePullPolicy: IfNotPresent

name: nginx

- command:

- sleep

- '360000'

image: 'busybox:latest'

imagePullPolicy: Always

name: busybox

a. Pod 中共享 UTS 命名空间

一个 pod 里,有多个 containers,他们之间共享 hostname。

UTS:最简单的 namespace,只作用 hostname 和 NIS 域名两个资源。

image.png

示例:

# kubectl get deployments.apps multi-containers

切换到 nginx 的 hostname:

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c nginx -- bash

# hostname

切换到 busybox 的 hostname:

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c busybox -- bash

# hostname

b. Pod 中共享 IPC 命名空间

IPC:进程间通信,只有同一个 namespace 的进程之间才能够通信,常用于MessageQ。

image.png

c. Pod 中共享 NET 命名空间

Net:网络相关资源隔离,如网络设备、路由表、防火墙( iptables )、 socket ( ss、netstat )等等。

在排查问题时,经常会出现网络丢包、连接不上、解析不了等各种各样的问题,如何通过抓包找到问题,这个将在后续介绍。

image.png

示例:

# netstat -antpl

image.png

d. 非共享 USER 命名空间

USER :在不同的 namespace 中用户可以有相同的 UID 和 GID ,它们之间互相不影响。

e. Pod 中非共享 pid 命名空间

PID:隔离进程的 pid 属性,即不同的 namespace 中的进程可以有相同的 pid,相同的 namespace 可以看到其他进程的 pid。

image.png

image.png

f. Pod 中非共享 mnt 命名空间

MNT:隔离的是 mount points (挂载点) ,即不同 namespace 下面的进程看到的文件系统结构是不同的。不同的 containers 依赖不同的环境,mnt 去共享,会存在冲突。

非共享 MNT 示例:

image.png 

示例:

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c nginx -- bash

# ls -l

image.png

# kubectl exec -it multi-containers-6695d87b75-dsxgn -c busybox -- sh

# ls -l

image.png

g. 超好用的 command:lsns

lsns:列出有关所有当前可访问的名称空间或给定名称空间的信息。命名空间标识符是一个索引节点号。

常用参数:

-J 使用 JSON 输出格式

-l 使用列表格式的输出

-n 不打印标题

-r 使用原生输出格式

-u 不截断列中的文本

-t 名字空间类型( mnt, net, ipc, user, pid, uts, cgroup )

示例:

# lsns

image.png

# lsns -t net

image.png

# lsns -t mnt

image.png

# ps -ef |grep tomcat

# ps -ef |grep 1208542

# ps -ef |grep 1208523

image.png

# pstree -sp 1208608

# ps -ef |grep 1208523

image.png

h. 超好用的 command:nsenter

nsenter:在指定进程的指定命令空间下运行指定程序的命令,它最典型的用途就是进入容器的网络命令空间。

用法:

nsenter [options] <program> [<argument>...]

Run a program with namespaces of other processes.

选项:

 -t, --target <pid>     要获取名字空间的目标进程

-m, --mount[=<file>]   enter mount namespace

-u, --uts[=<file>]     enter UTS namespace (hostname etc)

-i, --ipc[=<file>]     enter System V IPC namespace

-n, --net[=<file>]     enter network namespace

-p, --pid[=<file>]     enter pid namespace

-U, --user[=<file>]    enter user namespace

-S, --setuid <uid>     set uid in entered namespace

-G, --setgid <gid>     set gid in entered namespace

--preserve-credentials do not touch uids or gids

-r, --root[=<dir>]     set the root directory

-w, --wd[=<dir>]       set the working directory

-F, --no-fork         执行 <程序> 前不 fork

-Z, --follow-context  

set SELinux context according to --target PID

-h, --help     显示此帮助并退出

-V, --version  输出版本信息并退出

命令解析:

image.png

演示示例:

# ipconfig eth0

# kubectl get pods multi- containers-6695d87b75-dsxgn -o wide  

image.png

# docker ps |grep multi

# docker inspect 0683e462045a |grep -i -pid

# lsns -p 905215

image.png 

# nsenter -n -t 905215

# tcpdump -i any host 223.5.5.5 -nnvv -xxx & [1]1015386

image.png 

# pkill tcpdump

# lsns -p 905215

# nsenter -p -m -t 905215

image.png

# nsenter -p -m -i -u -n -t 905215

# ps -ef

image.png

相关文章
|
Linux Docker 容器
Docker容器运行Linux
Docker容器运行Linux
149 0
|
Ubuntu 关系型数据库 MySQL
M1 macos docker获取x86 x64 amd 等指定架构版本linux ubuntu mysql 容器并启动容器
M1 macos docker获取x86 x64 amd 等指定架构版本linux ubuntu mysql 容器并启动容器
|
3月前
|
安全 Linux 虚拟化
10-26|我现在加了,在容器内也可以改时间了,但是我在容器内改了,为什么会影响到linux机子啊
10-26|我现在加了,在容器内也可以改时间了,但是我在容器内改了,为什么会影响到linux机子啊
|
7月前
|
Cloud Native Linux 开发者
【Docker】Docker:解析容器化技术的利器与在Linux中的关键作用
【Docker】Docker:解析容器化技术的利器与在Linux中的关键作用
|
6月前
|
监控 Linux 数据处理
Linux中的nsenter命令:深入容器内部,实现无缝交互
`nsenter`是Linux工具,用于进入容器的命名空间,实现与容器内环境的交互。它基于Linux内核的命名空间功能,支持网络、PID等多类型隔离。`nsenter`允许在不停止容器的情况下调试和操作,如 `-t` 指定PID进入命名空间,`-n` 进入网络命名空间。示例包括使用`nsenter`查看容器进程或网络配置。使用时注意目标进程状态,理解命名空间类型,并谨慎操作。
|
7月前
|
Linux Docker 容器
蓝易云 - 【Linux】如何在linux系统重启或启动时执行命令或脚本(也支持docker容器内部)
以上就是在Linux系统和Docker容器中设置启动时运行命令或脚本的方法。希望对你有所帮助。
135 0
|
存储 Linux Docker
跨cpu架构部署容器技术点:怎样修改Linux 的内核版本
在使用Docker 进行跨平台部署之后,我们还可以尝试进行跨架构部署。 从X86 架构上移植到 aarch64 上。
267 0
|
7月前
|
存储 Linux 文件存储
Linux使用Docker部署Traefik容器并实现远程访问管理界面-1
Linux使用Docker部署Traefik容器并实现远程访问管理界面
155 0
|
7月前
|
Linux 网络安全 Docker
【Linux】-docker配置容器并打包成镜像
【Linux】-docker配置容器并打包成镜像
186 0
|
7月前
|
Linux Shell 虚拟化
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
linux 部署docker容器虚拟化平台(二)--------docker 镜像制作方法
105 0