Helm in k3s

在 k3s 内使用 Helm(国内)

1. AppHub

Helm 可以类似理解为 ”K8s OS“ 的包管理工具,再以前没有这个工具我们要手动写 yaml/json 文件来自动化部署应用,但是 Helm 就类似于 Homebrew 一样,有人帮我们写好了配置文件(Chart),我们只需要一个命令,加自定义的参数就行了。

helm install stable/mysql --generate-name

Helm 官方提供了一个 Chart 仓库,Helm Hub,但是众说周知的原因,无法访问。阿里云原生团队提供了镜像服务,同步所有 Charts 并且将其中的 gcr.io 等镜像地址全部替换为国内可以访问的镜像。

阿里云 Helm charts 开源仓库。

AppHub

AppHub 的主要职责之一,是把所有 Helm 官方 Hub 托管的应用,都自动同步到国内,并自动将 Charts 文件中的 gcr.io 等有网络访问问题的 URL 替换成为稳定的国内镜像 URL。

2. k3s 提供的内建 CRD

k3s 内建了一个 CRD 并且也内置了 Helm V3 & V2, 从而使得 Helm 的使用可以使用另一种方式。

什么是 CRD,Custom Controllers,参考 k8s 官方介绍。

什么是 Operator,参考 CoreOS 的官方介绍。

下面是 k3s 中内建 Helm Operator 的资源类型。

[root@bowser1704 ~]# kubectl api-resources --api-group=helm.cattle.io
NAME         SHORTNAMES   APIGROUP         NAMESPACED   KIND
helmcharts                helm.cattle.io   true         HelmChart

那么在这个 CRD 里面怎么使用国内镜像呢?

HelmChart namespace 必须为 kube-system 因为 HelmChart 的 controller 只在 kube-system 里面。

Keep in mind that namespace in your HelmChart resource metadata section should always be kube-system, because the K3s deploy controller is configured to watch this namespace for new HelmChart resources.

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: example-helmchart
  namespace: kube-system
spec:
  helmVersion: v3
  chart: test-helmchart
  targetNamespace: test-namespace
  version: 0.0.1 
  repo: https://apphub.aliyuncs.com

3. 使用 release 文件

k3s helm

在路径 /var/lib/rancher/k3s/server/static/charts/ 下的 tgz 格式文件可以通过 kubernetes API 访问。

所以可以通过下载 tgz / helm chart release 文件解决「网络」问题。yaml 文件可以这么写:

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik
  namespace: kube-system
spec:
  chart: https://%{KUBERNETES_API}%/static/charts/traefik-1.81.0.tgz
  valuesContent: |-
    rbac:
      enabled: true
    ssl:
      enabled: true
    metrics:
      prometheus:
        enabled: true
    kubernetes:
      ingressEndpoint:
        useDefaultPublishedService: true
    image: "rancher/library-traefik"
    tolerations:
      - key: "CriticalAddonsOnly"
        operator: "Exists"
      - key: "node-role.kubernetes.io/master"
        operator: "Exists"
        effect: "NoSchedule"    

如何下载 helm chart release

安装 helm 到网络环境良好的机器,例如你的电脑。

helm pull loki/promtail
# download promtail-x.x.x.tgz to your current directory.

然后上传到机器上,copy 到 /var/lib/rancher/k3s/server/static/charts/ 目录下。


Ref:

  1. Operator 与 Controller 的区别

  2. Exploring the HelmChart custom resource in k3s