首页 » K8s » 第1章 Kubernetes 入门总览

第1章 Kubernetes 入门总览

 

本章目录(点击跳转):

本章目标:搞懂 Kubernetes 是什么、为什么需要它、核心概念长什么样,并掌握最常用的 kubectl 命令,为后面所有章节打地基。

1.1 为什么需要 Kubernetes

先从一个真实场景说起:

假设你写了一个 Web 服务,部署在 1 台服务器上运行得好好的。某天业务量翻了 10 倍,1 台机器扛不住了,你需要:

  1. 再开几台服务器,把服务复制过去;
  2. 用户请求要均匀打到几台机器上;
  3. 某台机器挂了,要自动把流量切走、重新拉起服务;
  4. 发新版本时不能停机,要逐个替换;
  5. 晚上流量下来了,还要把多开的机器关掉省钱。

手工做这些事,10 台服务器还算能应付,100 台、1000 台就完全是地狱了。Kubernetes(简称 K8s,因为 K 和 s 中间隔着 8 个字母)就是干这个的:帮你自动管理成百上千台服务器上的应用。

一句话总结:

Kubernetes 是一个容器编排系统——它把一堆服务器当成一台大机器来用,自动帮你部署、扩缩容、修复、升级运行在容器里的应用。

1.1.1 先搞懂两个前置概念

  • 服务器/虚拟机:一台有 CPU、内存、硬盘、网络的机器,可以是一台物理机,也可以是云上的虚拟机(比如阿里云 ECS、腾讯云 CVM、AWS EC2)。
  • 容器:可以理解为"一个被打包好的、随时能跑的应用环境"。比如你写的 Java 程序 + JDK + 依赖库 + 配置文件,全部打包成一个 Docker 镜像,在任何支持容器的机器上都能一模一样地运行。

一个典型的流程是:

# 1. 把应用打成镜像(用 Docker 举例,概念上其他工具也一样)
docker build -t myapp:1.0 .

# 2. 推送到镜像仓库
docker push registry.example.com/myapp:1.0

# 3. 在服务器上运行
docker run -d -p 80:80 registry.example.com/myapp:1.0

容器解决了"应用怎么打包运行"的问题,但"几十上百台机器上怎么调度、维护"的问题就交给 Kubernetes 了。

1.1.2 Kubernetes 能帮你做什么

能力 说明 没有 K8s 你要怎么办
自动调度 自动决定每个应用容器放在哪台机器 自己维护机器列表和分配表
自我修复 容器挂了自动重启,机器挂了自动迁走 写脚本 + 人工巡检
弹性伸缩 流量大了自动加副本,小了自动减 半夜爬起来手工加机器
滚动更新 发版不停机,逐个替换并自动回滚 停机维护,出错自己回滚
负载均衡 自动把流量分给多个副本 自己配 Nginx/LB
服务发现 应用之间可以互相找到对方 硬编码 IP 或自己维护名单
配置管理 配置、密钥和代码分离,改配置不发版 配置文件散落各处
存储管理 自动给应用挂持久化存储 手工挂载、手工迁移数据

1.2 核心概念速览(小白版)

Kubernetes 的文档经常让人劝退,其实核心概念没那么多。先看这张"家族关系图":

Kubernetes 集群 (Cluster)
├── 节点 (Node)  ×N        ← 一台台服务器
│   └── Pod ×N            ← 最小调度单位,里面跑 1 个或多个容器
│       └── 容器 (Container)
├── Service               ← 给一组 Pod 提供稳定的访问入口(虚拟IP)
├── Deployment            ← 声明"我要一直跑 N 个副本的 Pod"
├── ConfigMap / Secret    ← 配置和密钥
├── PVC (持久卷声明)       ← 给 Pod 挂存储
└── Namespace             ← 逻辑隔离,相当于"文件夹"

下面逐个用大白话解释:

1.2.1 Node(节点)

就是一台加入集群的服务器。集群里至少要有节点才能干活。K8s 里节点分两种角色:

  • 控制面(Control Plane):集群的"大脑",负责决策(调度到哪个节点、维护状态等)。
  • 工作节点(Worker Node):真正跑容器的"干活的机器"。

小集群里两者经常混在同一台机器上(比如 minikube 就是 1 台机器既是控制面又是工作节点)。

1.2.2 Pod

K8s 里最小、最基本的单位。一个 Pod 里通常跑一个容器(也可以跑多个,比如"主容器 + 日志收集边车")。

重要理解:

  • Pod 是"一次性的":它可能被删除、迁移,Pod 的 IP 会变化,所以不要依赖 Pod IP 去访问服务(这就是后面 Service 存在的意义)。
  • 你几乎不会直接创建 Pod,而是通过 Deployment 等工作负载来管理 Pod。

1.2.3 Service(服务)

给一组 Pod 提供一个稳定的虚拟 IP 和域名,并把流量均匀转发给这些 Pod。Pod 来来去去,Service 不动。

1.2.4 Deployment(部署)

最常用的工作负载,用来管理"无状态"应用。你声明"我要 3 个副本",K8s 就保证任何时候都有 3 个 Pod 在跑,发版时滚动更新、出错自动回滚。

1.2.5 Namespace(命名空间)

逻辑分组,类似文件夹。比如 dev、test、prod 三个环境各占一个 namespace,互不干扰。

1.2.6 ConfigMap / Secret / PVC

  • ConfigMap:存放配置(如 APP_ENV=production)。
  • Secret:存放敏感信息(密码、密钥、证书)。
  • PVC:给 Pod 挂载持久化存储(数据库数据、文件)。

1.2.7 声明式 vs 命令式(很重要的小白知识)

K8s 有两种使用方式:

命令式:告诉它"做什么动作"。

kubectl create deployment myapp --image=nginx --replicas=3

声明式:告诉它"我要什么结果",K8s 负责让现实变成这样。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.27

实际工作中强烈推荐声明式:把上面的 YAML 保存成文件,用 kubectl apply -f myapp.yaml 应用,配置就有了版本管理,随时可以复查和回滚。

1.3 集群架构(了解即可)

一个 K8s 集群长这样:

                    ┌──────────────────────────────┐
   用户/CI/CD ─────►│        kubectl / API 客户端    │
                    └──────────────┬───────────────┘
                                   │ HTTPS
                    ┌──────────────▼───────────────┐
                    │        API Server            │  唯一入口,所有请求都走它
                    │  (etcd 在旁边存所有数据)       │
                    └──┬───────────┬───────────┬───┘
                       │           │           │
              ┌────────▼───┐ ┌─────▼────┐ ┌────▼────────┐
              │ Scheduler  │ │Controller│ │ ...          │
              │ 调度器      │ │ 控制器    │ │             │
              └────────────┘ └──────────┘ └─────────────┘
                       │           │           │
              ┌────────▼───────────▼───────────▼─────────┐
              │ kubelet(每个节点一个)→ 管理本节点上的 Pod  │
              │ kube-proxy(每个节点一个)→ 实现 Service    │
              │ 容器运行时 → 真正运行容器                    │
              └───────────────────────────────────────────┘

小白只需要记住 3 件事:

  1. API Server:一切操作的入口,kubectl 的所有命令本质都是调它的 REST API。
  2. etcd:集群的数据库,所有状态都存在这里。
  3. kubelet:每个节点上的"管家",负责让本节点上的 Pod 状态符合期望。

其他组件(Scheduler、Controller Manager 等)后面用到时再了解,现在不用深究。

1.4 动手前:先看看集群长什么样

假设你已经装好了一个集群(下一章手把手教你装),先跑这几个命令感受一下:

# 看集群版本(本书基于 Kubernetes 1.35 编写)
kubectl version --client
kubectl get nodes --wide

# 看所有节点
kubectl get nodes

# 看默认命名空间下的所有资源
kubectl get all -n default

# 看所有命名空间
kubectl get namespaces

# 看集群里到底有哪些资源类型
kubectl api-resources | head -30

输出示例(minikube 单节点):

$ kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
minikube     Ready    control-plane   10m   v1.35.0

再试一个"杀 Pod"实验,直观感受 K8s 的"自愈":

# 创建一个 nginx Pod
kubectl run demo --image=nginx:1.27

# 看看它
kubectl get pods -o wide

# 把它删了
kubectl delete pod demo

# 过 5 秒再看(注意:Pod 没了,这就是 Pod 的"一次性")
kubectl get pods

如果换成 Deployment,删掉 Pod 后 K8s 会自动补一个新的——这个现象在第 4 章会详细展开,先记住这个"自动补齐"的思想,它是整个 K8s 的精髓:

你声明期望状态,K8s 不断工作让现实收敛到期望状态。

1.5 最常用的 kubectl 命令速查

这一节当字典用,后面每章都会反复用到。

1.5.1 创建与删除

# 用 YAML 文件创建(最常用)
kubectl apply -f myapp.yaml

# 创建多个文件
kubectl apply -f ./manifests/

# 看 apply 前会做什么(dry run)
kubectl apply -f myapp.yaml --dry-run=client -o yaml

# 删除
kubectl delete -f myapp.yaml

# 命令行快速创建(演示用,生产不推荐)
kubectl run web --image=nginx:1.27
kubectl create deployment web --image=nginx:1.27 --replicas=3
kubectl create service clusterip web --tcp=80:80

# 删除各类资源
kubectl delete pod mypod
kubectl delete deployment web
kubectl delete ns test-ns   # 删除整个命名空间(慎用!)

1.5.2 查看

# 看资源(最常用的四个)
kubectl get pods                  # 看 Pod
kubectl get deployments           # 看 Deployment
kubectl get svc                   # 看 Service
kubectl get all                   # 一把全看

# 常用参数
kubectl get pods -A               # 所有命名空间
kubectl get pods -n kube-system   # 指定命名空间
kubectl get pods -w               # 持续监听变化(watch)
kubectl get pods -o wide          # 显示更多信息(IP、节点)
kubectl get pods -o yaml          # 输出完整 YAML(学习资源长什么样利器)
kubectl get pods -o jsonpath='{.items[*].metadata.name}'  # 只要名字

# 看详情/事件(排障第一招)
kubectl describe pod mypod
kubectl describe deployment web

# 看标签筛选
kubectl get pods -l app=web
kubectl get pods --show-labels

1.5.3 操作运行中的东西

# 进容器执行命令
kubectl exec -it mypod -- sh
kubectl exec -it mypod -c main -- /bin/bash   # 多容器 Pod 指定容器

# 看日志
kubectl logs mypod
kubectl logs mypod -c sidecar      # 多容器指定
kubectl logs mypod -p              # 上一次崩溃前的日志
kubectl logs -f mypod              # 实时跟踪
kubectl logs -l app=web --tail=100 # 按标签看所有副本

# 把服务端口转发到本地
kubectl port-forward svc/web 8080:80
# 然后浏览器打开 http://localhost:8080

# 扩容
kubectl scale deployment web --replicas=5

# 更新镜像
kubectl set image deployment/web web=nginx:1.28

# 交互式编辑(新手慎用,会直接改集群)
kubectl edit deployment web

1.5.4 提高效率的小技巧

# 1) 自动补全(PowerShell 示例)
# 先生成脚本
kubectl completion powershell > kubectl.ps1
# 然后在 $PROFILE 里加一行:
#   Invoke-Expression (Get-Content kubectl.ps1)
# 之后 kubectl get <Tab> 就能补全了

# 2) 起别名(PowerShell)
Set-Alias k kubectl
k get pods

# 3) 常用查看组合
k get pods -A -o wide
k describe pod <名字>
k logs <名字> -f

1.6 本章小结

  • K8s 是容器编排系统,核心价值是自动化:调度、自愈、扩缩容、滚动更新。
  • 核心概念:Cluster → Node → Pod → Service → Deployment,外加 Namespace、ConfigMap/Secret、PVC。
  • K8s 是声明式的:你描述"要什么",它负责"做到"。
  • 排障三板斧:kubectl get 看状态、kubectl describe 看事件、kubectl logs 看日志。

下一章:搭建一个真正可以动手的集群环境。

原文链接:第1章 Kubernetes 入门总览,转载请注明来源!

赞 0