# 容器与运维
# Linux
# linux启动流程
# 启动过程
通电 → BIOS → 加载引导记录(GRUB)→ 加载操作系统 → 加载 /boot → 创建 init 进程(pid=1)→ 选择运行级别(/etc/rc.d)→ 加载开机程序(/etc/init.d)
# 详细步骤
- BIOS/UEFI 阶段:硬件自检(POST),加载引导程序
- Bootloader 阶段:GRUB 加载内核镜像到内存
- Kernel 阶段:
- 初始化硬件驱动
- 挂载根文件系统
- 启动 init 进程(systemd 或 SysV init)
- Init 阶段:
- 读取配置文件(/etc/inittab 或 systemd unit)
- 启动系统服务
- 进入多用户模式
# systemd vs SysV init
| 特性 | systemd | SysV init |
|---|---|---|
| 启动方式 | 并行启动 | 串行启动 |
| 服务管理 | systemctl | service |
| 配置文件 | .service unit 文件 | /etc/init.d/ 脚本 |
| 依赖管理 | 自动处理依赖 | 手动管理 |
| 性能 | 快 | 慢 |
# linux文件描述符
# 概念
Linux 文件描述符(File Descriptor)是一个非负整数,用于标识进程打开的文件或其他 I/O 资源。类似 Windows 中的文件句柄。
# 默认文件描述符
- 0:标准输入(stdin)
- 1:标准输出(stdout)
- 2:标准错误(stderr)
# 相关命令
# 查看当前进程的文件描述符限制
ulimit -n
# 查看系统级最大文件描述符数
cat /proc/sys/fs/file-max
# 查看当前已使用的文件描述符数
cat /proc/sys/fs/file-nr
# 临时修改文件描述符限制
ulimit -n 65535
# 永久修改:编辑 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
# 为什么重要
- Linux 中一切皆文件,socket 也是文件
- 高并发场景(如 Web 服务器)需要大量文件描述符
- 默认值(通常 1024)可能不足以支撑高并发
- 合理设置可优化服务器性能
# 文件描述符与连接数
每个 TCP 连接占用一个文件描述符,因此:
- 文件描述符限制 = 最大并发连接数
- 需要合理规划系统资源
# 进程间通信的方式
参考资料: https://baike.baidu.com/item/%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/1235923?fr=aladdin https://www.cnblogs.com/lmh001/p/9754122.html 总结
管道 信号量 共享内存 套接字 消息队列 大概是这五种
管道分无名 有名 高级
一般java开发很少用到进程之间通信 顶多就是在一些框架底层 线程操作中用到类似的概念 例如信号量和共享内存 消息队列
- 哪些通信方式是要陷入内核态的
在进程之间通信 都是需要借助内核来处理 这个问题不太明白
因为在操作系统中 进程通信肯定要进入 内核态来处理的 在线程通信好像不太需要 如线程共享内存
# Kubernetes
# k8s常用组件
| 名称 | 作用 | 备注 |
|---|---|---|
| etcd | k8s 注册中心 | 管理、注册k8s相关服务信息 |
| api server | k8s manager api server | |
| scheduler | 调度组件 | 用来管理k8s相关调度任务 |
| controller-manager | 控制面板 | 管理k8s资源 |
| kubelet | node节点的管理探针 | 用来配合master节点管理node的 |
| kube-proxy | node节点网络代理组件 | 用来接入到k8s网络的组件 |
| containerd | 实现oci标准的容器引擎 | 一般使用docker不过现在开始直接使用containerd |
| dns | k8s自用的dns服务 | 提供k8s一些别名访问的dns |
| flannel | k8s网络组件 | 基于overlay network的 |
| calico | k8s网络组件 | 基于bgp路由协议 |
| prometheus | 监控组件 | 存储采集上来的监控数据 |
| grafana | 监控组件 | 展示prometheus存储的数据 |
| helm | k8s发布软件包格式 |
# k8s常用高可用部署方式
k8s要实现高可用 核心是etcd要高可用
业内很多一键部署高可用的脚本啥的 基本上就是要么直接写好二进制安装脚本或者包装kubeadm来实现的
kubeadm
高本版的kubeadm 支持外接etcd创建高可用的k8s集群rancher
rancher 可以使用rke建立k8s高可用集群二进制安装
手工安装 etcd、api server 、schedule 等master组件
然后签发证书 安装node节点的 kubelet kube-proxy组件