基础依赖与环境配置
1.ca-certificates, gnupg, lsb-release 三个包的解释。
答:
这三个包是安装Docker/K8s的基础依赖;
(1)ca-certificates(验证证书)
提供系统CA根证书集合 ,让系统能验证HTTPS网站 的可信性(docker/K8s的仓库是HTTPS),验证官方仓库。
根证书 :自己给自己发的证书,信任的起点(无条件信任);
系统CA根证书集合:本质是公钥证书文件,本地是否存在受信任的根证书 可以验证目标服务器的证书。
(2)gnupg(来源验证)
验证 官方仓库的GPG签名 (软件包来源 )------来源验证,确保安装包的真实可信。
(3)lsb-release(识别)
该包提供 lsb_release 命令,能提取系统的发行版、版本号、架构等信息,让 Docker/K8s 源根据系统信息匹配对应的软件仓库和安装包。
2.docker-ce, docker-ce-cli, containerd.io, docker-compose-plugin 作用。
答:
(1)docker-ce(核心软件包)
是Docker的核心软件包 ,提供dockerd守护进程 、配置信息等,通过dockerd从创建、启动、停止删除容器,来管理容器状态,资源,运行环境,即管理容器生命周期。
(2)docker-ce-cli(命令工具)
Docker的命令行工具 ,提供 docker具体命令(docker命令),用于与docker守护进程交互,发送操作指令让其执行具体任务。
(3)containerd.io(管理系统)
高层容器运行时 ,负责容器镜像和生命周期管理 ,并通过底层容器运行时 runc 创建和运行容器。
(4)docker-compose-plugin(插件)
通过yaml文件(声明容器的期望状态)来定义和管理多容器部署与运行。(docker-compose的插件形式)
通过执行命令来读取yaml文件,按照定义的配置,通过dockerd来创建容器等。
bash
# 命令
docker compose up -d
3.K8s 在1.2之后就不再支持docker,请解释对错。
答:
这是错误说法:
Kubernetes 1.20 版本开始弃用 Docker 作为容器运行时,而不是 Docker 镜像。
原因:
K8s管理的是容器的期望状态,通过CRI拉取容器镜像(使用/部署 并非镜像本身)和调用容器运行时(通过CRI与运行时交互);从K8s 1.20版本后,改用containerd或CRI-O替代容器运行时,但仍然可以使用Docker打包的镜像。
4.举例说明创建容器以及以交互方式访问容器的命令?
答:
(1)创建并运行容器:
bash
# 格式:
# docker run -d --name 容器名 镜像名
# 示例:
docker run -d --name Test nginx
创建:

验证:

(2)交互方式访问容器:
bash
# 命令:
# docker exec -it 容器名 容器会话(指定容器内的 shell 程序)
# -i(交互模式):保持标准输入打开,允许向容器输入内容
# -t(终端):为容器提供一个伪终端环境
# 示例:
docker exec -it Test /bin/bash
访问容器:

5.部署安装K8s为什么要关闭swap分区?
答:
核心原因是避免磁盘I/O负载影响性能,同时保证K8s资源调度的精准性;
K8s 是一个"容器编排系统 ",是管理"容器集群运行的规则"的系统,用于管理容器集群的期望状态 。Node 作为K8s的**"资源池"** ,将Pod加入一个合适的Node进行运行。再通过Pod来调度、组合容器,具体实现任务目标。
Pod:是K8s调度中的最小单位 ,包含一个或多个必须紧密合作 的容器(必须在同一Node才能正常工作),容器共享网络和存储。
抽象解释:
Node作为"资源池"汇报资源情况,Pod声明"资源用量",kube-Scheduler遍历所有的Node,搜索"合适"的Node,将Pod加入该节点。(Pod和Pod中的容器相当于Node中的进程,Node 节点本身是 Linux 服务器,依托 Linux 内核实现资源调度和容器运行)
因此K8s要精确获取Pod的资源使用情况 ,并由kubelet与cgroup进行精确控制,但swap分区会破坏"精确性"(用磁盘空间临时充当内存)。
开启swap时:
当Pod实际内存超过限制,部分内存被换出到磁盘;
kubelet与cgroup会对Pod的内存情况判断错误,出现调度错误,破坏资源隔离,导致性能下降或无响应。
6.解释br_netfilter。
答:
br_netfilter 不仅影响 同一个Node 内 Pod 之间的通信,更作用于 K8s 的网络策略;
br_netfilter 是 Linux 内核中的一个 网络模块 ,使经过 Linux 网桥 的数据包 能够被 iptables / netfilter 框架处理。
在 K8s 集群中,Pod 网络通信 通常通过 Linux 网桥实现。每个Pod都有自己的虚拟网卡,同一个Node中的Pod通过网桥连接,依赖iptables(基于netfilter)实现与外界通信,因此必须启用br_netfilter来确保网络包进入netfilter,确保网络策略生效。
br------bridge,用于连接多个网络接口;
netfilter------Linux内核的网络包 的过滤框架,用于检测、修改、丢弃网络包;
br_netfilter------经过网桥的数据包传递给netfilter,使iptables规则生效,实现相同 Node 内Pod之间(通过网桥实现)以及Pod与外界之间(虚拟网卡到外部网络的转发链)的通信。
7.解释kubeadm, kubectl, kubelet。
答:
(1)kubeadm (安装集群、管理集群)
是 Kubernetes 官方提供的"集群部署与初始化工具 ",主要用于快速搭建和初始化 Kubernetes 集群;
作用:
生成 集群所需的证书、配置文件 ,并启动控制平面组件 ,同时支持节点加入集群。
(2)kubectl(管理集群)
K8s的命令行工具,用于与控制平面交互,管理和操作集群的主要接口;
作用:
管理K8s资源,管理集群状态。
(3)kubelet(运行Pod)
是节点组件 中的一个进程------程序代理,与控制平面通信确保Pod正常运行。
作用:
管理该节点中的Pod,通过容器运行时来保证Pod中的容器正常运行。
流程:
kubelet 通过与 kube-apiserver 通信,获取 分配到本节点的 Pod 的期望 状态;若发现 Pod 实际状态与期望状态不一致,会触发自愈机制(如重启异常容器、重建失联 Pod)
通过 CRI 接口调用容器运行时,由容器运行时完成容器的管理。
8.详细说明K8s集群的创建过程。
答:
8.1 准备节点环境、配置文件
(1) 关闭swap:
bash
swapoff -a
sed -i 's/.*swap.*/#&/' /etc/fstab
(2)内核参数配置:
启用 br_netfilter 模块,调整sysctl参数,确保网桥流量可以被netfilter处理,保证桥接网络流量可以被 iptables 处理;
bash
modprobe br_netfilter
cat > /etc/sysctl.d/k8s.conf << EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
(3)安装必要工具:
kubeadm、kubelet、kubectl
bash
# 安装
apt-get install -y kubeadm kubelet kubectl
# 锁定版本,防止自动升级
apt-mark hold kubeadm kubelet kubectl
8.2 初始化控制平面节点(安装组件)
(1)初始化控制平面(此为自定义配置方式,提前准备 kubeadm.yaml )
bash
modprobe br_netfilter
kubeadm init --config kubeadm.yaml
自动生成证书、kube-apiserver等相关组件。
bash
# 简化版
kubeadm init --apiserver-advertise-address=192.168.1.100 --image-repository=registry.aliyuncs.com/google_containers --pod-network-cidr=192.168.0.0/16 --kubernetes-version=v1.33.0
(2)配置 kubectl 环境(控制平面节点执行,否则无法使用 kubectl)
bash
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
(3)安装Pod网络插件(控制平面节点执行,否则无法使用 kubectl)
确保Pod能够跨节点通信。
bash
# 以 Calico 为例
kubectl apply -f https://docs.projectcalico.org/v3.28/manifests/calico.yaml
(4)验证控制平面状态
bash
kubectl get nodes
kubectl get pods -n kube-system
8.3 添加节点
(1)将节点加入集群(使用控制平面初始化成功后生成的 join 命令,替换为自己的令牌和哈希值):
bash
kubeadm join
# 示例
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
8.4 验证与管理
验证节点状态与系统Pod是否正常运行;
bash
# 检查节点状态
# 预期输出:状态为"Ready"
kubectl get nodes
bash
# 检查Pod
# 预期输出:状态为"Running"
kubectl get pods -A
