Skip to content

k8s部署

  • 使用前提,有部署好的k8s集群

yaml

命令空间

  • 为项目分配个专门的命名空间
yaml
apiVersion: v1
kind: Namespace
metadata:
    name: dev

pv & pvc

  • 持久化存储,挂载到容器内,存放日志、上传文件等
yaml
# 申请 PV
apiVersion: v1
kind: PersistentVolume
metadata:
    name: dev-pv
    labels:
        app: dev-pv
spec:
    # 存储大小
    capacity:
        storage: 5Gi
    # 访问模式
    accessModes:
        - ReadWriteOnce # 单个节点 读写
    # 存储介质:使用宿主机本地目录
    hostPath:
        path: /data/dev
        type: DirectoryOrCreate # 不存在就创建
    # 回收策略:删除PVC后PV保留数据
    persistentVolumeReclaimPolicy: Retain
---
# 申请 PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
    name: dev-pvc
    namespace: dev
    labels:
        app: dev-pvc
spec:
    # 访问模式
    accessModes:
        - ReadWriteOnce # 单个节点 读写
    resources:
        requests:
            storage: 5Gi # 申请5G存储空间
    # 关联pv
    selector:
        matchLabels:
            app: dev-pv # pv的label

configMap

  • 存放程序的配置文件
  • mysqlredis等秘钥配置需要放在secret
  • 本程序测试,只放了mysql,redis,真实情况,所有秘钥相关的都放在secret里面
yaml
# 配置文件
apiVersion: v1
kind: ConfigMap
metadata:
    name: backend-api-cm
    namespace: dev
data:
    backend-api.yaml: |
        Name: backend-api
        Host: 0.0.0.0
        Port: 8100

        Log:
          ServiceName: backend-api #服务名称
          Mode: file  # 日志模式,console-输出到console,file-输出到当前服务器(容器)文件,volume-输出docker挂在文件内
          Encoding: json  # 日志展示方式,开发选择plain,生产json default=json,options=[json,plain]
          TimeFormat: 2006-01-02 15:04:05  # 时间格式
          Path: /app/logs  # 日志存储路径,默认logs
          Level: info     # 日志写入级别 info|error|severe
          Compress: true  # 是否开启gzip压缩
          KeepDays: 15     # 日志保留天数
          StackCooldownMillis: 100 # 日志write间隔,默认100  #多少毫秒后再次写入堆栈跟踪。用来避免堆栈跟踪日志过多
          MaxBackups: 0 # default=0
          MaxSize: 0 # default=0
          Rotation: daily # `json:",default=daily,options=[daily,size]"`
          Stat: true   # 是否开启stat服务,1.4.4版本新增参数`json:",default=true"`

        MySql:
          Host: ${Mysql_Host}
          Port: 3306
          User: ${Mysql_User}
          Password: ${Mysql_Password}
          Database: base
          Prefix:
          Charset: utf8mb4

        Redis:
          Host: ${Redis_Host}
          Type: ${Redis_Type}
          Password: ${Redis_Password}

        # jwt 配置
        Jwt:
          Secret: 2QCgGgG5eRrFxQaKAEswWJe4BewVpA7u

        # 应用配置
        App:
          # 当前环境
          Env: test
          # 当前环境key
          Key: ncDhGL5Fx2KBn5knH7MYCakeJYEycAYq
          # csrf
          Csrf:
            Enable: false
            Key: pDpcAXzTtpRXsmMf

        # article rpc 配置
        ArticleRpc:
          Etcd:
            Hosts:
              - 212.64.13.112:2379
            Key: article.rpc
            Timeout: 3000

        # 链路追踪
        Telemetry:
          Name: backend-api            # 在追踪 UI 中显示的服务名称
          Endpoint: localhost:4317     # OTLP gRPC 端点
          Sampler: 0.1                 # 1.0 = 100% 采样;高流量生产环境建议 0.1
          Batcher: otlpgrpc            #

        # 抓取数据
        Prometheus:
          Host: 0.0.0.0
          Port: 8101
          Path: /metrics

secret

  • 把数据放secret里面,字段进行base64编码
yaml
# 配置文件
apiVersion: v1
kind: Secret
metadata:
    name: backend-api-secret
    namespace: dev
    # 禁止随意删除
    annotations:
        kubernetes.io/protected-secret: 'true'
type: Opaque
data:
    # base64加密
    Mysql_Host: MjEyLjY0LjEzLjExMg==
    Mysql_User: YmFzZQ==
    Mysql_Password: TjRzTEIyd2FQZTdya0VGag==

    Redis_Host: MjEyLjY0LjEzLjExMjo2Mzc5
    Redis_Type: bm9kZQ==
    Redis_Password: QThVYUVEZGhjSFNG

deployment

  • 正式部署程序
yaml
# 部署项目
apiVersion: apps/v1
kind: Deployment
metadata:
    name: backend-api
    namespace: dev
spec:
    # 设置2个副本
    replicas: 2
    # 滚动更新
    strategy:
        type: RollingUpdate
        # 副本少就用固定1 大于10pod时,用25%比较好
        rollingUpdate:
            maxSurge: 1 # 更新时集群允许临时多跑多少个 Pod
            maxUnavailable: 1 # 更新过程中旧 Pod 最多同时下线多少个 Pod
    selector:
        # 匹配pod标签
        matchLabels:
            app: backend-api-pod
    template:
        metadata:
            # 设置 pod 标签
            labels:
                app: backend-api-pod
        spec:
            # 配置拉取镜像账号
            imagePullSecrets:
                - name: harbor-secret
            # 配置挂载目录
            volumes:
                # 挂载pvc 持久存储
                - name: storage # 挂载目录名称
                  persistentVolumeClaim:
                      claimName: dev-pvc # 必填:已创建的PVC名称
                      readOnly: false # 可读写
                # 挂载configmap配置文件
                - name: config
                  configMap:
                      name: backend-api-cm
            containers:
                - name: backend-api-container
                  image: harbor.elai.team/base/backend-api:v1.0.18
                  command:
                      - './backend'
                      - '-f'
                      - '/app/config/backend-api.yaml'
                  # 镜像拉取策略:• Always:每次创建都拉取• IfNotPresent:本地没有才拉取(默认)• Never:只使用本地镜像
                  imagePullPolicy: IfNotPresent
                  ports:
                      - containerPort: 8100
                      - containerPort: 8101
                      - containerPort: 4317
                  # 挂载配置文件
                  # secret为环境变量
                  envFrom:
                      - secretRef:
                            name: backend-api-secret
                  volumeMounts:
                      # 使用configmap配置文件挂载到容器内
                      - name: config
                        mountPath: /app/config
                        readOnly: true
                      # 把日志放在pvc 持久存储内
                      - name: storage # 挂载目录名称
                        mountPath: /app/backend-api/logs/ # 日志目录
                        subPath: logs
                        readOnly: false
                      # 把上传文件放在pvc 持久存储内
                      - name: storage # 挂载目录名称
                        mountPath: /app/backend-api/upload # 上传目录
                        subPath: upload
                        readOnly: false
                  # 资源限制
                  resources:
                      # 最小资源
                      requests:
                          cpu: 300m
                          memory: 1Gi
                      # 资源上限
                      limits:
                          cpu: 1000m
                          memory: 1.5Gi
                  # 启动探针:应对慢启动
                  startupProbe:
                      httpGet:
                          path: /v1/health
                          port: 8100
                      initialDelaySeconds: 3
                      periodSeconds: 5
                      failureThreshold: 5
                      # 连续成功多少次判定正常
                      successThreshold: 1
                  # 就绪探针:成功就分配流量
                  readinessProbe:
                      httpGet:
                          path: /v1/health
                          port: 8100
                      # 容器启动后首次探测等待时间
                      initialDelaySeconds: 5
                      # 探测间隔
                      periodSeconds: 15
                      # 单次探测超时时间
                      timeoutSeconds: 3
                      # 连续失败多少次判定异常
                      failureThreshold: 3
                      # 连续成功多少次判定正常
                      successThreshold: 1
                  # 存活探针:卡死自动重启
                  livenessProbe:
                      httpGet:
                          path: /v1/health
                          port: 8100
                      # 容器启动后首次探测等待时间
                      initialDelaySeconds: 5
                      # 探测间隔
                      periodSeconds: 15
                      # 单次探测超时时间
                      timeoutSeconds: 3
                      # 连续失败多少次判定异常
                      failureThreshold: 3
                      # 连续成功多少次判定正常
                      successThreshold: 1

service

  • 配置服务, 用于内部,外部访问
yaml
# 暴露服务
apiVersion: v1
kind: Service
metadata:
    name: backend-api-svc
    namespace: dev
    labels:
        app: backend-api-svc
spec:
    type: ClusterIP
    selector:
        app: backend-api-pod
    ports:
        - protocol: TCP
          port: 8100 # 集群内 访问端口
          targetPort: 8100 # 容器端口
          name: api
        - protocol: TCP
          port: 8101 # 集群内 访问端口
          targetPort: 8101 # 容器端口
          name: metrics
        - protocol: TCP
          port: 4317 # 集群内 访问端口
          targetPort: 8101 # 容器端口
          name: metrics

ingress

  • 配置ingress, 用于外部访问
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
    name: dev-ingress
    namespace: dev
    annotations:
        # 开启长连接、上传大文件(文件上传接口必备)
        nginx.ingress.kubernetes.io/proxy-body-size: '50m'
        nginx.ingress.kubernetes.io/proxy-connect-timeout: '60s'
        nginx.ingress.kubernetes.io/proxy-read-timeout: '60s'
        # 开启真实IP获取
        nginx.ingress.kubernetes.io/enable-real-ip: 'true'
        nginx.ingress.kubernetes.io/x-forwarded-for: 'true'
spec:
    ingressClassName: nginx
    rules:
        - host: base-backend-api.test
          http:
              paths:
                  - path: /
                    pathType: Prefix
                    backend:
                        service:
                            name: backend-api-svc
                            port:
                                number: 8100