GitHub地址:https://github.com/helm/helm/blob/master/docs/charts.md

介绍

在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制,很大程度上简化了 Kubernetes 应用的部署和管理。Helm 本质就是让 K8s 的应用管(Deployment,Service 等 ) 可配置,能动态生成。通过动态生成 K8s 资源清单文件(deployment.yaml,service.yaml)。然后调用 Kubectl 自动执行 K8s 资源部署。

Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。Helm 有两个重要的概念:chart 和 release。chart 是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。可以将 chart 想象成 apt、yum 中的软件安装包。release 是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。

Helm 包含两个组件:Helm 客户端和 Tiller 服务器,如下图所示:

k8s helm mysql 高可用 最佳实践 k8s operator helm_容器

Helm 客户端负责 chart 和 release 的创建和管理以及和 Tiller 的交互。Tiller 服务器运行在 Kubernetes 集群中,它会处理 Helm 客户端的请求,与 Kubernetes API Server 交互。

helm部署
  1. 获取helm
ntpdate ntp1.aliyun.com
wget https://storage.googleapis.com/kubernetes-helm/helm-v2.13.1-linux-amd64.tar.gz
tar -zxvf helm-v2.13.1-linux-amd64.tar.gz
cd linux-amd64/
cp helm /usr/local/bin/
  1. 分配角色
    因为 Kubernetes APIServer 开启了 RBAC 访问控制,所以需要创建 tiller 使用的 service account: tiller 并分配合适的角色给它。这里简单起见直接分配cluster- admin 这个集群内置的 ClusterRole 给它。创建 rbac-config.yaml 文件。
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: tiller
  namespace: kube-system
kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
kubectl create -f rbac-config.yaml
helm init --service-account tiller --skip-refresh
vim /root/.kube/tiller.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: helm
    name: tiller
  name: tiller-deploy
  namespace: kube-system
spec:
  replicas: 1
  strategy: {}
  selector:
    matchLabels:
      app: helm
      name: tiller
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: helm
        name: tiller
    spec:
      automountServiceAccountToken: true
      containers:
      - env:
        - name: TILLER_NAMESPACE
          value: kube-system
        - name: TILLER_HISTORY_MAX
          value: "0"
        image: gcr.io/kubernetes-helm/tiller:v2.13.1
        imagePullPolicy: Never
        livenessProbe:
          httpGet:
            path: /liveness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
        name: tiller
        ports:
        - containerPort: 44134
          name: tiller
        - containerPort: 44135
          name: http
        readinessProbe:
          httpGet:
            path: /readiness
            port: 44135
          initialDelaySeconds: 1
          timeoutSeconds: 1
        resources: {}
status: {}
---
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: helm
    name: tiller
  name: tiller-deploy
  namespace: kube-system
spec:
  ports:
  - name: tiller
    port: 44134
    targetPort: tiller
  selector:
    app: helm
    name: tiller
  type: ClusterIP
status:
  loadBalancer: {}

...
kubectl apply -f tiller.yaml

tiller 默认被部署在 k8s 集群中的 kube-system 这个namespace 下

kubectl get pod -n kube-system -l app=helm 
helm version
  1. 自定义helm模板
mkdir ./hello-world
 cd ./hello-world
 vim ./Chart.yaml #创建自描述文件 Chart.yaml , 这个文件必须有 name 和 version 定义
	 name: hello-world 
	 version: 1.0.0
./values.yaml
image:
  repository: daocloud.io/library/nginx
  tag: "latest"
mkdir ./templates 
 vim ./templates/deployment.yaml #创建模板文件, 用于生成 Kubernetes 资源清单
 apiVersion: extensions/v1beta1
 kind: Deployment
 metadata:
   name: hello-world
 spec:
   replicas: 1
   template:
     metadata:
       labels:
         app: hello-world
     spec:
       containers:
         - name: hello-world
           image: {{ .Values.image.repository }}:{{ .Values.image.tag }}  #image: daocloud.io/library/nginx
           ports:
             - containerPort: 8080
               protocol: TCP
./templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: hello-world
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: hello-world

使用命令 helm install RELATIVE_PATH_TO_CHART 创建一次Release

helm install .
helm ls # 列出已经部署的 Release
helm status RELEASE_NAME # 查询一个特定的 Release 的状态
helm delete cautious-shrimp # 移除所有与这个 Release 相关的 Kubernetes 资源
helm rollback cautious-shrimp 1 #回滚到指定版本
helm delete --purge cautious-shrimp # 使用 helm delete --purge RELEASE_NAME 移除所有与指定 Release 相关的 Kubernetes 资源和所有这个 Release 的记录
helm ls --deleted 
helm install --set image.tag='latest' . # 在 values.yaml 中的值可以被部署 release 时用到的参数 --values YAML_FILE_PATH 或 --set key1=value1, key2=value2 覆盖掉
helm upgrade -f values.yaml test . # 升级版本
# 使用模板动态生成K8s资源清单,非常需要能提前预览生成的结果。 使用--dry-run --debug 选项来打印出生成的清单文件内容,而不执行部署
helm install . --dry-run --debug --set image.tag=latest