Kubernetes 入门指南
一、Kubernetes 是什么
Kubernetes(常简写为 K8s)是一个开源的容器编排平台,用来自动完成容器的部署、扩缩容、滚动更新和故障恢复。
只用一台机器跑一个容器时,我们可以直接用容器命令启动它;但当应用变成几十个服务、几百个容器,并且需要 7×24 小时稳定运行时,手工管理就很难了。Kubernetes 把“希望达到的状态”写成一份声明,平台会持续对照这份声明,把实际状态调整到期望状态。例如声明“这个 Web 应用始终保持 3 个副本”,即使某个副本崩溃,Kubernetes 也会自动再启动一个。
对初学者来说,不必一开始就记住所有对象,先理解一个思路:你描述目标,平台负责实现并维持目标。
二、核心概念:先记住这几个对象
1. 集群、节点与控制平面
一个 Kubernetes 集群由一组机器组成。每台机器叫一个节点(Node)。控制平面(Control Plane)负责调度、记录状态和接收指令;工作节点负责真正运行容器。
2. Pod:最小的运行单元
Pod 是 Kubernetes 中最小的可部署单元,一个 Pod 里通常运行一个主容器,特殊情况下也可以运行几个需要紧密配合的容器。同一 Pod 内的容器共享网络和存储卷,生命周期也相同。Pod 本身是短暂的:它可能因为节点故障或更新而被重建,因此不要把 Pod 当作一台固定不变的服务器。
3. Deployment:管理无状态应用的副本
Deployment 用来声明“某种 Pod 要保持多少个副本、用哪个镜像、如何更新”。修改镜像版本后,Deployment 会按滚动更新的方式逐步替换旧 Pod,让服务在更新过程中尽量不中断。
4. Service:给一组 Pod 一个稳定的访问入口
Pod 的地址会随重建而变化,Service 则为一组标签相同的 Pod 提供一个固定不变的访问入口,并在多个 Pod 之间做负载均衡。前端调用后端时,应该访问 Service,而不是直接记住某个 Pod 的地址。
5. Namespace:逻辑上的隔离空间
Namespace 把集群内的资源划分到不同的逻辑空间,例如把开发、测试和生产环境分开,避免名称冲突,也方便按空间分配权限和资源配额。
6. ConfigMap 与 Secret:配置与敏感信息分开存放
应用的普通配置放在 ConfigMap 中,密码、令牌等敏感信息放在 Secret 中,再以环境变量或文件的方式挂载给 Pod。敏感信息不要写进代码仓库,也不要直接写进容器镜像。
三、一个最小示例:部署一个 Web 应用
下面是一份最简 Deployment 示例,它声明运行 2 个副本:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo
spec:
replicas: 2
selector:
matchLabels:
app: web-demo
template:
metadata:
labels:
app: web-demo
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80
再用一个 Service 把它暴露出来:
apiVersion: v1
kind: Service
metadata:
name: web-demo
spec:
type: ClusterIP
selector:
app: web-demo
ports:
- port: 80
targetPort: 80
常用操作如下:
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get pods
kubectl get svc
kubectl describe pod <Pod 名称>
在本地学习时,可以用端口转发快速验证:
kubectl port-forward svc/web-demo 8080:80
然后在浏览器访问本地 8080 端口,就能看到 Web 页面。
四、Service 的三种常见类型
- ClusterIP:只在集群内部访问,是默认类型,适合内部服务之间调用。
- NodePort:在每个节点上打开一个固定端口,适合学习和小规模对外访问。
- LoadBalancer:借助云厂商的负载均衡器对外提供访问,适合生产环境。
初学时先用 ClusterIP 理解内部调用,再用 NodePort 或端口转发验证效果,生产选型再考虑 LoadBalancer。
五、常用 kubectl 命令速查
kubectl get pods:查看 Pod 列表和状态。kubectl get deployments:查看 Deployment 列表。kubectl get svc:查看 Service 列表。kubectl logs <Pod 名称>:查看容器日志。kubectl describe pod <Pod 名称>:查看 Pod 的事件和配置细节。kubectl delete -f <文件>:删除按文件创建的资源。
排查问题时,先看 get 的状态,再看 describe 的事件,最后看 logs 的输出,这个顺序能帮你快速定位大多数入门问题。
六、新手常见问题
- Pod 一直处于 Pending:多数是节点资源不足或调度条件不满足,先用
describe查看事件提示。 - Pod 反复重启(CrashLoopBackOff):多半是程序启动就退出,查看日志确认是配置错误还是端口冲突。
- 镜像拉取失败(ImagePullBackOff):检查镜像名称、标签和网络访问,确认镜像确实存在。
- Service 访问不到:检查 Service 的 selector 标签是否与 Pod 标签一致,端口映射是否正确。
遇到问题时不要急着删除重建,先保留现场看事件和日志,养成“先观察、再修改”的习惯。
七、给初学者的学习路线
- 在本地用 minikube 或 kind 搭建一个单节点集群,先跑通上面的最小示例。
- 练习修改副本数、镜像版本和环境变量,观察滚动更新的过程。
- 学习 Namespace、ConfigMap、持久化存储卷等概念,再做一个带配置和数据的练习。
- 了解 Ingress、资源限制(requests/limits)和健康检查,再考虑把练习项目部署到云上。
结语
Kubernetes 的概念看起来多,但核心始终是“声明期望状态、平台持续维持”。从一个 Pod、一个 Deployment、一个 Service 开始动手,边做边看状态变化,比只看文档更快建立直觉。先把最小示例跑通,再逐步扩展,你就已经迈出了容器编排的第一步。
- 点赞
- 收藏
- 关注作者
评论(0)