Criação de um repositório de dados do Kafka no Linux on IBM Z and LinuxONE
Instale o operador do Kafka e configure o armazenamento de dados
Antes de iniciar
Certifique-se de ter preparado seu host on-line e off-line para extrair imagens do repositório externo. Além disso, assegure-se de que o repositório Helm correto seja incluído.
Para obter mais informações, consulte “Preparação para a instalação do armazenamento de dados ”.
A partir da versão Strimzi 0.46.0, o suporte às versões Kafka 3.8.0 e 3.8.1, aos clusters ZooKeeper-based Apache Kafka e à migração para o KRaft foi descontinuado. Se você usa o Strimzi 0.45.0 ou uma versão anterior, é necessário migrar para o KRaft antes de atualizar para o Strimzi 0.46.0.
Para obter mais informações sobre a migração de dados de um cluster baseado em Zookeeper para um cluster KRaft, consulte o artigo “Migração do Zookeeper para o KRaft” no site Kafka.
Kafka Versões do operador e tags de imagem para implantação
As imagens a seguir são necessárias para o gráfico Helm fixado ou versões do operador.
| Plataforma | Versões do operador | Versão do gráfico do Helm | Imagem com tag |
|---|---|---|---|
| Linux® on IBM Z® and LinuxONE | 0.51.0 | 0.51.0 | artifact-public.instana.io/self-hosted-images/3rd-party/operator/strimzi: 0.51.0_v0.32.0 artifact-public.instana.io/self-hosted-images/3rd-party/datastore/kafka: 0.51.0-kafka-4.1.1_v0.32.0 |
Instalando o Kafka online
Conclua estas etapas para instalar o armazenamento de dados do Kafka
Crie o namespace
instana-kafka:kubectl create namespace instana-kafkaCrie segredos de extração de imagem para o namespace do
instana-kafka. Atualize o valor < download_key> com sua própria chave do agente.kubectl create secret docker-registry instana-registry --namespace instana-kafka \ --docker-username=_ \ --docker-password=<download_key> \ --docker-server=artifact-public.instana.ioCrie
custom_values.yamle especifique a tolerância e a afinidade. Pule esta etapa se o arquivo já tiver sido criado.tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true"Instale o operador Strimzi.
helm install strimzi instana/strimzi-kafka-operator --version 0.51.0 -n instana-kafka --set image.registry=artifact-public.instana.io --set image.repository=self-hosted-images/3rd-party/operator --set image.name=strimzi --set image.tag=0.51.0_v0.32.0 --set image.imagePullSecrets[0].name="instana-registry" --set kafka.image.registry=artifact-public.instana.io --set kafka.image.repository=self-hosted-images/3rd-party/datastore --set kafka.image.name=kafka --set kafka.image.tag=0.51.0-kafka-4.1.1_v0.32.0 -f custom_values.yamlCrie um arquivo ` YAML ` para o broker. Por exemplo,
kafka-broker.yamlna configuração do broker.apiVersion: kafka.strimzi.io/v1 kind: KafkaNodePool metadata: name: kafka labels: strimzi.io/cluster: instana spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 50Gi deleteClaim: true template: pod: tmpDirSizeLimit: 500Mi tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true"Implantar o Broker.
kubectl apply -f kafka-broker.yaml -n instana-kafkaCrie um arquivo ` YAML ` para o controlador. Por exemplo,
kafka-controller.yamlna configuração do controlador.apiVersion: kafka.strimzi.io/v1 kind: KafkaNodePool metadata: name: controller labels: strimzi.io/cluster: instana spec: replicas: 3 roles: - controller storage: type: persistent-claim size: 50Gi deleteClaim: true template: pod: tmpDirSizeLimit: 500Mi tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true"Implantar o controlador.
kubectl apply -f kafka-controller.yaml -n instana-kafkaCrie um arquivo YAML. Por exemplo,
kafka.yamlcom a configuração Kafka.apiVersion: kafka.strimzi.io/v1 kind: Kafka metadata: name: instana labels: strimzi.io/cluster: instana annotations: strimzi.io/node-pools: enabled strimzi.io/kraft: enabled spec: kafka: version: 4.1.1 listeners: - name: scram port: 9092 type: internal tls: false authentication: type: scram-sha-512 configuration: useServiceDnsDomain: true authorization: type: simple superUsers: - strimzi-kafka-user config: offsets.topic.replication.factor: 3 transaction.state.log.replication.factor: 3 transaction.state.log.min.isr: 2 default.replication.factor: 3 min.insync.replicas: 2 max.message.bytes: 52428800 replica.fetch.max.bytes: 52428800 template: pod: tmpDirSizeLimit: 100Mi template: pod: tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true" entityOperator: template: pod: tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true" tmpDirSizeLimit: 100Mi # Add the following securityContext snippet for Kubernetes offerings other than OCP. # securityContext: # runAsUser: 1000 # fsGroup: 1000 userOperator: image: artifact-public.instana.io/self-hosted-images/3rd-party/operator/strimzi:0.51.0_v0.32.0Conclua as etapas em Implementando e verificando o Kafka (online e offline).
Instalação offline do Operador do Kafka
Se você ainda não extrai as imagens do ClickHouse do registro externo quando se preparou para a instalação, será possível extrai-las agora, Execute os comandos a seguir no host bastion. Em seguida, copie as imagens para o seu servidor de armazenamento de imagens ( Instana ) localizado no seu ambiente isolado.
docker pull artifact-public.instana.io/self-hosted-images/3rd-party/operator/strimzi:0.51.0
docker pull artifact-public.instana.io/self-hosted-images/3rd-party/datastore/kafka:0.51.0_v0.32.0
Siga as etapas a seguir no seu servidor do Instana.
Remarque as imagens para o seu registro de imagem interno
docker tag artifact-public.instana.io/self-hosted-images/3rd-party/operator/strimzi:0.51.0 <internal-image-registry>/operator/strimzi:0.51.0 docker tag artifact-public.instana.io/self-hosted-images/3rd-party/datastore/kafka:0.51.0_v0.32.0 <internal-image-registry>/datastore/kafka:0.51.0_v0.32.0Envie por push as imagens para seu registro de imagem interno no host bastion.
docker push <internal-image-registry>/operator/strimzi:0.51.0 docker push <internal-image-registry>/datastore/kafka:0.51.0_v0.32.0Crie o namespace
instana-kafka:kubectl create namespace instana-kafkaOpcional: Crie um segredo de image pull se o seu registro de imagem interno precisar de autenticação.
kubectl create secret docker-registry <secret_name> --namespace instana-kafka \ --docker-username=<registry_username> \ --docker-password=<registry_password> \ --docker-server=<internal-image-registry>:<internal-image-registry-port> \ --docker-email=<registry_email>Crie
custom_values.yamle especifique a tolerância e a afinidade. Pule esta etapa se o arquivo já tiver sido criado.tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true"Instale o operador Strimzi. Se você criou um segredo de pull de imagem na etapa anterior, adicione
--set image.imagePullSecrets[0].name="<internal-image-registry-pull-secret>"ao comando a seguir:helm install strimzi strimzi-kafka-operator-helm-3-chart-0.51.0.tgz --version 0.51.0 -n instana-kafka --set image.registry=<internal-image-registry> --set image.repository=operator/strimzi --set image.name=strimzi --set image.tag=0.51.0_v0.32.0 --set kafka.image.registry=<internal-image-registry> --set kafka.image.repository=datastore/kafka --set kafka.image.name=kafka --set kafka.image.tag=0.51.0-kafka-4.1.1_v0.32.0 -f custom_values.yamlCrie um arquivo ` YAML ` para o broker. Por exemplo,
kafka-broker.yamlna configuração do broker.apiVersion: kafka.strimzi.io/v1 kind: KafkaNodePool metadata: name: kafka labels: strimzi.io/cluster: instana spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 50Gi deleteClaim: true template: pod: tmpDirSizeLimit: 500Mi tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true"Implantar o Broker.
kubectl apply -f kafka-broker.yaml -n instana-kafkaCrie um arquivo ` YAML ` para o controlador. Por exemplo,
kafka-controller.yamlna configuração do controlador.apiVersion: kafka.strimzi.io/v1 kind: KafkaNodePool metadata: name: controller labels: strimzi.io/cluster: instana spec: replicas: 3 roles: - controller storage: type: persistent-claim size: 50Gi deleteClaim: true template: pod: tmpDirSizeLimit: 500Mi tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true"Implantar o controlador.
kubectl apply -f kafka-controller.yaml -n instana-kafka- Crie um arquivo ` YAML `, por exemplo
kafka.yaml, com a configuração ` Kafka `.apiVersion: kafka.strimzi.io/v1 kind: Kafka metadata: name: instana labels: strimzi.io/cluster: instana annotations: strimzi.io/node-pools: enabled strimzi.io/kraft: enabled spec: kafka: version: 4.1.1 listeners: - name: scram port: 9092 type: internal tls: false authentication: type: scram-sha-512 configuration: useServiceDnsDomain: true authorization: type: simple superUsers: - strimzi-kafka-user template: pod: tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true" config: offsets.topic.replication.factor: 3 transaction.state.log.replication.factor: 3 transaction.state.log.min.isr: 2 default.replication.factor: 3 min.insync.replicas: 2 max.message.bytes: 52428800 replica.fetch.max.bytes: 52428800 template: pod: tmpDirSizeLimit: 100Mi entityOperator: template: pod: tolerations: - key: node.instana.io/monitor operator: Equal effect: NoSchedule value: "true" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-role.kubernetes.io/monitor operator: In values: - "true" tmpDirSizeLimit: 100Mi # Add the following securityContext snippet for Kubernetes offerings other than OCP. # securityContext: # runAsUser: 1000 # fsGroup: 1000 userOperator: image: <internal-image-registry>/operator/strimzi:0.51.0_v0.32.0 - Conclua as etapas em Implementando e verificando o Kafka (online e offline).
Implantação e verificação do ` Kafka ` (online e offline)
Conclua estas etapas para implementar a instância do Kafka e criar o armazenamento de dados
Implemente Kafka.
kubectl apply -f kafka.yaml -n instana-kafka kubectl wait kafka/instana --for=condition=Ready --timeout=300s -n instana-kafkaCrie um usuário Kafka que possa autenticar com um cluster Kafka usando SASL/SCRAM.
Crie um arquivo ` YAML `, por exemplo
strimzi-kafka-user.yaml, com a especificação de usuário ` Kafka `.apiVersion: kafka.strimzi.io/v1 kind: KafkaUser metadata: name: strimzi-kafka-user labels: strimzi.io/cluster: instana spec: authentication: type: scram-sha-512 authorization: type: simple acls: - resource: type: topic name: '*' patternType: literal operation: All host: "*" - resource: type: group name: '*' patternType: literal operation: All host: "*"Crie o usuário
strimzi-kafka-user..kubectl apply -f strimzi-kafka-user.yaml -n instana-kafka kubectl wait kafkauser/strimzi-kafka-user --for=condition=Ready --timeout=60s -n instana-kafkaRecupere a senha do
strimzi-kafka-userkubectl get secret strimzi-kafka-user -n instana-kafka --template='{{index .data.password | base64decode}}' && echoArmazene a senha recuperada no arquivo
config.yamlSubstitua o valor<RETRIEVED_FROM_SECRET>pela senha que você obtém na etapa anterior.datastoreConfigs: ... kafkaConfig: adminUser: strimzi-kafka-user adminPassword: <RETRIEVED_FROM_SECRET> consumerUser: strimzi-kafka-user consumerPassword: <RETRIEVED_FROM_SECRET> producerUser: strimzi-kafka-user producerPassword: <RETRIEVED_FROM_SECRET> ...
Verifique a instalação do Instana Kafka.
kubectl get all -n instana-kafkaA saída pode ser como o exemplo a seguir:
NAME READY STATUS RESTARTS AGE pod/instana-entity-operator-8564975588-mrz2f 3/3 Running 0 15m pod/instana-kafka-0 1/1 Running 0 16m pod/instana-kafka-1 1/1 Running 0 16m pod/instana-kafka-2 1/1 Running 0 16m pod/instana-contoller-0 1/1 Running 0 17m pod/instana-contoller-1 1/1 Running 0 17m pod/instana-contoller-2 1/1 Running 0 17m pod/strimzi-cluster-operator-cf49c75d8-qm8jq 1/1 Running 0 34m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/instana-kafka-bootstrap ClusterIP 192.168.1.239 <none> 9091/TCP,9092/TCP 16m service/instana-kafka-brokers ClusterIP None <none> 9090/TCP,9091/TCP,9092/TCP 16m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/instana-entity-operator 1/1 1 1 15m deployment.apps/strimzi-cluster-operator 1/1 1 1 34m NAME DESIRED CURRENT READY AGE replicaset.apps/instana-entity-operator-8564975588 1 1 1 15m replicaset.apps/strimzi-cluster-operator-cf49c75d8 1 1 1 34mCertifique-se de que os pods estejam agendados nos nós desejados.
kubectl get pods -n instana-kafka -o wideO exemplo a seguir mostra um resultado de saída.
instana-entity-operator-77c6bc665-74d9t 1/1 Running 1 22d 10.254.12.207 worker0.instana-odf5.cp.fyre.ibm.com <none> <none> instana-kafka-0 1/1 Running 1 22d 10.254.12.206 worker1.instana-odf5.cp.fyre.ibm.com <none> <none> instana-kafka-1 1/1 Running 0 22d 10.254.20.18 worker2.instana-odf5.cp.fyre.ibm.com <none> <none> instana-kafka-2 1/1 Running 0 22d 10.254.12.204 worker3.instana-odf5.cp.fyre.ibm.com <none> <none> instana-contoller-0 1/1 Running 1 22d 10.254.12.207 worker0.instana-odf5.cp.fyre.ibm.com <none> <none> instana-contoller-1 1/1 Running 0 22d 10.254.12.206 worker1.instana-odf5.cp.fyre.ibm.com <none> <none> instana-contoller-2 1/1 Running 0 22d 10.254.20.18 worker2.instana-odf5.cp.fyre.ibm.com <none> <none> strimzi-cluster-operator-5c9dfd89c6-dbr4d 1/1 Running 1 22d 10.254.12.204 worker3.instana-odf5.cp.fyre.ibm.com <none> <none>
Tarefas pós-instalação do ` Kafka ` (online e offline)
Depois de instalar com sucesso o operador Kafka , conclua as tarefas a seguir, se necessário:
(Opcional) Equilibrar o cluster usando o controle de velocidade
O controle de cruzeiro equilibra cargas de trabalho em um cluster Kafka . Para obter mais informações, consulte Balanceamento de cluster com o Cruise Control
Para usar o controle de cruzeiro na implementação do Kafka , conclua as etapas a seguir:
Instale um relator de métricas nos brokers do cluster. Para obter mais informações, consulte Monitoramento Kafka.
Crie uma implantação do servidor Cruise Control.
Abra o recurso customizado do
Kafkapara ediçãokubectl edit kafkas.kafka.strimzi.io <your-kafka-cluster-name> -n instana-kafkaInclua a configuração a seguir em seu recurso customizado do
KafkaapiVersion: kafka.strimzi.io/v1 kind: Kafka metadata: name: instana spec: # ... cruiseControl: {}
Aplicar a configuração.
kubectl apply -f kafka.yaml -n instana-kafkaAo aplicar a configuração, o Kafka usa todas as configurações padrão do Cruise Control para implementar o servidor Cruise Control. Se você incluir o Cruise Control em um cluster existente (em vez de iniciar um cluster novo), verá que todos os seus pods do broker do Kafka serão rolados para instalar o relator de métricas.
Verifique se o Cruise Control está implementado em seu agrupamento.
kubectl get pods -n instana-kafkaA saída de comando mostra o pod de controle de cruzeiro conforme mostrado no exemplo a seguir:
NAME READY STATUS RESTARTS AGE instana-cruise-control-6fcbd54b48-ndzrh 2/2 Running 0 8m48s instana-entity-operator-78d7995695-8tt2v 3/3 Running 0 12m instana-kafka-0 2/2 Running 0 9m12s instana-kafka-1 2/2 Running 0 10m instana-kafka-2 2/2 Running 0 9m46s instana-contoller-0 1/1 Running 0 13m instana-contoller-1 1/1 Running 0 13m instana-contoller-2 1/1 Running 0 13m strimzi-cluster-operator-54565f8c56-rmdb8 1/1 Running 0 14mApós o Cruise Control ser implementado, ele começa a extrair métricas dos tópicos criados pelos repórteres de métricas em cada broker.
Obter uma proposta de otimização
Depois que o Cruise Control é implementado, você pode gerar uma proposta de otimização. Para fazer isso, é necessário aplicar um recurso customizado do KafkaRebalance (a definição para isso é instalada ao instalar o Strimzi). Um KafkaRebalance básico é mostrado no exemplo a seguir:
apiVersion: kafka.strimzi.io/v1
kind: KafkaRebalance
metadata:
name: my-rebalance
labels:
strimzi.io/cluster: instana
# no goals specified, using the default goals from the Cruise Control configuration
spec: {}
É possível implementar o recurso customizado KafkaRebalance como qualquer outro recurso.
kubectl apply -f kafka-rebalance.yaml -n instana-kafka
Ao aplicar o recurso KafkaRebalance em seu cluster Kafka , o Operador de cluster emite as solicitações relevantes para o Cruise Control para buscar a proposta de otimização. O Cluster Operator armazena o status do KafkaRebalance e as atualizações de progresso do Cruise Control. É possível verificar as atualizações usando o comando a seguir:
kubectl describe kafkarebalance my-rebalance -n instana-kafka
O resultado pode ser como o seguinte exemplo:
Name: my-rebalance
Namespace: instana-kafka
Labels: strimzi.io/cluster=instana
Annotations: API Version: kafka.strimzi.io/v1
Kind: KafkaRebalance
Metadata:
# ...
Status:
Conditions:
Last Transition Time: 2023-04-04T11:13:35.749066535Z
Status: ProposalReady
Type: State
Observed Generation: 1
Optimization Result:
Data To Move MB: 0
Excluded Brokers For Leadership:
Excluded Brokers For Replica Move:
Excluded Topics:
Intra Broker Data To Move MB: 12
Monitored Partitions Percentage: 100
Num Intra Broker Replica Movements: 0
Num Leader Movements: 24
Num Replica Movements: 55
On Demand Balancedness Score After: 84.23162054159118
On Demand Balancedness Score Before: 80.87946050436929
Recent Windows: 5
Session Id: 42f7cc24-b295-4406-80c9-c3c7a3625180
Os itens a seguir são as partes principais da solicitação KafkaRebalance :
O campo
Status.Conditions.Statusmostra o progresso de sua solicitação de rebalanceamento Se a proposta ainda não estiver pronta, você poderá verProposalPendingcomoStatus.O
Status.Optimization Result(quando a proposta estiver pronta) mostra um resumo da proposta de otimização. O significado de cada um desses valores é descrito na documentação do Strimzi
Iniciando um reequilíbrio do cluster
Se a proposta KafkaRebalance corresponder ao seu requisito, será possível aplicar uma anotação approve ao recurso KafkaRebalance para Cruise Control para iniciar a aplicação das mudanças:
kubectl annotate kafkarebalance my-rebalance strimzi.io/rebalance=approve -n instana-kafka
Ao aplicar uma anotação approve , o Cruise Control atualiza as mudanças da proposta KafkaRebalance . O Operador do cluster mantém o status do recurso do KafkaRebalance atualizado com o progresso do rebalanceamento enquanto ele está em andamento É possível verificar o progresso do rebalanceamento executando o comando a seguir:
kubectl describe kafkarebalance my-rebalance -n instana-kafka
Quando o rebalanceamento está em andamento, o Status mostra Rebalancing. Quando o rebalanceamento for concluído, o Status mostrará Ready
Consulte o seguinte exemplo:
Name: my-rebalance
Namespace: instana-kafka
Labels: strimzi.io/cluster=instana
Annotations: API Version: kafka.strimzi.io/v1
Kind: KafkaRebalance
Metadata:
# ...
Status:
Conditions:
Last Transition Time: 2023-04-04T11:16:06.230479824Z
Status: Rebalancing
Type: State
# ...
Interromper o reequilíbrio de um cluster
Os rebalanceamentos podem levar muito tempo e podem impactar o desempenho do cluster. Portanto, talvez você queira parar um rebalanceamento se ele causar um problema. Para parar um rebalanceamento contínuo, é possível aplicar a anotação stop ao recurso KafkaRebalance a qualquer momento usando o comando a seguir:
kubectl annotate kafkarebalance my-rebalance strimzi.io/rebalance=stop -n instana-kafka