Kafka имеет множество компонентов, таких как Headless Services, Statefulsets , и каждый из них играет особую роль. По этой причине я бы также предложил использовать Kafka Confluenti c Диаграмма руля .
Это руководство основано на диаграмме руля, так как вы упомянули, что будете использовать его в комментариях но приведенные здесь концепции могут быть распространены на любое приложение, которое использует службы безголового доступа и нуждается во внешнем доступе.
В отношении того, что вы предоставили, я полагаю, что вы столкнулись с некоторыми трудностями, поскольку вы ссылаетесь на внешнюю службу без ссылки, которая не будет работать поскольку служба безголового доступа не имеет внутреннего операционного IP.
служба безголового оператора создается вместе с StatefulSet. Созданный сервис не получит clusterIP
, но вместо этого будет просто включать список Endpoints
. Затем эти Endpoints
используются для генерации спецификаций экземпляра c DNS-записей в виде: <StatefulSet>-<Ordinal>.<Service>.<Namespace>.svc.cluster.local
Он создает DNS-имя для каждого модуля, например:
[ root@curl:/ ]$ nslookup my-confluent-cp-kafka-headless
Server: 10.0.0.10
Address 1: 10.0.0.10 kube-dns.kube-system.svc.cluster.local
Name: my-confluent-cp-kafka-headless
Address 1: 10.8.0.23 my-confluent-cp-kafka-1.my-confluent-cp-kafka-headless.default.svc.cluster.local
Address 2: 10.8.1.21 my-confluent-cp-kafka-0.my-confluent-cp-kafka-headless.default.svc.cluster.local
Address 3: 10.8.3.7 my-confluent-cp-kafka-2.my-confluent-cp-kafka-headless.default.svc.cluster.local
Это то, что заставляет эти сервисы соединяться друг с другом внутри кластера.
Поэтому вы не можете выставить cp-kafka:9092
, который является безголовый сервис, также используется только для внутреннего использования, как я объяснил выше.
- Чтобы получить внешний доступ , необходимо установить параметры
nodeport.enabled
на true
, как указано здесь : Параметры внешнего доступа . - Он добавляет один сервис к каждому модулю kafka-N во время развертывания диаграммы.
- Обратите внимание, что созданный сервис имеет селектор
statefulset.kubernetes.io/pod-name: demo-cp-kafka-0
, это как служба определяет модуль, к которому она предназначена.
Воспроизведение:
nodeport:
enabled: true
servicePort: 19092
firstListenerPort: 31090
$ helm install demo cp-helm-charts
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
demo-cp-control-center-6d79ddd776-ktggw 1/1 Running 3 113s
demo-cp-kafka-0 2/2 Running 1 113s
demo-cp-kafka-1 2/2 Running 0 94s
demo-cp-kafka-2 2/2 Running 0 84s
demo-cp-kafka-connect-79689c5c6c-947c4 2/2 Running 2 113s
demo-cp-kafka-rest-56dfdd8d94-79kpx 2/2 Running 1 113s
demo-cp-ksql-server-c498c9755-jc6bt 2/2 Running 2 113s
demo-cp-schema-registry-5f45c498c4-dh965 2/2 Running 3 113s
demo-cp-zookeeper-0 2/2 Running 0 112s
demo-cp-zookeeper-1 2/2 Running 0 93s
demo-cp-zookeeper-2 2/2 Running 0 74s
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-cp-control-center ClusterIP 10.0.13.134 <none> 9021/TCP 50m
demo-cp-kafka ClusterIP 10.0.15.71 <none> 9092/TCP 50m
demo-cp-kafka-0-nodeport NodePort 10.0.7.101 <none> 19092:31090/TCP 50m
demo-cp-kafka-1-nodeport NodePort 10.0.4.234 <none> 19092:31091/TCP 50m
demo-cp-kafka-2-nodeport NodePort 10.0.3.194 <none> 19092:31092/TCP 50m
demo-cp-kafka-connect ClusterIP 10.0.3.217 <none> 8083/TCP 50m
demo-cp-kafka-headless ClusterIP None <none> 9092/TCP 50m
demo-cp-kafka-rest ClusterIP 10.0.14.27 <none> 8082/TCP 50m
demo-cp-ksql-server ClusterIP 10.0.7.150 <none> 8088/TCP 50m
demo-cp-schema-registry ClusterIP 10.0.7.84 <none> 8081/TCP 50m
demo-cp-zookeeper ClusterIP 10.0.9.119 <none> 2181/TCP 50m
demo-cp-zookeeper-headless ClusterIP None <none> 2888/TCP,3888/TCP 50m
- Мой узел работает по IP
35.226.189.123
, и я подключусь к службе demo-cp-kafka-0-nodeport
nodeport, которая находится на порту 31090
, Теперь давайте попробуем подключиться снаружи кластера. Для этого я подключусь к другой виртуальной машине, где у меня есть мини-куб, поэтому я могу использовать kafka-client
pod для тестирования:
user@minikube:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kafka-client 1/1 Running 0 17h
user@minikube:~$ kubectl exec kafka-client -it -- bin/bash
root@kafka-client:/# kafka-console-consumer --bootstrap-server 35.226.189.123:31090 --topic demo-topic --from-beginning --timeout-ms 8000 --max-messages 1
Wed Apr 15 18:19:48 UTC 2020
Processed a total of 1 messages
root@kafka-client:/#
Как видите, я смог получить доступ к kafka извне.
- Используя этот метод, диаграмма управления создаст 1 внешнюю службу для каждой заданной вами реплики.
- Если вам нужен внешний доступ к Zookeeper, он не предоставляется автоматически, как kafka агент, но я оставлю для вас модель сервиса:
zookeeper-external-0.yaml
apiVersion: v1
kind: Service
metadata:
labels:
app: cp-zookeeper
pod: demo-cp-zookeeper-0
name: demo-cp-zookeeper-0-nodeport
namespace: default
spec:
externalTrafficPolicy: Cluster
ports:
- name: external-broker
nodePort: 31181
port: 12181
protocol: TCP
targetPort: 31181
selector:
app: cp-zookeeper
statefulset.kubernetes.io/pod-name: demo-cp-zookeeper-0
sessionAffinity: None
type: NodePort
- Он создаст для него сервис:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demo-cp-zookeeper-0-nodeport NodePort 10.0.5.67 <none> 12181:31181/TCP 2s
- Протестируйте его со своим внешним IP:
pod/zookeeper-client created
user@minikube:~$ kubectl exec -it zookeeper-client -- /bin/bash
root@zookeeper-client:/# zookeeper-shell 35.226.189.123:31181
Connecting to 35.226.189.123:31181
Welcome to ZooKeeper!
JLine support is disabled
Если у вас есть какие-либо сомнения, дайте мне знать в комментариях!