웹사이트 검색

Kubernetes에서 Taint 및 Toleration 생성


이 페이지에서

  1. 전제 조건
  2. 우리가 할 일\n
  3. 테인트 및 톨러레이션 만들기

taint와 toleration은 함께 작동하여 pod가 부적절한 노드에 예약되지 않도록 합니다. 하나 이상의 taint를 노드에 적용할 수 있습니다. 즉, 노드는 taint를 허용하지 않는 포드를 수락해서는 안 됩니다. 내결함성이 있는 포드는 오염이 있는 노드에만 배포할 수 있습니다.

예를 들어 특정 pod 집합에서 독점적으로 사용하도록 일부 노드를 전용하려는 경우 해당 노드에 taint를 추가한 다음 pod에 각각의 톨러레이션을 추가할 수 있습니다. 그런 다음 toleration이 있는 포드는 오염된 노드와 클러스터의 다른 노드를 사용할 수 있습니다. 이렇게 하면 내결함성이 없는 포드가 오염이 있는 노드에 배포될 수 없습니다.

노드 taint는 효과와 연결된 키-값 쌍입니다. 사용 가능한 효과는 다음과 같습니다.

  • NoSchedule: 이 taint를 허용하지 않는 포드는 노드에서 예약되지 않지만 기존 포드는 노드에서 제거되지 않습니다.\n
  • PreferNoSchedule: Kubernetes는 노드에 대한 이러한 오염을 허용하지 않는 포드 예약을 방지합니다.\n
  • NoExecute: 포드가 이미 노드에서 실행 중인 경우 노드에서 포드가 제거되고 노드에서 아직 실행되지 않은 경우 노드에 예약되지 않습니다.\n

이 기사에서는 작업자 노드에 taint를 생성하고 팟(Pod)에 톨러레이션(toleration)을 추가합니다. 이렇게 하면 내결함성이 없는 포드가 오염이 있는 작업 노드에 배포되지 않는다는 것을 이해하는 데 도움이 됩니다.

전제 조건

  1. 워커 노드가 1개 이상 있는 Kubernetes 클러스터.
    Kubernetes 클러스터를 만드는 방법을 알아보려면 여기를 클릭하세요. 이 안내서는 AWS Ubuntu 18.04 EC2 인스턴스에서 1개의 마스터와 2개의 노드가 있는 Kubernetes 클러스터를 생성하는 데 도움이 됩니다.\n

우리가 할 일

  1. 테인트 및 톨러레이션 만들기

taint 및 Toleration 만들기

먼저 클러스터에서 사용 가능한 노드를 확인합니다.

kubectl  get nodes #Get current pods in the cluster.

"describe" 명령을 사용하여 node01에 대한 오염을 확인합니다.

kubectl describe node node01 #Describe node01 node to extract more details.

위 스크린샷에서 노드에 Taint가 없음을 확인할 수 있습니다.

"app=fronend:NoSchedule" Taint를 Node01에 추가해 보겠습니다.

kubectl taint nodes node01 app=fronend:NoSchedule #Add taint to the node01 node.
kubectl describe node node01 #Extract details of the node01 node.

위의 스크린샷에서 이제 Node01에 Taint가 있는 것을 볼 수 있습니다.

파일을 만들고 다음 팟(Pod) 정의를 파일에 추가하십시오.

vim my-pod.yml #Create a pod definition.
apiVersion: v1
kind: Pod
metadata:
  name: frontend
spec:
  containers:
  - image: nginx
    name: frontend-nginx

이 포드 정의에는 Toleration이 없습니다.

Toleration이 없는 포드를 만들려면 다음 명령어를 실행합니다.

kubectl create -f my-pod.yml #Create a pod.
kubectl get pods #Get details of the pod.

Pod에 대한 자세한 내용을 보려면 "describe" 명령을 사용하십시오.

kubectl get pods #Get details of the pod.
kubectl describe pod frontend #Extract more details of the Pod.

위의 스크린샷에서 Pod가 예약되지 않은 것을 볼 수 있습니다. 그 이유는 Node01에 Taint가 있지만 Pod에 Toleration이 없기 때문입니다. \

다음 포드 정의를 사용하여 다른 파일을 생성합니다. 이 Pod에는 Toleration이 있습니다.

vim my-mysql-pod.yml #Create a pod definition.
apiVersion: v1
kind: Pod
metadata:
  name: backend
spec:
  containers:
    - name: mysql
      image: mysql:latest
      env:
        - name: "MYSQL_USER"
          value: "mysql"
        - name: "MYSQL_PASSWORD"
          value: "mysql"
        - name: "MYSQL_DATABASE"
          value: "sample"
        - name: "MYSQL_ROOT_PASSWORD"
          value: "supersecret"
      ports:
        - containerPort: 3306
  tolerations:
  - key: app
    value: fronend
    effect: NoSchedule
    operator: Equal

이제 "my-mysql-pod.yml"을 사용하여 Pod를 만듭니다.

kubectl get pods #Get current pods in the cluster.
kubectl create -f my-mysql-pod.yml #Create a pod.
kubectl get pods #Get current pods in the cluster.

위의 스크린샷에서 새 Pod "backend"가 생성되어 실행 중인 상태임을 확인할 수 있습니다.

그 이유는 Pod에 Toleration이 있어 Taint가 있는 노드에 배포할 수 있기 때문입니다.

포드에 대한 자세한 내용을 보려면 "describe" 명령을 사용하십시오.

kubectl  describe  pod backend #Describe the pod to get more details of it.

결론

이 문서에서는 먼저 노드에 Taint를 만든 다음 Toleration이 없는 포드를 배포하려고 시도했습니다. 포드가 배포되지 않는 것을 확인했습니다. 나중에 Toleration이 있는 Pod를 추가했습니다. 이 Toleration을 사용하면 Pod가 Taint가 있는 노드 node01에 배포될 수 있습니다.