Kubernetes에서 Taint 및 Toleration 생성
이 페이지에서
- 전제 조건
- 우리가 할 일\n
- 테인트 및 톨러레이션 만들기
taint와 toleration은 함께 작동하여 pod가 부적절한 노드에 예약되지 않도록 합니다. 하나 이상의 taint를 노드에 적용할 수 있습니다. 즉, 노드는 taint를 허용하지 않는 포드를 수락해서는 안 됩니다. 내결함성이 있는 포드는 오염이 있는 노드에만 배포할 수 있습니다.
예를 들어 특정 pod 집합에서 독점적으로 사용하도록 일부 노드를 전용하려는 경우 해당 노드에 taint를 추가한 다음 pod에 각각의 톨러레이션을 추가할 수 있습니다. 그런 다음 toleration이 있는 포드는 오염된 노드와 클러스터의 다른 노드를 사용할 수 있습니다. 이렇게 하면 내결함성이 없는 포드가 오염이 있는 노드에 배포될 수 없습니다.
노드 taint는 효과와 연결된 키-값 쌍입니다. 사용 가능한 효과는 다음과 같습니다.
- NoSchedule: 이 taint를 허용하지 않는 포드는 노드에서 예약되지 않지만 기존 포드는 노드에서 제거되지 않습니다.\n
- PreferNoSchedule: Kubernetes는 노드에 대한 이러한 오염을 허용하지 않는 포드 예약을 방지합니다.\n
- NoExecute: 포드가 이미 노드에서 실행 중인 경우 노드에서 포드가 제거되고 노드에서 아직 실행되지 않은 경우 노드에 예약되지 않습니다.\n
이 기사에서는 작업자 노드에 taint를 생성하고 팟(Pod)에 톨러레이션(toleration)을 추가합니다. 이렇게 하면 내결함성이 없는 포드가 오염이 있는 작업 노드에 배포되지 않는다는 것을 이해하는 데 도움이 됩니다.
전제 조건
- 워커 노드가 1개 이상 있는 Kubernetes 클러스터.
Kubernetes 클러스터를 만드는 방법을 알아보려면 여기를 클릭하세요. 이 안내서는 AWS Ubuntu 18.04 EC2 인스턴스에서 1개의 마스터와 2개의 노드가 있는 Kubernetes 클러스터를 생성하는 데 도움이 됩니다.\n
우리가 할 일
- 테인트 및 톨러레이션 만들기
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에 배포될 수 있습니다.