【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个空格禁止用TabYAML严格敏感资源命名小写、中划线分隔语义清晰例如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存活探针检测服务是否存活卡死/无响应自动重启Pod2. 通用探测方式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 \ --restartalways \ -v /data/registry:/var/lib/registry \ registry:22. 配置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 k3s3. 镜像上传与拉取流程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服务闭环实操整合本篇所有知识点手写一套NamespaceDeploymentService探针资源限制完整配置零基础吃透落地。1. 创建测试命名空间kubectl create ns demo2. 完整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: ClusterIP3. 部署与验证命令# 应用配置部署服务 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 JarSpringBoot生产全流程手把手完成Jar打包→生产Dockerfile→私有仓库推送→K8s部署→ConfigMap配置热更新→Ingress外网访问→滚动更新版本回滚全套生产实操欢迎订阅专栏零基础吃透K8s生产实战