在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里面的所有配置都可以用這個命令進行修改,用這個可以做到無環境化