1 一般惯例

  1. chart 名称必须是小写字母和数字。单词之间可以使用横杠分隔(-)
  2. Helm 尽可能使用  SemVer 2 来表示版本号。
  3. YAML 文件应该按照  双空格  缩进(绝不要使用 tab 键)。
  4. Chart.yaml 需要首字母大写,因为文件名大小写敏感

2 Values.yaml

  1. 变量名称以小写字母开头,单词按驼峰区分。
  2. 所有的 Helm 内置变量以大写字母开头,以便与用户定义的 value 进行区分:.Release.Name.Capabilities.KubeVersion
  3. YAML 的类型强制规则有时候是很反常的。比如,foo: false  和  foo: "false"  是不一样的。大整型数如:foo: 12345678  有时会被转换成科学计数法。避免类型强制规则错误最简单的方式是  给所有字符串打引号

3 templates/

templates/ 目录结构应该如下:

  • 如果生成 YAML 输出,模板文件应该有扩展名 .yaml。扩展名是 .tpl 可用于生成非格式化内容的模板文件。
  • 模板文件名称应该使用横杠符号(my-example-configmap.yaml),不用驼峰记法。
  • 每个资源的定义应该在它自己的模板文件中。
  • 模板文件的名称应该反映名称中的资源类型。比如:foo-pod.yaml, bar-svc.yaml

定义的模板(在 {{ define }} 命令中定义的模板)是可全局访问的。这就意味着 chart 和所有的子 chart 都可以访问用 {{ define }} 创建的所有模板。因此,所有定义的模板名称应该被命名空间化。

# 正确的:
{{- define "nginx.fullname" }}
{{/* ... */}}
{{ end -}}
# 错误的:
{{- define "fullname" }}
{{/* ... */}}
{{ end -}}

4 dependencies

Chart.yaml 中声明的 dependencies Helm | 依赖

5 标签和注释

Helm | 标签和注释

6 Pod 和 Pod template

容器镜像应该使用固定的 tag 或镜像 SHA。例如下面形式会更加灵活:

image: "{{ .Values.redisImage }}:{{ .Values.redisTag }}"

所有的 Pod 模板部分应该指定一个 selector。比如:

selector:
  matchLabels:
    app.kubernetes.io/name: MyName
template:
  metadata:
    labels:
      app.kubernetes.io/name: MyName

7 自定义资源

自定义资源介绍:Helm | Chart
自定义资源最佳实践:Helm | 自定义资源

Kubernetes 提供了一种声明 Kubernetes 新类型对象的机制。使用 CustomResourceDefinition(CRD), Kubernetes 开发者可以声明自定义资源类型。

8 RBAC

Helm | 基于角色的访问控制

Kubernetes(简称 K8s)的 RBAC(基于角色的访问控制)是一种用于管理和控制对集群资源访问权限的机制。RBAC 允许集群管理员定义不同的角色,并为这些角色分配特定的权限,然后将角色绑定到用户、组或服务账户上。

以下是一个简单的 RBAC 示例,演示如何为某个命名空间中的开发人员创建一个角色,并将其绑定到一个用户。

创建角色

这个角色名为 developer-role,位于 development 命名空间中,允许用户对 Pod 和 Service 资源执行 creategetlistwatchupdatedelete 操作。

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: development
name: developer-role
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["create", "get", "list", "watch", "update", "delete"]

创建角色绑定

这个角色绑定将 developer-role 角色绑定到用户 developer@example.com,确保该用户在 development 命名空间中拥有相应的权限。

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: developer-rolebinding
  namespace: development
subjects:
  - kind: User
    name: "developer@example.com" # 用户名
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: developer-role
  apiGroup: rbac.authorization.k8s.io