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
  1. --kubeconfig:后面带上k8s的配置,这里阿里云的集群里面可以找到,有内网跟外网两个,随便用哪个都行
  2. upgrade:表示升级,后面的 -i 表示没有创建过的话就创建,有的话就更新
  3. --set-file:这里主要是为了配置配置项跟数据字典索用到的,以文件的形式配置
  4. --set:这个就比较重要了,我们在values.yaml里面的所有配置都可以用这个命令进行修改,用这个可以做到无环境化
posted @ 2020-04-10 14:13  张占岭  阅读(1467)  评论(0编辑  收藏  举报