每日一Go-65、一次搞懂 K8s 配置、扩缩容与发布:ConfigMap / Secret / HPA / 滚动更新

9 阅读4分钟

一、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 \
  -"{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"checksum/config\":\"$(date +%s)\"}}}}}"

6. 回滚

kubectl rollout undo deployment golang-per-day-65

友情链接:加班费计算器(vx小程序搜索“加班计”)


*源码地址*

1、公众号“Codee君”回复“源码”获取源码

2、pan.baidu.com/s/1B6pgLWfS…


如果您喜欢这篇文章,请您(点赞、分享、亮爱心),万分感谢!