Appearance
k8s部署
- 使用前提,有部署好的k8s集群
yaml
命令空间
- 为项目分配个专门的命名空间
yaml
apiVersion: v1
kind: Namespace
metadata:
name: devpv & 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的labelconfigMap
- 存放程序的配置文件
mysql,redis等秘钥配置需要放在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: /metricssecret
- 把数据放
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: QThVYUVEZGhjSFNGdeployment
- 正式部署程序
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: 1service
- 配置服务, 用于内部,外部访问
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: metricsingress
- 配置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