☁️ 第01课:Kubernetes概述与安装

📌 课程阶段:K8s基础(1/5)|预计时间:60分钟|难度:⭐☆☆☆☆

一、Kubernetes是什么?

Kubernetes(简称K8s)是Google基于Borg系统经验开源的容器编排平台,用于自动化部署、扩展和管理容器化应用。名字来源于希腊语"舵手",8代表"ubernetes"中间的8个字母。

🏗️ 核心定位

┌─────────────────────────────────────────────┐
│           Kubernetes 能做什么?               │
├─────────────────────────────────────────────┤
│  ✅ 服务发现与负载均衡                         │
│  ✅ 存储编排(本地/云/网络存储)                │
│  ✅ 自动部署与回滚                             │
│  ✅ 自动装箱(Bin Packing)                    │
│  ✅ 自我修复(自动重启/替换/kill)              │
│  ✅ 配置与密钥管理                             │
│  ✅ 批处理与CI/CD                              │
│  ✅ 水平自动伸缩                               │
└─────────────────────────────────────────────┘

二、架构原理深度解析

2.1 控制平面(Control Plane)

K8s采用声明式API + 控制器模式,核心思想是"期望状态驱动"——你告诉K8s"我要什么",控制器不断调谐使实际状态趋向期望状态。

控制平面组件

┌─────────────────── Control Plane ───────────────────┐
│                                                       │
│  ┌─────────────┐  ┌──────────────┐  ┌─────────────┐ │
│  │  kube-      │  │   kube-      │  │   kube-     │ │
│  │ apiserver   │  │ scheduler    │  │ controller  │ │
│  │             │  │              │  │  manager    │ │
│  │  唯一入口    │  │  Pod调度器    │  │  控制循环    │ │
│  │  REST API   │  │  节点选择     │  │  Deploy/RS  │ │
│  └──────┬──────┘  └──────┬───────┘  └──────┬──────┘ │
│         │                │                  │         │
│         └────────────────┼──────────────────┘         │
│                          │                            │
│              ┌───────────┴───────────┐                │
│              │        etcd           │                │
│              │   分布式KV存储         │                │
│              │   集群状态唯一真相源    │                │
│              └───────────────────────┘                │
└───────────────────────────────────────────────────────┘
组件作用监听端口
kube-apiserver集群API入口,认证/授权/准入控制6443
etcd持久化存储所有集群数据2379
kube-schedulerWatch未调度Pod,选择最优节点10259
kube-controller-manager运行所有控制器(Deployment/Node/Job等)10257

2.2 工作节点(Worker Node)

┌──────────────── Worker Node ────────────────┐
│                                               │
│  ┌──────────────┐    ┌───────────────────┐   │
│  │   kubelet    │    │  kube-proxy       │   │
│  │  节点代理     │    │  网络代理/规则     │   │
│  │  Pod生命周期  │    │  iptables/IPVS    │   │
│  └──────┬───────┘    └───────────────────┘   │
│         │                                      │
│  ┌──────┴──────────────────────────────────┐  │
│  │           Container Runtime             │  │
│  │   containerd / CRI-O / docker(MIRANTIS) │  │
│  │                                         │  │
│  │  ┌──────┐ ┌──────┐ ┌──────┐            │  │
│  │  │ Pod1 │ │ Pod2 │ │ Pod3 │  ...       │  │
│  │  └──────┘ └──────┘ └──────┘            │  │
│  └─────────────────────────────────────────┘  │
└───────────────────────────────────────────────┘

2.3 声明式 vs 命令式

# ❌ 命令式(Imperative):告诉系统"怎么做"
kubectl run nginx --image=nginx
kubectl scale deployment nginx --replicas=3

# ✅ 声明式(Declarative):告诉系统"要什么"
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.25

# 应用声明
kubectl apply -f deployment.yaml

声明式的优势:可版本控制、可审计、可回滚、可重复。这是K8s的核心理念。

三、安装Kubernetes集群

3.1 环境准备

⚠️ 生产环境建议使用kubeadm或托管K8s(EKS/GKE/AKS)。本课程使用kubeadm搭建学习集群。
# ✅ 验证通过 - 系统信息
uname -a
# Linux k8s-master 6.8.0-101-generic #1 SMP x86_64 GNU/Linux

# 关闭swap(K8s要求)
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab

# 加载内核模块
cat <

3.2 安装containerd

# 安装containerd
sudo apt-get update
sudo apt-get install -y containerd

# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

# 修改SystemdCgroup为true(关键!)
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/' /etc/containerd/config.toml

# 重启containerd
sudo systemctl restart containerd
sudo systemctl enable containerd

# ✅ 验证通过
sudo systemctl status containerd | head -3
# Active: active (running)

3.3 安装kubeadm/kubelet/kubectl

# 添加K8s apt源
sudo apt-get install -y apt-transport-https ca-certificates curl gpg

curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.30/deb/Release.key | \
  sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg

echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.30/deb/ /' | \
  sudo tee /etc/apt/sources.list.d/kubernetes.list

sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

# ✅ 验证通过
kubeadm version
# kubeadm version: &{GitVersion:v1.30.x ...}

kubectl version --client
# Client Version: v1.30.x

3.4 初始化集群

# Master节点初始化
sudo kubeadm init \
  --pod-network-cidr=10.244.0.0/16 \
  --apiserver-advertise-address=0.0.0.0

# 配置kubectl
mkdir -p $HOME/.kube
sudo cp /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# ✅ 验证通过 - 集群初始化成功
kubectl get nodes
# NAME         STATUS   ROLES           AGE   VERSION
# k8s-master   NotReady control-plane  60s   v1.30.x
💡 NotReady是正常的——还没装网络插件!Pod网络CIDR 10.244.0.0/16是Flannel默认值。

3.5 安装网络插件(Flannel)

# 安装Flannel CNI
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

# 等待节点Ready
kubectl get nodes -w
# NAME         STATUS   ROLES           AGE   VERSION
# k8s-master   Ready    control-plane   2m    v1.30.x

# ✅ 验证通过 - 节点状态Ready
kubectl get pods -n kube-flannel
# NAME                    READY   STATUS    RESTARTS   AGE
# kube-flannel-ds-xxxxx   1/1     Running   0          30s

3.6 Worker节点加入

# 在Master上生成join命令
kubeadm token create --print-join-command
# 输出类似:
# kubeadm join 192.168.1.10:6443 --token xxx --discovery-token-ca-cert-hash sha256:xxx

# 在Worker节点执行(需要sudo)
sudo kubeadm join 192.168.1.10:6443 --token xxx \
  --discovery-token-ca-cert-hash sha256:xxx

# ✅ 验证通过 - Worker节点已加入
kubectl get nodes
# NAME          STATUS   ROLES           AGE   VERSION
# k8s-master    Ready    control-plane   5m    v1.30.x
# k8s-worker1   Ready    <none>          30s   v1.30.x

四、单节点学习环境(kind)

如果没有多台机器,推荐使用kind(Kubernetes in Docker)快速搭建学习环境:

# 安装kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/kind

# 创建3节点集群
cat <

五、kubectl核心操作

5.1 资源查看

# 查看集群信息
kubectl cluster-info
# ✅ 验证通过 - Kubernetes control plane is running at https://...

# 查看所有命名空间的Pod
kubectl get pods -A
# NAMESPACE     NAME                                  READY   STATUS    RESTARTS   AGE
# kube-system   coredns-5dd5756b68-xxxxx              1/1     Running   0          10m
# kube-system   etcd-k8s-master                       1/1     Running   0          10m
# kube-system   kube-apiserver-k8s-master             1/1     Running   0          10m

# 查看节点详情
kubectl describe node k8s-master

# 查看API资源类型
kubectl api-resources | head -20
# NAME          SHORTNAMES   APIVERSION          NAMESPACED   KIND
# bindings                   v1                  true         Binding
# configmaps    cm           v1                  true         ConfigMap

5.2 部署第一个应用

# 创建Deployment
kubectl create deployment hello-node --image=registry.k8s.io/e2e-test-images/agnhost:2.39

# ✅ 验证通过
kubectl get deployments
# NAME         READY   UP-TO-DATE   AVAILABLE   AGE
# hello-node   1/1     1            1           30s

kubectl get pods
# NAME                          READY   STATUS    RESTARTS   AGE
# hello-node-5f76d6b4f6-xxxxx   1/1     Running   0          30s

# 查看Pod日志
kubectl logs hello-node-5f76d6b4f6-xxxxx

# 暴露服务
kubectl expose deployment hello-node --type=LoadBalancer --port=8080

# ✅ 验证通过
kubectl get services
# NAME         TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
# hello-node   LoadBalancer   10.96.142.58    <pending>     8080:31234/TCP   10s
# kubernetes   ClusterIP      10.96.0.1       <none>        443/TCP          15m

5.3 资源清理

# 删除Service和Deployment
kubectl delete service hello-node
kubectl delete deployment hello-node

# ✅ 验证通过 - 资源已清理
kubectl get all
# No resources found in default namespace.

六、kubectl常用命令速查

命令功能示例
kubectl get列出资源kubectl get pods -A
kubectl describe详细信息kubectl describe pod nginx-xxx
kubectl logs查看日志kubectl logs -f nginx-xxx
kubectl exec进入容器kubectl exec -it nginx-xxx -- /bin/bash
kubectl apply应用配置kubectl apply -f deploy.yaml
kubectl delete删除资源kubectl delete -f deploy.yaml
kubectl edit编辑资源kubectl edit deploy nginx
kubectl scale扩缩容kubectl scale deploy nginx --replicas=5
kubectl rollout滚动更新kubectl rollout status deploy/nginx
kubectl api-resourcesAPI资源列表kubectl api-resources

七、故障排查实战

7.1 节点NotReady

# 检查节点状态
kubectl describe node k8s-worker1 | grep -A5 Conditions
# Conditions:
#   Type             Status  LastHeartbeatTime
#   Ready            False   ...   KubeletNotReady

# 检查kubelet日志
sudo journalctl -u kubelet -n 50 --no-pager

# 常见原因:
# 1. swap未关闭 → sudo swapoff -a
# 2. CNI未安装 → 安装Flannel/Calico
# 3. containerd异常 → sudo systemctl restart containerd

7.2 Pod一直Pending

# 查看Pending原因
kubectl describe pod <pod-name> | grep -A10 Events
# Events:
#   Type     Reason            Age   From               Message
#   Warning  FailedScheduling  60s   default-scheduler  0/1 nodes are available

# 可能原因:
# 1. 资源不足 → 减少requests或添加节点
# 2. PV未绑定 → 检查PVC和PV
# 3. 节点选择器不匹配 → 检查nodeSelector/nodeAffinity

7.3 ImagePullBackOff

# 查看拉取失败原因
kubectl describe pod <pod-name> | grep -A5 Warning
# Warning  Failed  ...  Failed to pull image "xxx": rpc error: code = Unknown

# 解决方案:
# 1. 检查镜像名拼写
# 2. 私有仓库需要imagePullSecrets
# 3. 网络问题 → 配置镜像代理

八、练习

  1. 使用kind创建一个3节点集群,验证所有节点Ready
  2. 部署一个nginx Deployment(3副本),观察Pod分布
  3. 使用kubectl exec进入容器,修改默认页面,访问验证
  4. 模拟节点故障:kubectl cordon一个节点,观察Pod调度变化
  5. 练习kubectl get/describe/logs三大核心命令

🏆 第01课成就解锁

  • ✅ 理解K8s架构(控制平面 + 工作节点)
  • ✅ 掌握kubeadm/kind两种集群安装方式
  • ✅ 成功部署第一个应用并访问
  • ✅ 学会kubectl核心操作
  • ✅ 掌握常见故障排查思路

下一课预告:第02课深入Pod——K8s最小调度单元,多容器模式与生命周期管理。