3.10. 사용자 정의 스케줄러 실행
기본 스케줄러와 함께 여러 사용자 정의 스케줄러를 실행하고 각 Pod에 사용할 스케줄러를 구성할 수 있습니다.
OpenShift Container Platform에서 사용자 정의 스케줄러를 사용하는 것이 지원되지만 Red Hat은 사용자 정의 스케줄러의 기능을 직접 지원하지 않습니다.
기본 스케줄러를 구성하는 방법에 대한 자세한 내용은 Pod 배치를 제어하도록 기본 스케줄러 구성을 참조하십시오.
특정 스케줄러를 사용하여 지정된 Pod를 예약하려면 해당 Pod
사양에서 스케줄러의 이름을 지정합니다.
3.10.1. 사용자 정의 스케줄러 배포
클러스터에 사용자 지정 스케줄러를 포함하려면 배포에 사용자 지정 스케줄러의 이미지를 포함합니다.
사전 요구 사항
-
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. 스케줄러 바이너리가 있습니다.
참고스케줄러 바이너리 생성 방법에 대한 정보는 이 문서의 범위를 벗어납니다. 예를 들어 Kubernetes 문서 의 다중 스케줄러 구성을 참조하십시오. 사용자 지정 스케줄러의 실제 기능은 Red Hat에서 지원하지 않습니다.
- 스케줄러 바이너리가 포함된 이미지를 생성하여 레지스트리로 푸시했습니다.
절차
스케줄러 구성 파일을 보유한 구성 맵이 포함된 파일을 생성합니다.
scheduler-config-map.yaml
의 예apiVersion: v1 kind: ConfigMap metadata: name: scheduler-config namespace: kube-system 1 data: scheduler-config.yaml: | 2 apiVersion: kubescheduler.config.k8s.io/v1beta2 kind: KubeSchedulerConfiguration profiles: - schedulerName: custom-scheduler 3 leaderElection: leaderElect: false
config map을 생성합니다.
$ oc create -f scheduler-config-map.yaml
사용자 정의 스케줄러의 배포 리소스가 포함된 파일을 생성합니다.
custom-scheduler.yaml
파일의 예apiVersion: v1 kind: ServiceAccount metadata: name: custom-scheduler namespace: kube-system 1 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: custom-scheduler-as-kube-scheduler subjects: - kind: ServiceAccount name: custom-scheduler namespace: kube-system 2 roleRef: kind: ClusterRole name: system:kube-scheduler apiGroup: rbac.authorization.k8s.io --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: custom-scheduler-as-volume-scheduler subjects: - kind: ServiceAccount name: custom-scheduler namespace: kube-system 3 roleRef: kind: ClusterRole name: system:volume-scheduler apiGroup: rbac.authorization.k8s.io --- apiVersion: apps/v1 kind: Deployment metadata: labels: component: scheduler tier: control-plane name: custom-scheduler namespace: kube-system 4 spec: selector: matchLabels: component: scheduler tier: control-plane replicas: 1 template: metadata: labels: component: scheduler tier: control-plane version: second spec: serviceAccountName: custom-scheduler containers: - command: - /usr/local/bin/kube-scheduler - --config=/etc/config/scheduler-config.yaml 5 image: "<namespace>/<image_name>:<tag>" 6 livenessProbe: httpGet: path: /healthz port: 10259 scheme: HTTPS initialDelaySeconds: 15 name: kube-second-scheduler readinessProbe: httpGet: path: /healthz port: 10259 scheme: HTTPS resources: requests: cpu: '0.1' securityContext: privileged: false volumeMounts: - name: config-volume mountPath: /etc/config hostNetwork: false hostPID: false volumes: - name: config-volume configMap: name: scheduler-config
클러스터에 배포 리소스를 생성합니다.
$ oc create -f custom-scheduler.yaml
검증
스케줄러 Pod가 실행 중인지 확인합니다.
$ oc get pods -n kube-system
사용자 정의 스케줄러 Pod는
Running
으로 나열됩니다.NAME READY STATUS RESTARTS AGE custom-scheduler-6cd7c4b8bc-854zb 1/1 Running 0 2m
3.10.2. 사용자 정의 스케줄러를 사용하여 Pod 배포
사용자 정의 스케줄러가 클러스터에 배포된 후 기본 스케줄러 대신 해당 스케줄러를 사용하도록 Pod를 구성할 수 있습니다.
각 스케줄러에는 클러스터에 있는 별도의 리소스 보기가 있습니다. 따라서 각 스케줄러는 자체 노드 집합에서 작동해야 합니다.
두 개 이상의 스케줄러가 동일한 노드에서 작동하는 경우 서로 개입하여 사용 가능한 리소스보다 동일한 노드에 더 많은 포드를 예약할 수 있습니다. 이 경우 리소스가 부족하여 Pod가 거부될 수 있습니다.
사전 요구 사항
-
cluster-admin
역할의 사용자로 클러스터에 액세스할 수 있어야 합니다. - 사용자 지정 스케줄러가 클러스터에 배포되었습니다.
절차
클러스터에서 역할 기반 액세스 제어(RBAC)를 사용하는 경우 사용자 정의 스케줄러 이름을
system:kube-scheduler
클러스터 역할에 추가합니다.system:kube-scheduler
클러스터 역할을 편집합니다.$ oc edit clusterrole system:kube-scheduler
사용자 정의 스케줄러의 이름을
leases
및endpoints
리소스에 대한resourceNames
목록에 추가합니다.apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: annotations: rbac.authorization.kubernetes.io/autoupdate: "true" creationTimestamp: "2021-07-07T10:19:14Z" labels: kubernetes.io/bootstrapping: rbac-defaults name: system:kube-scheduler resourceVersion: "125" uid: 53896c70-b332-420a-b2a4-f72c822313f2 rules: ... - apiGroups: - coordination.k8s.io resources: - leases verbs: - create - apiGroups: - coordination.k8s.io resourceNames: - kube-scheduler - custom-scheduler 1 resources: - leases verbs: - get - update - apiGroups: - "" resources: - endpoints verbs: - create - apiGroups: - "" resourceNames: - kube-scheduler - custom-scheduler 2 resources: - endpoints verbs: - get - update ...
Pod
구성을 생성하고 schedulerName 매개변수에서 사용자 정의 스케줄러
의 이름을 지정합니다.custom-scheduler-example.yaml
파일의 예apiVersion: v1 kind: Pod metadata: name: custom-scheduler-example labels: name: custom-scheduler-example spec: schedulerName: custom-scheduler 1 containers: - name: pod-with-second-annotation-container image: docker.io/ocpqe/hello-pod
- 1
- 사용할 사용자 정의 스케줄러의 이름입니다. 이 예에서는
custom-scheduler
입니다. 스케줄러 이름을 제공하지 않으면 기본 스케줄러를 사용하여 Pod가 자동으로 예약됩니다.
Pod를 생성합니다.
$ oc create -f custom-scheduler-example.yaml
검증
다음 명령을 입력하여 Pod가 생성되었는지 확인합니다.
$ oc get pod custom-scheduler-example
custom-scheduler-example
Pod는 출력에 나열됩니다.NAME READY STATUS RESTARTS AGE custom-scheduler-example 1/1 Running 0 4m
다음 명령을 입력하여 사용자 정의 스케줄러에서 Pod를 예약했는지 확인합니다.
$ oc describe pod custom-scheduler-example
스케줄러,
custom-scheduler
는 다음 잘린 출력에 표시된 대로 나열됩니다.Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled <unknown> custom-scheduler Successfully assigned default/custom-scheduler-example to <node_name>