跳至内容

InstanceGroup 资源

InstanceGroup 资源代表一组通常在同一可用区内配置的类似机器。在 AWS 上,实例组直接映射到自动扩展组。

完整的键列表可以在 InstanceGroup 参考页面中找到。

您还可以找到 实例组操作页面 上配置的具体用例。

在本页中,我们将扩展更重要的配置键。

cloudLabels

如果您需要在自动扩展组或实例上添加标签(传播 ASG 标签),您可以在实例组规范中使用 cloudLabels 添加它。在集群规范级别定义的云标签也将被继承。

spec:
  cloudLabels:
    billing: infra
    environment: dev

suspendProcess

自动扩展组自动包含多个 扩展进程,这些进程可以保持 ASG 的健康状态。在某些情况下,您可能希望禁用某些扩展活动。

例如,如果您在使用 Kubernetes 自动扩展器时在 ASG 中运行多个 AZ,则自动扩展器将删除未使用的特定实例。在某些情况下,AZRebalance 进程会在没有警告的情况下重新扩展 ASG。

spec:
  suspendProcesses:
  - AZRebalance

instanceProtection

自动扩展组可能会自动扩展或缩减以平衡实例类型、区域等。 实例保护 可以防止 ASG 被扩展。

spec:
  instanceProtection: true

instanceMetadata

默认情况下,IMDSv2 为新创建的集群启用。从 Kubernetes 1.27 开始,此默认值也应用于现有集群。所有节点角色的默认跳数限制为 1。

要启用 IMDSv2,请将以下配置添加到实例组

spec:
  instanceMetadata:
    httpTokens: required

要禁用 IMDSv2,请将以下配置添加到实例组

spec:
  instanceMetadata:
    httpTokens: optional

externalLoadBalancers

实例组可以链接到最多 10 个负载均衡器。连接后,启动的任何实例都会自动注册到负载均衡器。例如,如果您可以在专门用于运行在 NodePort 上公开的 Ingress 控制器上的实例组,您就可以手动创建负载均衡器并将其链接到实例组。现在,到负载均衡器的流量将自动转到其中一个节点。

您可以指定 loadBalancerName 将实例组链接到 AWS Classic ELB,或者指定 targetGroupArn 将实例组链接到目标组,目标组由应用程序负载均衡器和网络负载均衡器使用。

apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  labels:
    kops.k8s.io/cluster: k8s.dev.local
  name: ingress
spec:
  machineType: m4.large
  maxSize: 2
  minSize: 2
  role: Node
  externalLoadBalancers:
  - targetGroupArn: arn:aws:elasticloadbalancing:eu-west-1:123456789012:targetgroup/my-ingress-target-group/0123456789abcdef
  - loadBalancerName: my-elb-classic-load-balancer

detailedInstanceMonitoring

详细监控将使监控数据每 1 分钟可用一次,而不是每 5 分钟可用一次。 启用详细监控。在生产环境中,您可能需要考虑为更快地进行故障排除而启用详细监控。

注意:启用详细监控会产生 收费

spec:
  detailedInstanceMonitoring: true

additionalUserData

kOps 利用 cloud-init 在引导时初始化和设置主机。但是,在某些情况下,您可能已经在基础设施中利用了 cloud-init 的某些功能,并且希望继续这样做。有关 cloud-init 的更多信息,请参见 此处

可以通过设置 additionalUserData 字段将额外的用户数据传递给主机配置。有效的用户数据内容类型的列表可以在 此处 找到。

脚本将按照 此处 文档中描述的字母顺序执行。

注意:在 Flatcar-OS 中传递 additionalUserData 不受支持,会导致节点无法启动。

示例

spec:
  additionalUserData:
  - name: myscript.sh
    type: text/x-shellscript
    content: |
      #!/bin/sh
      echo "Hello World.  The time is now $(date -R)!" | tee /root/output.txt
  - name: local_repo.txt
    type: text/cloud-config
    content: |
      #cloud-config
      apt:
        primary:
          - arches: [default]
            uri: http://local-mirror.mydomain
            search:
              - http://local-mirror.mydomain
              - http://archive.ubuntu.com

compressUserData

引入
kOps 1.19

压缩用户数据的某些部分,以节省空间并帮助解决某些云中的大小限制。目前,只有 nodeup.sh 中的规范会被压缩。

spec:
  compressUserData: true

packages

引入
kOps 1.24

要将附加包安装到实例组中的主机,请将 packages 字段指定为字符串数组。

包名称是特定于发行版的,不会以任何方式进行验证。指定不正确的包名称可能会阻止节点启动。

例如

apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  name: nodes
spec:
  packages:
  - nfs-common

sysctlParameters

引入
kOps 1.17

要将自定义内核运行时参数添加到您的实例组,请将 sysctlParameters 字段指定为字符串数组。每个字符串必须采用 variable=value 的形式,就像它在 sysctl.conf 中出现的方式一样(另请参见 sysctl(8) 手册页)。

与简单文件资产不同,以这种方式指定内核运行时参数会正确地自动调用 sysctl --system 来应用这些参数。

例如

apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  name: nodes
spec:
  sysctlParameters:
  - fs.pipe-user-pages-soft=524288
  - net.ipv4.tcp_keepalive_time=200

这最终将出现在相关实例组节点上的一个 drop-in 文件中。

mixedInstancesPolicy (仅 AWS)

利用 EC2 Spot 和 capacity-optimized 分配策略的混合实例策略允许 EC2 自动扩展组选择具有最高容量的实例类型。这减少了实例组上出现 Spot 中断的可能性。

可以使用 kops toolbox instance-selector 命令生成具有混合实例策略的实例组。实例选择器接受用户提供的资源参数,如 vcpu、内存等等,以动态选择符合您标准的实例类型。

kops toolbox instance-selector --vcpus 4 --flexible --usage-class spot --instance-group-name spotgroup
apiVersion: kops.k8s.io/v1alpha2
kind: InstanceGroup
metadata:
  labels:
    kops.k8s.io/cluster: spot.k8s.local
  name: spotgroup
spec:
  image: 099720109477/ubuntu/images/hvm-ssd/ubuntu-focal-20.04-amd64-server-20200528
  machineType: c3.xlarge
  maxSize: 15
  minSize: 2
  mixedInstancesPolicy:
    instances:
    - c3.xlarge
    - c4.xlarge
    - c5.xlarge
    - c5a.xlarge
    onDemandAboveBase: 0
    onDemandBase: 0
    spotAllocationStrategy: capacity-optimized
  nodeLabels:
    kops.k8s.io/instancegroup: spotgroup
  role: Node
  subnets:
  - us-east-1a
  - us-east-1b
  - us-east-1c

实例

Instances 是一个实例类型列表,我们愿意在 EC2 自动扩展组中运行这些实例类型。

onDemandAllocationStrategy

指示如何分配实例类型以满足按需容量

onDemandBase

OnDemandBase 是自动扩展组容量的最低数量,必须由按需实例满足。此基础部分将在您的组扩展时首先配置。

onDemandAboveBase

OnDemandAboveBase 控制按需实例和 Spot 实例的百分比,用于超出 OnDemandBase 的额外容量。范围为 0–100。默认值为 100。如果您将此参数保留为 100,则按需实例的百分比为 100%,Spot 实例的百分比为 0%。

spotAllocationStrategy

SpotAllocationStrategy 指示如何在 Spot 实例池中分配实例。

如果分配策略为最低价格,则自动扩展组将使用价格最低的 Spot 池启动实例,并在您在 spotInstancePools 中指定的 Spot 池数量之间均匀分配您的实例。如果分配策略为 容量优化,则自动扩展组将使用基于可用 Spot 容量最佳选择的 Spot 池启动实例。https://docs.aws.amazon.com/autoscaling/ec2/APIReference/API_InstancesDistribution.html

spotInstancePools

仅在 Spot 分配策略为最低价格时使用。分配 Spot 实例的 Spot 实例池数量。Spot 池从 LaunchTemplate 的 Overrides 数组中不同的实例类型确定。如果未设置,默认值为 2。

CapacityRebalance

引入
kOps 1.26

如果使用 Spot 实例,建议在您的 InstanceGroup 中启用 CapacityRebalance。这将配置 ASG 在 ASG 收到重新平衡建议时主动替换 Spot 实例。https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-capacity-rebalancing.html

instanceRequirements

引入
kOps 1.24

InstanceGroup 可以配置为使用满足给定一组要求的所有机器类型,而不是配置特定机器类型。

spec:
  mixedInstancesPolicy:
    instanceRequirements:
      cpu:
        min: "2"
        max: "16"
      memory:
        min: "2G"

请注意,可突发实例始终包含在合格实例集中。

warmPool (仅限 AWS)

引入
kOps 1.21

预热池包含已预先初始化的 EC2 实例,这些实例与常规实例相比,可以更快地加入集群。这些实例运行 kOps 配置过程,拉取已知的容器映像,然后关闭。当 ASG 需要扩展时,如果预热池中有可用实例,它将从预热池中拉取实例。

您可以通过添加以下内容来启用预热池

spec:
  warmPool: {}

这将使用 AWS 默认设置。您可以像这样更改池大小

spec:
  warmPool:
    minSize: 3
    maxSize: 10

您还可以通过在集群规范中设置 warmPool 字段,为类型为 Node 或 APIServer 的所有实例组指定默认值。如果在集群规范级别启用了预热池,则可以通过将 maxSize: 0 设置为在实例组级别禁用它们。

生命周期钩子

默认情况下,AWS 不保证 kOps 配置将运行到完成。也不保证实例在完成后的及时关闭,前提是允许实例运行这么长时间。为了保证这一点,需要生命周期钩子。

如果您启用此功能,则必须确保您的元数据 API 受保护。否则,集群中的任何 Pod 都可以完成生命周期钩子,结果为 ABANDONED,阻止任何实例加入集群。

以下配置将启用生命周期钩子,并防止滥用元数据 API

spec:
  warmPool:
    enableLifecycleHook: true
  instanceMetadata:
    httpPutResponseHopLimit: 1
    httpTokens: required

maxInstanceLifetime (仅限 AWS)

引入
kOps 1.24

最大实例生命周期指定实例在被终止和替换之前可以在服务中运行的最长时间(以 go 持续时间 格式)。一个常见的用例可能是由于内部安全策略或外部合规性控制而需要按计划替换实例的要求。换句话说,此功能有助于您在集群中添加一些短暂性。您必须指定至少 24 小时(86,400 秒)的值。要清除以前设置的值,请指定 0 的新值。

以下配置使最大实例生命周期为两天。

spec:
  maxInstanceLifetime: "48h"

API 更改

kOps 正在更新 v1alpha2 API 到更新版本。该新 API 仍在开发中,但 API 的内部形式和验证错误消息使用新的字段名称。下表跟踪更改,除了不再使用的字段的删除之外。

v1alpha2 字段 新字段
associatePublicIp associatePublicIP
externalLoadBalancers[*].targetGroupArn externalLoadBalancers[*].targetGroupARN
rootVolumeEncryption rootVolume.encryption
rootVolumeEncryptionKey rootVolume.encryptionKey
rootVolumeIops rootVolume.iops
rootVolumeOptimization rootVolume.optimization
rootVolumeSize rootVolume.size
rootVolumeThroughput rootVolume.throughput
rootVolumeType rootVolume.type