1 一般惯例
- chart 名称必须是小写字母和数字。单词之间可以使用横杠分隔(-)
- Helm 尽可能使用 SemVer 2 来表示版本号。
- YAML 文件应该按照 双空格 缩进(绝不要使用 tab 键)。
Chart.yaml需要首字母大写,因为文件名大小写敏感
2 Values.yaml
- 变量名称以小写字母开头,单词按驼峰区分。
- 所有的 Helm 内置变量以大写字母开头,以便与用户定义的 value 进行区分:
.Release.Name,.Capabilities.KubeVersion。 - 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 标签和注释
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: MyName7 自定义资源
自定义资源介绍:Helm | Chart
自定义资源最佳实践:Helm | 自定义资源
Kubernetes 提供了一种声明 Kubernetes 新类型对象的机制。使用 CustomResourceDefinition(CRD), Kubernetes 开发者可以声明自定义资源类型。
8 RBAC
Kubernetes(简称 K8s)的 RBAC(基于角色的访问控制)是一种用于管理和控制对集群资源访问权限的机制。RBAC 允许集群管理员定义不同的角色,并为这些角色分配特定的权限,然后将角色绑定到用户、组或服务账户上。
以下是一个简单的 RBAC 示例,演示如何为某个命名空间中的开发人员创建一个角色,并将其绑定到一个用户。
创建角色
这个角色名为 developer-role,位于 development 命名空间中,允许用户对 Pod 和 Service 资源执行 create、get、list、watch、update 和 delete 操作。
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