Featured image of post Kubernetes Node role labeler

Kubernetes Node role labeler

Теперь узлы могут назначать себе роли сами

Описание

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
All rights reserved
Создано при помощи Hugo
Тема Stack, дизайн Jimmy