跳至内容

集群模板

命令 kops replace 可以用 yaml 文件中的配置替换集群的预期配置(参见 cli/kops_replace.md)。

可以使用命令 kops toolbox template 从模板生成该 yaml 文件(参见 cli/kops_toolbox_template.md)。

本文档详细介绍了使用的模板语言。

作为 --template 传递的文件必须是 go 模板。示例

# File cluster.tmpl.yaml
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  labels:
  kops.k8s.io/cluster: {{.clusterName}}.{{.dnsZone}}
  name: nodes
spec:
  image: {{ ChannelRecommendedImage .cloud .kubernetesVersion .architecture }}
  kubernetesVersion: {{ ChannelRecommendedKubernetesUpgradeVersion .kubernetesVersion }}
  machineType: m4.large
  maxPrice: "0.5"
  maxSize: 20
  minSize: 15
  role: Node
  rootVolumeSize: 100
  subnets:
  - {{.awsRegion}}a
  - {{.awsRegion}}b
  - {{.awsRegion}}c

您可以通过使用 --values PATH 命令行选项传递环境文件,例如。请注意,--values 是一个切片,因此可以多次定义;每个配置文件都会覆盖配置(因此假设重复值,顺序很重要);这种用法的案例是上游集群可以覆盖的默认配置。

作为 --values 传递的文件必须包含模板中引用的变量。示例

# File values.yaml
clusterName: eu1
kubernetesVersion: 1.7.1
dnsZone: k8s.example.com
awsRegion: eu-west-1

当使用 --values 传递多个环境文件时,kOps 将执行深度合并,例如,给定以下两个文件

# File values-a.yaml
instanceGroups:
  foo:
    ami: ami-1234567
    type: m4.large

# File values-b.yaml
instanceGroups:
  foo:
    type: t2.large

将导致 instanceGroups.foo 对象具有两个属性:{"ami": "ami-1234567", "type": "t2.large"}

除了通过环境文件指定值外,还可以使用 --set--set-string 命令行选项直接在命令行上传递变量。这两个选项之间的区别是,--set-string 将始终产生一个字符串值,而 --set 将导致值被解析为一个 YAML 值,例如,值 true 在使用 --set 时将变成一个布尔值,而在使用 --set-string 时它将是文字字符串 "true"。指定变量的格式如下

kops toolbox template --template mytemplate.tpl --set 'version=1.0,foo.bar=baz' --set-string 'foo.myArray={1,2,3}' --set 'foo.myArray[1]=false,foo.myArray[3]=4'

这将产生与使用以下文件中的 --values 选项相同的值

version: 1.0
foo:
  bar: baz
  myArray:
  - "1"
  - false
  - "3"
  - 4

运行 kops toolbox template 将用值替换模板中的占位符并生成文件 output.yaml,然后可以使用它用 kops replace -f cluster.yaml 替换预期的集群配置。

注意:创建集群预期配置模板时,您可以

  • 使用 kops get k8s-cluster.example.com -o yaml > cluster-desired-config.yaml 创建集群预期配置文件(参见 cli/kops_get.md)。此文件中的值在 cluster_spec.md 中定义。
  • 用占位符替换该文件中的值以创建模板。

模板

--template 命令行选项可以指向特定的文件或包含模板集合的目录。一个示例用法是;

$ kops toolbox template --values dev.yaml --template cluster.yaml --template instance_group_directory

cluster.yaml(例如,您的主集群规范)将首先写入,然后写入 instance_group_directory 目录中找到的任何模板。请注意,工具箱会自动为您在文档之间添加 YAML 分隔符。

代码片段

工具箱模板还支持将代码块重用或分解成代码片段目录。通过将 --snippets PATH 传递到包含模板的目录;

$ kops toolbox template --values dev.yaml --template cluster.yaml --template instancegroups --snippets snippets

下面的示例假设您已将适当的文件(即节点.json、master.json 等)放到代码片段目录中。请注意,代码片段的命名空间是平面的,并且始终是文件路径的 basename();因此 snippets/components/docker.options 仍然被称为 'docker.options'。

apiVersion: kops.k8s.io/v1alpha2
kind: Cluster
metadata:
  name: {{ .environment }}.{{ .dns_zone }}
spec:
  docker:
    {{ include "docker" . | indent 4 }}
  additionalPolicies:
    master: |
      {{ include "masters.json" . | indent 6 }}
    node: |
      {{ include "nodes.json" . | indent 6 }}

模板函数

kOps 特定函数

ChannelRecommendedKopsKubernetesVersion

此函数返回针对运行的 kops 版本推荐的 kubernetes 版本。

ChannelRecommendedKubernetesUpgradeVersion

此函数返回推荐的 kubernetes 版本,前提是您当前运行 <kubernetesVersion>。通常,这是给定通道支持的最新修补程序版本。

ChannelRecommendedImage

此函数返回给定云提供商和 kubernetes 版本的推荐镜像。

Sprig 函数

您可以在模板中使用完整的 Sprig 函数 集。请注意,如果您想使用 'defaults' 函数,请在命令行上通过 --fail-on-missing=false 关闭验证检查;

image: {{ default $image $node.image }}
machineType: {{ default $instance $node.machine_type }}
maxSize: {{ default "10" $node.max_size }}
minSize: {{ default "1" $node.min_size }}

Sprig 的 toJson 函数 也支持分配整个数组。

# template
spec:
  kubernetesApiAccess: {{.allowedIPs | toJson }}
# values
allowedIPs:
- 1.2.3.4/32
- 4.3.2.1/32
# rendered
spec:
  kubernetesApiAccess: ["1.2.3.4/32","4.3.2.1/32"]

格式化

golang 模板中的格式化很痛苦!在语句的开头或结尾处正确使用它可能会让人恼火,因此添加了一个 --format-yaml=true(默认为 false)命令行选项。这将首先取消序列化生成的 content(执行语法验证),然后重新序列化 content,删除所有这些讨厌的格式问题,换行符等。