本文是本人学习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-apiserverMaster集群控制平面入口,提供REST API,所有操作都通过它
etcdMaster分布式键值存储,保存集群所有状态数据(唯一状态源)
kube-controller-managerMaster运行各种控制器(Node、ReplicaSet、Deployment等),保证期望状态
kube-schedulerMaster负责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等话题。

欢迎留言交流你的实践经验!

更多推荐