Kubernetes 知识点(1)——基础依赖

基础依赖与环境配置

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
相关推荐
hopsky1 小时前
Docker Compose 启动的容器内存 监控
docker·容器·eureka
FrameNotWork4 小时前
多设备 Android Logcat 自动采集方案:基于 Docker + Shell 实现日志按天切割与自动清理
android·docker·容器
Haoea!4 小时前
Docker + Harbor 私有镜像仓库搭建
运维·docker·容器
iambooo4 小时前
Docker 架构与核心原理深度解析:容器到底是怎么实现的?
运维·docker·容器
海兰4 小时前
Docker部署OpenClaw及常见问题解决(win11)
docker·容器·eureka
wyyl1987084 小时前
北京奶茶原料定制厂家
云原生
木雷坞5 小时前
使用Docker Compose部署PostgreSQL:从入门到实践
docker·postgresql·容器
Tummer83636 小时前
从 Docker 到 Kubernetes:容器编排的工程化实践指南
docker·容器·kubernetes
nxb5566 小时前
云原生keepalived实验设定
linux·运维·云原生