노드의 확장 리소스 광고하기

노드의 확장 리소스 광고하기 (Advertise Extended Resources for a Node)

이 페이지는 노드(Node)에 대한 확장 리소스(extended resource)를 지정하는 방법을 보여줘요. 확장 리소스를 사용하면 클러스터 관리자가 쿠버네티스가 모르는 노드 수준 리소스를 알릴 수 있어요.

출처: 문서

본문

시작하기 전에 (Before you begin)

노드 이름 얻기

kubectl get nodes

이 실습에 사용할 노드 하나를 선택해요.

노드 중 하나에 새 확장 리소스 광고하기

노드에 새 확장 리소스를 광고하려면 쿠버네티스 API 서버에 HTTP PATCH 요청을 보내요. 예를 들어 노드 중 하나에 dongle이 네 개 붙어 있다고 가정해 봐요. 다음은 그 노드에 dongle 리소스 4개를 광고하는 PATCH 요청 예시예요.

PATCH /api/v1/nodes/<your-node-name>/status HTTP/1.1
Accept: application/json
Content-Type: application/json-patch+json
Host: k8s-master:8080

[
  {
    "op": "add",
    "path": "/status/capacity/example.com~1dongle",
    "value": "4"
  }
]

쿠버네티스는 dongle이 무엇인지, dongle이 무엇을 하는지 알 필요가 없어요. 위 PATCH 요청은 쿠버네티스에 "이 노드에는 dongle이라고 부르는 것이 네 개 있다"고 알려줘요.

쿠버네티스 API 서버에 쉽게 요청을 보내도록 프록시를 시작합니다:

kubectl proxy

다른 명령 창에서 HTTP PATCH 요청을 보냅니다. <your-node-name> 을 노드 이름으로 바꿔요:

curl --header "Content-Type: application/json-patch+json" \
  --request PATCH \
  --data '[{"op": "add", "path": "/status/capacity/example.com~1dongle", "value": "4"}]' \
  http://localhost:8001/api/v1/nodes/<your-node-name>/status

참고:

출력은 노드에 dongle 용량이 4개 있음을 보여줘요:

"capacity": {
  "cpu": "2",
  "memory": "2049008Ki",
  "example.com/dongle": "4",
}

노드를 설명합니다:

kubectl describe node <your-node-name>

다시 한 번 출력이 dongle 리소스를 보여줘요:

Capacity:
  cpu: 2
  memory: 2049008Ki
  example.com/dongle: 4

이제 애플리케이션 개발자는 특정 수의 dongle을 요청하는 파드를 만들 수 있어요. 컨테이너에 확장 리소스 할당하기를 참고해요.

논의 (Discussion)

확장 리소스는 메모리·CPU 리소스와 비슷해요. 예를 들어 노드가 그 위에서 실행되는 모든 컴포넌트가 공유할 특정 양의 메모리와 CPU를 갖듯이, 노드가 그 위에서 실행되는 모든 컴포넌트가 공유할 특정 수의 dongle을 가질 수 있어요. 그리고 애플리케이션 개발자가 특정 양의 메모리와 CPU를 요청하는 파드를 만들 수 있듯이, 특정 수의 dongle을 요청하는 파드를 만들 수 있어요.

확장 리소스는 쿠버네티스에 불투명(opaque)해요. 쿠버네티스는 그것이 무엇인지 아무것도 알지 못해요. 쿠버네티스는 노드에 특정 수가 있다는 것만 알아요. 확장 리소스는 정수 양으로 광고되어야 해요. 예를 들어 노드는 dongle 4개를 광고할 수 있지만 4.5개는 광고할 수 없어요.

스토리지 예시 (Storage example)

노드에 특별한 종류의 디스크 저장 공간 800GiB가 있다고 가정해 봐요. 특별 저장 공간에 example.com/special-storage 같은 이름을 만들 수 있어요. 그런 다음 특정 크기(예: 100GiB) 단위로 광고할 수 있어요. 이 경우 노드가 example.com/special-storage 유형의 리소스 8개가 있다고 광고하게 돼요.

Capacity:
 ...
 example.com/special-storage: 8

특수 저장 공간에 대한 임의 요청을 허용하고 싶다면, 특수 저장 공간을 1바이트 단위로 광고할 수 있어요. 이 경우 example.com/special-storage 유형의 800Gi 리소스를 광고하게 돼요.

Capacity:
 ...
 example.com/special-storage:  800Gi

그러면 컨테이너는 800Gi까지 특수 저장 공간의 원하는 바이트 수를 요청할 수 있어요.

정리 (Clean up)

다음은 노드에서 dongle 광고를 제거하는 PATCH 요청이에요.

PATCH /api/v1/nodes/<your-node-name>/status HTTP/1.1
Accept: application/json
Content-Type: application/json-patch+json
Host: k8s-master:8080

[
  {
    "op": "remove",
    "path": "/status/capacity/example.com~1dongle",
  }
]

프록시를 시작합니다:

kubectl proxy

다른 명령 창에서 HTTP PATCH 요청을 보냅니다. <your-node-name> 을 노드 이름으로 바꿔요:

curl --header "Content-Type: application/json-patch+json" \
  --request PATCH \
  --data '[{"op": "remove", "path": "/status/capacity/example.com~1dongle"}]' \
  http://localhost:8001/api/v1/nodes/<your-node-name>/status

dongle 광고가 제거됐는지 확인합니다:

kubectl describe node <your-node-name> | grep dongle

(출력이 없어야 해요)

더 알아보기 (Learn more)

애플리케이션 개발자용

클러스터 관리자용