Taints và tolerations hoạt động cùng nhau để đảm bảo rằng các pod không được lên lịch vào các nút không phù hợp. Một hoặc nhiều taints có thể được áp dụng cho một nút, điều này có nghĩa là nút không nên chấp nhận bất kỳ pod nào không chấp nhận taints. Các pod có tolerations chỉ có thể được triển khai trên các nút có taints đó.
Ví dụ: nếu bạn muốn dành riêng một số nút để một nhóm pod cụ thể sử dụng độc quyền, bạn có thể thêm taints vào các nút đó rồi thêm sự chấp nhận tương ứng vào các pod. Sau đó, các pod có tolerations sẽ được phép sử dụng các nút bị taints cũng như bất kỳ nút nào khác trong cụm. Điều này đảm bảo rằng các pod không có khả năng chịu đựng sẽ không bao giờ được triển khai trên các nút có lỗi.
Lỗi của nút là cặp khóa-giá trị được liên kết với một hiệu ứng. Sau đây là các hiệu ứng có sẵn:
Sử dụng lệnh "describe" để kiểm tra Taints đối với node01
Trong ảnh chụp màn hình ở trên, có thể thấy rằng node không có bất kỳ Taint nào.
Hãy thêm "app=fronend:NoSchedule" Taint vào Node01
Trong ảnh chụp màn hình ở trên, có thể thấy rằng Node01 hiện có Taint.
Tạo một tệp và thêm định nghĩa pod sau vào đó.
Định nghĩa pod này không có bất kỳ Toleration nào trong đó.
Để tạo một pod không có bất kỳ Toleration, thực hiện lệnh sau.
Sử dụng lệnh "describe" để lấy thêm thông tin chi tiết về pod.
Trong ảnh chụp màn hình ở trên, có thể thấy rằng Pod không được lên lịch. Lý do cho điều này là Node01 có Taint nhưng không có Toleration trong Pod. \
Để tạo một tệp khác với định nghĩa pod sau. Pod này có Toleration trong đó.
Trong ảnh chụp màn hình ở trên, có thể thấy rằng một "phần phụ trợ" Pod mới đã được tạo và đang ở trạng thái chạy.
Lý do cho điều này là Pod có Toleration trong đó cho phép nó được triển khai trên Node có Taint.
Sử dụng lệnh "describe" để xem thêm chi tiết về Pod.
Ví dụ: nếu bạn muốn dành riêng một số nút để một nhóm pod cụ thể sử dụng độc quyền, bạn có thể thêm taints vào các nút đó rồi thêm sự chấp nhận tương ứng vào các pod. Sau đó, các pod có tolerations sẽ được phép sử dụng các nút bị taints cũng như bất kỳ nút nào khác trong cụm. Điều này đảm bảo rằng các pod không có khả năng chịu đựng sẽ không bao giờ được triển khai trên các nút có lỗi.
Lỗi của nút là cặp khóa-giá trị được liên kết với một hiệu ứng. Sau đây là các hiệu ứng có sẵn:
- NoSchedule: Các Pod không chấp nhận lỗi này sẽ không được lên lịch trên nút nhưng các Pod hiện có sẽ không bị xóa khỏi nút.
- PreferNoSchedule: Kubernetes tránh lên lịch các Pod không chấp nhận lỗi này vào nút.
- NoExecute: Pod bị xóa khỏi nút nếu nó đã chạy trên nút và không được lên lịch vào nút nếu nó chưa chạy trên nút.
Điều kiện tiên quyết
- Cụm Kubernetes có ít nhất 1 nút worker.Nếu bạn muốn tìm hiểu cách tạo Cụm Kubernetes, hãy nhấp vào đây. Hướng dẫn này sẽ giúp bạn tạo cụm Kubernetes với 1 Master và 2 Node trên AWS Ubuntu 18.04 EC2 Instances.
Những gì chúng ta sẽ làm
- Tạo Taints và Tolerations
Tạo Taints và Tolerations
Trước tiên, hãy kiểm tra các node có sẵn trong cụm.
Mã:
kubectl get nodes #Lấy các pod hiện tại trong cụm.
Sử dụng lệnh "describe" để kiểm tra Taints đối với node01
Mã:
kubectl describe node node01 #Describe node01 node để trích xuất thêm thông tin chi tiết.
Trong ảnh chụp màn hình ở trên, có thể thấy rằng node không có bất kỳ Taint nào.
Hãy thêm "app=fronend:NoSchedule" Taint vào Node01
Mã:
kubectl taint nodes node01 app=fronend:NoSchedule #Thêm taint vào node node01.
Mã:
kubectl describe node node01 #Trích xuất thông tin chi tiết của node node01.
Trong ảnh chụp màn hình ở trên, có thể thấy rằng Node01 hiện có Taint.
Tạo một tệp và thêm định nghĩa pod sau vào đó.
Mã:
vim my-pod.yml #Tạo định nghĩa pod.
Mã:
apiVersion: v1kind: Podmetadata: name: frontendspec: containers: - image: nginx name: frontend-nginx
Định nghĩa pod này không có bất kỳ Toleration nào trong đó.
Để tạo một pod không có bất kỳ Toleration, thực hiện lệnh sau.
Mã:
kubectl create -f my-pod.yml #Tạo một pod.
Mã:
kubectl get pods #Lấy thông tin chi tiết về pod.
Sử dụng lệnh "describe" để lấy thêm thông tin chi tiết về pod.
Mã:
kubectl get pods #Lấy thông tin chi tiết về pod.
Mã:
kubectl describe pod frontend #Trích xuất thêm thông tin chi tiết về Pod.
Trong ảnh chụp màn hình ở trên, có thể thấy rằng Pod không được lên lịch. Lý do cho điều này là Node01 có Taint nhưng không có Toleration trong Pod. \
Để tạo một tệp khác với định nghĩa pod sau. Pod này có Toleration trong đó.
Mã:
vim my-mysql-pod.yml #Tạo định nghĩa pod.
Mã:
apiVersion: v1kind: Podmetadata: name: backendspec: 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
Bây giờ, hãy tạo một Pod bằng cách sử dụng "my-mysql-pod.yml".
Mã:
kubectl get pods #Get các pod hiện tại trong cụm.
Mã:
kubectl create -f my-mysql-pod.yml #Tạo một pod.
Mã:
kubectl get pods #Lấy các pod hiện tại trong cụm.
Trong ảnh chụp màn hình ở trên, có thể thấy rằng một "phần phụ trợ" Pod mới đã được tạo và đang ở trạng thái chạy.
Lý do cho điều này là Pod có Toleration trong đó cho phép nó được triển khai trên Node có Taint.
Sử dụng lệnh "describe" để xem thêm chi tiết về Pod.
Mã:
kubectl describe pod backend #Mô tả pod để biết thêm chi tiết về nó.