大家好,我是小刘运维。最近很多朋友问我:「K8s到底是什么?为什么现在都在聊它?」

作为一个从Java开发转运维的老兵,我深知技术术语的晦涩。今天咱们用大白话聊聊K8s,希望能帮你建立一个直观的理解。


一、K8s是什么?

K8sKubernetes 的缩写(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.推荐资源

3.我的建议

💡 不要一开始就啃所有概念,先用起来!

我的经验是:

  1. 先搭建一个单机环境
  2. 部署一个Nginx
  3. 试着扩容、缩容
  4. 试着滚动更新
  5. 在这个过程中遇到问题再去查概念

六、常见问题

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 #云原生 #运维 #容器化

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐