在k8s裏對應用進行部署,主要也就是無狀態應用deployment,服務發現service和反向代理ingress了,因此此次主要來介紹它們,若是對yaml語法不清楚的同窗還須要看個人上一篇文章。<k8s~helm裏的yaml的介紹>html
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 }}
服務配置,主要是跟應用暴露的端口進行綁定,通常應用也只會暴露80端口,提供新的端口給外部訪問,也可供路由Ingress訪問nginx
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 -綁定的無狀態應用
下面配置路由,主要跟上面配置的服務綁定,通常不讓服務直接暴露使用,這裏多用了一層路由
,主要是路由有負載
跟灰度
的做用,並且只提供一個IP(通常一個集羣只有一個路由IP)api
{{- 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 -}}
APPNAME=admin helm --kubeconfig k8s.conf upgrade -i \ --set-file configDatas.XXX=XXXX.txt \ --set apiAppResources.requests.cpu=1 \ ${APPNAME} ./chart