云原生入门:什么是K8s?
大家好,我是小刘运维。最近很多朋友问我:「K8s到底是什么?为什么现在都在聊它?」
作为一个从Java开发转运维的老兵,我深知技术术语的晦涩。今天咱们用大白话聊聊K8s,希望能帮你建立一个直观的理解。
一、K8s是什么?
K8s 是 Kubernetes 的缩写(K和s之间有8个字母),它是一个开源的容器编排平台。
用大白话说:K8s是用来管理容器的「大管家」。
1.什么是容器?
在讲K8s之前,先说说容器。你可以把容器想象成一个打包好的应用盒子:
- 里面装着你的应用代码
- 装着运行时环境(比如JDK、Node.js)
- 装着配置文件
- 装着依赖库
这个盒子在任何环境下都能开箱即用,不会出现「我本地能跑,生产环境跑不了」的问题。
容器 ≠ 虚拟机,容器更轻量、启动更快:
| 特性 | 虚拟机 | 容器 |
|---|---|---|
| 隔离级别 | 硬件级 | 进程级 |
| 启动时间 | 分钟级 | 秒级 |
| 资源占用 | 大 | 小 |
| 镜像大小 | GB级 | MB级 |
2.为什么需要K8s?
想象一下这个场景:
你有10个容器跑在3台服务器上,突然:
- 某个容器挂了 → 谁来重启它?
- 流量变大了 → 谁来自动扩容?
- 一台服务器宕机了 → 上面的容器谁来迁移?
- 新版本要发布 → 如何不中断服务?
这就是K8s要解决的问题!
K8s就像一个智能调度系统,帮你:
- ✅ 自动恢复挂掉的容器
- ✅ 根据流量自动扩缩容
- ✅ 把容器调度到合适的服务器
- ✅ 平滑发布新版本(蓝绿部署、金丝雀发布)
- ✅ 服务发现和负载均衡
- ✅ 配置和密钥管理
二、K8s核心概念(大白话版)
K8s有很多概念,初学者容易晕。咱们用生活中的例子来理解:
1. Pod(豆荚)
Pod是K8s最小的调度单元。
你可以把Pod想象成一个豌豆荚,里面可以装一个或多个「豌豆」(容器)。
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: web
image: nginx:latest
ports:
- containerPort: 80
💡 关键点:
- 一个Pod里的容器共享网络和存储
- 通常一个Pod只放一个容器
- Pod是临时的,随时可能被销毁重建
2. Deployment(部署)
Deployment是用来管理Pod的。
你可以把Deployment想象成一个应用管理者,它告诉你:
- 我要运行3个副本(Pod)
- 用的是nginx镜像
- 如果某个Pod挂了,立刻补一个新的
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
3. Service(服务)
Service是用来访问Pod的。
Pod是临时的,IP会变。Service就像一个固定的门牌号,用户访问Service,Service再把流量转发给Pod。
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 80
type: NodePort
4. Namespace(命名空间)
Namespace是用来做资源隔离的。
你可以把Namespace想象成不同的房间,每个房间里的资源互不可见。
常见用法:
default:默认房间kube-system:K8s自己的组件dev:开发环境prod:生产环境
三、K8s架构
K8s集群由两部分组成:Master节点和Worker节点。
3.Master节点(控制平面)
Master节点是集群的大脑,负责决策:
| 组件 | 作用 |
|---|---|
| kube-apiserver | 集群入口,所有组件都通过它通信 |
| etcd | 集群数据库,保存所有配置 |
| kube-scheduler | 调度Pod到合适的Worker节点 |
| kube-controller-manager | 控制器,管理各种资源 |
4.Worker节点(工作节点)
Worker节点是干活的,实际运行应用:
| 组件 | 作用 |
|---|---|
| kubelet | 节点代理,管理本节点上的Pod |
| kube-proxy | 网络代理,负责Service的负载均衡 |
| Container Runtime | 容器运行时(如Docker、containerd) |
四、真实案例:我的K8s集群
说一千道一万,不如看个真实案例。这是我自己生产环境用的K8s集群:
1.集群配置
服务器规划:
- 192.168.91.18 (Master1)
- 192.168.91.19 (Master2)
- 192.168.91.20 (Master3)
- 192.168.91.21 (Worker1)
- 192.168.91.22 (Worker2)
- 192.168.91.23 (Worker3)
环境:
- OS: CentOS 7
- 容器运行时: containerd
- 网络插件: flannel
- 高可用: keepalived + haproxy

2.部署一个应用的完整流程
- 编写Deployment YAML
[root@master-1 ~]# cat nginx.yaml
# 1. PVC 定义
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nginx-data-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: managed-nfs-storage # 动态存储类在这里指定
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
replicas: 3
#基于标签关联pod,会关联env=test或者env=prod的pod
selector:
matchExpressions:
- key: env
values:
- "test"
- "prod"
operator: In
template:
metadata:
#为pod设置了两个标签
labels:
app: nginx
env: test
spec:
containers:
- name: nginx
image: nginx:1.22.1
imagePullPolicy: IfNotPresent
volumeMounts:
- name: data
mountPath: /usr/share/nginx/html
volumes:
- name: data
persistentVolumeClaim:
claimName: nginx-data-pvc # 引用上面创建的 PVC
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
# 指定svc的类型为NodePort,也就是在默认的ClusterIP基础之上多监听所有worker节点的端口而已。
type: NodePort
# 基于标签选择器关联Pod
selector:
app: nginx
# 配置端口映射
ports:
# 指定Service服务本身的端口号
- port: 80
# 后端Pod提供服务的端口号
targetPort: 80
nodePort: 30088 # 固定 NodePort 端口
- 应用配置:
kubectl apply -f nginx.yaml

- 查看Pod状态:
kubectl get pods
kubectl get pods,svc

- 验证访问:
curl http://node-ip:30088

五、如何开始学习K8s?
1.学习路径建议
1. 先学会用Docker
↓
2. 用minikube或kind搭建单机K8s
↓
3. 学习核心概念(Pod、Deployment、Service)
↓
4. 动手部署几个应用
↓
5. 学习高级概念(Ingress、ConfigMap、Secret)
↓
6. 搭建生产级集群(高可用、安全、监控)
2.推荐资源
- 官方文档:https://kubernetes.io/zh-cn/
- 小刘的博客:k8s_liux3528的博客-CSDN博客
3.我的建议
💡 不要一开始就啃所有概念,先用起来!
我的经验是:
- 先搭建一个单机环境
- 部署一个Nginx
- 试着扩容、缩容
- 试着滚动更新
- 在这个过程中遇到问题再去查概念
六、常见问题
Q1:K8s和Docker是什么关系?
A:Docker是容器运行时,K8s是容器编排平台。K8s可以用Docker,也可以用其他容器运行时(如containerd)。
Q2:没有K8s就不能用容器吗?
A:当然可以!如果你的应用只有几个容器,用Docker Compose就够了。K8s适合大规模容器集群管理。
Q3:学习K8s需要先学Go语言吗?
A:不需要!99%的场景只需要写YAML配置文件,不需要写代码。
七、总结
K8s不是什么黑科技,它就是一个管理容器的工具。
什么时候用K8s?
- ✅ 容器数量多(几十个以上)
- ✅ 需要高可用、自动扩缩容
- ✅ 需要平滑发布、回滚
- ✅ 团队规模大,需要资源隔离
什么时候不用K8s?
- ❤️ 只是个人项目,几个容器
- ❤️ 团队小,没人维护
- ❤️ 业务量小,不需要复杂调度
技术是为业务服务的,不要为了用K8s而用K8s!
「小刘说」
作为一个踩过无数坑的运维老兵,我想说:
K8s不难,难的是坚持动手实践。
不要被一堆概念吓住,先搭个环境跑起来,遇到问题再解决问题。
记住:最好的学习方式是在生产环境中使用(当然是先在测试环境练熟了再上生产😂)。
如果这篇文章对你有帮助,欢迎关注「小刘」,后续会带来更多K8s实战内容!
标签:#Kubernetes #K8s #云原生 #运维 #容器化
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)