JcaPEMKeyConverter предоставляется BouncyCastle, необязательной зависимостью. Чтобы использовать поддержку ключей EC, вы должны явно добавить зависимость к пути к классам.

У меня есть простое приложение для потоковой передачи Flink. Он хорошо работает в кластере, созданном start-cluster.sh команда.

Теперь, основываясь на учебнике Flink , я надеюсь развернуть его в режиме приложения изначально в кластере Kubernetes, созданном k3d на macOS.

Вот мой Dockerfile :

      FROM flink

RUN mkdir -p ${FLINK_HOME}/usrlib
COPY ["my-app/target/my-flink-app-xxx.jar", "${FLINK_HOME}/usrlib/my-flink-app-xxx.jar"]

Я построил и отправил его в Docker Hub.

Имя моего кластера k3d-dev, поэтому я побежал

      flink run-application \
    --target kubernetes-application \
    -Dkubernetes.cluster-id=k3d-dev \
    -Dkubernetes.container.image=hongbomiao/my-flink-app-xxx:latest \
    local:///opt/flink/usrlib/my-flink-app-xxx.jar

Однако я получил ошибку:

       The program finished with the following exception:

io.fabric8.kubernetes.client.KubernetesClientException: JcaPEMKeyConverter is provided by BouncyCastle, an optional dependency. To use support for EC Keys you must explicitly add this dependency to classpath.
    at io.fabric8.kubernetes.client.internal.CertUtils.handleECKey(CertUtils.java:161)
    at io.fabric8.kubernetes.client.internal.CertUtils.loadKey(CertUtils.java:131)
    at io.fabric8.kubernetes.client.internal.CertUtils.createKeyStore(CertUtils.java:111)
    at io.fabric8.kubernetes.client.internal.CertUtils.createKeyStore(CertUtils.java:243)
    at io.fabric8.kubernetes.client.internal.SSLUtils.keyManagers(SSLUtils.java:128)
    at io.fabric8.kubernetes.client.internal.SSLUtils.keyManagers(SSLUtils.java:122)
    at io.fabric8.kubernetes.client.utils.HttpClientUtils.createHttpClient(HttpClientUtils.java:82)
    at io.fabric8.kubernetes.client.utils.HttpClientUtils.createHttpClient(HttpClientUtils.java:62)
    at io.fabric8.kubernetes.client.BaseClient.<init>(BaseClient.java:51)
    at io.fabric8.kubernetes.client.DefaultKubernetesClient.<init>(DefaultKubernetesClient.java:105)
    at org.apache.flink.kubernetes.kubeclient.FlinkKubeClientFactory.fromConfiguration(FlinkKubeClientFactory.java:102)
    at org.apache.flink.kubernetes.KubernetesClusterClientFactory.createClusterDescriptor(KubernetesClusterClientFactory.java:61)
    at org.apache.flink.kubernetes.KubernetesClusterClientFactory.createClusterDescriptor(KubernetesClusterClientFactory.java:39)
    at org.apache.flink.client.deployment.application.cli.ApplicationClusterDeployer.run(ApplicationClusterDeployer.java:63)
    at org.apache.flink.client.cli.CliFrontend.runApplication(CliFrontend.java:213)
    at org.apache.flink.client.cli.CliFrontend.parseAndRun(CliFrontend.java:1057)
    at org.apache.flink.client.cli.CliFrontend.lambda$main$10(CliFrontend.java:1132)
    at org.apache.flink.runtime.security.contexts.NoOpSecurityContext.runSecured(NoOpSecurityContext.java:28)
    at org.apache.flink.client.cli.CliFrontend.main(CliFrontend.java:1132)

После чтения

я добавил

      <dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcpkix-jdk15on</artifactId>
    <version>1.69</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.69</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-ext-jdk15on</artifactId>
    <version>1.69</version>
</dependency>

в мой файл pom.xml . Я построил и снова запустил Docker Hub.

Когда я запустил приведенную выше команду Flink, у меня все еще была такая же ошибка. Есть идеи? Спасибо!


ОБНОВИТЬ:

Помимо указанного выше изменения pom.xml , я попытался вручную загрузить эти 3 баночки и изменил свой Dockerfile на

      FROM flink

RUN mkdir -p ${FLINK_HOME}/usrlib
COPY ["streaming/target/streaming-0.1.jar", "${FLINK_HOME}/usrlib/streaming-0.1.jar"]
COPY ["streaming/bcpkix-jdk15on-1.69.jar", "${FLINK_HOME}/usrlib/bcpkix-jdk15on-1.69.jar"]
COPY ["streaming/bcprov-jdk15on-1.69.jar", "${FLINK_HOME}/usrlib/bcprov-jdk15on-1.69.jar"]
COPY ["streaming/bcprov-ext-jdk15on-1.69.jar", "${FLINK_HOME}/usrlib/bcprov-ext-jdk15on-1.69.jar"]

и попытался снова, но все та же ошибка.

2 ответа

После проверки кода файла kubernetes-session.sh Флинка :

      # ...
CC_CLASSPATH=`manglePathList $(constructFlinkClassPath):$INTERNAL_HADOOP_CLASSPATHS`

# ...
"$JAVA_RUN" $JVM_ARGS -classpath "$CC_CLASSPATH" $log_setting org.apache.flink.kubernetes.cli.KubernetesSessionCli "$@"

я добавил echo $CC_CLASSPATHи распечатал путь к классам.

В моем случае это на /usr/local/Cellar/apache-flink/1.13.1/libexec/lib.

После того, как я положил bcprov-jdk15on-1.69.jar и bcpkix-jdk15on-1.69.jar в папке выше Flink теперь можно развернуть на k3s через k3d как в режиме сеанса, так и в режиме приложения.

Сегодня я наткнулся на эту проблему на своем m1 mac, используя docker и k3d для создания кластера k3s.

Я решил это, фактически сделав то, что говорится в сообщении об ошибке: добавив надувной замок в путь к классу.

Но вам нужно добавить bc в путь к классу плагина вpom.xml, вот так:

      ...
      <plugin>
        <groupId>${quarkus.platform.group-id}</groupId>
        <artifactId>quarkus-maven-plugin</artifactId>
        <version>${quarkus.platform.version}</version>
        <extensions>true</extensions>
        <executions>
          <execution>
            <goals>
              <goal>build</goal>
              <goal>generate-code</goal>
              <goal>generate-code-tests</goal>
            </goals>
          </execution>
        </executions>

        <!-- add bouncy castle to class path, so that elliptic curve keys work -->
        <dependencies>
          <dependency>
              <groupId>org.bouncycastle</groupId>
              <artifactId>bcpkix-jdk15on</artifactId>
              <version>1.69</version>
          </dependency>
          <dependency>
              <groupId>org.bouncycastle</groupId>
              <artifactId>bcprov-jdk15on</artifactId>
              <version>1.69</version>
          </dependency>
          <dependency>
              <groupId>org.bouncycastle</groupId>
              <artifactId>bcprov-ext-jdk15on</artifactId>
              <version>1.69</version>
          </dependency>
        </dependencies>
      </plugin>
...

Я не знаю, мне кажется, что k3d всегда генерирует ключи EC, так как у меня была точно такая же проблема на совершенно другой машине (win10/wsl2 + k3d).

Другие вопросы по тегам