Периодически происходит сбой приложения при попытке подключения к кластеру с включенным Kerberos - PullRequest
0 голосов
/ 13 мая 2019

В нашем приложении мы защитили кластер kafka, который мы используем для аудита и обработки исключений.По завершении определенных событий основное приложение подключается к кафке и отправляет сообщение.Существует постоянно работающая потребительская утилита, которая получает сообщения из очереди.Мы используем керберозу для безопасности.

При подключении к kafka мы сталкиваемся с периодической проблемой.Иногда это терпит неудачу, а иногда и проходит.Есть много запущенных заданий, которые отправляют сообщения в Kafka, и случайно любое из них может дать сбой в течение данного дня.При повторной попытке много раз это удается.

Ниже приведено сообщение об ошибке.

Connection with broker-hostname/brokerhostip disconnected
javax.security.sasl.SaslException: An error: (java.security.PrivilegedActionException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]) occurred when evaluating SASL token received from the Kafka Broker. Kafka Client will go to AUTH_FAILED state.
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.createSaslToken(SaslClientAuthenticator.java:296)
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.sendSaslToken(SaslClientAuthenticator.java:213)
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.authenticate(SaslClientAuthenticator.java:181)
    at org.apache.kafka.common.network.KafkaChannel.prepare(KafkaChannel.java:71)
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:350)
    at org.apache.kafka.common.network.Selector.poll(Selector.java:303)
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:349)
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:225)
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:126)
    at java.lang.Thread.run(Thread.java:748)
Caused by: javax.security.sasl.SaslException: GSS initiate failed
    at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:211)
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator$2.run(SaslClientAuthenticator.java:278)
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator$2.run(SaslClientAuthenticator.java:276)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.kafka.common.security.authenticator.SaslClientAuthenticator.createSaslToken(SaslClientAuthenticator.java:276)
    ... 9 common frames omitted
Caused by: org.ietf.jgss.GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)
    at sun.security.jgss.krb5.Krb5InitCredential.getInstance(Krb5InitCredential.java:147)
    at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:122)
    at sun.security.jgss.krb5.Krb5MechFactory.getMechanismContext(Krb5MechFactory.java:187)
    at sun.security.jgss.GSSManagerImpl.getMechanismContext(GSSManagerImpl.java:224)
    at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:212)
    at sun.security.jgss.GSSContextImpl.initSecContext(GSSContextImpl.java:179)
    at com.sun.security.sasl.gsskerb.GssKrb5Client.evaluateChallenge(GssKrb5Client.java:192)

Ниже приведены настройки jas, которые мы используем:

KafkaClient {
  com.sun.security.auth.module.Krb5LoginModule required
  doNotPrompt=true
  useTicketCache=true
  useKeyTab=true
  keyTab="keytab-file-location"
  renewTicket=true
  serviceName="kafka"
  principal="PRINCIPAL"
  debug=true
  client=true;
};

Свойства kafka:

bootstrapservers = "server-names"
topic = "topic-name"
securityprotocol = "SASL_PLAINTEXT"
keyserializer = "org.apache.kafka.common.serialization.StringSerializer"
valueserializer = "org.apache.kafka.common.serialization.StringSerializer"

Kerberose работает нормально, так как основное приложение может подключаться к кластеру hadoop с такой же конфигурацией, а также, как я уже упоминал выше, это проблема с перебоями, поэтому она работает большую часть времени.

Может кто-нибудь подсказать мне, какисправить это?

...