Описание ¶
Node Role Labeler давно руки чесались написать, примитивнейший оператор, но задачу выполняет. Проблема в том, что Kubernetes, а именно kubelet, не может назначить себе самому при создании узла label node-role.kubernetes.io/ROLE_NAME, потому что kubernetes.io защищённый префикс. Очень не удобно.
Вот у меня Karpenter, или Cluster Autoscaler, да не важно, я хочу чтобы узлы сразу были с красивыми ролями, а из коробки так не получается, только руками. Теперь можно навесить node-role.cluster.local/NAME и оператор создаст копию с доменом kubernetes.io автоматически. В обратную сторону тоже работает. Подробнее - читайте на GitHub.
Демо ¶
Karpenter конфигурация ¶
Вот таким образом можно сразу навешивать labels на узлы Karpenter-a.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
  | apiVersion: karpenter.k8s.aws/v1beta1
kind: EC2NodeClass
metadata:
  name: private
spec:
  amiFamily: AL2
  metadataOptions:
    httpEndpoint: enabled
    httpProtocolIPv6: disabled
    httpPutResponseHopLimit: 2
    httpTokens: required
  role: Karpenter-development-role
  securityGroupSelectorTerms:
  - tags:
      karpenter.sh/discovery: development
  subnetSelectorTerms:
  - tags:
      karpenter.sh/discovery/development/subnet: private
  tags:
    karpenter.sh/discovery: development
---
apiVersion: karpenter.sh/v1beta1
kind: NodePool
metadata:
  name: on-demand-amd64
spec:
  disruption:
    budgets:
    - nodes: 20%
    - nodes: "5"
    - duration: 20h
      nodes: "0"
      schedule: 0 5 * * *
    consolidationPolicy: WhenUnderutilized
    expireAfter: 720h
  limits:
    cpu: "200"
    memory: 400Gi
  template:
    metadata:
      labels:
        node-role.cluster.local/on-demand-amd64: ""
    spec:
      nodeClassRef:
        name: private
      requirements:
      - key: kubernetes.io/arch
        operator: In
        values:
        - amd64
      - key: node.kubernetes.io/instance-type
        operator: In
        values:
        - r5a.4xlarge
        - r5a.2xlarge
        - r5a.xlarge
        - r5a.large
        - r5a.medium
        - r5.4xlarge
        - r5.2xlarge
        - r5.xlarge
        - r5.large
        - r5.medium
        - m6i.4xlarge
        - m6i.2xlarge
        - m6i.xlarge
        - m6i.large
        - m6i.medium
        - m5a.4xlarge
        - m5a.2xlarge
        - m5a.xlarge
        - m5a.large
        - m5a.medium
        - m5.4xlarge
        - m5.2xlarge
        - m5.xlarge
        - m5.large
        - m5.medium
        - c6a.4xlarge
        - c6a.2xlarge
        - c6a.xlarge
        - c6a.large
        - c6a.medium
        - c6.4xlarge
        - c6.2xlarge
        - c6.xlarge
        - c6.large
        - c6.medium
        - t3a.4xlarge
        - t3a.2xlarge
        - t3a.xlarge
        - t3a.large
        - t3a.medium
      - key: karpenter.sh/capacity-type
        operator: In
        values:
        - on-demand
  |