Camunda Self Managed on MacOS M1

Hi,

I’m trying to setup a local kubernetes environment in my MacbookPro M1 where I have installed Docker Desktop with Kubernetes.

I’m following the instructions on this page: Camunda Self-Managed for Absolute Beginners | Camunda to the letter but many of the services simply do not start. Actually the only service that starts is camunda-platform-zeebe-gateway.

Looking at the logs I see a lot of exceptions:

→ camunda-platform-connectors

java.lang.UnsupportedOperationException: Unable to determine authentication                                                                        │
│     at io.camunda.common.auth.DefaultNoopAuthentication.getTokenHeader(DefaultNoopAuthentication.java:31)                                          │
│     at io.camunda.common.http.DefaultHttpClient.retrieveToken(DefaultHttpClient.java:207)                                                          │
│     at io.camunda.common.http.DefaultHttpClient.post(DefaultHttpClient.java:148)                                                                   │
│     at io.camunda.operate.CamundaOperateClient.searchProcessDefinitionResults(CamundaOperateClient.java:46)                                        │
│     at io.camunda.connector.runtime.inbound.importer.ProcessDefinitionSearch.query(ProcessDefinitionSearch.java:64)                                │
│     at io.camunda.connector.runtime.inbound.importer.ProcessDefinitionImporter.scheduleImport(ProcessDefinitionImporter.java:55)                   │
│     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)                                                            │
│     at java.base/java.lang.reflect.Method.invoke(Unknown Source)                                                                                   │
│     at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130)                                │
│     at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124)                               │
│     at io.micrometer.observation.Observation.observe(Observation.java:499)                                                                         │
│     at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124)                                        │
│     at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)                         │
│     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)                                                               │
│     at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)                                                                       │
│     at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)                                          │
│     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)                                                                 │
│     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)                                                                │
│     at java.base/java.lang.Thread.run(Unknown Source) 

→ camunda-platform-operate

at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:?]                                                                 │
│     at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[?:?]                                               │
│     at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:?]                                       │
│     at java.lang.reflect.Method.invoke(Method.java:568) ~[?:?]                                                                                     │
│     at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49) [operate-webapp-8.4.5-exec.jar:8.4.5]                        │
│     at org.springframework.boot.loader.Launcher.launch(Launcher.java:95) [operate-webapp-8.4.5-exec.jar:8.4.5]                                     │
│     at org.springframework.boot.loader.Launcher.launch(Launcher.java:58) [operate-webapp-8.4.5-exec.jar:8.4.5]                                     │
│     at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:65) [operate-webapp-8.4.5-exec.jar:8.4.5]                                 │
│ Caused by: java.util.concurrent.ExecutionException: java.net.ConnectException: Connection refused                                                  │
│     at org.elasticsearch.common.util.concurrent.BaseFuture$Sync.getValue(BaseFuture.java:257) ~[elasticsearch-7.17.16.jar!/:7.17.16]               │
│     at org.elasticsearch.common.util.concurrent.BaseFuture$Sync.get(BaseFuture.java:244) ~[elasticsearch-7.17.16.jar!/:7.17.16]                    │
│     at org.elasticsearch.common.util.concurrent.BaseFuture.get(BaseFuture.java:75) ~[elasticsearch-7.17.16.jar!/:7.17.16]                          │
│     at org.elasticsearch.client.RestHighLevelClient.performClientRequest(RestHighLevelClient.java:2692) ~[elasticsearch-rest-high-level-client-7.1 │
│     ... 59 more                                                                                                                                    │
│ Caused by: java.net.ConnectException: Connection refused                                                                                           │
│     at sun.nio.ch.Net.pollConnect(Native Method) ~[?:?]                                                                                            │
│     at sun.nio.ch.Net.pollConnectNow(Net.java:672) ~[?:?]                                                                                          │
│     at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:946) ~[?:?]                                                               │
│     at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvent(DefaultConnectingIOReactor.java:174) ~[httpcore-nio-4.4.16.jar!/:4 │
│     at org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor.processEvents(DefaultConnectingIOReactor.java:148) ~[httpcore-nio-4.4.16.jar!/: │
│     at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor.execute(AbstractMultiworkerIOReactor.java:351) ~[httpcore-nio-4.4.16.jar!/:4. │
│     at org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager.execute(PoolingNHttpClientConnectionManager.java:221) ~[httpasyncclient-4 │
│     at org.apache.http.impl.nio.client.CloseableHttpAsyncClientBase$1.run(CloseableHttpAsyncClientBase.java:64) ~[httpasyncclient-4.1.5.jar!/:4.1. │
│     at java.lang.Thread.run(Thread.java:840) ~[?:?]  

→ camunda-platform-tasklist

24-03-17 15:04:28.034  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #21 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:31.038  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #22 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:34.039  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #23 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:37.042  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #24 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:40.047  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #25 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:43.053  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #26 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:46.065  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #27 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:49.075  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #28 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:52.078  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #29 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:55.083  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #30 connect to Elasticsearch at http:// │
│ 2024-03-17 15:04:58.095  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #31 connect to Elasticsearch at http:// │
│ 2024-03-17 15:05:01.104  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #32 connect to Elasticsearch at http:// │
│ 2024-03-17 15:05:04.113  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #33 connect to Elasticsearch at http:// │
│ 2024-03-17 15:05:07.116  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #34 connect to Elasticsearch at http:// │
│ 2024-03-17 15:05:10.128  INFO 10 --- [           main] i.c.t.e.ElasticsearchConnector           : Retrying #35 connect to Elasticsearch at http:// │
│ 

And also some strange messages for these services:

→ camunda-platform-elasticsearch-master-0

Stream closed EOF for default/camunda-platform-elasticsearch-master-0 (elasticsearch)
Stream closed EOF for default/camunda-platform-elasticsearch-master-0 (sysctl) 

→ camunda-platform-zeebe

Stream closed EOF for default/camunda-platform-zeebe-0 (zeebe) 

I’m starting to wonder if it is at all possible to have a local Camunda Self-Managed instances in my local machine.

Would you be so kind as to provide me with some hints on what might be wrong with my approach?

ajs



Hi @ajs1 - when I wrote that blog post, all the testing was done on an M1 Macbook. It’s possible you need to assign more resources to your Docker install. My current resource allocation is in the screenshot below, but your environment may be different depending on what other services you are running on your Mac.

Operate and Tasklist depend on Elasticsearch, so Zeebe and Elasticsearch are where I would focus my efforts. Forget the other services until those two are running! One thing to check are the events for those pods: press d then Shift+G (or just scroll to the bottom); often events will show if you are lacking resources, such as “Insufficient CPU.”

Let me know what you see in the event log for Zeebe and Elasticsearch!

Thank you very much Nathan. The services are now running properly with one single exception: camunda-platform-connectors. Looking at the logs I find the following:

2024-03-20T21:52:04.282Z ERROR 1 --- [   scheduling-1] i.c.c.r.i.i.ProcessDefinitionImporter    : Failed to import process definitions                                                                              │
│                                                                                                                                                                                                                     │
│ java.lang.UnsupportedOperationException: Unable to determine authentication                                                                                                                                         │
│     at io.camunda.common.auth.DefaultNoopAuthentication.getTokenHeader(DefaultNoopAuthentication.java:31)                                                                                                           │
│     at io.camunda.common.http.DefaultHttpClient.retrieveToken(DefaultHttpClient.java:207)                                                                                                                           │
│     at io.camunda.common.http.DefaultHttpClient.post(DefaultHttpClient.java:148)                                                                                                                                    │
│     at io.camunda.operate.CamundaOperateClient.searchProcessDefinitionResults(CamundaOperateClient.java:46)                                                                                                         │
│     at io.camunda.connector.runtime.inbound.importer.ProcessDefinitionSearch.query(ProcessDefinitionSearch.java:64)                                                                                                 │
│     at io.camunda.connector.runtime.inbound.importer.ProcessDefinitionImporter.scheduleImport(ProcessDefinitionImporter.java:55)                                                                                    │
│     at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)                                                                                                                             │
│     at java.base/java.lang.reflect.Method.invoke(Unknown Source)                                                                                                                                                    │
│     at org.springframework.scheduling.support.ScheduledMethodRunnable.runInternal(ScheduledMethodRunnable.java:130)                                                                                                 │
│     at org.springframework.scheduling.support.ScheduledMethodRunnable.lambda$run$2(ScheduledMethodRunnable.java:124)                                                                                                │
│     at io.micrometer.observation.Observation.observe(Observation.java:499)                                                                                                                                          │
│     at org.springframework.scheduling.support.ScheduledMethodRunnable.run(ScheduledMethodRunnable.java:124)                                                                                                         │
│     at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)                                                                                          │
│     at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)                                                                                                                                │
│     at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)                                                                                                                                        │
│     at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)                                                                                                           │
│     at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)                                                                                                                                  │
│     at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)                                                                                                                                 │
│     at java.base/java.lang.Thread.run(Unknown Source)  

I don’t yet have any processes deployed so I don’t understand this error.

I also see this text when I use the “d” shortcut:

│       memory:  2Gi                                                                                                                                                                                                  │
│     Requests:                                                                                                                                                                                                       │
│       cpu:      1                                                                                                                                                                                                   │
│       memory:   1Gi                                                                                                                                                                                                 │
│     Readiness:  http-get http://:http/actuator/health/readiness delay=30s timeout=1s period=30s #success=1 #failure=5                                                                                               │
│     Environment:                                                                                                                                                                                                    │
│       SERVER_PORT:                          8080                                                                                                                                                                    │
│       ZEEBE_CLIENT_BROKER_GATEWAY-ADDRESS:  camunda-platform-zeebe-gateway:26500                                                                                                                                    │
│       ZEEBE_CLIENT_SECURITY_PLAINTEXT:      true                                                                                                                                                                    │
│     Mounts:                                                                                                                                                                                                         │
│       /tmp from tmp (rw)                                                                                                                                                                                            │
│       /var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-crs5r (ro)                                                                                                                                 │
│ Conditions:                                                                                                                                                                                                         │
│   Type                        Status                                                                                                                                                                                │
│   PodReadyToStartContainers   True                                                                                                                                                                                  │
│   Initialized                 True                                                                                                                                                                                  │
│   Ready                       False                                                                                                                                                                                 │
│   ContainersReady             False                                                                                                                                                                                 │
│   PodScheduled                True                                                                                                                                                                                  │
│ Volumes:                                                                                                                                                                                                            │
│   tmp:                                                                                                                                                                                                              │
│     Type:       EmptyDir (a temporary directory that shares a pod's lifetime)                                                                                                                                       │
│     Medium:                                                                                                                                                                                                         │
│     SizeLimit:  <unset>                                                                                                                                                                                             │
│   kube-api-access-crs5r:                                                                                                                                                                                            │
│     Type:                    Projected (a volume that contains injected data from multiple sources)                                                                                                                 │
│     TokenExpirationSeconds:  3607                                                                                                                                                                                   │
│     ConfigMapName:           kube-root-ca.crt                                                                                                                                                                       │
│     ConfigMapOptional:       <nil>                                                                                                                                                                                  │
│     DownwardAPI:             true                                                                                                                                                                                   │
│ QoS Class:                   Burstable                                                                                                                                                                              │
│ Node-Selectors:              <none>                                                                                                                                                                                 │
│ Tolerations:                 node.kubernetes.io/not-ready:NoExecute op=Exists for 300s                                                                                                                              │
│                              node.kubernetes.io/unreachable:NoExecute op=Exists for 300s                                                                                                                            │
│ Events:                                                                                                                                                                                                             │
│   Type     Reason     Age                  From     Message                                                                                                                                                         │
│   ----     ------     ----                 ----     -------                                                                                                                                                         │
│   Warning  Unhealthy  23m (x334 over 22h)  kubelet  Readiness probe failed: HTTP probe failed with statuscode: 503 

Cheers
ajs

@ajs1 - glad it’s mostly working now! Can you share your values.yaml configuration for the Connectors pod? The Connector Runtime pulls deployed process definitions to look for where you’ve implemented Connectors in your processes (specifically inbound connectors). It isn’t necessarily expecting any deployed process diagrams, but it’s trying to make that call to see what’s there and it’s failing with an authentication error.

Yes, of course. I have not disabled “inbound” connectors so maybe this is the issue.
camunda-values.yaml (1.1 KB)
I would like to use several webhooks in my processes so I guess inbound connectors are necessary?

@ajs1 - I think the default authentication mode for Connectors is OAuth. Try setting this value to “disabled”:

Hi Nathan,

Everything is working perfectly now. Thank you very for your valuable help.

I had a few problems with the certificate and cluster endpoint used in Camunda Modeler, so a few pointers on that in case someone out there is struggling with the same issues :
I’m using Camunda Modeler with this Cluster endpoint: http://zeebe.camunda.local
And I’ve also created a “flags.json” inside " `~/Library/Application Support/camunda-modeler/resources" with the following content:
{
“zeebe-ssl-certificate”: “~/Documents/installation_instructions/camunda/github/microservices/key-zeebe.pem”
}

Cheers
ajs

1 Like

This topic was automatically closed 7 days after the last reply. New replies are no longer allowed.