在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