17.B站薪享宏福笔记——第二章 k8s Pod概念&&Kubernetes网络
2 Pod概念&&Kubernetes网络
2.1 Pod 概念
2.1.1 pod直译
豌豆、豆荚( 豌豆类比 Pod,豌豆里面的豌豆粒类比容器 Container )

多个容器组合在一起,形成的逻辑分组,在 kubernetes 中就是 Pod 。
2.1.2 Pause 特性
Nginx、Redis、Php-fpm 三个是应用容器
Pause作用:1.Pod 内部第一个启动的容器(第一个启动,去初始化网络) 2.初始化网格栈(容器共用的网络由 pause 构建) 3.挂载需要的存储卷 4.回收僵尸进程(僵尸进程:存在但不提供工作或服务,例:容器nginx中启动1号进程,1号进程启动master进程,master进程启动多个work process工作进程(被master进程所管理,由master进程分配任务),当master进程消失,work process不知道如何工作,就称为僵尸进程,1号进程需要负责对其进行回收、杀死、释放对应资源。)

与docker借助名称空间NS,配合Cgroup、Bridge、Netfilter、chroot等实现容器化类似。
共享网络Network(三个应用放到一起可以组成一个简单的应用场景,组成微服务模块提供服务,如果各自为战,网络不在同一段,任意一个不能解决业务场景,当使用同一网络,可以通过Pause容器的localhost回环接口进行访问。)
共享PID、IPC(为了使Pause容器成为1号进程,这才有权限回收其他僵尸进程,为了能回收僵尸进程,所以要共享Pid、Ipc,才能使1号进程看到其他进程的信息,从而保证当前Pod的稳定运行。)
2.1.3 Pause总结
1.一个Pod是Kubernetes中部署的最小单位, 任何应用都需要封装成Pod运行。
2.每个Pod中都会有一个Pause容器,位于其他所有容器前启动,初始化网络栈,挂载需要用到的存储卷以及回收僵尸进程。
3.Pod中其他容器共享Pause容器的网络、PID、IPC名字空间。
注意:Pod是一种逻辑概念,并不真实存在(例:小王和小明组成一个组,这个组可以去做一定的任务,但是用手去碰这个组碰不到,只能碰这个组内某个人。)
2.1.4 创建Rocky系统虚拟机
Rocky镜像下载
国外官网地址:https://rockylinux.org/zh-CN/download
国内官网地址:https://mirrors.aliyun.com/rockylinux/?spm=a2c6h.25603864.0.0.10a14ac4YWnjGH
(1)创建虚拟机过程:
1.打开VMware Workstation虚拟机,左侧新建文件夹,改名为Rocky-Linux。
2.在文件夹Rocky-Linux下新建虚拟机,选中自定义(高级)(C),下一步。硬件兼容性默认既可,下一步。
3.选中稍后安装操作系统(S),下一步。客户机操作系统选中Linux(L),版本(V)选中CentOS 8 64 位,下一步。
4.虚拟机名称(V) RL-1,位置 D:\VMware\rl-1,下一步。
5.处理器数量(P):2,每个处理器的内核数量(C):2,下一步。内存 4096 MB,下一步。
6.网络使用仅主机模式网络(H),下一步。I/O控制器类型,选中 LSI Logic(L) 推荐,下一步。虚拟机磁盘类型选中 SCSI(S),下一步。
7.选中创建新虚拟磁盘(V),下一步。指定磁盘容量,最大磁盘大小(GB)(S) 100,选中将虚拟机磁盘存储为单个文件(O),
8.磁盘文件显示 RL-1.vmdk 默认就可以,下一步。
9.选中刚刚创建的虚拟机RL-1,点击编辑虚拟机设置,点击添加,选中网络适配器,点击完成。
10.选中CD/DVD(IDE),选中使用ISO映像文件(M),点击浏览,选择前面给出的链接地址下载的名为Rocky-9.5-x86_64-minimal.iso的镜像,点击确定。
Rocky Linux 9.5,2CPU,2核心,共4核心可用,4G内存,100G磁盘,2个网卡。
(2)安装Rocky Linux操作系统过程:
1.点击开启此虚拟机,选择第一个 Install Rocky Linux 9.5 回车,选中中文,简体中文(中国),点击继续。
2.点击安装目标位置(D),存储配置点击自定义,点击完成。
3.点击 + 号,挂载点(P)选中/boot,期望容量(C):800,点击添加挂载点(A)。点击 + 号,挂载点(P)选中swap,期望容量(C):4000,点击添加挂载点(A)。点击 + 号,挂载点(P)选中 / ,点击添加挂载点(A)。点击完成。点击接受更改。
4.点击ROOT密码,输入 ROOT密码:12345678,确认:12345678,选中 允许 root 用户使用密码进行SSH登录,点击完成。(锁定root账户是指不允许远程root用户登录,只能远程登录其他用户,然后切换成root用户。root 用户使用密码进行SSH登录是指可以使用root密码进行登录。),再次点击完成。然后点击开始安装(B)。安装完成后,点击重启系统。
(3)Rocky Linux系统渊源
大家现在大部分使用的系统都是Linux,是一个内核,基于此内核,外部封装生态(例:包管理工具,进程管理工具,防火墙等。)一些厂商围绕其生态衍生出:Red-Hat、CentOS、Fedora(红帽桌面版)、Ubuntu等发行版。
1.初始,拖瓦斯写出Linux内核,Red-Hat红帽公司成立,利用Linux内核加上外围软件生态推出Red-Hat系统版本。
2.Red-Hat红帽公司随后又推出了Fedora(红帽桌面版),用以Red-Hat系统上游(Red-Hat红帽公司发布代码先发布到Fedora(红帽桌面版)测试,代码稳定后下发给Red-Hat系统企业版)。
3.Red-Hat系统特性服务收费,代码开源。随后CentOS社区成立,利用代码订阅拿到整体代码后,将需要收费的授权软件移除,添加新的补充协议优化,得到新的发行版系统CentOS。
4.Red-Hat红帽公司将CentOS社区收购,原因是Fedora(红帽桌面版)->Red-Hat系统企业版 ->CentOS系统,CentOS系统位于最下游,运行最稳定还免费,对自己公司产品形成竞争,所以收购后关闭了CentOS社区及发行版。
5.Red-Hat红帽公司随后又推出了CentOS stream,形成 Fedora(红帽桌面版)-> CentOS stream ->Red-Hat系统企业版生态,相当于在自己的Red-Hat系统企业版之上增加了一个上游,让自己的产品更稳定。
6.但CentOS stream又叫滚动版,类似Windows,会经常更新组件进行重启(有些服务器多的公司会拿到CentOS stream,自己去维护成稳定版,Meta团队就是对此系统进行维护升级的一家公司。)
7.Rocky Linux是由原CentOS社区创始人同样在Red-Hat系统企业版上修修改改而创立的新的社区(目前云厂商也在跟投Rocky Linux)。

2.1.5 Rocky Linux 系统环境初始化
(1)修改静态ip,连接xshell
1.点击RL-1,点击运行此虚拟机,输入账号:root,输入密码:12345678
2.修改网卡的地址为固定IP,要不每次开启虚拟机还要查看IP地址,再用xshell去连接。(主要修改下面加黑的两个信息)
[root@loaclhost ~]# cd /etc/NetworkManager/system-connections [root@loaclhost system-connections]# ls ens33.nmconnection ens34.nmconnection [root@loaclhost system-connections]# cat ens33.nmconnection [connection] id=ens33 uuid=bb876cde-1acd-389f-994a-79ccc9c523d4 type=ethernet autoconnect-priority=-999 interface-name=ens33 timestamp=1747916230 [ethernet] [ipv4] method=manual address1=192.168.66.11/24 [ipv6] addr-gen-mode=eui64 method=auto [proxy] [root@loaclhost system-connections]# systemctl restart NetworkManager
3.打开xshell,点击文件,点击新建,名称输入:192.168.66.11,主机输入:192.168.66.11,端口号输入:22,点击确定,输入账号:root,输入密码:12345678,xshell连接成功虚拟机。
4.温馨提示,虚拟机有两个网卡,ens33和ens34,连接不成功时,可以在 Windows 上手动设置 IP 地址
1.打开网络连接设置:
右键点击任务栏右下角的网络图标,选择“打开网络和Internet设置”。
在状态页面中,找到并点击“更改适配器选项”。
2.找到对应的网络适配器:
找到代表你仅主机模式网络的网络适配器(通常是 VMnet1 对于 VMware 用户)。
3.配置静态IP:
右键点击该适配器,选择“属性”。
双击“Internet 协议版本 4 (TCP/IPv4)”。
4.选择“使用下面的 IP 地址”,然后输入以下信息:
IP 地址: 192.168.66.x (x 可以是除了 .11 之外的任何数字,例如 .1)
子网掩码: 255.255.255.0
默认网关: 留空(如果你只是想与虚拟机通信而不是访问外部网络)
如果需要,可以填写“首选 DNS 服务器”的地址(例如 Google 的公共 DNS 8.8.8.8),但这不是必需的。
保存设置:
点击“确定”保存所有更改。
注意:当修改为连接仅主机模式的网卡时,需要通过Net网络,要设置内网为外网网关,即192.168.66.11 -> 10.0.0.129 -> 10.0.0.200上网
(2)环境初始化
# 替换yum源 [root@loaclhost yum.repos.d]# sed -e 's|^mirrorlist=|#mirrorlist=|g' -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' -i.bak /etc/yum.repos.d/[Rr]ocky*.repo [root@loaclhost yum.repos.d]# cd /etc/yum.repos.d [root@loaclhost yum.repos.d]# ls -ltr total 60 -rw-r--r--. 1 root root 3417 Nov 1 2024 rocky.repo.bak -rw-r--r--. 1 root root 2387 Nov 1 2024 rocky-extras.repo.bak -rw-r--r--. 1 root root 1165 Nov 1 2024 rocky-devel.repo.bak -rw-r--r--. 1 root root 6610 Nov 1 2024 rocky-addons.repo.bak -rw-r--r--. 1 root root 3426 May 22 15:20 rocky.repo -rw-r--r--. 1 root root 2393 May 22 15:20 rocky-extras.repo -rw-r--r--. 1 root root 1168 May 22 15:20 rocky-devel.repo -rw-r--r--. 1 root root 6628 May 22 15:20 rocky-addons.repo
# 建立缓存 dnf调用yum实现软件包安装 [root@loaclhost ~]# dnf makecache Rocky Linux 9 - BaseOS 1.7 MB/s | 2.3 MB 00:01 Rocky Linux 9 - AppStream 3.6 MB/s | 8.4 MB 00:02 Rocky Linux 9 - Extras 22 kB/s | 16 kB 00:00 Metadata cache created.
# 防火墙修改 firewalld 为 iptables ,停止 firewalld 和防止其开机自启 [root@loaclhost ~]# systemctl stop firewalld [root@loaclhost ~]# systemctl disable firewalld Removed "/etc/systemd/system/multi-user.target.wants/firewalld.service". Removed "/etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service". # 安装 iptables 防火墙 [root@loaclhost ~]# yum -y install iptables-services Last metadata expiration check: 0:09:04 ago on Thu May 22 16:57:28 2025. Dependencies resolved. =================================================================================================================================================== Package Architecture Version Repository Size =================================================================================================================================================== Installing: iptables-nft-services noarch 1.8.10-11.el9_5 appstream 19 k Upgrading: iptables-libs x86_64 1.8.10-11.el9_5 baseos 397 k iptables-nft x86_64 1.8.10-11.el9_5 baseos 187 k Transaction Summary =================================================================================================================================================== Install 1 Package Upgrade 2 Packages Total download size: 602 k Downloading Packages: (1/3): iptables-nft-services-1.8.10-11.el9_5.noarch.rpm 40 kB/s | 19 kB 00:00 (2/3): iptables-nft-1.8.10-11.el9_5.x86_64.rpm 293 kB/s | 187 kB 00:00 (3/3): iptables-libs-1.8.10-11.el9_5.x86_64.rpm 431 kB/s | 397 kB 00:00 --------------------------------------------------------------------------------------------------------------------------------------------------- Total 650 kB/s | 602 kB 00:00 Rocky Linux 9 - AppStream 1.7 MB/s | 1.7 kB 00:00 Importing GPG key 0x350D275D: Userid : "Rocky Enterprise Software Foundation - Release key 2022 <releng@rockylinux.org>" Fingerprint: 21CB 256A E16F C54C 6E65 2949 702D 426D 350D 275D From : /etc/pki/rpm-gpg/RPM-GPG-KEY-Rocky-9 Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Upgrading : iptables-libs-1.8.10-11.el9_5.x86_64 1/5 Upgrading : iptables-nft-1.8.10-11.el9_5.x86_64 2/5 Running scriptlet: iptables-nft-1.8.10-11.el9_5.x86_64 2/5 Installing : iptables-nft-services-1.8.10-11.el9_5.noarch 3/5 Running scriptlet: iptables-nft-services-1.8.10-11.el9_5.noarch 3/5 Cleanup : iptables-nft-1.8.10-4.el9_4.x86_64 4/5 Running scriptlet: iptables-nft-1.8.10-4.el9_4.x86_64 4/5 Cleanup : iptables-libs-1.8.10-4.el9_4.x86_64 5/5 Running scriptlet: iptables-libs-1.8.10-4.el9_4.x86_64 5/5 Verifying : iptables-nft-services-1.8.10-11.el9_5.noarch 1/5 Verifying : iptables-nft-1.8.10-11.el9_5.x86_64 2/5 Verifying : iptables-nft-1.8.10-4.el9_4.x86_64 3/5 Verifying : iptables-libs-1.8.10-11.el9_5.x86_64 4/5 Verifying : iptables-libs-1.8.10-4.el9_4.x86_64 5/5 Upgraded: iptables-libs-1.8.10-11.el9_5.x86_64 iptables-nft-1.8.10-11.el9_5.x86_64 Installed: iptables-nft-services-1.8.10-11.el9_5.noarch Complete! # 启动 iptables 防火墙 [root@loaclhost ~]# systemctl start iptables # 清空 iptables 防火墙规则(查看当前规则是iptables -L) [root@loaclhost ~]# iptables -F
# 将空规则保存成持久化文件
[root@loaclhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables: [ OK ] # 打开 iptables 开机自启 [root@loaclhost ~]# systemctl enable iptables Created symlink /etc/systemd/system/multi-user.target.wants/iptables.service → /usr/lib/systemd/system/iptables.service. # 临时关闭 selinux [root@loaclhost ~]# setenforce 0 # 永久关闭 selinux [root@loaclhost ~]# sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config # 在内核中修改selinux 告警级别,添加一个 selinux=0 的标记
[root@loaclhost ~]# grubby --update-kernel ALL --args selinux=0 # 设置时区
[root@loaclhost ~]# timedatectl set-timezone Asia/Shanghai
# 关闭虚拟机,拍摄快照
[root@loaclhost ~]# shutdown -h now
# 点击RL-1虚拟机,右键快照,拍摄快照,名称Rocky Linux环境初始化,确定保存。
2.1.6 基于Docker模拟pod
(1)安装 Docker 前准备工作
# 安装 epel 源,给 bridge-utils 提供支持源 [root@localhost ~]# yum install -y epel-release Last metadata expiration check: 5:14:43 ago on Thu May 22 16:57:28 2025. Dependencies resolved. ===================================================================================================================== Package Architecture Version Repository Size ===================================================================================================================== Installing: epel-release noarch 9-7.el9 extras 19 k Transaction Summary ===================================================================================================================== Install 1 Package Total download size: 19 k Installed size: 26 k Downloading Packages: epel-release-9-7.el9.noarch.rpm 762 B/s | 19 kB 00:25 --------------------------------------------------------------------------------------------------------------------- Total 761 B/s | 19 kB 00:25 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : epel-release-9-7.el9.noarch 1/1 Running scriptlet: epel-release-9-7.el9.noarch 1/1 Many EPEL packages require the CodeReady Builder (CRB) repository. It is recommended that you run /usr/bin/crb enable to enable the CRB repository. Verifying : epel-release-9-7.el9.noarch 1/1 Installed: epel-release-9-7.el9.noarch Complete! # 使用 bridge-utils提供网桥服务 [root@localhost ~]# yum install -y bridge-utils Extra Packages for Enterprise Linux 9 - x86_64 251 kB/s | 19 MB 01:19 Extra Packages for Enterprise Linux 9 openh264 (From Cisco) - x86_64 33 B/s | 2.5 kB 01:16 Dependencies resolved. ===================================================================================================================== Package Architecture Version Repository Size ===================================================================================================================== Installing: bridge-utils x86_64 1.7.1-3.el9 epel 34 k Transaction Summary ===================================================================================================================== Install 1 Package Total download size: 34 k Installed size: 64 k Downloading Packages: bridge-utils-1.7.1-3.el9.x86_64.rpm 1.4 kB/s | 34 kB 00:25 --------------------------------------------------------------------------------------------------------------------- Total 687 B/s | 34 kB 00:50 Extra Packages for Enterprise Linux 9 - x86_64 1.6 MB/s | 1.6 kB 00:00 Importing GPG key 0x3228467C: Userid : "Fedora (epel9) <epel@fedoraproject.org>" Fingerprint: FF8A D134 4597 106E CE81 3B91 8A38 72BF 3228 467C From : /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-9 Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : bridge-utils-1.7.1-3.el9.x86_64 1/1 Running scriptlet: bridge-utils-1.7.1-3.el9.x86_64 1/1 Verifying : bridge-utils-1.7.1-3.el9.x86_64 1/1 Installed: bridge-utils-1.7.1-3.el9.x86_64 Complete! # br_netfilter 模块意为将所有经过网桥的流量,必须被防火墙处理。 [root@localhost ~]# modprobe br_netfilter # 将 br_netfilter 模块添加到开机自启文件中 [root@localhost ~]# echo 'br_netfilter' >> /etc/modules-load.d/bridge.conf # 内核,ipv4下所有网桥流量都必须被防火墙回调 [root@localhost ~]# echo 'net.bridge.bridge-nf-call-iptables=1' >> /etc/sysctl.conf # 内核,ipv6下所有网桥流量都必须被防火墙回调 [root@localhost ~]# echo 'net.bridge.bridge-nf-call-ip6tables=1' >> /etc/sysctl.conf # 内核,开启路由转发 [root@localhost ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf # 刷新生效 [root@localhost ~]# sysctl -p net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1
(2)安装 Docker
# 安装docker底层需要的服务 # yum-utils 软件包管理器功能的工具集合 # device-mapper-persistent-data支持逻辑卷管理(LVM) # lvm2 逻辑卷管理工具集 [root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 Last metadata expiration check: 0:17:22 ago on Thu May 22 22:20:50 2025. Package device-mapper-persistent-data-1.0.9-3.el9_4.x86_64 is already installed. Package lvm2-9:2.03.24-2.el9.x86_64 is already installed. Dependencies resolved. ===================================================================================================================== Package Architecture Version Repository Size ===================================================================================================================== Installing: yum-utils noarch 4.3.0-16.el9 baseos 35 k Transaction Summary ===================================================================================================================== Install 1 Package Total download size: 35 k Installed size: 23 k Downloading Packages: yum-utils-4.3.0-16.el9.noarch.rpm 1.4 kB/s | 35 kB 00:25 --------------------------------------------------------------------------------------------------------------------- Total 1.4 kB/s | 35 kB 00:25 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : yum-utils-4.3.0-16.el9.noarch 1/1 Running scriptlet: yum-utils-4.3.0-16.el9.noarch 1/1 Verifying : yum-utils-4.3.0-16.el9.noarch 1/1 Installed: yum-utils-4.3.0-16.el9.noarch Complete! # 添加阿里云的 docke-ce yum源 [root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo Adding repo from: https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 切换成国内阿里云下载网址 [root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo # 安装 docker-ce [root@localhost ~]# yum -y install docker-ce Docker CE Stable - x86_64 1.4 kB/s | 70 kB 00:50 Dependencies resolved. ===================================================================================================================== Package Architecture Version Repository Size ===================================================================================================================== Installing: docker-ce x86_64 3:28.1.1-1.el9 docker-ce-stable 20 M Installing dependencies: container-selinux noarch 3:2.232.1-1.el9 appstream 55 k containerd.io x86_64 1.7.27-3.1.el9 docker-ce-stable 44 M docker-ce-cli x86_64 1:28.1.1-1.el9 docker-ce-stable 8.3 M fuse-common x86_64 3.10.2-9.el9 baseos 7.3 k fuse-overlayfs x86_64 1.14-1.el9 appstream 66 k fuse3 x86_64 3.10.2-9.el9 appstream 53 k fuse3-libs x86_64 3.10.2-9.el9 appstream 91 k libslirp x86_64 4.4.0-8.el9 appstream 67 k slirp4netns x86_64 1.3.1-1.el9 appstream 46 k tar x86_64 2:1.34-7.el9 baseos 875 k Installing weak dependencies: docker-buildx-plugin x86_64 0.23.0-1.el9 docker-ce-stable 16 M docker-ce-rootless-extras x86_64 28.1.1-1.el9 docker-ce-stable 3.2 M docker-compose-plugin x86_64 2.35.1-1.el9 docker-ce-stable 15 M Transaction Summary ===================================================================================================================== Install 14 Packages Total download size: 108 M Installed size: 429 M Downloading Packages: (1/14): docker-buildx-plugin-0.23.0-1.el9.x86_64.rpm 518 kB/s | 16 MB 00:31 (2/14): docker-ce-28.1.1-1.el9.x86_64.rpm 614 kB/s | 20 MB 00:33 (3/14): docker-ce-rootless-extras-28.1.1-1.el9.x86_64.rpm 755 kB/s | 3.2 MB 00:04 (4/14): containerd.io-1.7.27-3.1.el9.x86_64.rpm 1.1 MB/s | 44 MB 00:38 (5/14): tar-1.34-7.el9.x86_64.rpm 744 kB/s | 875 kB 00:01 (6/14): fuse-common-3.10.2-9.el9.x86_64.rpm 18 kB/s | 7.3 kB 00:00 (7/14): container-selinux-2.232.1-1.el9.noarch.rpm 239 kB/s | 55 kB 00:00 (8/14): fuse-overlayfs-1.14-1.el9.x86_64.rpm 356 kB/s | 66 kB 00:00 (9/14): docker-compose-plugin-2.35.1-1.el9.x86_64.rpm 4.4 MB/s | 15 MB 00:03 (10/14): slirp4netns-1.3.1-1.el9.x86_64.rpm 139 kB/s | 46 kB 00:00 (11/14): docker-ce-cli-28.1.1-1.el9.x86_64.rpm 883 kB/s | 8.3 MB 00:09 (12/14): libslirp-4.4.0-8.el9.x86_64.rpm 185 kB/s | 67 kB 00:00 (13/14): fuse3-libs-3.10.2-9.el9.x86_64.rpm 315 kB/s | 91 kB 00:00 (14/14): fuse3-3.10.2-9.el9.x86_64.rpm 490 kB/s | 53 kB 00:00 --------------------------------------------------------------------------------------------------------------------- Total 2.6 MB/s | 108 MB 00:41 Docker CE Stable - x86_64 65 B/s | 1.6 kB 00:25 Importing GPG key 0x621E9F35: Userid : "Docker Release (CE rpm) <docker@docker.com>" Fingerprint: 060A 61C5 1B55 8A7F 742B 77AA C52F EB6B 621E 9F35 From : https://mirrors.aliyun.com/docker-ce/linux/centos/gpg Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : fuse3-libs-3.10.2-9.el9.x86_64 1/14 Running scriptlet: container-selinux-3:2.232.1-1.el9.noarch 2/14 Installing : container-selinux-3:2.232.1-1.el9.noarch 2/14 Running scriptlet: container-selinux-3:2.232.1-1.el9.noarch 2/14 Installing : docker-buildx-plugin-0.23.0-1.el9.x86_64 3/14 Running scriptlet: docker-buildx-plugin-0.23.0-1.el9.x86_64 3/14 Installing : docker-compose-plugin-2.35.1-1.el9.x86_64 4/14 Running scriptlet: docker-compose-plugin-2.35.1-1.el9.x86_64 4/14 Installing : docker-ce-cli-1:28.1.1-1.el9.x86_64 5/14 Running scriptlet: docker-ce-cli-1:28.1.1-1.el9.x86_64 5/14 Installing : containerd.io-1.7.27-3.1.el9.x86_64 6/14 Running scriptlet: containerd.io-1.7.27-3.1.el9.x86_64 6/14 Installing : libslirp-4.4.0-8.el9.x86_64 7/14 Installing : slirp4netns-1.3.1-1.el9.x86_64 8/14 Installing : fuse-common-3.10.2-9.el9.x86_64 9/14 Installing : fuse3-3.10.2-9.el9.x86_64 10/14 Installing : fuse-overlayfs-1.14-1.el9.x86_64 11/14 Running scriptlet: fuse-overlayfs-1.14-1.el9.x86_64 11/14 Installing : tar-2:1.34-7.el9.x86_64 12/14 Installing : docker-ce-rootless-extras-28.1.1-1.el9.x86_64 13/14 Running scriptlet: docker-ce-rootless-extras-28.1.1-1.el9.x86_64 13/14 Installing : docker-ce-3:28.1.1-1.el9.x86_64 14/14 Running scriptlet: docker-ce-3:28.1.1-1.el9.x86_64 14/14 Running scriptlet: container-selinux-3:2.232.1-1.el9.noarch 14/14 Running scriptlet: docker-ce-3:28.1.1-1.el9.x86_64 14/14 Verifying : containerd.io-1.7.27-3.1.el9.x86_64 1/14 Verifying : docker-buildx-plugin-0.23.0-1.el9.x86_64 2/14 Verifying : docker-ce-3:28.1.1-1.el9.x86_64 3/14 Verifying : docker-ce-cli-1:28.1.1-1.el9.x86_64 4/14 Verifying : docker-ce-rootless-extras-28.1.1-1.el9.x86_64 5/14 Verifying : docker-compose-plugin-2.35.1-1.el9.x86_64 6/14 Verifying : tar-2:1.34-7.el9.x86_64 7/14 Verifying : fuse-common-3.10.2-9.el9.x86_64 8/14 Verifying : container-selinux-3:2.232.1-1.el9.noarch 9/14 Verifying : fuse-overlayfs-1.14-1.el9.x86_64 10/14 Verifying : slirp4netns-1.3.1-1.el9.x86_64 11/14 Verifying : libslirp-4.4.0-8.el9.x86_64 12/14 Verifying : fuse3-libs-3.10.2-9.el9.x86_64 13/14 Verifying : fuse3-3.10.2-9.el9.x86_64 14/14 Installed: container-selinux-3:2.232.1-1.el9.noarch containerd.io-1.7.27-3.1.el9.x86_64 docker-buildx-plugin-0.23.0-1.el9.x86_64 docker-ce-3:28.1.1-1.el9.x86_64 docker-ce-cli-1:28.1.1-1.el9.x86_64 docker-ce-rootless-extras-28.1.1-1.el9.x86_64 docker-compose-plugin-2.35.1-1.el9.x86_64 fuse-common-3.10.2-9.el9.x86_64 fuse-overlayfs-1.14-1.el9.x86_64 fuse3-3.10.2-9.el9.x86_64 fuse3-libs-3.10.2-9.el9.x86_64 libslirp-4.4.0-8.el9.x86_64 slirp4netns-1.3.1-1.el9.x86_64 tar-2:1.34-7.el9.x86_64 Complete! # 配置 daemon 文件
# default-ipc-mode 指定IPC模式允许共享,自 docker 19.03 以后默认关闭
# data-root 指定当前docker的根目录位置
# 指定 cgroupdriver 驱动为 systemd
# 指定当前log-driver的日志驱动为json-file,max-size单个文件的大小,max-file最大的文件数量
# insecure-registries 当前信任的仓库地址
# registry-mirrors 当前的镜像官方仓库地址
[root@localhost ~]# cd /etc/docker/ [root@localhost docker]# cat daemon.json { "default-ipc-mode":"shareable", "data-root": "/data/docker", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m", "max-file": "100" }, "insecure-registries": ["harbor.xinxainghf.com"], "registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"] }
# 创建docker的system管理目录 [root@localhost ~]# mkdir -p /etc/systemd/system/docker.service.d
# docker配置重载以及重启和开启开机自启 [root@localhost ~]# systemctl daemon-reload && systemctl restart docker && systemctl enable docker Created symlink /etc/systemd/system/multi-user.target.wants/docker.service → /usr/lib/systemd/system/docker.service.
(3)基于 Docker 模拟 pod
# 注:pause 上传需要安装上传命令,yum -y install lrzsz # 本地目录下编辑 nginx.conf 配置文件 [root@loaclhost ~]# cat nginx.conf # 错误日志的标准输出 error_log stderr; # 线程数量 events { worker_connections 1024;} http{ # 当前访问日志的路径 access_log /dev/stdout combined; server{ # 监听80端口,默认服务器 listen 80 default_server; # 当前域名为 example.com server_name example.com www.example.com; # 定义根区域 location / { # 反向代理到本地回环接口的2368端口 proxy_pass http://127.0.0.1:2368; } } } # 导入压缩包成镜像,以下三个是此次实验所需镜像。注:ghost 镜像大版本为5.xx后,新增了数据库必要配置,不配置数据库会启动失败。 [root@loaclhost ~]# docker load -i pause.tar Loaded image: k8s.gcr.io/pause:3.1 [root@loaclhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx latest be69f2940aaf 5 weeks ago 192MB ghost 4.48.2 1ae6b8d721a2 2 years ago 480MB pause 3.1 da86e6ba6ca1 7 years ago 742kB # 1.基于pause3.1镜像后台启动一个名为pause的容器,容器的80端口映射到宿主机的8080端口 [root@loaclhost ~]# docker run --name pause -p 8080:80 -d pause:3.1 9b3b38df356b4ce184b3f74646d3ab8f348964c58ea191d632790e7a2812a3b6 # 2.基于nginx镜像后台启动一个名为nginx的容器,本地目录nginx.conf配置文件挂载到nginx容器/etc/nginx/nginx.conf,nginx,容器与pause容器共享网络、ipc、pid [root@loaclhost ~]# docker run --name nginx -v `pwd`/nginx.conf:/etc/nginx/nginx.conf --net=container:pause --ipc=container:pause --pid=container:pause -d nginx 150559a2b69034eeda76f98a0e1386c9d20f317a7be7a14923fa7d97bd3a87fa # 3.基于ghost镜像后台启动一个名为ghost的容器,ghost容器与pause容器共享网络、ipc、pid [root@loaclhost ~]# docker run -d --name ghost --net=container:pause --ipc=container:pause --pid=container:pause ghost:4.48.2 d3a871fb52af97d1b3b1c3c64dd6f07cabba7322288173eb65e642049bee6c45 [root@loaclhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3a871fb52af ghost:4.48.2 "docker-entrypoint.s…" 22 seconds ago Up 22 seconds ghost 150559a2b690 nginx "/docker-entrypoint.…" 59 seconds ago Up 59 seconds nginx 9b3b38df356b pause:3.1 "/pause" About a minute ago Up About a minute 0.0.0.0:8080->80/tcp, [::]:8080->80/tcp pause
本地浏览器访问:192.168.66.11:8080,docker 容器部署,抽象封装成Pod。

思考:为什么要启动 pause 容器,启动 nginx 容器,共享网络、ipc、pid 给 ghost 不可以么?
1.nginx 容器启动后,本身对外提供访问,对内还要共享,一旦死亡,共享 ghost 也将死亡,但 pause 容器启动后就休眠,更具有稳定性,即使 nginx 容器死亡,ghost 不会受到影响。
2.nginx 容器不能回收僵尸进程,而 pause 镜像代码是独立开发的,可以回收僵尸进程。
2.2 Kubernets 网络
2.2.1 基本概述
Kubernetes 的网络模型假定了所有 Pod 都在一个可以直接连通的扁平的网络空间中,这在 GCE (Google Compute Engine)里面是现成的网络模型,Kubernetes 假定这个网络已经存在。而在私有云搭建 Kubernetes 集群,就不能假定这个网路已经存在了。我们需要自己实现这个网络假设,将不同节点上的 Docker 容器之间的互相访问先打通,然后运行 Kubernetes。
扁平的网络空间:两台机器上分别有一个 Pod,两个 Pod 可以通过对方的地址直接去发送数据。
2.2.2 网络模型原则
(1)在不使用网络地址转换(NAT)的情况下,集群中的 Pod 能够与任意其他 Pod 进行通信(包含跨节点)
(2)在不使用网络地址转换(NAT)的情况下,在集群节点上运行的程序能与同一节点上的任何 Pod 进行通信
(3)每个 Pod 都有自己的 IP 地址(IP-per-Pod),并且任意其他 Pod 都可以通过相同的这个地址访问它
2.2.3 CNI
借助 CNI 标准,Kubernetes 可以实现容器网络问题的解决。通过插件化的方式来集成各种网络插件,实现集群内部网络相互通信,只要实现 CNI 标准中定义的核心接口操作(ADD,将容器添加到网络;DEL,从网络中删除一个容器;CHECK,检查容器的网络是否符合预期等)。CNI 插件通常聚焦在容器到容器的网络通信。

1.Podman、CRI-O、ContainerD等 容器运行时 CRI,借助 CNI 的 lib 库去描绘一个 json 文件。
2.json 文件里记录应该如何配置网络插件,再调用对应插件库中的某些插件,用以实现 Pod 或容器之间的网络通信。
CNI 的接口并不是指 HTTP,gRPC 这种接口,CNI 接口是指对可执行程序的调用(exec)可执行程序,Kubernetes 节点默认的 CNI 插件路径为 /opt/cni/bin 。(不要与web接口混为一谈)
CNI 通过 JSON 格式的配置文件来描述网络配置,当需要设置容器网络时,由容器运行时CRI负责执行 CNI 插件,并通过 CNI 插件的标准输入(stdin)来传递配置文件信息,通过标准输出(stdout)接收插件的执行结果。从网络插件功能可以分为五类:(CNI主要目的:容器使用不再去解决网络本身的通讯问题或容器与容器间的通讯问题。)

Main插件,创建具体网络设备(bridge:网桥设备,连接container和host的网络;ipvlan:为容器增加ipvlan网卡;loopback:IO设备,解决回环接口问题;macvlan:为容器创建一个MAC地址;ptp:创建一对虚拟拟态网队Veth Pair;vlan:分配一个vlan设备;host-device:将已存在的设备移入容器内)
IPAM插件:负责分配IP地址(dhcp:容器向 DHCP 服务器发起请求,给 Pod发放或回收IP地址;host-local:使用预先配置的IP地址段来进行分配;static:为容器分配一个静态IPv4/IPv6地址,主要用于debug)
META插件:官方其他功能的插件(tuning:通过sysctl调整网络设备参数;portmap:通过iptables配置端口映射;bandwidth:使用Token Bucket Filter 来限流;sbr:为网卡设置 source based routing;firewall:通过 iptables 给容器网络的进出流量进行限制)
Windows插件:专门用于 Windows 平台的 CNI 插件(win-bridge(windows网桥创建) 与 win-overlay(windows环境扁平化网络) 网络插件)
第三方网络插件:第三方开源的网络插件众多,每个组件都有各自的优点及适应的场景,难以形成统一的标准组件,常用有 Flannel、Calico、Cilium、OVN 网络插件

2.2.4 各CNI插件功能说明
(1)各种插件

网络模型:封装或未封装(外部包不包装)
路由分发:一种外部网关协议,用于在互联网上交换路由和可达性信息。BGP可以帮助进行跨集群 pod 之间的网络。此功能对于未封装的 CNI 网络插件是必须的,并且通常由 BGP 完成。如果你想构建跨网段拆分的集群,路由分发是一个很好的功能。(跨节点将Pod的IP地址制作成路由表,从而实现跨节点访问。)
网络策略:Kubernetes 提供了强制执行规则的功能,这些规则决定了那些 service 可以使用网络策略进行相互通信。这是从 Kubernetes 1.7 起稳定的功能,可以与某些网络插件一起使用。(a Pod访问 b Pod,b Pod 不可以访问a Pod,就是是否支持网络策略。该放行的放行,不该放行的拒绝掉。)
网格:允许在不同的 Kubernetes 集群间进行service之间的网络通信。(k8s增加多集群,跨集群访问,需要service互相之间可以访问。)
外部数据存储:具有此功能的 CNI 网络插件需要一个外部数据存储来存储数据。(支持ETCD灵活性更高。)
加密:允许加密和安全的网络控制和数据平面。(跨节点传输,数据加密。)
Ingress/Egress 策略:允许你管理 Kubernetes 和非 Kubernetes 通信的路由控制。
(2)网络模型
underlay network(非封装网络):
现实的物理基础层网络设备
underlay 就是数据中心场景的基础物理设施,保证任何两个点路由可达,其中包含了传统的网络技术
overlay network(封装网络):
一个基于物理网络之上构建的逻辑网络(基于物理网络,在之上增加了虚拟的抽象层)
Overlay 是在网络技术领域指的是一种网络架构上叠加的虚拟化技术模式(可变可修改性非常强)
Overlay 网络技术多种多样,一般采用 TRILL、VxLan、GRE、NVGRE等隧道技术
underlay network(非封装网络):

1.左右两个工作节点k8s worker,左边worker1有两个容器10.42.0.2和10.42.0.3 通过网桥 docker0关联。
2.bgp routing 路由信息,通过ETCD将两边的路由表进行公开。
3.10.42.0.2想要访问10.42.1.2,先把数据报文发送给docker0,docker0再去查询路由表bgp routing,通过路由方案,经过物理网络192.168.34.10 -> 192.168.34.11,到达worker2的路由表bgp routing,达到目标容器或POD。
4.整个过程没有进行封装,类似有a到b,外层套一个快递盒,盒子上写a到b,这就是封装。直接在物品上写a到b,这是非封装。
overlay network(封装网络):

1.左右两个工作节点k8s worker,左边worker1有两个容器10.42.0.2和10.42.0.3 通过网桥 docker0关联。
2.10.42.0.2想要访问10.42.1.2,先把数据报文发送给docker0,flanneld 会在数据外部加一层数据报文,经过物理网络192.168.34.10 -> 192.168.34.11,到达worker2的 flanneld 拆包,达到目标容器或POD。
2.2.5 Calico
Calico 是一个纯三层的虚拟网络,它没有复用 docker 的 docker0 网桥,而是自己实现的,calico 网络不对数据包进行额外封装,不需要NAT和端口映射。 (支持覆盖网络和非覆盖网络,有封装和非封装,有三种工作类型。)
(1)calico-架构

Felix
管理网络接口
编写路由
编写ACL(访问控制列表)
报告状态
bird(BGP Client)
BGP Client 将通过 BGP 协议广播告诉剩余 calico 节点,从而实现网络互通(BGP协议的收发同步)
confd
通过监听 etcd 以了解 BGP 配置和全局默认值的更改。Confg 根据ETCD 中数据的更新,动态生成 BIRD 配置文件。当配置文件更改时,confd 触发 BIRD 重新加载新文件。
虚线:(1)calico 中的 confd 可以通过 api server 连接 etcd(大多数都是这样)
(2)calico 也可以直接连接 etcd (较新颖的功能)
(2)VXLAN
什么是VXLAN?
VXLAN,即Virtual Extensible LAN(虚拟可扩展局域网),是Linux本身支持的—网种网络虚拟化技术。VXLAN可以完全在内核态实现封装和解封装工作(上一代 flannel 中加了 flanneld 进程,数据报文的封装和解封在用户空间完成,用户空间和内核空间发生数据交互,需要拷贝,占用资源。 ),从而通过“隧道”机制,构建触覆盖网络(Overlay Network)
基于三层的“二层”通信,即 vxlan 包封装在 udp 数据包中,要求 upd 在 k8s 节点间三层可达;二层即 vxlan 封包的源 mac 地址和目的 mac 地址是自己的 vxlan 设备 mac 和对端 vxlan 设备 mac 实现通讯。

1.node01、node02节点,node01 上的 pod1 想要访问 node02 上的 pod2。
2.两边都有 calico-vxlan 组件,当数据下潜至内核,vxlan 工作,在外层封装数据报文,实现 vxlan 改造。
3.通过 etcd 实现信息同步,通过编辑路由信息,将数据发送到对应节点的物理网卡,再由数据 Main 网络中定义的,物理和 Pod 中网卡一端绑定,从而进入到Pod中。
4.再由对应节点的 vxlan 拆解。

VXLAN
数据包封包:封包,在 vxlan 设备上将 pod 发来的数据包源、目的 mac 替换为本机 vxlan 网卡和对端节点 vxlan 网卡的 mac。外层 upd 目的 ip 地址根据路由和对端 vxlan 的 mac 查 fdb (mac地址和IP对应规则表)表获取。
优势:只要 k8s 节点间三层互通,可以跨网段,对主机网关路由没有特殊要求。各个 node 节点通过 vxlan 设备实现基于三层的“二层”互通,三层即 vxlan 包封装在 udp 数据包中,要求 udp 在 k8s 节点间三层可达;二层即 vxlan 封包的源 mac 地址和目的 mac 地址是自己的 vxlan 设备 mac 和对端 vxlan 设备 mac
缺点:需要进行 vxlan 的数据包封包和解包会存在一定的性能损耗
配置方法
# Enable IPIP - name: CALICO_IPV4POOL_IPIP value: "Never" # Enable or Disable VXLAN on the default IP pool. - name: CALICO_IPV4POOL_VXLAN value: "Always" # Enable or Disable VXLAN on the default IPv6 pool. - name: CALICO_IPV6POOL_VXLAN value: "Always"
# 注释原默认是bridge网桥,修改为 vxlan # calico_backend: "bird" calico_backend: "vxlan"
# 注释原基于网桥做存活探测和就绪探测 # bird-live # bird-ready
查看验证
# 查看vxlan ifconfig vxlan.calico # vxlan 不需要 BGP 来建立节点间的邻接关系(所以出现空) calicoctl node status
(3)IPIP
Linux 原生内核支持
IPIP 隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包中,新的IP数据包的目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原始IP数据包,并将其传递到目标主机。IPIP 隧道可以在不同的网络之间建立连接,例如在IPv4网络和IPv6网络之间建立连接。(把当前的 IP 数据包封装在一个新的 IP 数据包中)

1.node01、node02节点,node01 上的 pod1 想要访问 node02 上的 pod2。
2.pod1先发送给自己节点的 tunl0,tunl0 通过IP封装包的方式,将报文通过物理网卡传递到 node02上的 tunl0。
3.tunl0 接收到后,解封三层头部放到 pod2 中,从而实现数据的传递。

1.新增自己的物理网卡地址和对方的物理主机网卡的地址。
数据包封包:封包,在 tun10 设备上将 Pod 发来的数据包的 mac 层去掉,留下 ip 层封包。外层数据包目的 ip 地址根据路由得到。
优点:只要 k8s 节点间三层互通,可以跨网段,对主机网关路由没有特殊要求。
缺点:需要进行 IPIP 的数据包封包和解包会存在一定的性能损耗。
配置方法
# Enable IPIP - name: CALICO_IPV4POOL_IPIP value: "Always" # Enable or Disable VXLAN on the default IP pool. - name: CALICO_IPV4POOL_VXLAN value: "Never" # Enable or Disable VXLAN on the default IPv6 pool. - name: CALICO_IPV6POOL_VXLAN value: "Never"
查看验证
# 查看(可以看到 tunl0 的网卡) ifconfig tunl0 # 查看 BGP 获取相邻的信息( IPIP 模式需要 BGP 来建立节点间的临接关系,需要写对应的物理IP地址,VXLAN不需要) calicoctl node status
(4)BGP
边界网关协议(Border Gateway Protocol,BGP )是互联网上一个核心的去中心化自治路由协议。它通过维护 IP 路由表或“前缀”表来实现自治系统(AS)之间的可达性,属于矢量路由协议(有距离的概念)。BGP 不使用传统的内部网关协议(IGP)的指标,而使用基于路径、网络策略或规则集来决定路由。因此,它更适合被称为矢量性协议,而不是路由协议。BGP,通俗的讲就是将接入到机房的多条线路(如电信、联通、移动等)融合为一体,实现多线单 IP,BGP 机房的优点:服务器只需要设置一个 IP 地址,最佳访问路由是由网络上的骨干路由器根据路由跳数与其他技术指标来确定的,不会占用服务器的任何系统。

1.node01、node02节点,node01 上的 pod1 想要访问 node02 上的 pod2。
2.虚拟 veth 直接发给物理网卡 ens33,可以把 ens33 想象成两个路由器。
3.通过路由记录的方式,发送数据。
数据包封包:不需要进行数据包封包
优点:不用封包解包,通过 BGP 协议可实现 pod 网络在主机间的三层可达
缺点:跨网段时,配置较为复杂网络要求较高,主机网关路由也需要充当 BGP Speaker(BGP发现端)。
配置方法
# Enable IPIP - name: CALICO_IPV4POOL_IPIP value: "Off" # Enable or Disable VXLAN on the default IP pool. - name: CALICO_IPV4POOL_VXLAN value: "Never" # Enable or Disable VXLAN on the default IPv6 pool. - name: CALICO_IPV6POOL_VXLAN value: "Never"
查看验证
# 验证命令(或者查看有没有vxlan和tunl0 网卡) calicoctl get ippool -o wide --allow-version-mismatch calicoctl get node -o wide --allow-version-mismatch # 查看 BGP 获取相邻的信息
calicoctl node status
(5)总结
VXLAN模式:vxlan 借助技术实现二层封包的三层可达,这种特性可以在有很好的三层可达的网络中建立关联,因为封包,性能相对较弱。
IPIP模式:通过Linux内核,IPIP隧道工作方式,实现的封包,可以跨IPV4、IPV6网络,因为封包,性能相对较弱。
BGP模式:无需封包,性能更理想,但当跨多个广播域时,需要进行复杂的网络配置。
———————————————————————————————————————————————————————————————————————————
无敌小马爱学习
浙公网安备 33010602011771号