Technical note

HelmChart制作

参考

常规操作

# 生成骨架
helm create mychart

# 修改并安装
helm install full-coral ./mychart

# 查看实际加载的模板
helm get manifest full-coral

## 安装
helm install clunky-serval ./mychart --namespace mynamespace

# 测试渲染
helm install --debug --dry-run goodly-guppy ./mychart
helm install solid-vulture ./mychart --dry-run --debug --set favoriteDrink=slurm

使用HarborHelm仓库

https://juejin.cn/post/6844903795827146759

# 安装cm-push插件,3.8以上虽然自带push命令,但无法实现向http仓库推送
helm plugin install https://github.com/chartmuseum/helm-push

# 添加HarborHelm仓库
helm repo add dubhe http://harbor.dubhe:30002/chartrepo/dubhe
helm repo update

# 上传chart
helm cm-push ./gogs.tgz dubhe --username admin --password yourpass 

简易脚手架

Chart.yaml

apiVersion: v2
name: mysql
description: Dubhe MySQL Helm Chart for Kubernetes
type: application
version: 1.0.0
appVersion: "5.7.42-debian"

values.yaml

mysql:
  repository: mysql
  tag: 5.7.42-debian
  imagePullPolicy: Always
  storageClassName: longhorn-retain
  storageSize: 20Gi
  nodePort: 30353

templates/deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: "{{ .Values.mysql.repository }}:{{ .Values.mysql.tag }}"
        imagePullPolicy: {{ .Values.mysql.imagePullPolicy }}
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: dubhe-secret
              key: mysql-password
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
        - name: mysql-config
          mountPath: /etc/mysql/mysql.conf.d/mysqld.cnf
          subPath: mysqld.cnf
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql
      - name: mysql-config
        configMap:
          name: mysql-configmap
          items:
            - key: mysql-conf
              path: mysqld.cnf

templates/configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: mysql-configmap
data:
  mysql-conf: |
    [mysqld]
    server_id       = 1
    log-bin         = mysql-bin
    pid-file        = /var/run/mysqld/mysqld.pid
    socket          = /var/run/mysqld/mysqld.sock
    datadir         = /var/lib/mysql
    #log-error      = /var/log/mysql/error.log
    # By default we only accept connections from localhost
    #bind-address   = 127.0.0.1
    # Disabling symbolic-links is recommended to prevent assorted security risks
    symbolic-links=0
    
    lower_case_table_names=1
    sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    character-set-server=utf8
    group_concat_max_len=102400
    max_connections=2000
    max_allowed_packet=524288000
    
    default-time-zone='+08:00'
    # 忽略挂载目录
    ignore-db-dir=lost+found

templates/pvc.yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql
spec:
  accessModes:
    - ReadWriteOnce
  {{- if not ( empty .Values.mysql.storageClassName ) }}
  storageClassName: {{ .Values.mysql.storageClassName }}
  {{- end }}
  resources:
    requests:
      storage: {{ .Values.mysql.storageSize }}

templates/service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
  clusterIP: None

templates/service-exposed.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql-exposed
spec:
  selector:
    app: mysql
  ports:
    - protocol: TCP
      port: 3306
      targetPort: 3306
      {{- if not ( empty .Values.mysql.nodePort ) }}
      nodePort: {{ .Values.mysql.nodePort }}
      {{- end }}
  type: NodePort