Поиск по сайту:

Как использовать селекторы узлов в Kubernetes


На этой странице

  1. Предварительные условия
  2. Что мы будем делать
  3. Настройка селекторов узлов
  4. Заключение

Мы можем ограничить Pod, чтобы он мог работать только на определенном узле. Могут быть некоторые ситуации, когда нам может потребоваться больший контроль над узлом, на который приземляется модуль.

nodeSelector — это одна из форм ограничения выбора узла. nodeSelector – это поле PodSpec. Это простая функция планирования пода, которая позволяет запланировать под на узел, метки которого соответствуют меткам nodeSelector container.style.width=100%;var ins=document.createElement(ins);ins.id=slotId+-asloaded;ins. className=adsbygoogle ezasloaded;ins.dataset.adClient=pid;ins.dataset.adChannel=cid;if(ffid==2){ins.dataset.fullWidthResponsive=true;}

Чтобы узнать больше о выборе узлов, нажмите здесь, чтобы перейти на официальную страницу Kubernetes.

В этой статье у нас не будет испорченного главного узла, поэтому модули могут быть развернуты и на главном узле. Затем мы создадим модули, чтобы увидеть, как они развертываются на рабочем узле, а также на главном узле. Затем мы прикрепим метку к главному узлу и укажем модули для развертывания на главном узле только с помощью nodeSelector.

Предпосылки

  1. Кластер Kubernetes с хотя бы 1 рабочим узлом.
    Если вы хотите научиться создавать кластер Kubernetes, нажмите здесь. Это руководство поможет вам создать кластер Kubernetes с 1 мастером и 2 узлами на экземплярах AWS Ubuntu 18.04 EC2.

Что мы будем делать

  1. Настройка селекторов узлов

Настройка селекторов узлов

Во-первых, давайте извлечем сведения об узлах в кластере, используя следующую команду.

kubectl get nodes #Get nodes available in the cluster
kubectl describe nodes node01 | grep Taint #Describe node1 node to extract details regarding Taints
kubectl describe nodes master | grep Taint #Describe master node to extract details regarding Taints

Выше показано, что узлы не имеют дефектов, это означает, что поды могут быть размещены на любом из узлов, либо на главном, либо на узле 01.

Теперь давайте создадим развертывание, в котором нет селектора узлов.

vim my-deployment-without-node-selector.yaml #Create a deployment definition
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: frontend
  name: frontend
spec:
  replicas: 3
  selector:
    matchLabels:
      app: frontend
  template:
    metadata:
      labels:
        app: frontend
    spec:
      containers:
      - image: httpd:2.4-alpine
        name: frontend

Теперь мы готовы создать развертывание с помощью следующей команды.

kubectl get pods #Get pods available in the cluster
kubectl create -f my-deployment-without-node-selector.yaml #Create a deployment
kubectl get pods ##Get nodes available in the cluster

Теперь измените количество реплик в развертывании, отредактировав файл и применив изменения.

kubectl apply -f my-deployment-without-node-selector.yaml #Apply changes made in the deployment definition file
kubectl get pods -o wide # Get more details regarding pods using -o wide option

На приведенном выше снимке экрана видно, что новые модули создаются и также планируются на главном узле.

Причина этого в том, что оба узла, master и node01, не имеют дефектов.

Итак, чтобы ограничить планирование и убедиться, что модули получают места только на главном узле, давайте создадим метку на главном узле.

kubectl label nodes master on-master=true #Create a label on the master node
kubectl describe node master #Get more details regarding the master node

На приведенном выше снимке экрана видно, что главный узел имеет метку «on-master=true».

Теперь давайте создадим новое развертывание с nodeSelector:on-master=true , чтобы убедиться, что модули развертываются только на главном узле.

vim my-deployment-with-node-selector.yaml #Create a deployment definition file 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: streamer-v4-deployment
  labels:
    app: streamer-v4
spec:
  replicas: 2
  selector:
    matchLabels:
      app: streamer-v4
  template:
    metadata:
      labels:
        app: streamer-v4
    spec:
      containers:
      - name: streamer-v4
        image: nginx
        ports:
        - containerPort: 8880
      nodeSelector:
        on-master: "true"

Новое развертывание с помощью nodeSelector теперь можно создать с помощью следующей команды.

kubectl create -f my-deployment-with-node-selector.yaml #Create a deployment
kubectl get pods -o wide | grep streamer-v4-deployment #Get more details of the pods

На приведенном выше снимке экрана видно, что модули были развернуты только на главном узле.

Теперь давайте изменим \replica=50\, чтобы увидеть, где будут развернуты модули.

vim my-deployment-with-node-selector.yaml #Change a deployment definition

Примените последние изменения с помощью команды, указанной ниже.

kubectl apply -f my-deployment-with-node-selector.yaml #Apply changes to the deployment

Здесь вы можете видеть, что все модули создаются и развертываются только на «главном» узле.

Заключение

В этой статье мы увидели, как можно ограничить развертывание модулей на определенном узле только с помощью label и nodeSelector.

Мы также увидели, что если на главном узле нет Taints, на нем можно развернуть модули.