1、如云平台整体架构图所示,下面这里是开发人员的流程图。接下来就来搭建一下环境。

chart 获取namespace chart path_redis


2、首先gitlab、harbor的搭建,这里就忽略掉了

3、主要来看分析一下如何制作一个chart

首先values.yaml文件内容如下所示:

replicaCount: 1
image:
  repository: 192.168.1.135:8888/wisecloud/portalms_server
  pullPolicy: IfNotPresent
  tag: latest

imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""

serviceAccount:
  create: true
  annotations: {}
  name: ""
podAnnotations: {}

podSecurityContext: {}


securityContext: {}

service:
  type: ClusterIP
  port: 80

ingress:
  enabled: false
  annotations: {}

  hosts:
    - host: portalms.xxl.com
      paths:
      - path: /
        backend:
          serviceName: portalms-server-svc
          servicePort: 80
  tls: []


resources: {}

autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 5
  targetCPUUtilizationPercentage: 75
  targetMemoryUtilizationPercentage: 80

nodeSelector: {}

tolerations: []

affinity: {}

fullname: portalms-server


config:
  name: portalms-server-cmp
  namespace: wisecloud
  data: |
    [DB]
    username = postgres
    password = 123456
    database = portal
    database_type = postgresql
    pool_size = 120
    host = 192.168.1.133
    port = 23451

    [CAS]
    cas_operator_search = http://192.168.1.130:8822

    [THREAD]
    thread_pool_executor = 100

    [NGINX]
    host=http://192.168.1.130
    port=8007

    [NETHEART]
    heart_time = 30

    [WORKORDER]
    time_interval = 3
    thread_pool_size = 30
    time_out = 30
    delete_mouth=3

    [REDIS]
    redis_db=0
    redis_ip=192.168.1.133
    redis_port=6579
    redis_password=wisecloud2018


    [PUSH_REDIS]
    redis_db=0
    redis_ip=192.168.1.133
    redis_port=6579
    redis_password=wisecloud2018

这里主要是用来定义变量的

接下来看deployment.yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Values.fullname }}-dep
  namespace: {{ .Values.config.namespace }}
  labels:
    app: {{ .Values.fullname }}
spec:
  {{- if not .Values.autoscaling.enabled }}
  replicas: {{ .Values.replicaCount }}
  {{- end }}
  strategy: # 滚动更新
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 25%  # 每次更新的所占百分比
      maxUnavailable: 0% # 最大不可用副本占比
  selector:
    matchLabels:
      app: {{ .Values.fullname }}
  template:
    metadata:
      {{- with .Values.podAnnotations }}
      annotations:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      labels:
        app: {{ .Values.fullname }}
    spec:
      {{- with .Values.imagePullSecrets }}
      imagePullSecrets:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      serviceAccountName: {{ include "portalms-chart.serviceAccountName" . }}
      securityContext:
        {{- toYaml .Values.podSecurityContext | nindent 8 }}
      containers:
        - name: {{ .Chart.Name }}
          securityContext:
            {{- toYaml .Values.securityContext | nindent 12 }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          ports:
            - name: http
              containerPort: 4050
              protocol: TCP
          volumeMounts:
            - name: portalms-config
              mountPath: /opt/wisecloud/portalms/portal_server/utils/portal_conf.ini
          livenessProbe:
            httpGet:
              path: /api/portalms/portal
              port: 4050
          readinessProbe:
            httpGet:
              path: /api/portalms/portal
              port: 4050
          resources:
            {{- toYaml .Values.resources | nindent 12 }}
      volumes:
        - name: portalms-config
          configMap:
            name: {{ .Values.config.name }}
      {{- with .Values.nodeSelector }}
      nodeSelector:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.affinity }}
      affinity:
        {{- toYaml . | nindent 8 }}
      {{- end }}
      {{- with .Values.tolerations }}
      tolerations:
        {{- toYaml . | nindent 8 }}
      {{- end }}

首先分析头一段:

chart 获取namespace chart path_配置信息_02


这里换成真实的地址,应该就是:

chart 获取namespace chart path_chart 获取namespace_03


这里没有什么好说的,接下来分析下面这一段

chart 获取namespace chart path_ide_04


这里也很简单,主要是要注意一下,这个deployment的selector匹配的是app为portalms-server的,意味着pod需要贴上这个标签。

chart 获取namespace chart path_ide_05


而这里就是具体deployment里面的内容了,仔细瞧瞧,首先metadata里面,主要贴上了上面说的标签。

chart 获取namespace chart path_chart 获取namespace_06


这里加上了拉取镜像的secret,

chart 获取namespace chart path_ide_07


这里是serviceAccountName

chart 获取namespace chart path_配置信息_08


接下来这里是核心部分:

chart 获取namespace chart path_chart 获取namespace_09


首先是定义了容器的端口是4050,然后做了一个挂载,挂载选择的是portalms-config,然后就是探测,最后是做资源的限制。

其中挂载指定的是portalms-config

继续往下看,会发现portalms-config,其实是指定了一个名为portalms-server-cmp的configmap。

chart 获取namespace chart path_ide_10

既然这里指定了configmap,那么就看下configmap.yaml文件

非常的简单:这个configmap就是指定了一个portal_conf的配置,然后后面是配置信息

chart 获取namespace chart path_redis_11


那么这里挂载的含义,就是会将下面这一串配置信息,挂载到容器的/opt/wisecloud/portalms/portal_server/utils/portal_conf.ini文件里面去。

chart 获取namespace chart path_redis_12


不过,其实这里最好让configmap引用values.yaml里面的配置,不然相当于这个配置就是写死的了。后续再优化吧。至此deployment和configmap应该是没有问题的,那么接下来看一下service

chart 获取namespace chart path_ide_13


service也非常的简单,这里使用的是NodePort的方式,且service的端口是的端口是80。整体来说是没有什么问题的,那么这个chart运行起来会是什么样的呢?我们先 来预测下:

a、命名空间namespace为wisecloud
b、会创建一个名为portalms-server-cmp的configMap
c、会创建一个名为portalms-server-dep的deployment,这个deployment下面会有一个pod,pod里面的容器用的是portalms,且对外暴露的端口应该是4050
d、会创建一个名为portalms-server-svc的service服务,这个服务使用的nodeport方式,service的端口是80,会代理到pod的4050端口,且会在宿主机上生成一个随机的端口。用来提供对外访问。假设这个端口是30000,k8s集群里面的任意一台节点机器为192.168.1.1
那么通过访问192.168.1.1:30000即可代理到启动的portalms服务。

那么启动一下看看:

chart 获取namespace chart path_配置信息_14


从这里可以看到service是NodePort方式,且节点ip为32253,去任意一个节点看一下这个端口:

chart 获取namespace chart path_chart 获取namespace_15


然后通过jmeter来访问一下这个服务是不是正常的:服务是通的,表示portalms这个服务确实是启动了

chart 获取namespace chart path_chart 获取namespace_16


chart 获取namespace chart path_配置信息_17