开源之家
  • 首页
  • 精品培训视频
  • 计算机电子书
  • 软件工具
  • 知识库
    • Linux入门教程
    • Shell脚本学习指南
    • Nginx入门教程
    • Docker 入门实战
    • Kubernetes(k8s)手册
    • 快乐的Linux命令行
  • Linux命令手册
登录

Linux入门教程

01 Linux简介
  • 1.0 Linux学习路线
  • 1.1 操作系统概述
  • 1.2 Linux是什么,有哪些特点?
  • 1.3 Linux和UNIX的关系及区别(详解版)
  • 1.4 类UNIX系统是什么鬼?
  • 1.5 Linux中大量使用脚本语言,而不是C语言!
  • 1.6 为什么要学Linux,它比Windows好在哪里?
  • 1.7 Linux系统的优缺点
  • 1.8 常见Linux发行版本有哪些?
  • 1.9 初学者应选择哪个Linux发行版?
  • 1.10 Linux桌面系统大比拼|附带优缺点
  • 1.11 Linux的主要应用领域有哪些?
  • 1.12 Linux已经霸占了服务器领域!
  • 1.13 开源软件是什么?有哪些?
  • 1.14 开源协议是什么?有哪些?如何选择?
  • 1.15 开源就等于免费吗?用事实来说话
  • 1.16 Linux该如何学习(新手入门必看)
  • 1.17 想学好Linux,这些习惯必须养成(初学者必读)
02 Linux安装
  • 2.1 安装Linux系统对硬件有什么要求?
  • 2.2 虚拟机是什么
  • 2.3 为什么建议使用虚拟机来安装Linux?
  • 2.4 小白必看:零基础安装Linux系统(超级详细)
  • 2.5 使用U盘安装Linux系统
  • 2.6 使用dd命令安装Linux系统
  • 2.7 使用LiveCD从光盘直接运行Linux,无需安装
  • 2.8 忘记root账户密码怎么办?
  • 2.9 使用系统光盘修复Linux系统
  • 2.10 破解密码这么简单,Linux是安全的操作系统吗?
  • 2.11 Linux四种远程管理协议
  • 2.12 Linux两种远程管理工具(PuTTY和SecureCRT)
  • 2.13 新手必读的Linux使用注意事项
  • 2.14 Linux文件目录结构一览表
  • 2.15 Linux中一切皆文件[包含优缺点]
  • 2.16 Linux挂载详解
  • 2.17 新手必看的Linux服务器管理和维护注意事项
03 Linux文件和目录管理
  • 3.1 Linux文件系统的层次结构
  • 3.2 Linux文件系统到底有什么用处?
  • 3.3 Linux绝对路径和相对路径详解
  • 3.4 Linux文件(目录)命名规则
  • 3.5 Linux命令行下如何识别文件类型?
  • 3.6 Linux命令基本格式
  • 3.7 Linux切换目录(cd命令)
  • 3.8 Linux显示当前工作路径(pwd命令)
  • 3.9 Linux查看目录中的文件(ls命令)
  • 3.10 Linux创建目录(mkdir命令)
  • 3.11 Linux删除空目录(rmdir命令)
  • 3.12 Linux创建文件及修改文件时间戳(touch命令)
  • 3.13 Linux建立软硬链接文件(ln命令)
  • 3.14 深度剖析Linux硬链接和软链接,直击它们的本质!
  • 3.15 Linux复制文件和目录(cp命令)
  • 3.16 Linux删除文件或目录(rm命令)
  • 3.17 Linux移动或重命名文件和目录(mv命令)
  • 3.18 Linux懒人神器:命令自动补全功能!
  • 3.19 Linux命令的执行过程是怎样的?(新手必读)
  • 3.20 什么是环境变量,Linux环境变量有哪些?
  • 3.21 Linux PATH环境变量及作用(初学者必读)
04 Linux打包和压缩详解
  • 4.1 打包和压缩的概念和区别
  • 4.2 Linux tar打包命令详解
  • 4.3 Linux压缩文件或目录为.zip格式(zip命令)
  • 4.4 Linux解压.zip格式的文件(unzip命令)
  • 4.5 Linux压缩文件或目录中文件为.gz格式(gzip命令)
  • 4.6 Linux解压.gz格式的文件(gunzip命令)
  • 4.7 Linux压缩文件或目录中文件为.bz2格式(bzip2命令)
  • 4.8 Linux解压.bz2格式的文件(bunzip2命令)
05 Vim文本编辑器
  • 5.1 Vim及其安装
  • 5.2 Vi和Vim之间到底有什么关系?
  • 5.3 Linux Vim三种工作模式
  • 5.4 Linux Vim基本操作
  • 5.5 Vim移动光标命令汇总
  • 5.6 Linux Vim撤销和恢复撤销快捷键
  • 5.7 Linux Vim可视化模式
  • 5.8 Vim多窗口编辑模式
  • 5.9 Linux Vim批量注释和自定义注释
  • 5.10 Vim显示行号
  • 5.11 Vim配置文件(.vimrc)详解
06 Linux文本处理
  • 6.1 Linux连接合并文件内容(cat命令)
  • 6.2 Linux分屏显示文件内容(more命令)
  • 6.3 Linux显示文件开头内容(head命令)
  • 6.4 Linux查看文件内容(less命令)
  • 6.5 Linux显示文件结尾内容(tail命令)
  • 6.6 Linux重定向(输入输出重定向)
  • 6.7 Linux grep(Linux三剑客之一)
  • 6.8 Linux sed(Linux三剑客之一)
  • 6.9 Linux sed命令的高级玩法
  • 6.10 Linux awk(Linux三剑客之一)
  • 6.11 Linux awk命令的高级玩法
07 Linux系统软件安装
  • 7.1 Linux软件包
  • 7.2 Linux RPM包统一命名规则
  • 7.3 Linux RPM包安装、卸载和升级
  • 7.4 Linux rpm命令查询软件包
  • 7.5 Linux RPM包验证和数字证书
  • 7.6 Linux提取RPM包
  • 7.7 Linux SRPM源码包安装
  • 7.8 Linux重建RPM数据库(修复损坏的RPM数据库)
  • 7.9 RPM包的依赖性及其解决方案
  • 7.10 Linux yum源及配置
  • 7.11 Linux yum命令
  • 7.12 Linux yum管理软件组
  • 7.13 Linux源码包安装和卸载
  • 7.14 Linux源码包升级
  • 7.15 RPM包和源码包,究竟应该选择哪种安装方式?
  • 7.16 Linux函数库(静态函数库和动态函数库)及其安装过程
  • 7.17 Linux脚本程序包及安装方法详解(以webmin为例)
08 Linux用户和用户组管理
  • 8.1 Linux用户和用户组
  • 8.2 Linux UID和GID
  • 8.3 Linux /etc/passwd
  • 8.4 Linux /etc/shadow
  • 8.5 Linux /etc/group
  • 8.6 Linux /etc/gshadow
  • 8.7 Linux初始组和附加组
  • 8.8 Linux /etc/login.defs
  • 8.9 Linux系统添加新用户(useradd命令)
  • 8.10 Linux修改系统用户密码(passwd命令)
  • 8.11 Linux修改系统用户信息(usermod命令)
  • 8.12 Linux强制系统用户登陆时修改密码(chage命令)
  • 8.13 Linux删除系统用户(userdel命令)
  • 8.14 Linux查看用户的UID和GID(id命令)
  • 8.15 Linux临时切换用户身份(su命令)
  • 8.16 Linux whoami和who am i命令
  • 8.17 Linux添加用户组(groupadd命令)
  • 8.18 Linux修改用户组(groupmod命令)
  • 8.19 Linux删除用户组(groupdel命令)
  • 8.20 Linux将系统用户加入或移除群组(gpasswd命令)
  • 8.21 Linux切换用户的有效群组(newgrp命令)
09 Linux权限管理
  • 9.1 Linux权限管理的重要性
  • 9.2 Linux修改文件和目录的所属组(chgrp命令)
  • 9.3 Linux修改文件和目录的所有者和所属组(chown命令)
  • 9.4 Linux文件权限到底是如何设定的?
  • 9.5 Linux读写执行权限(-r、-w、-x)的真正含义是什么?
  • 9.6 Linux修改文件或目录权限(chmod命令)
  • 9.7 Linux默认权限的设定和修改(umask)
  • 9.8 Linux ACL访问控制权限
  • 9.9 Linux ACL权限设置(setfacl和getfacl)
  • 9.10 Linux mask有效权限有什么用,如何修改?
  • 9.11 Linux SetUID(SUID)特殊权限
  • 9.12 不要轻易设置SetUID(SUID)权限,否则会带来重大安全隐患!
  • 9.13 Linux SetGID(SGID)特殊权限
  • 9.14 Linux Stick BIT(SBIT)特殊权限
  • 9.15 Linux文件特殊权限(SUID、SGID和SBIT)的设置
  • 9.16 Linux修改文件或目录的隐藏属性(chattr命令)
  • 9.17 Linux查看文件或目录的隐藏属性(lsattr命令)
  • 9.18 Linux sudo命令(包含和su命令的对比)
  • 9.19 Linux权限对指令执行的影响
10 Linux文件系统管理
  • 10.1 硬盘结构(机械硬盘和固态硬盘)详解
  • 10.2 Linux文件系统详解
  • 10.3 Linux系统是如何识别硬盘设备和硬盘分区的?
  • 10.4 Linux df用法详解:查看文件系统硬盘使用情况
  • 10.5 Linux du命令:统计目录或文件所占磁盘空间大小
  • 10.6 Linux mount命令详解:挂载Linux系统外的文件
  • 10.7 Linux挂载光盘(使用mount命令)
  • 10.8 Linux挂载U盘(使用mount命令)
  • 10.9 Linux开机自动挂载硬件设备(配置/etc/fatab文件)
  • 10.10 修改/etc/fstab文件出错导致Linux不能启动,该怎么办?
  • 10.11 Linux umount命令:卸载文件系统
  • 10.12 Linux fsck命令:检测和修复文件系统
  • 10.13 Linux dumpe2fs命令:查看文件系统信息
  • 10.14 Linux fdisk命令详解:给硬盘分区
  • 10.15 Linux fdisk创建分区(主分区、扩展分区和逻辑分区)过程详解
  • 10.16 Linux parted命令用法详解:创建分区
  • 10.17 Linux mkfs命令详解格式化分区(为分区写入文件系统)
  • 10.18 Linux mke2fs命令格式化硬盘(给硬盘写入文件系统)
  • 10.19 Linux虚拟内存和物理内存
  • 10.20 Linux swap分区及作用详解
11 Linux高级文件系统管理
  • 11.1 磁盘配额是什么
  • 11.2 磁盘配额启动前的准备工作
  • 11.3 Linux扫描文件系统并建立磁盘配额记录文件(quotacheck命令)
  • 11.4 Linux开启磁盘配额限制(quotaon命令)
  • 11.5 Linux关闭磁盘配额限制(quotaoff命令)
  • 11.6 Linux修改用户(群组)的磁盘配额(edquota命令)
  • 11.7 Linux非交互式设置磁盘配额(setquota命令)
  • 11.8 Linux查询已建立好的磁盘配额(quota和repquota命令)
  • 11.9 Linux磁盘配额测试过程完全攻略
  • 11.10 Linux LVM逻辑卷管理机制
  • 11.11 Linux PV物理卷
  • 11.12 Linux VG卷组
  • 11.13 Linux LV逻辑卷
  • 11.14 Linux LVM(逻辑卷管理)的删除
  • 11.15 Linux RAID(磁盘阵列)完全攻略
  • 11.16 使用图形界面来配置RAID
  • 11.17 使用mdadm命令来配置RAID
12 Linux系统管理
  • 12.1 Linux进程管理
  • 12.2 Linux进程启动的方式有几种?
  • 12.3 Linux如何查看正在运行的进程(ps命令)
  • 12.4 Linux实时监听进程运行状态(top命令)
  • 12.5 Linux查看进程树(pstree命令)
  • 12.6 Linux列出进程调用或打开的文件信息(lsof命令)
  • 12.7 Linux进程优先级
  • 12.8 Linux调整进程的优先级(nice和renice命令)
  • 12.9 Linux常用信号(进程间通信)
  • 12.10 Linux终止进程(kill命令)
  • 10.11 Linux umount命令:卸载文件系统
  • 10.12 Linux fsck命令:检测和修复文件系统
  • 10.13 Linux dumpe2fs命令:查看文件系统信息
  • 10.14 Linux fdisk命令详解:给硬盘分区
  • 10.15 Linux fdisk创建分区(主分区、扩展分区和逻辑分区)过程详解
  • 10.16 Linux parted命令用法详解:创建分区
  • 10.17 Linux mkfs命令详解格式化分区(为分区写入文件系统)
  • 10.18 Linux mke2fs命令格式化硬盘(给硬盘写入文件系统)
  • 10.19 Linux虚拟内存和物理内存
  • 10.20 Linux swap分区及作用详解
13 Linux数据备份与恢复
  • 13.1 Linux备份的重要性
  • 13.2 Linux中的哪些数据需要备份?
  • 13.3 Linux数据备份介质的选择
  • 13.4 Linux备份策略
  • 13.5 Linux tar命令备份数据
  • 13.6 Linux dump
  • 13.7 Linux restore
  • 13.8 Linux dd
  • 13.9 Linux rsync命令:支持本地备份和远程备份
14 Linux系统服务管理
  • 14.1 Linux系统服务
  • 14.2 Linux端口
  • 14.3 Linux独立服务管理
  • 14.4 Linux基于xinetd服务的管理
  • 14.5 Linux源码包服务管理
  • 14.6 Linux常见服务类别及功能
  • 14.7 影响Linux系统性能的因素有哪些?
  • 14.8 Linux分析系统性能(sar命令)
  • 14.9 Linux如何查看CPU运行状态?
  • 14.10 Linux如何查看内存的使用情况?
  • 14.11 Linux如何查看硬盘的读写性能?
15 Linux系统日志管理
  • 15.1 Linux rsyslogd服务
  • 15.2 Linux日志文件及功能
  • 15.3 Linux日志文件的格式分析
  • 15.4 rsyslogd配置文件格式及其内容
  • 15.5 Linux日志服务器设置
  • 15.6 Linux日志轮替(日志转储)
  • 15.7 Linux logrotate命令
  • 15.8 Linux日志分析工具
16 Linux系统启动管理
  • 16.1 Linux系统启动流程
  • 16.2 BIOS开机自检
  • 16.3 主引导目录(MBR)结构及作用
  • 16.4 Linux内核(内核模块)的加载
  • 16.5 Linux /sbin/init
  • 16.6 Linux /etc/inittab
  • 16.7 Linux /etc/rc.d/rc.local配置文件
  • 16.8 Linux启动引导程序加载内核
  • 16.9 Linux /boot/grub/目录
  • 16.10 Linux GRUB磁盘分区表示法
  • 16.11 Linux GRUB配置文件
  • 16.12 Linux多系统并存的GRUB配置文件
  • 16.13 Linux GRUB手动安装
  • 16.14 Linux GRUB加密
  • 16.15 Linux字符界面调整分辨率
  • 16.16 Linux内核模块管理
  • 16.17 Linux NTFS文件系统安装
17 LAMP环境搭建和LNMP环境搭建
  • 17.1 Linux LAMP环境搭建的前期准备
  • 17.2 Linux libxml2安装
  • 17.3 Linux libmcrypt安装
  • 17.4 Linux mhash和mcrypt安装
  • 17.5 Linux zlib和libpng安装
  • 17.6 Linux jpeg6安装
  • 17.7 Linux freetype安装
  • 17.8 Linux gd库安装
  • 17.9 Linux Apache安装
  • 17.10 Linux ncurses安装
  • 17.11 Linux MySQL安装
  • 17.12 Linux PHP安装
  • 17.13 Linux memcache安装和配置
  • 17.14 Linux phpmyadmin安装及配置
  • 17.15 LNMP安装的前期准备
  • 17.16 LNMP一键安装
  • 17.17 LNMP安装php扩展模块
18 SELinux管理
  • 18.1 SELinux是什么
  • 18.2 SELinux的主要作用
  • 18.3 SELinux 的3种工作模式
  • 18.4 SELinux配置文件(/etc/selinux/config)
  • 18.5 SELinux工作模式设置
  • 18.6 SELinux安全上下文查看
  • 18.7 SELinux安全上下文的修改和设置
  • 18.8 SELinux默认安全上下文的查询和修改
  • 18.9 SELinux auditd日志系统的安装与启动
  • 18.10 SELinux auditd日志使用方法
  • 18.11 SELinux的3种策略类型
  • 18.12 SELinux策略规则查看的方法
  • 18.13 SELinux策略规则的开启和关闭

Shell脚本学习指南

01 Shell基础
  • 1.1 Shell是什么
  • 1.2 Shell是运维人员必须掌握的技能
  • 1.3 常用的Shell有哪些?
  • 1.4 进入Shell的两种方式
  • 1.5 Shell命令的基本格式
  • 1.6 Shell命令的本质到底是什么?如何自己实现一个命令?
  • 1.7 Shell命令的选项和参数在本质上是什么
  • 1.8 Shell命令提示符
  • 1.9 修改命令提示符
  • 1.10 第一个Shell脚本
  • 1.11 执行Shell脚本
  • 1.12 Shell四种运行方式
  • 1.13 Shell配置文件的加载
  • 1.14 如何编写自己的Shell配置文件?
02 Shell编程
  • 2.1 Shell变量
  • 2.2 Linux中的文件描述符到底是什么?
  • 2.3 Shell命令替换
  • 2.4 Shell位置参数
  • 2.5 Shell特殊变量
  • 2.6 Shell $*和$@之间的区别
  • 2.7 Shell $?
  • 2.8 Shell字符串详解
  • 2.9 Shell字符串拼接
  • 2.10 Shell字符串截取
  • 2.11 Shell数组
  • 2.12 Shell获取数组长度
  • 2.13 Shell数组拼接
  • 2.14 Shell删除数组元素
  • 2.15 Shell关联数组
  • 2.16 Shell内建命令
  • 2.17 Shell alias命令
  • 2.18 Shell echo命令
  • 2.19 Shell read命令
  • 2.20 Shell exit命令
  • 2.21 Shell declare和typeset命令
  • 2.22 Shell数学计算
  • 2.23 Shell (())
  • 2.24 Shell let命令
  • 2.25 Shell $[]
  • 2.26 Shell expr命令
  • 2.27 Linux bc命令
  • 2.28 Shell declare -i
  • 2.29 Shell if else
  • 2.30 Shell退出状态
  • 2.31 Shell test命令
  • 2.32 Shell [[]]
  • 2.33 Shell case in
  • 2.34 Shell while
  • 2.35 Shell until
  • 2.36 Shell for
  • 2.37 Shell select in
  • 2.38 Shell break和continue
  • 2.39 Shell函数
  • 2.40 Shell函数参数
  • 2.41 Shell函数返回值精讲
03 Shell高级教程
  • 3.1 Shell重定向
  • 3.2 Linux中的文件描述符到底是什么?
  • 3.3 结合文件描述符谈重定向,彻底理解重定向的本质!
  • 3.4 使用exec命令操作文件描述符
  • 3.5 使用exec命令操作文件描述符
  • 3.6 Shell Here Document
  • 3.7 Shell Here String
  • 3.8 Shell组命令
  • 3.9 Shell进程替换
  • 3.10 Linux管道
  • 3.11 Shell过滤器
  • 3.12 子Shell和子进程到底有什么区别?
  • 3.13 如何检测子Shell和子进程?
  • 3.14 Linux中的信号是什么
  • 3.15 Bash Shell中的信号
  • 3.16 Linux进程简明教程
  • 3.17 使用什么命令查看进程
  • 3.18 Shell向进程发送信号
  • 3.19 使用trap命令获取信号
  • 3.20 trap命令捕获信号实例演示
  • 3.21 移除(重置)信号捕获
  • 3.22 关于进程、信号和捕获的总结
  • 3.23 Shell模块化
04 Bash Shell快捷键
  • 4.1 Bash Shell快捷键大全
  • 4.2 Bash Shell命令自动补全功能
  • 4.3 Bash Shell历史命令

Nginx入门教程

01 Nginx基础
  • 1.1 前言
  • 1.2 Nginx 简介
  • 1.3 Nginx 源码架构分析
  • 1.4 Nginx 编译安装
  • 1.5 Tengine 编译安装
  • 1.6 OpenResty 编译安装
  • 1.7 Nginx 配置简述
  • 1.8 Nginx Docker 容器化配置
02 Nginx核心配置
  • 2.1 Nginx 核心配置指令
  • 2.2 Nginx 配置文件
  • 2.3 Nginx 进程配置指令
  • 2.4 Nginx 端口监听
  • 2.5 Nginx 主机名
  • 2.6 Nginx 处理HTTP请求
  • 2.7 Nginx 路由匹配规则
  • 2.8 Nginx 重定向配置
  • 2.9 Nginx 根目录配置
  • 2.10 Nginx 访问路径别名
  • 2.11 Nginx 文件判断
  • 2.12 Nginx 零复制
  • 2.13 Nginx 日志记录配置
03 Nginx HTTP模块
  • 3.1 Nginx 镜像模块
  • 3.2 Nginx 请求头控制模块
  • 3.3 Nginx IP访问控制模块
  • 3.4 Nginx 用户cookie模块
  • 3.5 Nginx 并发连接数限制模块
  • 3.6 Nginx 首页处理模块
  • 3.7 Nginx 请求频率限制模块
  • 3.8 Nginx 页面缓存时间配置
  • 3.9 Nginx gzip压缩及相关配置
04 Nginx Web服务
  • 4.1 Nginx 静态资源服务器搭建
  • 4.2 Nginx 文件下载服务器搭建
  • 4.3 Nginx 伪动态SSI服务器
  • 4.4 Nginx HTTPS服务器搭建
  • 4.5 Nginx FastCGI模块配置简述
  • 4.6 Nginx PHP服务器环境搭建
  • 4.7 Nginx 基于FastCGI负载均衡
  • 4.8 Nginx CGI网关接口
  • 4.9 Nginx uWSGI模块配置
  • 4.10 Nginx Python项目部署
  • 4.11 Nginx 伪流媒体服务器搭建
  • 4.12 Nginx HTTP2模块配置简述
  • 4.13 Nginx WebDAV模块配置简述
05 Nginx 代理服务器
  • 5.1 Nginx HTTP代理服务器
  • 5.2 Nginx stream模块简述
  • 5.3 Nginx TCPUDP代理简述
  • 5.4 Nginx 基于SSL的TCP代理服务器
  • 5.5 Nginx gRPC代理服务器
06 Nginx 缓存
  • 6.1 Nginx Web缓存配置
  • 6.2 Nginx 代理缓存配置
  • 6.3 Nginx Memcached 缓存模块
  • 6.4 Nginx 反向代理缓存服务器配置
  • 6.5 Nginx 客户端缓存控制
07 Nginx 负载均衡
  • 7.6 Nginx TCPUDP负载均衡
  • 7.5 Nginx upstream动态更新
  • 7.4 Nginx upstream容错机制
  • 7.3 Nginx 长连接负载均衡
  • 7.2 Nginx 负载均衡策略
  • 7.1 Nginx 负载均衡模块
08 Nginx 日志管理监控
  • 8.1 Nginx 日志分析简述
  • 8.2 Nginx 访问日志配置
  • 8.3 Nginx 错误日志配置
  • 8.4 Nginx 日志归档配置
  • 8.5 Nginx 日志分析工具 ELK
  • 8.6 Nginx 监控工具 Prometheus
09 Nginx 集群
  • 9.1 LVS简介
  • 9.2 Keepalived 配置简述
  • 9.3 Nginx 集群负载搭建
  • 9.4 Nginx 集群配置管理规划
  • 9.5 Nginx 配置归档工具GitLab
  • 9.6 Nginx 配置修改工具Ansible
  • 9.7 Jenkins 安装与配置简述
  • 9.8 Nginx 集群配置管理实例
10 Nginx 在 k8s 的应用
  • 10.1 Kubernetes(k8s)系统简述
  • 10.2 Kubernetes(k8s)集群部署
  • 10.3 Kubernetes(k8s)网络通信
  • 10.4 Nginx Ingress 简介
  • 10.5 Nginx Ingress 安装部署
  • 10.6 Nginx Ingress 配置映射
  • 10.7 Nginx Ingress 注解

Docker 入门实战

01 Docker基础
  • 1.1 前言
  • 1.2 Docker 架构
02 Docker安装
  • 2.1 CentOS Docker 安装
  • 2.2 Ubuntu Docker 安装
  • 2.3 Debian Docker 安装
  • 2.4 Windows Docker 安装
  • 2.5 MacOS Docker 安装
  • 2.6 Docker 镜像加速
03 Docker 使用
  • 3.1 Docker Hello World
  • 3.2 Docker 容器使用
  • 3.3 Docker 镜像使用
  • 3.4 Docker 容器连接
  • 3.5 Docker 仓库管理
  • 3.6 Docker Dockerfile
  • 07 Docker Compose
  • 08 Docker Machine
  • 09 Swarm 集群管理
04 Docker 实例
  • 4.1 Docker 安装 Ubuntu
  • 4.2 Docker 安装 CentOS
  • 4.3 Docker 安装 Nginx
  • 4.4 Docker 安装 Node.js
  • 4.5 Docker 安装 PHP
  • 4.6 Docker 安装 MySQL
  • 4.7 Docker 安装 Tomcat
  • 4.8 Docker 安装 Python
  • 4.9 Docker 安装 Redis
  • 4.10 Docker 安装 MongoDB
  • 4.11 Docker 安装 Apache
05 Docker 参考手册
  • 5.1 Docker 常用命令
  • 5.2 Docker 备忘单

Kubernetes(k8s)手册

01 kubernetes 概述
  • 01 kubernetes 简介
  • 02 Kubernetes 组件
  • 03 Kubernetes API
02 Kubernetes 安装
  • 01 Kubernetes Linux安装

快乐的Linux命令行

  • 第1章:引言
  • 第2章:什么是 shell
  • 第3章:文件系统中跳转
  • 第4章:探究操作系统
  • 第5章:操作文件和目录
  • 第6章:使用命令
  • 第7章:重定向
  • 第8章:从Shell眼中看世界
  • 第9章:键盘高级操作技巧
  • 第10章:权限
  • 第11章:进程
  • 第12章:Shell环境
  • 第13章:vi简介
  • 第14章:自定制Shell提示符
  • 第15章:软件包管理
  • 第16章:存储媒介
  • 第17章:网络系统
  • 第18章:查找文件
  • 第19章:归档和备份
  • 第20章:正则表达式
  • 第21章:文本处理
  • 第22章:格式化输出
  • 第23章:打印
  • 第24章:编译程序
  • 第25章:编写第一个Shell脚本
  • 第26章:启动一个项目
  • 第27章 : 自顶向下设计
  • 第28章 : 流程控制:if 分支结构
  • 第29章 : 读取键盘输入
  • 第30章 : 流程控制:while/until 循环
  • 第31章 : 疑难排解
  • 第32章 : 流程控制:case 分支
  • 第33章 : 位置参数
  • 第34章 : 流程控制:for 循环
  • 第35章 : 字符串和数字
  • 第36章 : 数组
  • 第37章 : 奇珍异宝

10.3 Kubernetes(k8s)网络通信

文章目录
  • 1、Docker网络模式
    • 1) 主机模式(host)
    • 2) 无网卡模式(none)
    • 3) 桥接模式(bridge)
    • 4) Macvlan网络模式(macvlan)
  • 2、Pod内容器间的数据通信
  • 3、同节点的Pod间数据通信
  • 4、跨主机的Pod间数据通信
  • 5、Pod应用在Kubernetes集群内发布服务
  • 6、Pod应用在Kubernetes集群外发布服务
    • 1) hostPort方式
    • 2) hostNetwork方式
    • 3) NodePort方式
    • 4) LoadBalancer方式
    • 5) ExternalIPs方式
  • 7、Service中Pod的调度策略
    • 1) 部署调度策略(Affinity)
    • 2) 流量调度策略(externalTrafficPolicy)

计算机间的信息和数据在网络中必须按照数据传输的顺序、数据的格式内容等方面的约定或规则进行传输,这种约定或规则称作协议。各种网络协议分布于不同的网络分层中,网络分层分为 OSI 七层模型和 TCP/IP 五层模型两种。TCP/IP 五层模型分别是应用层、传输层、网络层、链路层和物理层,其中应用层对应于 OSI 七层模型中的会话层、表示层、应用层,这也是二者的区别。

计算机网络数据是按照协议规范,采用分层的结构由发送端自上而下流动到物理层,再从物理层在网络分层中自下而上流动到接收端的应用层完成数据通信。网络分层中,高层级的应用模块仅利用低层级应用模块提供的接口和功能,低层级应用模块也仅使用高层级应用模块传来的参数响应相关操作,层次间每个应用模块都可能被提供相同功能的应用模块替代。

Kubernetes 网络通信也遵守 TCP/IP 五层模型的定义,通过不同的资源对象在相应的层级提供相应的模块功能。Kubernetes 资源对象在相应的网络层级与传统网络设备模块的对照表如下表所示。

网络分层 设备模块 Kubernetes 资源对象
应用层 F5、HAProxy、Nginx Ingress
传输层 F5、LVS Service
网络层 路由器、三层交换机 Flannel、Calico、Pod(容器间通信)
链路层 网桥、二层交换机、网卡 vnet、bridge
物理层 中继器、集线器、网线 --

1、Docker网络模式

Kubernetes 是基于容器的管理系统,其使用的 Docker 容器版本的 Pod 由多个 Docker 容器组成,因此为便于理解 Pod 的网络通信方式,应首先了解 Docker 自有的网络模式。Docker 容器有如下 4 种常见的网络模式。

1) 主机模式(host)

该模式下,因为容器与宿主机共享网络命名空间(network name-space,netns),所以该容器中可以共享使用宿主机的所有网卡设备。使用者可以通过访问宿主机 IP,访问容器中运行应用的所有网络端口。主机模式下网络传输效率最高,但宿主机上已经存在的网络端口无法被容器使用。

2) 无网卡模式(none)

该模式下,容器中只有环回(Lookback,lo)接口,运行在容器内的应用仅能使用环回接口实现网络层的数据传输。

3) 桥接模式(bridge)

该模式下,容器内会被创建 Veth(Virtual ETHernet)设备并接入宿主机的桥接网络,通过宿主机的桥接网络,容器内部应用可与宿主机及宿主机中接入同一桥接设备的其他容器应用进行通信。

4) Macvlan网络模式(macvlan)

当宿主机的网络存在多个不同的VLAN时,可以通过该模式为容器配置 VLAN ID,使该容器与宿主机网络中同一 VLAN ID 的设备实现网络通信。

Docker 容器间可以通过 IP 网络、容器名解析、joined 容器 3 种方式实现通信。IP 网络是在网络联通的基础上通过 IP 地址实现互访通信。容器名解析是在网络联通的基础上,由 Docker 内嵌的 DNS 进行容器名解析实现的互访通信方式,同一主机桥接模式的容器间需要启动时,可使用 --link 参数启用这一功能。

joined 容器方式可以使多个容器共享一个网络命名空间,多个容器间通过环回接口直接通信,这种方式容器间传输效率最高。

2、Pod内容器间的数据通信

Pod 是由多个 Docker 容器以 joined 容器方式构成的,多个容器共享由名为 pause 的容器创建的网络命名空间,容器内的进程彼此间通过环回接口实现数据通信。环回接口不依赖链路层和物理层协议,一旦传输层检测到目的端地址是环回接口地址,数据报文离开网络层时会被返回给本机的端口应用。这种模式传输效率较高,非常适用于容器间进程的频繁通信。

3、同节点的Pod间数据通信

每个 Pod 拥有唯一的 IP 和彼此隔离的网络命名空间,在 Linux 系统中,Pod 间跨网络命名空间的数据通信是通过 Veth 设备实现的。Veth 设备工作在链路层,总是成对出现,也被称为 Veth-pair 设备。在网络插件是 Flannel 的虚拟网络结构中,Flannel 在被 Kubernetes 触发、接收到相关 Pod 参数时,会为 Pod 创建 Veth 设备并分配 IP,Veth 设备一端是 Pod 的 eth0 接口,一端是 Node 节点中网络空间名为 default 的 Veth 虚拟接口。

Flannel 在初始安装时,创建了网桥设备 cni0,网络空间 default 中创建的 Veth 虚拟接口都被加入网桥设备 cni0 中,相当于所有的 Pod 都被接入这个虚拟交换机中,在同一虚拟交换机中的 Pod 实现了链路层的互联并进行网络通信。工作原理如下图所示。

同节点的Pod间数据通信
图:同节点的Pod间数据通信

可用如下命令查看当前节点服务器的网络命名空间和网桥信息。

# 查看系统中的网络命名空间
ls /var/run/docker/netns

# 查看每个命名空间的网络接口信息
nsenter --net=/var/run/docker/netns/default ifconfig -a

# 查看网桥信息
brctl show

4、跨主机的Pod间数据通信

由 CoreOS 使用Go语言开发的 Flannel 实现了一种基于 Vxlan(Virtual eXtensible Local Area Network)封装的覆盖网络(Overlay Network),将 TCP 数据封装在另一种网络包中进行路由转发和通信。

Vxlan 协议是一种隧道协议,基于 UDP 协议传输数据。Flannel 的 Vxlan 虚拟网络比较简单,在每个 Kubernetes 的 Node 上只有 1 个 VTEP(Vxlan Tunnel Endpoint)设备(默认为 flannel.1)。Kubernetes 集群中整个 Flannel 网络默认配置网段为 10.244.0.0/16,每个节点都分配了唯一的 24 位子网,Flannel 在 Kubernetes 集群中类似于传统网络中的一个三层交换设备,每个 Node 节点的桥接设备通过 VTEP 设备接口互联,使运行在不同 Node 节点中不同子网 IP 的容器实现跨 Node 互通。

可用如下命令查看当前节点服务器的 arp 信息。

# 本地桥arp表
bridge fdb

bridge fdb show dev flannel.1

5、Pod应用在Kubernetes集群内发布服务

Kubernetes 通过副本集控制器能够动态地在集群中任意创建和销毁 Node,因为每个 Node 被分配的子网范围不同,所以 Pod IP 也会随之变化。Flannel 构建的虚拟网络使得集群中的每个 Pod 在网络上已经实现互联互通,由于 Pod IP 变化的不确定性,运行在 Pod 中的应用服务无法被其他应用固定访问。

为使动态变化 IP 的 Pod 应用可以被其他应用访问,Kubernetes 通过标签筛选的形式将具有相同指定标签的一组 Pod 定义为 Service,每个 Service 的 Pod 成员信息通过端点控制器在 etcd 中保存及更新。Service 为 Pod 应用提供了固定的虚拟 IP 和端口实现固定访问,使得集群内其他 Pod 应用可以访问这个服务。

Service 是四层(TCP/UDP over IP)概念,其构建了一个有固定 ClusterIP(集群虚拟 IP,Virtual IP)和 Port 的虚拟集群,每个节点上运行的 kube-proxy 进程通过主节点的接口服务监听资源对象 Service 和 Endpoint 内 Pod 列表的变化。

kube-proxy 默认使用 iptables 代理模式,其通过对每个 Service 配置对应的 iptables 规则,在集群中的 Node 主机上捕获到达该 Service 的 ClusterIP 和 Port 的请求,当捕获到请求时,会将访问请求按比例随机分配给 Service 中的一个 Pod,如果被选择的 Pod 没有响应(取决于 readiness probes 的配置),则自动重试另一个 Pod。Service 访问逻辑如下图所示。

Service访问逻辑
图:Service访问逻辑

具体说明如下。

  • kube-proxy 根据集群中 Service 和 Endpoint 资源对象的状态初始化所在节点的 iptables 规则;
  • kube-proxy 通过接口服务监听集群中 Service 和 Endpoint 资源对象的变化并更新本地的 iptables 规则;
  • iptables 规则监听所有请求,将对应 ClusterIP 和 Port 的请求使用随机负载均衡算法负载到后端 Pod。

kube-proxy 在集群中的每个节点都会配置集群中所有 Service 的 iptables 规则,iptables 规则设置如下。

  • kube-proxy 首先是建立 filter 表的 INPUT 规则链和 nat 表的 PREROUTING 规则链,将访问节点的流量全部跳转到 KUBE-SERVICES 规则链进行处理;
  • kube-proxy 遍历集群中的 Service 资源实例,为每个 Service 资源实例创建两条 KUBE-SERVICES 规则;
  • KUBE-SERVICES 中一条规则是将访问 Service 的非集群 Pod IP 交由 KUBE-MARK-MASQ 规则标记为 0x4000/0x4000,在执行到 POSTROUTING 规则链时由 KUBE-POSTROUTING 规则链对数据流量实现 SNAT;
  • KUBE-SERVICES 中另一条规则将访问目标是 Service 的请求跳转到对应的 KUBE-SVC 规则链;
  • KUBE-SVC 规则链由目标 Service 端点列表中每个 Pod 的处理规则组成,这些规则包括随机负载均衡策略及会话保持(Session Affinity)的实现;
  • KUBE-SVC 每条规则链命名是将服务名 + 协议名按照 SHA256 算法生成哈希值后通过 base32 对该哈希值再编码,取编码的前 16 位与 KUBE-SVC 作为前缀组成的字符串;
  • KUBE-SEP 每个 Pod 有两条 KUBE-SEP 规则,一条是将请求数据 DNAT 到 Pod IP,另一条用来将 Pod 返回数据交由 KUBE-POSTROUTING 规则链实现 SNAT;
  • KUBE-SEP 每条规则链命名是将服务名 + 协议名 + 端口按照 SHA256 算法生成哈希值后通过 base32 对该哈希值再编码,取编码的前 16 位与 KUBE-SEP 为前缀组成的字符串。

Service 的负载均衡是由 iptables 的 statistic 模块实现的。statistic 模块的 random 模式可以将被设定目标的请求数在参数 probability 设定的概率范围内分配,参数设定值在 0.0~1.0 之间,当参数设定值为 0.5 时,表示该目标有 50% 的概率分配到请求。

kube-proxy 遍历 Service 中的 Pod 列表时,按照公式 1.0/float64(n-i) 为每个 Pod 计算概率值,n 是 Pod 的总数量,i 是当前计数。当有 3 个 Pod 时,计算值分别为 33%、50%、100%,3 个 Pod 的总流量负载分配分别为 33%、35%、32%。

Service 也支持会话保持功能,是应用 iptables 的 recent 模块实现的。recent 允许动态创建源地址列表,并对源地址列表中匹配的来源 IP 执行相应的 iptables 动作。recent 模块参数如下表所示。

参数 参数说明
set 把匹配动作的源 IP 添加到地址列表
name 源地址列表名称
mask 源地址列表中 IP 的掩码
rsource 设置源地址列表中保存数据包的源 IP 地址
rcheck 检查当前数据包源 IP 是否在源地址列表中
seconds 与 rcheck 配合使用,设置对指定时间内更新的 IP 地址与数据包源 IP 进行匹配检查,单位为秒
rеaр 与 seconds 配合使用,将清除源地址列表中指定时间内未被更新的 IP 地址

配置 Service 会话保持,只需在 Service 中进行如下配置即可。

spec:
    sessionAffinity: ClientIP
    sessionAffinityConfig:
        clientIP:
            timeoutSeconds: 10800

kube-proxy 实现 Service 的方法有 4 种,分别是 userspace、iptables、IPVS 和 winuser-space。iptables 只是默认配置,因 kube-proxy 的其他实现方式非本教程重点,此处不深入探讨。

6、Pod应用在Kubernetes集群外发布服务

Service 实现了 Pod 访问的固定 IP 和端口,但 ClusterIP 并不是绑定在网络设备上的,它只是 kube-proxy 进程设定的 iptables 本地监听转发规则,只能在 Kubernetes 集群内的节点上进行访问。Kubernetes 系统默认提供两种方式实现 Pod 应用向集群外发布服务,一种是基于资源对象 Pod 的 hostPort 和 hostNetwork 方式,另一种是基于资源对象 Service 的 NodePort、Load-Balancer 和 ExternalIPs 方式。

1) hostPort方式

hostPort 方式相当于创建 Docker 容器时使用 -p 参数提供容器的端口映射,只能通过运行容器的 Node 主机 IP 进行访问,属于资源对象 Pod 的运行方式,不支持多个 Pod 的 Service 负载均衡等功能。资源配置如下:

apiVersion: v1
kind: Pod
metadata:
    name: apps
    labels:
        app: web
spec:
    containers:
    - name: apps
      image: apache
      ports:
        - containerPort: 80
          hostPort: 8080

2) hostNetwork方式

hostNetwork 方式相当于创建 Docker 容器时以主机模式为网络模式的 Pod 运行方式,该方式运行的容器与所在 Node 主机共享网络命名空间,属于资源对象 Pod 的运行方式,不支持多个 Pod 的 Service 负载均衡等功能。资源配置如下:

apiVersion: v1
kind: Pod
metadata:
    name: nginx-web
    namespace: default
    labels:
        run: nginx-web
spec:
    hostNetwork: true
    containers:
    - name: nginx-web
      image: nginx
        ports:
        - containerPort: 80

3) NodePort方式

NodePort 方式是在集群中每个节点监听固定端口(NodePort)的访问,外部用户对任意 Node 主机 IP 和 NodePort 的访问,都会被 Service 负载到后端的 Pod,全局 NodePort 的默认可用范围为 30000~32767。NodePort 方式访问逻辑如下图所示。

NodePort方式访问逻辑
图:NodePort方式访问逻辑

具体说明如下。

  • kube-proxy 初始化时,会对 NodePort 方式的 Service 在 iptables nat 表中创建规则链 KUBE-NODEPORTS,用于监听本机 NodePort 的请求;
  • 外部请求访问节点 IP 和端口(NodePort)后,被 iptables 规则 KUBE-NODEPORTS 匹配后跳转给对应的 KUBE-SVC 规则链执行负载均衡等操作;
  • 选定 Pod 后,请求被转发到选定的 Pod IP 和目标端口(targetPod)。

NodePort 方式的资源配置如下:

apiVersion: v1
kind: Service
metadata:
    name: nginx-web
    namespace: default
    labels:
        run: nginx-web
spec:
    type: NodePort
    ports:
    - nodePort: 31804
      port: 8080
        protocol: TCP
        targetPort: 8080

4) LoadBalancer方式

LoadBalancer 方式是一种 Kubernetes 自动对外发布的解决方案,该方案是将外部负载均衡器作为上层负载,在创建 Service 时自动与外部负载均衡器互动,完成对 Kubernetes Service 负载均衡创建的操作,将 Service 按照外部负载均衡器的负载策略对外提供服务。该方案依赖外部负载均衡器的支持,阿里云、腾讯云等的容器云都提供了对这个方案的支持。资源配置如下:

apiVersion: v1
kind: Service
metadata:
    name: nginx-web
    namespace: default
    labels:
        run: nginx-web
spec:
    type: LoadBalancer
    ports:
    - port: 8080
      protocol: TCP
      targetPort: 8080

具体说明如下。

  • 不同的外部负载均衡器需要有对应的负载均衡控制器(Loadbalancer Controller);
  • 负载均衡控制器通过接口服务实时监听资源对象 Service 的变化;
  • LoadBalancer 类型的 Service 被创建时,Kubernetes 会为该 Service 自动分配 Node-Port;
  • 当监听到 LoadBalancer 类型的 Service 创建时,负载均衡控制器将触发外部负载均衡器(LoadBalancer)创建外部 VIP、分配外部 IP 或将现有节点 IP 绑定 NodePort 端口添加到外部负载均衡器的负载均衡池,完成负载均衡的配置;
  • 当外部用户访问负载均衡器的外部 VIP 时,外部负载均衡器会将流量负载到 Kubernetes 节点或 Kubernetes 集群中的 Pod(视外部负载均衡器的功能而定);
  • 不能与 NodePort 方式同时使用。

5) ExternalIPs方式

ExternalIPs 方式提供了一种指定外部 IP 绑定 Service 端口的方法,该方法可以指定节点内某几个节点 IP 地址或绑定外部路由到节点网络的非节点 IP 对外提供访问。Kubernetes 通过 ExternalIPs 参数将被指定的 IP 与 Service 端口通过 iptables 监听,其使用与 Service 一致的端口,相较于 NodePort 方式配置更加简单灵活。

由于是直接将 Service 端口绑定被路由的 IP 对外暴露服务,用户需要将整个集群对外服务的端口做好相应的规划,避免端口冲突。资源配置如下:

spec:
    externalIPs:
    - 192.168.1.101
    - 192.168.1.102
    ports:
    - name: http
      port: 80
      targetPort: 80
      protocol: TCP
    - name: https
      port: 443
      targetPort: 443
      protocol: TCP

具体说明如下。

  • ExternalIPs 设置的 IP 可以是集群中现有的节点 IP,也可以是上层网络设备路由过来的 IP。kube-proxy 初始化时,会对 ExternalIPs 方式的 Service 在 iptables nat 表中创建规则链 KUBE-SERVICES,用于访问 ExternalIPs 列表中 IP 及 Service port 请求的监听;
  • 外部或本地访问 ExternalIPs 列表中 IP 及 port 的请求被匹配后,跳转给对应的 KUBE-SVC 规则链执行负载均衡等操作。

7、Service中Pod的调度策略

Kubernetes 系统中,Pod 默认是按照资源策略随机部署的,虽然用户可对调度策略进行一定的调整,但 Pod 的调度策略同样对 Pod 通信存在一定的影响,相关调度策略有如下两种。

1) 部署调度策略(Affinity)

Kubernetes 集群中的 Pod 被随机调度并创建在集群中的 Node 上。在实际使用中,有时需要考虑 Node 资源的有效利用及不同应用间的访问效率等因素,也需要对这种调度设置相关期望的策略。主要体现在 Node 与 Pod 间的关系、同 Service 下 Pod 间的关系、不同 Service 下 Pod 间的关系这 3 个方面。

Node 与 Pod 间的关系可以使用 nodeAffinity 在资源配置文件中设置,在设置 Pod 资源对象时,可以将 Pod 部署到具有指定标签的集群 Node 上。Pod 间的关系可通过 podAntiAffinity 的配置尽量把同一 Service 下的 Pod 分配到不同的 Node 上,提高自身的高可用性,也可以把互相影响的不同 Service 的 Pod 分散到不同的集群 Node 上。

对于 Pod 间访问比较频繁的应用,可以使用 podAffinity 配置,尽量把被配置的 Pod 部署到同一 Node 服务器上。

2) 流量调度策略(externalTrafficPolicy)

Service 的流量调度策略有两种,分别是 Cluster 和 Local。Cluster 是默认调度策略,依据 iptables 的随机负载算法,将用户请求负载均衡分配给 Pod,但该方式会隐藏客户端的源 IP。

Local 策略则会将请求只分配给请求 IP 主机中该 Service 的 Pod,而不会转发给 Service 中部署在其他 Node 中的 Pod,这样就保留了最初的源 IP 地址。但该方式不会对 Service 的 Pod 进行负载均衡,同时被访问 IP 的 Node 主机上如果没有该 Service 的 Pod,则会报错。Local 策略仅适用于 NodePort 和 LoadBalancer 类型的 Service。

Kubernetes 中通过 Service 实现 Pod 应用访问,在流量调度策略的 Cluster 调度策略下,对一个 Service 的访问请求会被随机分配到 Service 中的任意 Pod,即便该 Service 与发出请求的 Pod 在同一 Node 有可提供服务的 Pod,也不一定会被选中。

在 Kubernetes 计划的 1.16 版本中增加了服务拓扑感知的流量管理功能,设计了新的 Pod 定位器(PodLocator),实现了服务的拓扑感知服务路由机制,使得 Pod 总能优先使用本地访问的策略找到最近的服务后端,这种拓扑感知服务使本地访问具有更广泛的意义,包括节点主机、机架、网络、机房等,这样可以有效地减少网络延迟,提高访问效率及安全性,更加节约成本。

更新于 2022年10月23日
10.2 Kubernetes(k8s)集群部署10.4 Nginx Ingress 简介

发表评论 取消回复

您需要登录后才可以发表评论...
登录... 后才能评论
文章目录
  • 1、Docker网络模式
    • 1) 主机模式(host)
    • 2) 无网卡模式(none)
    • 3) 桥接模式(bridge)
    • 4) Macvlan网络模式(macvlan)
  • 2、Pod内容器间的数据通信
  • 3、同节点的Pod间数据通信
  • 4、跨主机的Pod间数据通信
  • 5、Pod应用在Kubernetes集群内发布服务
  • 6、Pod应用在Kubernetes集群外发布服务
    • 1) hostPort方式
    • 2) hostNetwork方式
    • 3) NodePort方式
    • 4) LoadBalancer方式
    • 5) ExternalIPs方式
  • 7、Service中Pod的调度策略
    • 1) 部署调度策略(Affinity)
    • 2) 流量调度策略(externalTrafficPolicy)
开源之家

专注分享各种培训视频、收费教程、破解软件等优质资源的网站

联系客服
更多

Linux命令手册

免责声明

Copyright © 2015-2023 开源之家豫ICP备2021025902号

  • 首页
  • 我的
  • 顶部
AI&大数据 Java Java Linux Linux Python 办公软件 办公软件 培训视频 娱乐休闲 容器 小程序开发 数据库 系统相关 网络 英语 设计创意 软件测试