【K8s第二篇】生产核心资源精讲:YAML手写+私有镜像仓库+探针+配置热更新(零基础Docker迁移)

📅 2026/7/7 5:51:26 👁️ 阅读次数 📝 编程学习
【K8s第二篇】生产核心资源精讲:YAML手写+私有镜像仓库+探针+配置热更新(零基础Docker迁移)

🌈 专栏系列:Docker程序员零基础吃透K8s生产实战

上一篇我们已经从零搭建好了稳定可用的K3s K8s集群,完成了Docker到K8s的认知迁移、环境避坑、基础命令掌握。

很多小伙伴搭建完集群就卡住了:不会写YAML、只会复制粘贴、不懂配置含义、服务部署后不稳定、配置改不了、镜像不知道怎么管理

本篇作为全系列最核心的地基文章,专门解决以上痛点,全程落地生产必备能力:

✅ K8s YAML生产规范手写教程(告别无脑复制)

✅ 五大核心资源生产场景详解

✅ 私有镜像仓库搭建(企业Docker镜像迁移K8s必备)

✅ 生产级健康探针(解决服务假死、启动错乱)


一、前言:为什么必须学懂本篇内容?

只会敲kubectl命令、复制网上YAML,永远不算会K8s,生产环境一定会翻车:

  • 复制的配置无资源限制,服务OOM打满集群

  • 无健康探针,服务启动成功但无法访问、流量异常涌入

  • 配置硬编码镜像内,改参数必须重新打包镜像

  • 只用公共镜像,无法部署自己的Jar/Go/Python业务镜像

  • 不懂Namespace环境隔离,测试生产资源混乱冲突

本篇目标:打通K8s生产部署底层逻辑,所有配置知其然更知其所以然,具备独立编写、修改、调优K8s配置的能力。


二、K8s YAML生产标准语法(新手极简入门)

K8s所有资源全部依赖YAML文件管理,无需掌握复杂语法,只需吃透固定五层结构,所有配置通用。

1. YAML核心五层固定结构(必背)

# 1. apiVersion:资源API版本,不同资源版本不同 apiVersion: v1 # 2. kind:资源类型(Pod/Deployment/Service/ConfigMap等) kind: # 3. metadata:元数据(名称、命名空间、标签) metadata: name: namespace: labels: # 4. spec:期望状态(核心配置,我们90%的修改都在这里) spec: # 5. status:实际状态(系统自动生成,无需手动写) status:

2. 生产编写规范(企业通用)

  • 缩进统一使用2个空格,禁止用Tab(YAML严格敏感)

  • 资源命名小写、中划线分隔,语义清晰,例如:jar-demo-service

  • 必须配置namespace,禁止默认default环境混用

  • 必须添加labels标签,用于资源筛选、服务关联


三、K8s五大核心生产资源实操详解

只讲工作、生产、部署能用到的核心资源,摒弃冷门废弃组件。

1. Namespace 环境资源隔离

作用:划分开发、测试、生产环境,资源互相隔离,避免冲突,企业必备规范。

常用命令:

# 查看所有命名空间 kubectl get ns # 创建命名空间 kubectl create ns dev # 删除命名空间(连带删除所有资源) kubectl delete ns dev

生产规范:所有业务服务统一部署在自定义namespace,不使用默认default命名空间。

2. Pod 最小运行单元

Pod是K8s最小调度单元,一个Pod可以包含多个容器,我们的Jar、Python、Go、中间件容器全部运行在Pod中。

生产注意:企业不直接创建Pod,全部通过Deployment管理Pod,实现自愈、扩容、重启。

3. Deployment 无状态服务核心控制器

使用率100%,所有业务服务(Java/Python/Go)全部使用Deployment部署,核心能力:

  • 副本管理:指定运行N个Pod实例

  • 故障自愈:Pod挂了自动重建

  • 滚动更新:零停机版本升级

  • 弹性扩缩容:手动/自动调整副本数量

4. Service 内网固定流量入口

Pod IP是动态变化的,重启即变,Service作用:

  • 提供固定不变的内网IP+端口

  • 自动负载均衡多个Pod流量

  • 实现服务之间内网互通

类型:默认ClusterIP(仅内网访问,生产业务首选)。

5. Ingress 统一外网入口

替代杂乱的NodePort端口暴露,通过域名+路径统一转发所有服务,企业生产唯一外网访问方案。

K3s默认自带Ingress组件,无需额外安装,开箱即用。


四、生产配置核心:ConfigMap & Secret(告别硬编码)

Docker时代我们习惯把配置写死在镜像、启动命令里,K8s生产环境绝对禁止

1. ConfigMap:普通配置文件管理

存放非敏感配置:yml、properties、json、环境变量,支持热更新,改配置无需重打包、无需重启Pod。

适用场景:SpringBoot配置、Python参数、服务通用配置。

2. Secret:加密私密配置管理

存放敏感数据:数据库密码、Redis密钥、Token、账号密码,数据加密存储,杜绝明文泄露。

适用场景:所有中间件密码、业务密钥、授权信息。


五、生产级健康探针(解决服务假死、流量错乱)

90%新手服务不稳定的根源:没有配置探针

默认K8s只要容器启动成功就接入流量,但是很多服务(尤其是Java)启动慢,容器起来了,服务还没初始化完成,导致服务假死、503报错、流量涌入崩溃

1. 两种核心探针(生产必配)

  • Readiness就绪探针:检测服务是否准备好接收流量,未就绪不接入流量

  • Liveness存活探针:检测服务是否存活,卡死/无响应自动重启Pod

2. 通用探测方式

  • HTTPGet:适配Web服务(Jar/Flask/Go接口服务)

  • TCP Socket:适配数据库、Redis等端口服务

  • Exec命令:适配后台脚本、无端口服务

后续所有业务服务部署,都会标配生产级探针配置。


六、搭建私有镜像仓库(Docker镜像迁移K8s必备)

我们自己打包的Jar、Python、Go镜像无法直接被K8s调度,必须上传镜像仓库,公共仓库不安全、速度慢,生产/学习首选本地私有仓库。

1. 一键搭建Docker私有仓库

# 启动私有仓库容器 docker run -d \ --name private-registry \ -p 5000:5000 \ --restart=always \ -v /data/registry:/var/lib/registry \ registry:2

2. 配置K3s信任私有仓库(关键步骤)

K3s默认禁止非HTTPS私有镜像,需要配置信任http仓库:

# 创建仓库配置目录 mkdir -p /etc/rancher/k3s/registries.yaml # 写入信任配置(替换你的服务器IP) cat > /etc/rancher/k3s/registries.yaml <<EOF mirrors: "192.168.1.100:5000": endpoint: - "http://192.168.1.100:5000" EOF

重启K3s生效:

systemctl restart k3s

3. 镜像上传与拉取流程(Docker迁移K8s核心流程)

# 1. 本地打包镜像 docker build -t 服务名:版本 . # 2. 打私有仓库标签 docker tag 服务名:版本 服务器IP:5000/服务名:版本 # 3. 推送至私有仓库 docker push 服务器IP:5000/服务名:版本 # 4. K8s直接拉取部署 # YAML中镜像地址填写:服务器IP:5000/服务名:版本

至此,我们自己的业务镜像可以被K8s正常调度部署,完美衔接Docker打包流程。


七、生产资源限制配置(杜绝OOM、集群雪崩)

不配置资源限制,单个服务内存溢出、CPU打满,会抢占整个集群资源,导致所有服务崩溃,是生产重大事故根源。

1. 核心参数说明

  • requests:服务启动最小需要资源(调度依据)

  • limits:服务最大可用资源(超过直接OOM杀死)

2. 通用生产配置模板

resources: requests: cpu: 100m memory: 128Mi limits: cpu: 1000m memory: 1Gi

后续Jar、Python、Go服务会根据各自特性微调资源参数,适配不同服务性能。


八、手写第一个完整生产级K8s服务(闭环实操)

整合本篇所有知识点,手写一套Namespace+Deployment+Service+探针+资源限制完整配置,零基础吃透落地。

1. 创建测试命名空间

kubectl create ns demo

2. 完整YAML配置(可直接复用)

apiVersion: v1 kind: ConfigMap metadata: name: demo-config namespace: demo data: app.name: k8s-demo-service --- apiVersion: apps/v1 kind: Deployment metadata: name: demo-deploy namespace: demo labels: app: demo spec: replicas: 1 selector: matchLabels: app: demo template: metadata: labels: app: demo spec: containers: - name: demo-nginx image: nginx:alpine ports: - containerPort: 80 # 资源限制 resources: requests: cpu: 100m memory: 128Mi limits: cpu: 500m memory: 256Mi # 就绪探针 readinessProbe: httpGet: path: / port: 80 initialDelaySeconds: 3 periodSeconds: 5 # 存活探针 livenessProbe: httpGet: path: / port: 80 initialDelaySeconds: 5 periodSeconds: 10 # 挂载配置 env: - name: APP_NAME valueFrom: configMapKeyRef: name: demo-config key: app.name --- apiVersion: v1 kind: Service metadata: name: demo-svc namespace: demo spec: selector: app: demo ports: - port: 80 targetPort: 80 type: ClusterIP

3. 部署与验证命令

# 应用配置部署服务 kubectl apply -f demo.yaml # 查看资源状态 kubectl get all -n demo # 查看Pod详情、探针状态 kubectl describe pod -n demo # 测试内网访问 kubectl exec -it 任意pod名 -- curl localhost

部署成功标志:Pod状态Running、就绪探针通过、服务正常访问、配置挂载生效。


九、本篇总结

本篇彻底打通了K8s生产部署的底层核心能力,补齐了新手最大短板:

  • 掌握YAML生产规范,不再无脑复制配置

  • 吃透五大核心资源生产场景

  • 搭建私有镜像仓库,实现Docker镜像无缝迁移K8s

  • 掌握探针、资源限制、配置挂载三大生产刚需能力

  • 独立手写完整生产级服务配置,实现部署闭环

从本篇开始,我们已经完全脱离「玩具式K8s部署」,具备企业级部署的基础规范与能力。


下期预告

第三篇:实战部署Java Jar(SpringBoot)生产全流程

手把手完成:Jar打包→生产Dockerfile→私有仓库推送→K8s部署→ConfigMap配置热更新→Ingress外网访问→滚动更新&版本回滚全套生产实操!

欢迎订阅专栏,零基础吃透K8s生产实战!