Стримзи Кафка на локальном голом металле Kubernetes

У меня есть кластер Kubernetes, работающий на нескольких локальных (голых / физических) машинах. Я хочу развернуть kafka в кластере, но не могу понять, как использовать strimzi с моей конфигурацией.

Я пытался следовать руководству на странице быстрого запуска: https://strimzi.io/docs/quickstart/master/
Мои модули zookeeper ожидают рассмотрения в точке 2.4. Creating a cluster:

Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  pod has unbound immediate PersistentVolumeClaims
  Warning  FailedScheduling  <unknown>  default-scheduler  pod has unbound immediate PersistentVolumeClaims

Я обычно использую hostpath для своих томов, я не знаю, что с этим творится ...

РЕДАКТИРОВАТЬ: я попытался создать StorageClass с помощью команд Аргья Садху, но проблема все еще существует.
Описание моего PVC:

kubectl describe -n my-kafka-project persistentvolumeclaim/data-my-cluster-zookeeper-0
Name:          data-my-cluster-zookeeper-0
Namespace:     my-kafka-project
StorageClass:  local-storage
Status:        Pending
Volume:        
Labels:        app.kubernetes.io/instance=my-cluster
               app.kubernetes.io/managed-by=strimzi-cluster-operator
               app.kubernetes.io/name=strimzi
               strimzi.io/cluster=my-cluster
               strimzi.io/kind=Kafka
               strimzi.io/name=my-cluster-zookeeper
Annotations:   strimzi.io/delete-claim: false
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      
Access Modes:  
VolumeMode:    Filesystem
Mounted By:    my-cluster-zookeeper-0
Events:
  Type    Reason                Age                 From                         Message
  ----    ------                ----                ----                         -------
  Normal  WaitForFirstConsumer  72s (x66 over 16m)  persistentvolume-controller  waiting for first consumer to be created before binding

И моя капсула:

kubectl describe -n my-kafka-project pod/my-cluster-zookeeper-0
Name:           my-cluster-zookeeper-0
Namespace:      my-kafka-project
Priority:       0
Node:           <none>
Labels:         app.kubernetes.io/instance=my-cluster
                app.kubernetes.io/managed-by=strimzi-cluster-operator
                app.kubernetes.io/name=strimzi
                controller-revision-hash=my-cluster-zookeeper-7f698cf9b5
                statefulset.kubernetes.io/pod-name=my-cluster-zookeeper-0
                strimzi.io/cluster=my-cluster
                strimzi.io/kind=Kafka
                strimzi.io/name=my-cluster-zookeeper
Annotations:    strimzi.io/cluster-ca-cert-generation: 0
                strimzi.io/generation: 0
Status:         Pending
IP:             
IPs:            <none>
Controlled By:  StatefulSet/my-cluster-zookeeper
Containers:
  zookeeper:
    Image:      strimzi/kafka:0.15.0-kafka-2.3.1
    Port:       <none>
    Host Port:  <none>
    Command:
      /opt/kafka/zookeeper_run.sh
    Liveness:   exec [/opt/kafka/zookeeper_healthcheck.sh] delay=15s timeout=5s period=10s #success=1 #failure=3
    Readiness:  exec [/opt/kafka/zookeeper_healthcheck.sh] delay=15s timeout=5s period=10s #success=1 #failure=3
    Environment:
      ZOOKEEPER_NODE_COUNT:          1
      ZOOKEEPER_METRICS_ENABLED:     false
      STRIMZI_KAFKA_GC_LOG_ENABLED:  false
      KAFKA_HEAP_OPTS:               -Xms128M
      ZOOKEEPER_CONFIGURATION:       autopurge.purgeInterval=1
                                     tickTime=2000
                                     initLimit=5
                                     syncLimit=2

    Mounts:
      /opt/kafka/custom-config/ from zookeeper-metrics-and-logging (rw)
      /var/lib/zookeeper from data (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from my-cluster-zookeeper-token-hgk2b (ro)
  tls-sidecar:
    Image:       strimzi/kafka:0.15.0-kafka-2.3.1
    Ports:       2888/TCP, 3888/TCP, 2181/TCP
    Host Ports:  0/TCP, 0/TCP, 0/TCP
    Command:
      /opt/stunnel/zookeeper_stunnel_run.sh
    Liveness:   exec [/opt/stunnel/stunnel_healthcheck.sh 2181] delay=15s timeout=5s period=10s #success=1 #failure=3
    Readiness:  exec [/opt/stunnel/stunnel_healthcheck.sh 2181] delay=15s timeout=5s period=10s #success=1 #failure=3
    Environment:
      ZOOKEEPER_NODE_COUNT:   1
      TLS_SIDECAR_LOG_LEVEL:  notice
    Mounts:
      /etc/tls-sidecar/cluster-ca-certs/ from cluster-ca-certs (rw)
      /etc/tls-sidecar/zookeeper-nodes/ from zookeeper-nodes (rw)
      /var/run/secrets/kubernetes.io/serviceaccount from my-cluster-zookeeper-token-hgk2b (ro)
Conditions:
  Type           Status
  PodScheduled   False 
Volumes:
  data:
    Type:       PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
    ClaimName:  data-my-cluster-zookeeper-0
    ReadOnly:   false
  zookeeper-metrics-and-logging:
    Type:      ConfigMap (a volume populated by a ConfigMap)
    Name:      my-cluster-zookeeper-config
    Optional:  false
  zookeeper-nodes:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  my-cluster-zookeeper-nodes
    Optional:    false
  cluster-ca-certs:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  my-cluster-cluster-ca-cert
    Optional:    false
  my-cluster-zookeeper-token-hgk2b:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  my-cluster-zookeeper-token-hgk2b
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s
                 node.kubernetes.io/unreachable:NoExecute for 300s
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) didn't find available persistent volumes to bind.
  Warning  FailedScheduling  <unknown>  default-scheduler  0/1 nodes are available: 1 node(s) didn't find available persistent volumes to bind.

person Borhink    schedule 07.01.2020    source источник
comment
вывод kubectl описать пвх?   -  person Arghya Sadhu    schedule 07.01.2020
comment
Какую версию Kubernetes и kubeadm вы используете? Также опишите ваши PV и PVC.   -  person PjoterS    schedule 13.01.2020
comment
Я пропустил PV, я создал его, и проблема была устранена   -  person Borhink    schedule 15.01.2020


Ответы (3)


У вас должен быть PersistentVolume, удовлетворяющий ограничениям PersistentVolumeClaim.

Используйте локальное хранилище. Использование локального класса хранилища:

$ cat <<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
EOF | kubectl apply -f -

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

$ kubectl patch storageclass local-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
person Arghya Sadhu    schedule 07.01.2020
comment
Разве мы не можем использовать hostpath на strimzi вместо создания PersistentVolume или StorageClass? Я пробовал создавать и исправлять ваши команды, но они все еще ожидают выполнения - person Borhink; 08.01.2020
comment
что вы подразумеваете под hostpath вместо PV? hostpath - это тип PV: kubernetes.io/ документы / концепции / хранилище / постоянные-тома / - person ppatierno; 08.01.2020
comment
Я всегда использовал hostpath, который не требует дополнительных претензий. Нам просто нужно использовать этот простой шаблон в развертывании, например: volumes: { name: "name", hostPath: {path} } - person Borhink; 08.01.2020

Да, мне кажется, что в Kubernetes чего-то не хватает на уровне инфраструктуры. Вы должны предоставить PersistentVolumes, которые используются для статического назначения PVC, или, как уже упоминалось Arghya, вы можете предоставить StorageClasses для динамического назначения.

person ppatierno    schedule 08.01.2020
comment
Я пробовал использовать StorageClass, он ничего нового не делает. И я хочу избежать дублирования PV - PVC. - person Borhink; 08.01.2020
comment
Не могли бы вы предоставить мне список установленных классов хранения, доступных в вашем кластере, PV и, наконец, Kafka пользовательский ресурс, который вы используете для развертывания кластера? - person ppatierno; 08.01.2020
comment
У меня нет установленных классов хранения или только по умолчанию, как я полагаю. Это новый кластер, который я создал для тестирования стримзи. Единственное, что есть в кластере, подробно описано в предоставленной мной ссылке (краткое руководство для strimzi). - person Borhink; 08.01.2020

В моем случае я создавал кафку в другом пространстве имен my-cluster-kafka, но оператор strimzi находился в пространстве имен kafka.

Итак, я просто создал в том же пространстве имен. Для тестовой цели я использую временное хранилище.

Вот файл kafla.yaml:

apiVersion: kafka.strimzi.io/v1beta1
kind: Kafka
metadata:
  name: my-cluster
spec:
  kafka:
    replicas: 1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external
        port: 9094
        type: nodeport
        tls: false
    storage:
      type: ephemeral
    config:
      offsets.topic.replication.factor: 1
      transaction.state.log.replication.factor: 1
      transaction.state.log.min.isr: 1
  zookeeper:
    replicas: 1
    storage:
      type: ephemeral
  entityOperator:
    topicOperator: {}
    userOperator: {}
person Andre Araujo    schedule 10.03.2021