【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生产实战!
更多推荐

所有评论(0)