Kubernetes入门学习笔记(重点):从安装到核心概念
本文是本人学习Kubernetes过程中的总结笔记,基于官方文档和Kubernetes入门学习笔记:从安装到核心概念实际操作经验整理。
1. 安装前的准备工作
1.1 常用软件包的作用
在安装Docker和Kubernetes前,通常需要先安装以下三个包(Ubuntu/Debian系统):
sudo apt update
sudo apt install -y ca-certificates gnupg lsb-release
-
ca-certificates:提供受信任的根证书,用于HTTPS安全连接(如下载Docker仓库时验证证书)。
-
gnupg:GNU隐私卫士,提供GPG密钥管理,用于验证软件仓库的签名,防止篡改。
-
lsb-release:提供Linux标准基线信息(如发行版版本),Docker官方脚本会用它判断系统版本并添加对应仓库。
1.2 Docker相关组件的作用
安装Docker时通常会装以下几个包:
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
-
docker-ce:Docker社区版主程序(docker daemon)。
-
docker-ce-cli:Docker命令行客户端(docker命令本身)。
-
containerd.io:容器运行时核心,负责容器生命周期管理(K8s现在默认使用containerd而非Docker shim)。
-
docker-compose-plugin:Docker Compose插件,支持
docker compose命令,用于多容器编排(V2版本)。
1.3 K8s在1.20之后弃用Docker(非“不支持”)
常见说法:“K8s在1.2之后就不再支持Docker”——错误。
正确说法:
Kubernetes从1.20版本开始弃用Dockershim(Docker作为容器运行时的直接接口),从1.24版本完全移除。
现在默认使用containerd或CRI-O作为容器运行时。Docker仍然可以工作(通过cri-dockerd桥接),但官方不再推荐。
1.4 创建容器和交互式访问示例
# 创建并后台运行一个nginx容器
docker run -d --name my-nginx -p 8080:80 nginx:alpine
# 交互式进入容器(bash)
docker exec -it my-nginx /bin/sh
# 或者直接启动时进入
docker run -it --rm ubuntu:22.04 /bin/bash
2. Kubernetes集群安装关键点
2.1 为什么部署K8s要关闭Swap?
Kubernetes对性能和调度要求严格:
-
Swap会导致内存性能不可预测(页面换入换出延迟高)。
-
kubelet的内存驱逐(eviction)机制依赖真实物理内存统计,Swap会干扰判断。
-
官方要求:必须关闭Swap,否则kubelet启动失败。
# 临时关闭
sudo swapoff -a
# 永久关闭(编辑/etc/fstab,注释掉swap行)
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
2.2 br_netfilter模块的作用
K8s需要Pod跨节点通信,要求启用桥接流量经过netfilter(iptables)处理。
# 加载模块
sudo modprobe br_netfilter
# 永久生效
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# 设置桥接参数
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
2.3 三大核心工具
-
kubeadm:集群初始化和升级工具,用于快速搭建生产可用集群。
-
kubectl:命令行工具,用于和API Server通信,管理集群资源。
-
kubelet:运行在每个节点上的代理,负责管理本节点的Pod和容器。
3. 使用kubeadm创建集群(单master示例)
# 1. 所有节点安装容器运行时(containerd)和kubeadm、kubelet、kubectl
sudo apt update && sudo apt install -y containerd kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
# 2. Master节点初始化
sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# 3. 配置kubectl(普通用户)
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 4. 安装网络插件(这里用Calico)
kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
# 5. Worker节点加入(init时会输出join命令)
sudo kubeadm join 192.168.1.10:6443 --token xxxx --discovery-token-ca-cert-hash sha256:xxxx
3.1 Calico网络插件的作用
Calico是K8s最流行的CNI(容器网络接口)插件之一,提供:
-
Pod IP分配和管理
-
NetworkPolicy网络策略(细粒度安全控制)
-
高性能BGP路由(适合大规模集群)
4. Kubernetes核心组件作用
| 组件 | 位置 | 主要作用 |
|---|---|---|
| kube-apiserver | Master | 集群控制平面入口,提供REST API,所有操作都通过它 |
| etcd | Master | 分布式键值存储,保存集群所有状态数据(唯一状态源) |
| kube-controller-manager | Master | 运行各种控制器(Node、ReplicaSet、Deployment等),保证期望状态 |
| kube-scheduler | Master | 负责Pod调度,根据资源、亲和性等策略选择节点 |
| kubelet | 每个节点 | 节点代理,负责Pod创建、监控、报告状态 |
| kube-proxy | 每个节点 | 维护Service的iptables/nftables或IPVS规则,实现服务发现和负载均衡 |
5. 命名空间(Namespace)
-
Namespace:K8s的逻辑隔离机制,用于多租户、多环境隔离(dev/staging/prod)。
-
默认创建的四个命名空间:
kubectl get ns
# NAME STATUS AGE
# default Active ...
# kube-system Active ... # 系统组件所在
# kube-public Active ... # 公开资源(如configmap)
# kube-node-lease Active ... # 节点心跳租约
6. Pod详解
6.1 Pod是什么?
Pod是K8s的最小调度单位,通常包含一个或多个容器,共享网络和存储卷。
# 示例:简单nginx Pod
apiVersion: v1
kind: Pod
metadata:
name: my-nginx
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
6.2 根容器(Pause容器)
每个Pod自动创建一个Pause容器(基础设施容器),作用:
-
持有Pod的网络命名空间(所有容器共享同一个IP)
-
持有卷挂载点
-
作为Pod内其他容器的“父进程”,防止僵尸进程
6.3 Pod生命周期
Pending → Running → Succeeded/Failed → Terminated
kubectl get pod my-pod -w # 实时观看状态变化
6.4 Init容器特点和用途
Init容器在主容器启动前依次运行,主要用于:
-
初始化配置
-
等待依赖服务
-
克隆Git仓库等
spec:
initContainers:
- name: init-db
image: busybox
command: ['sh', '-c', 'until nslookup mysql; do sleep 2; done']
containers:
- name: app
image: myapp
6.5 Sidecar容器 vs Init容器
-
Init容器:串行执行,全部成功后才启动主容器,一次性任务。
-
Sidecar容器:与主容器并行运行,长期存在,常用于日志收集、代理、监控等。
# Sidecar示例:日志收集
spec:
containers:
- name: app
image: myapp
- name: log-agent
image: fluentd
volumeMounts:
- name: varlog
mountPath: /var/log
6.6 静态Pod
由节点上的kubelet直接管理(不通过API Server),配置文件放在/etc/kubernetes/manifests/目录,常用于系统组件(如kube-apiserver本身)。
7. 控制器(Controller)
控制器通过监听API Server,持续将当前状态向期望状态收敛。
7.1 ReplicaSet
保证指定数量的Pod副本运行,常用于无状态应用。
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-rs
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:alpine
7.2 Deployment(最常用)
在ReplicaSet之上提供声明式更新(滚动更新、回滚)。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
spec:
replicas: 3
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.19 # 修改此镜像版本即可触发滚动更新
# 查看滚动更新状态
kubectl rollout status deployment/nginx-deploy
# 回滚到上一个版本
kubectl rollout undo deployment/nginx-deploy
总结
本文从安装准备到核心概念,覆盖了K8s学习中最常见的问题点。建议动手实践:先用kubeadm搭一个单节点集群,再逐步部署Deployment和Service。后续可以深入Service、Ingress、StatefulSet、Helm等话题。
欢迎留言交流你的实践经验!
更多推荐

所有评论(0)