我们可以使用ConfigMap来实现Apollo环境的指定,具体使用方法详见如下示例yaml:
## 创建ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: apollo-server-configmap
namespace: your-namespace
data:
server.properties: |
##本地环境地址
#env=Local
##开发环境地址
env=DEV
apollo.meta=http://xx.xx.xx.xx:8080
##测试环境地址
#env=FAT
#apollo.meta=http://xx.xx.xx.xx:8081
##生产环境地址
#env=PRO
#apollo.meta=http://xx.xx.xx.xx:8082
## 创建Deployment
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: your-app
name: your-app
## 修改此值,改成自己项目的namespace
namespace: your-namespace
spec:
## 单位:秒
progressDeadlineSeconds: 600
## 修改此值,部署副本数量
replicas: 1
## 修改此值或者关闭配置,我们做的回滚操作并不是没有代价的,代价就是旧版本的 ReplicaSet 会被保留,但是不会继续提供服务了。当我们执行回滚操作的时候,就直接使用旧版本的 ReplicaSet。这个配置就是控制保留多少个版本的 ReplicaSet
#revisionHistoryLimit: 1
selector:
matchLabels:
app: your-app
## 定义升级策略,可选值,RollingUpdate(滚动升级,默认),Recreate(先将旧 Pod 下线,再启动新 Pod)
strategy:
rollingUpdate:
## 在升级过程中,最多可以创建多少个 Pod。也就是说每次滚动的步长。该值不能为0。
maxSurge: 50%
## 在升级过程中,最多不可用的 pod 的数量。该值不能为0。
maxUnavailable: 50%
type: RollingUpdate
template:
metadata:
labels:
app: your-app
spec:
# 配置pod亲和性,只能允许在自己服务器
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: project.node
operator: In
values:
- your-project-node-one
- your-project-node-two
# 配置pod的反亲和性
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- topologyKey: kubernetes.io/hostname
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- your-app
## 创建数据卷
volumes:
- name: apollo-server-configmap
configMap:
## 修改此值,ConfigMap 的key值,此值配置路径是:配置-配置字典
name: apollo-server-config
## 默认情况下用于创建文件的模式位。取值范围在0到0777之间。默认值为0644
defaultMode: 420
imagePullSecrets:
## 修改此处,docker镜像仓库地址和用户名密码配置,此值配置路径是:配置-保密字典
- name: registry-secret
containers:
- env:
## dubbo配置,注册到ZK的ip
- name: DUBBO_IP_TO_REGISTRY
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
## 调度中心自动注册ip
- name: XXLJOB_IP_TO_REGISTRY
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.hostIP
## 配置镜像以及版本
image: $REGISTRY/$DOCKERHUB_NAMESPACE/$APP_NAME:$IMAGE_VERSION
## 死循环命令,开启后,则pod必定启动成功,,此时可进入到pod内手动执行java -jar命令启动服务,可用于排查问题
## command: ["/bin/bash", "-ce", "tail -f /dev/null"]
## 镜像的拉取策略,可选值,Always(默认,每次pod启动都去远程pull镜像),IfNotPresent(如果本地没有,就去远程 pull 镜像),Never(只去本地获取镜像)
imagePullPolicy: Always
name: your-app
##容器的终止日志文件
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
## 此值与spec.template.spec.volumes[0].name的值相同
- name: apollo-server-configmap
readOnly: true
## 设置配置中心环境文件挂载路径
mountPath: /opt/settings
## dns 策略
# Default:和宿主机的DNS完全一致
# ClusterFirst:把集群的DNS写入到Pod的DNS配置,但是如果设置了HostNetwork=true,就会强制设置为Default
# ClusterFirstWithHostNet: 把集群的DNS写入到Pod的DNS配置,不管是否设置HostNetwork
# None: 忽略所有的DNS配置,一般来说,设置了None之后会自己手动再设置dnsConfig
dnsPolicy: ClusterFirst
## pod 重启策略
# always: 容器失效时,自动重启容器
# OnFailure: 容器终止运行,且退出码不为0时候重启
# Never: 不重启
restartPolicy: Always
## 优雅重启配置,新pod启动等待此值后再kill老的pod,单位:秒
terminationGracePeriodSeconds: 30
## 创建service
---
apiVersion: v1
kind: Service
metadata:
labels:
app: service-your-app
name: service-your-app
## 修改此值,改成自己项目的namespace
namespace: your-namespace
spec:
ports:
## 修改此值,端口,xxl-job的端口
- name: xxl-your-app
port: 30000
targetPort: 30000
nodePort: 30000
selector:
app: your-app
## 负载策略,可选值,None(随机),ClientIP(ip hash)
## 注意:选ClientIP时,应当增加此配置spec.sessionAffinityConfig.clientIP.timeoutSeconds(默认值为 10800 秒,即 3 小时)
sessionAffinity: None
## 代理策略:默认Cluster。Cluster表示:流量可以转发到其他节点上的Pod。Local表示:流量只发给本机的Pod
## 设置Local才能获取到客户端的真实ip,但是会出现负载不均衡现象,使用:Local模式 + Pod反亲和,一般是足够的
# externalTrafficPolicy: Local
## 修改此值,service类型,可选值,ClusterIP,NodePort
type: NodePort