helm是k8s的包管理工具

安装

https://github.com/helm/helm/releases

  1. 解压(tar -zxvf helm-v3.0.0-linux-amd64.tar.gz)
  2. 在解压目中找到helm程序,移动到需要的目录中(mv linux-amd64/helm /usr/local/bin/helm)

入门

chart的结构一般如下

mychart/
  Chart.yaml
  values.yaml
  charts/
  templates/
  ...

templates/ 目录包括了模板文件。当Helm评估chart时,会通过模板渲染引擎将所有文件发送到templates/目录中。 然后收集模板的结果并发送给Kubernetes。
values.yaml 文件也导入到了模板。这个文件包含了chart的 默认值 。这些值会在用户执行helm install 或 helm upgrade时被覆盖。
Chart.yaml 文件包含了该chart的描述。你可以从模板中访问它。charts/目录 可以 包含其他的chart(称之为 _子chart_)。(描述性的,一般这个文件不用怎么管

你可以使用helm create chartname来快速创建一个项目文件夹,里面包含了一个完整的结构,甚至包含了一些预生成的模版,如下

[root@master linux-amd64]# helm create testlist
[root@master testlist]# ll
total 16
drwxr-xr-x 2 root root 4096 Sep  1 14:34 charts
-rw-r--r-- 1 root root 1144 Sep  1 14:34 Chart.yaml
drwxr-xr-x 3 root root 4096 Sep  1 14:34 templates
-rw-r--r-- 1 root root 1875 Sep  1 14:34 values.yaml

[root@master testlist]# ll templates/
total 32
-rw-r--r-- 1 root root 1841 Sep  1 14:34 deployment.yaml
-rw-r--r-- 1 root root 1792 Sep  1 14:34 _helpers.tpl
-rw-r--r-- 1 root root  919 Sep  1 14:34 hpa.yaml
-rw-r--r-- 1 root root 2081 Sep  1 14:34 ingress.yaml
-rw-r--r-- 1 root root 1751 Sep  1 14:34 NOTES.txt
-rw-r--r-- 1 root root  322 Sep  1 14:34 serviceaccount.yaml
-rw-r--r-- 1 root root  364 Sep  1 14:34 service.yaml
drwxr-xr-x 2 root root 4096 Sep  1 14:34 tests
[root@master testlist]# ll templates/tests/
total 4
-rw-r--r-- 1 root root 382 Sep  1 14:34 test-connection.yaml

你可以把他们全部删除然后写你自己的,你也可以在这些文件的基础上进行修改,helm官方有一些别人已经写好的helm,你可以helm pull把他们拉下来,但是一般实际环境还是得要根据自己的需求去写

常用指令

helm create chartname 创建一个helm工程文件夹
helm package path 打包一个helm版本包
helm lint path 验证chart
helm uninstall release_name 卸载一个已经安装的包
helm test 测试模拟安装
helm template 渲染模版,可以看看各个值映射的对不对

编写示例:普罗米修斯容器化方案

prometheus+grafana,并实现以文件的方式自动发现
当然,这里只是简单演示,具体请按自己情况来添加其他需要的功能
deployment:

prometheus.yaml

#/bin/prometheus --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus --web.console.libraries=/usr/share/prometheus/console_libraries --web.console.templates=/usr/share/prometheus/consoles

apiVersion: apps/v1
kind: StatefulSet
metadata: 
  name: prometheus
  namespace: {{.Values.namespace}}
spec: 
  serviceName: prometheus
  replicas: {{.Values.prom.replicaCount}}
  selector: 
    matchLabels: 
      app: prometheus
  template: 
    metadata: 
      labels: 
        app: prometheus
    spec: 
      containers: 
      - name: prometheus
        image: prom/prometheus:latest
        imagePullPolicy: IfNotPresent
        args:
        - "--config.file=/etc/prometheus/conf/prometheus.yml"
        # user: root
        # command:  ["chmod", "-R", "777", "/prometheus"]
        volumeMounts: 
          - mountPath: /etc/prometheus/conf/
            name: prometheusconf
          - name: storage 
            mountPath: /prometheus
          - name: static-sd
            mountPath: /var/
      volumes: 
      - name: prometheusconf
        hostPath:
          path: /prom/conf/ #配置文件存放地址
      - name: storage
        hostPath: 
          path: /data01/ #node上的挂载点,记得权限放高点,不然pod里面的用户没有修改这个目录的权限就会导致失败
          type: DirectoryOrCreate
      - name: static-sd
        configMap:
          name: prometheus-file-sd #节点自动发现

grafana.yaml

apiVersion: apps/v1 
kind: Deployment
metadata: 
  name: grafana
  namespace: {{.Values.namespace}}
spec: 
  replicas: 1 
  selector: 
    matchLabels: 
      app: grafana
  template: 
    metadata: 
      labels: 
        app: grafana 
    spec:
      containers: 
      - name: grafana
        image: grafana/grafana:latest
        imagePullPolicy: IfNotPresent

configuremap:

file-sd.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: prometheus-file-sd
  namespace: {{ .Values.namespace }}
  labels:
    app: promtest
data:
  file-sd.json: |
    [
    ]

service

prom-ser.yaml

kind: Service
apiVersion: v1
metadata:
  name: prometheus
  namespace: {{ .Values.namespace }}
  labels:
    app: prometheus
spec:
  type: NodePort
  ports:
  - name: http
    port: 9090
    protocol: TCP
    targetPort: 9090
    nodePort: 30001
  selector:
    app: prometheus

gra-ser.yaml

kind: Service
apiVersion: v1
metadata:
  name: grafana
  namespace: {{ .Values.namespace }}
  labels:
    app: grafana
spec:
  type: NodePort
  ports:
  - name: grafana
    port: 3000
    targetPort: 3000
    nodePort: 30002
  selector:
    app: grafana

values.yaml

namespace: promtest

prom: 
  replicaCount: 1
  image:
  - name: prometheus
    image: prometheus:latest
    pullPolicy: IfNotPresent

标签: none

评论已关闭