k8s~helm的charts里的模版介绍deploymeny_service_ingress
在k8s里对应用进行部署,主要也就是无状态应用deployment,服务发现service和反向代理ingress了,所以这次主要来介绍它们,如果对yaml语法不清楚的同学还需要看我的上一篇文章。<k8s~helm里的yaml的介绍>
无状态应用Deployment模版
apiVersion: apps/v1beta2
kind: Deployment -无状态应用
metadata:
name: {{ include "admin.appname" . }}-api-app -应用名称
labels:
app: {{ include "admin.appname" . }}-api-app -应用标签
spec:
replicas: {{ .Values.apiAppReplicaCount }} -副本集数,就是要开多少个应用
selector:
matchLabels:
app: {{ include "admin.appname" . }}-api-app -映射
template:
metadata:
labels:
app: {{ include "admin.appname" . }}-api-app -映射标签
release: {{ .Release.Revision | quote }} -版本号
spec:
volumes:
- configMap:
defaultMode: 420
name: {{ .Values.configItemName }} -配置项名称,这个是在上面配置项配置的时候的名称
name: volume-{{ include "admin.appname" . }}-api-app -配置项名称,这个是引入之后的别名
{{ if .Values.isDev -}} -开发环境多引入一个数据卷
- hostPath:
path: {{ .Values.volumes.devWwwPath }} -数据卷位置
type: ''
name: {{ .Values.volumes.devWwwName }} -数据卷名称
{{- end }}
imagePullSecrets: -镜像密码
- name: {{ .Values.image.imagePullSecrets }}
dnsPolicy: ClusterFirst
schedulerName: default-scheduler
containers:
- name: {{ include "admin.appname" . }}-api-app -容器名称
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}" -镜像地址跟标签
command:
- /scripts/start.sh -启动脚本
volumeMounts:
- mountPath: /alidata/config -配置项路径
name: volume-{{ include "admin.appname" . }}-api-app -配置项名称,跟上面的对应
{{ if .Values.isDev -}} -开发环境额外配置数据卷
- mountPath: {{ .Values.volumes.devWwwRealPath }} -引入的数据卷配置到容器哪个位置
name: {{ .Values.volumes.devWwwName }} -数据卷名称
{{- end }}
env: -配置环境变量
- name: ADMIN_CONSOLE_URL
value: {{ .Values.consoleHost }}
imagePullPolicy: Always -总是拉去镜像
ports:
- containerPort: 80 -暴露的端口
name: http -名字随便取,不同端口的别一样就行
protocol: TCP
- containerPort: 8080
name: http2
protocol: TCP
strategy: -发布策略
type: RollingUpdate -滚动升级,下面是按什么比例滚动升级
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
livenessProbe: -存活检测
failureThreshold: 3
initialDelaySeconds: 3
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
httpGet:
path: /
scheme: HTTP
port: 80
readinessProbe: -就绪检测
failureThreshold: 3
initialDelaySeconds: 3
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 10
httpGet:
path: /
scheme: HTTP
port: 80
resources: -下面配置了资源限制,比如多少个cpu,多少内存等
{{ toYaml .Values.appResources | indent 12 }}
服务发现svc(service.yaml)模版
服务配置,主要是跟应用暴露的端口进行绑定,一般应用也只会暴露80端口,提供新的端口给外部访问,也可供路由Ingress访问
apiVersion: v1
kind: Service
metadata:
name: {{ include "admin.appname" . }}-api-svc -名称
spec:
type: ClusterIP
ports:
- port: 80 -暴露的端口
targetPort: http -目标端口
protocol: TCP
name: http
- port: 8080
targetPort: 8080
name: http2
selector:
app: {{ include "admin.appname" . }}-api-app -绑定的无状态应用
路由ingress
下面配置路由,主要跟上面配置的服务绑定,一般不让服务直接暴露使用,这里多用了一层路由
,主要是路由有负载
跟灰度
的作用,而且只提供一个IP(一般一个集群只有一个路由IP)
{{- if eq .Values.isRelease false -}} -非灰度环境就配置路由
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: {{ include "admin.appname" . }}-api-ingress -路由名称
annotations:
nginx.ingress.kubernetes.io/service-weight: '' -权重之类的,这里笔者没用到
nginx.ingress.kubernetes.io/ssl-redirect: 'false' -是否强制http跳https,true的话就强制跳
{{ if .Values.isProd -}} -这里是灰度判断,如果带有环境环境的cookie就把请求转发到灰度环境的服务上
nginx.ingress.kubernetes.io/service-match: '{{ include "admin.release.appname" . }}-api-svc: cookie("admin_gray_tag", "release")'
{{- end }}
spec:
tls:
- hosts:
- {{ .Values.apiHost }} -域名绑定
secretName: {{ .Values.hostTls }} -TLs配置
rules:
- host: {{ .Values.apiHost }} -域名配置跳转规则
http:
paths:
- path: /
backend:
serviceName: {{ include "admin.appname" . }}-api-svc -绑定的服务的名称
servicePort: 80
{{ if .Values.isProd -}}
- path: /
backend:
serviceName: {{ include "admin.release.appname" . }}-api-svc -绑定的灰度服务的名称
servicePort: 80
{{- end }}
{{- end -}}
CI/CD中调用Helm命令进行部署
APPNAME=admin
helm --kubeconfig k8s.conf upgrade -i \
--set-file configDatas.XXX=XXXX.txt \
--set apiAppResources.requests.cpu=1 \
${APPNAME} ./chart
- --kubeconfig:后面带上k8s的配置,这里阿里云的集群里面可以找到,有内网跟外网两个,随便用哪个都行
- upgrade:表示升级,后面的 -i 表示没有创建过的话就创建,有的话就更新
- --set-file:这里主要是为了配置配置项跟数据字典索用到的,以文件的形式配置
- --set:这个就比较重要了,我们在values.yaml里面的所有配置都可以用这个命令进行修改,用这个可以做到无环境化