本章目录(点击跳转):
- 1.1 为什么需要 Kubernetes
- 1.1.1 先搞懂两个前置概念
- 1.1.2 Kubernetes 能帮你做什么
- 1.2 核心概念速览(小白版)
- 1.2.1 Node(节点)
- 1.2.2 Pod
- 1.2.3 Service(服务)
- 1.2.4 Deployment(部署)
- 1.2.5 Namespace(命名空间)
- 1.2.6 ConfigMap / Secret / PVC
- 1.2.7 声明式 vs 命令式(很重要的小白知识)
- 1.3 集群架构(了解即可)
- 1.4 动手前:先看看集群长什么样
- 1.5 最常用的 kubectl 命令速查
- 1.5.1 创建与删除
- 1.5.2 查看
- 1.5.3 操作运行中的东西
- 1.5.4 提高效率的小技巧
- 1.6 本章小结
本章目标:搞懂 Kubernetes 是什么、为什么需要它、核心概念长什么样,并掌握最常用的
kubectl命令,为后面所有章节打地基。
1.1 为什么需要 Kubernetes
先从一个真实场景说起:
假设你写了一个 Web 服务,部署在 1 台服务器上运行得好好的。某天业务量翻了 10 倍,1 台机器扛不住了,你需要:
- 再开几台服务器,把服务复制过去;
- 用户请求要均匀打到几台机器上;
- 某台机器挂了,要自动把流量切走、重新拉起服务;
- 发新版本时不能停机,要逐个替换;
- 晚上流量下来了,还要把多开的机器关掉省钱。
手工做这些事,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 件事:
- API Server:一切操作的入口,
kubectl的所有命令本质都是调它的 REST API。 - etcd:集群的数据库,所有状态都存在这里。
- 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 入门总览,转载请注明来源!
