[kafka] External bootstrap service

jeonghyun yu·2024년 5월 10일

Strimzi kafka

목록 보기
3/3

참고 페이지

node port service

  • Strimzi kafka는 총 브로커 갯수 + 1개의 서비스를 갖는다.
    • NodePort type으로 생성
    • 파드는 statefulset.kubernetes.io/pod-name label을 포함해서 생성되기 때문에 selector를 사용해서 연결
  • client가 서비스에 연결하고자 하면
    • 쿠버네티스 노드 중 하나의 public IP
    • 서비스에 연결된 node port 필요
  • 해당 정보들은 advertised address로 config 설정 해둔다.
    • 브로커가 재기동 될 때마다 노드가 바뀌므로 init container를 사용해서 노도의 주소를 다시 수집해 변경해준다.
    • init container는 kubernetes API와 통신하여 밑의 node address 중 하나를 취득한다.
      • External DNS
      • External IP
      • Internal DNS
      • Internal IP
      • Hostname
    • 얻어지는 것 중 하나로 사용
  • external bootstrap service의 node port number 확인
    • kubectl get service my-cluster-kafka-external-bootstrap -o=jsonpath='{.spec.ports[0].nodePort}{"\n"}'
  • node 주소 확인
    • kubectl get node node-name -o=jsonpath='{range .status.addresses[*]}{.type}{"\t"}{.address}{"\n"}'
  • 접근 확인
    • bin/kafka-console-producer.sh --broker-list <node-address>:<node-port> --topic <your-topic>

network error Troubleshooting

[2019-04-22 21:04:11,976] WARN [Consumer clientId=consumer-1, groupId=console-consumer-42133] Connection to node 1 (/10.0.2.15:31301) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

or

[2019-04-22 21:11:37,295] WARN [Producer clientId=console-producer] Connection to node -1 (/10.0.2.15:31488) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

DNS name과 IP는 internal하고 외부 client가 접속하지 못해서 발생하는 이슈
production grade clusters와 local development tools(Minikube or Minishift)에서 주로 발생한다.

확인 사항

  • 카프카 클라이언트가 접근할 노드 주소
    • node private IP
    • 10.0.11.69
  • 카프카 파드가 실행되고 있는 노드 주소
    • kubectl get node <node-name> -o=jsonpath='{range .status.addresses[*]}{.type}{"\t"}{.address}{"\n"}'
    • InternalIP 10.0.11.69
  • 카프카 브로커에 advertised 되고 있는 주소
    • kubectl exec my-cluster-kafka-0 -c kafka -it -- cat /tmp/strimzi.properties | grep advertised
    • advertised.listeners=CONTROLPLANE-9090://kafka-cluster-kafka-0.kafka-cluster-kafka-brokers.kafka.svc:9090,REPLICATION-9091://kafka-cluster-kafka-0.kafka-cluster-kafka-brokers.kafka.svc:9091,PLAIN-9092://kafka-cluster-kafka-0.kafka-cluster-kafka-brokers.kafka.svc:9092,TLS-9093://kafka-cluster-kafka-0.kafka-cluster-kafka-brokers.kafka.svc:9093,EXTERNAL-9094://10.0.11.69:31634
  • 세 개가 다르면 문제가 발생할 수 있다.

이슈 해결 방안 1

  • configuration 옵션으로 advertised address를 바꿔줄 수 있다.
    • kubernetes API를 통해 node resource를 읽는 대신에 config하는 방식
# ...
listeners:
  # ...
  - name: external
    port: 9094
    type: nodeport
    tls: false
    configuration:
      brokers:
      - broker: 0
        advertisedHost: XXX.XXX.XXX.XXX
      - broker: 1
        advertisedHost: XXX.XXX.XXX.XXX
      - broker: 2
        advertisedHost: XXX.XXX.XXX.XXX
# ...
  • 쿠버네티스 노드와 포트가 reachable 한지 확인
    • telnet / ping

단점

  • 카프카 클러스터를 scale up 할 때마다 수정해줘야 한다.

node port customizing

  • default node port number는 k8s controller에 의해서 자동 지정된다.
    • kafka cluster를 삭제 후 재배포 할 경우 매번 다른 node port set으로 생성될 것

config

# ...
listeners:
  # ...
  - name: external
    port: 9094
    type: nodeport
    tls: true
    authentication:
      type: tls
    configuration:
      bootstrap:
        nodePort: 32100
      brokers:
      - broker: 0
        nodePort: 32000
      - broker: 1
        nodePort: 32001
      - broker: 2
        nodePort: 32002
# ...
  • bootstrap service : 32100
  • broker services : 32000, 32001, 32002
    • 다른 service가 사용하는 port인지 확인하기!

advertised ports

# ...
listeners:
  # ...
  - name: external
    port: 9094
    type: nodeport
    tls: true
    authentication:
      type: tls
    configuration:
      brokers:
      - broker: 0
        advertisedHost: example.hostname.0
        advertisedPort: 12340
      - broker: 1
        advertisedHost: example.hostname.1
        advertisedPort: 12341
      - broker: 2
        advertisedHost: example.hostname.2
        advertisedPort: 12342
# ...
  • advertisedHost : can be DNS name or IP address

0개의 댓글