一、ConfigMap:把“配置”从镜像里剥离出来
1. 它解决了什么问题?
当配置写在代码/Dockerfile里,改个DB地址就需要重建镜像+重新发布;有了ConfigMap之后,配置和程序就彻底解耦。
2. 示例
apiVersion: v1 #定义API版本
kind: ConfigMap #定义资源类型
metadata:
name: golang-per-day-65-configmap #这里填写ConfigMap名称
namespace: codee_jun #这里填写命名空间
data:
config.yaml: |
server:
mode: "prod"
port: 8080
host: 0.0.0.0
readtimeout: 60
writetimeout: 60
log:
level: "info"
mysql:
dsn: root:123456@tcp(mysql.codee_jun.svc.cluster.local:3306)/golang_per_day?charset=utf8&parseTime=True&loc=Local&timeout=10s
redis:
addr: "redis.codee_jun.svc.cluster.local:6379"
password: "123456"
db: 0
jwt:
secret: "golang_per_day_secret_key"
# 24h表示24小时
expire: 24h
ratelimit:
# 每秒放多少个令牌
cap: 1000
# 每秒取多少个令牌
quantum: 1000
3. 让ConfigMap生效
kubectl get configmap -n codee-jun
4. 查看已有的ConfigMap
kubectl get configmap -n codee-jun
二、Secret:用于存储敏感数据。例如数据库密码、Token、TLS证书。
1. 注意:Secret默认只是Base64编码,并不是真正的加密。在生产环境中,请结合KMS(密钥管理服务)使用。
2. 示例:
# 创建secret
kubectl create secret tls codee-jun-tls-secret --cert=./ssl/xxx.crt --key=./ssl/xxx.key -n codee-jun
3. 在ingress中使用
# golang_per_day_65 项目的 Ingress 配置
# 用于管理外部访问集群内服务的路由规则
apiVersion: networking.k8s.io/v1
kind: Ingress
# Ingress 元数据配置
metadata:
name: golang_per_day_65-ingress # Ingress 资源名称
namespace: codee_jun # 所属命名空间
annotations: # Nginx Ingress 控制器特定配置
# CORS 配置
nginx.ingress.kubernetes.io/enable-cors: "true" # 启用跨域资源共享
nginx.ingress.kubernetes.io/cors-allow-origin: "https://golang_per_day_65.com" # 允许的源
nginx.ingress.kubernetes.io/cors-allow-methods: "GET, POST, PUT, DELETE, OPTIONS" # 允许的HTTP方法
nginx.ingress.kubernetes.io/cors-allow-headers: "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range,Authorization" # 允许的请求头
nginx.ingress.kubernetes.io/cors-allow-credentials: "true" # 如果需要凭证
# 代理配置
nginx.ingress.kubernetes.io/proxy-body-size: "1024m" # 允许的请求体大小
# 会话亲和性配置
nginx.ingress.kubernetes.io/affinity: "cookie" # 启用基于cookie的会话亲和性
nginx.ingress.kubernetes.io/session-cookie-name: "golang_per_day_65-session" # 会话cookie名称
nginx.ingress.kubernetes.io/session-cookie-expires: "172800" # cookie过期时间(秒)
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800" # cookie最大生存时间(秒)
# Ingress 规格配置
spec:
ingressClassName: nginx # 使用的Ingress控制器类名
# TLS 配置(HTTPS)
tls:
- hosts:
- golang_per_day_65.com # 域名
secretName: codee-jun-tls-secret # tls证书
# 路由规则
rules:
- host: golang_per_day_65.com # 域名
http: # 协议
paths: # 路径
- path: / # 路径
pathType: Prefix # 路径类型
backend: # 后端
service: # 服务
name: golang-per-day-65 # 服务名称
port: # 服务端口
number: 8080 # 服务端口号
三、HPA(水平扩展)
HPA是K8s的横向Pod自动扩缩容。它通过监控指标(CPU、内存或者自定义指标)来自动调整副本数。
示例:
apiVersion: autoscaling/v2 #定义API版本
kind: HorizontalPodAutoscaler #定义水平Pod自动扩缩容器
metadata: #元数据
name: golang-per-day-65-hpa #这里填写HPA名称
namespace: codee_jun #这里填写命名空间
spec: #HPA规格
scaleTargetRef:
apiVersion: apps/v1 #定义API版本
kind: Deployment #定义资源类型
name: golang-per-day-65 #这里填写Deployment名称
minReplicas: 3 #最小副本数
maxReplicas: 10 #最大副本数
metrics: #指标集合
- type: Resource #资源指标类型
resource: #资源指标
name: cpu #资源名称
target: #资源目标值
type: Utilization #CPU利用率目标
averageUtilization: 80 #CPU利用率目标值
- type: Resource
resource:
name: memory #内存资源名称
target:
type: Utilization #内存利用率目标
averageUtilization: 80 #内存利用率目标值
四、滚动更新
1. 前提条件,需要在Deployment里配置滚动更新的策略
spec: # 部署规格
# 副本数量:期望运行的Pod数量
replicas: 3 # 运行3个Pod副本,提供高可用性
strategy: # 策略:滚动更新策略
type: RollingUpdate # 策略类型:滚动更新
rollingUpdate: # 滚动更新配置
maxSurge: 1 # 最大激增数:允许同时运行的最大Pod数量超过期望副本数
maxUnavailable: 1 # 最大不可用数:允许同时运行的最大Pod数量低于期望副本数
2. 修改yaml+apply是最推荐的方法
- image: imoowi/golang_per_day:day60
+ image: imoowi/golang_per_day:day65
//应用变更
kubectl apply -f app.yaml
3. kubectl set image 最快
kubectl set image deployment/golang-per-day-65 app=imoowi/golang_per_day:day65
4. 强制滚动(不改任何配置)
kubectl rollout restart deployment golang-per-day-65
5. 生产最优雅的滚动更新方式
修改ConfigMap
kubectl apply -f configmap.yaml
更新 checksum
kubectl patch deployment golang-per-day-65 \
-p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"checksum/config\":\"$(date +%s)\"}}}}}"
6. 回滚
kubectl rollout undo deployment golang-per-day-65
友情链接:加班费计算器(vx小程序搜索“加班计”)
*源码地址*
1、公众号“Codee君”回复“源码”获取源码
如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!