{"id":37022541,"url":"https://github.com/jgroups-extras/jgroups-kubernetes","last_synced_at":"2026-01-14T02:41:41.240Z","repository":{"id":9623151,"uuid":"62534926","full_name":"jgroups-extras/jgroups-kubernetes","owner":"jgroups-extras","description":"JGroups discovery protocol for Kubernetes","archived":false,"fork":false,"pushed_at":"2025-12-11T13:23:34.000Z","size":873,"stargazers_count":97,"open_issues_count":8,"forks_count":35,"subscribers_count":9,"default_branch":"main","last_synced_at":"2025-12-12T16:38:14.625Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://jgroups.org","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jgroups-extras.png","metadata":{"files":{"readme":"README.adoc","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-07-04T05:51:10.000Z","updated_at":"2025-12-11T13:23:31.000Z","dependencies_parsed_at":"2024-01-01T18:26:27.538Z","dependency_job_id":"1471bcc4-4ca9-4f7d-b8f7-d3a4efc16113","html_url":"https://github.com/jgroups-extras/jgroups-kubernetes","commit_stats":null,"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/jgroups-extras/jgroups-kubernetes","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgroups-extras%2Fjgroups-kubernetes","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgroups-extras%2Fjgroups-kubernetes/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgroups-extras%2Fjgroups-kubernetes/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgroups-extras%2Fjgroups-kubernetes/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jgroups-extras","download_url":"https://codeload.github.com/jgroups-extras/jgroups-kubernetes/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jgroups-extras%2Fjgroups-kubernetes/sbom","scorecard":{"id":518345,"data":{"date":"2025-08-11","repo":{"name":"github.com/jgroups-extras/jgroups-kubernetes","commit":"999d7c4e5171ea2fbd15924eb090b960302d90d6"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":5.4,"checks":[{"name":"Maintained","score":3,"reason":"4 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:30: update your workflow using https://app.stepsecurity.io/secureworkflow/jgroups-extras/jgroups-kubernetes/ci.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:32: update your workflow using https://app.stepsecurity.io/secureworkflow/jgroups-extras/jgroups-kubernetes/ci.yml/main?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Code-Review","score":3,"reason":"Found 1/3 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:10","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: Apache License 2.0: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T02:20:40.280Z","repository_id":9623151,"created_at":"2025-08-20T02:20:40.280Z","updated_at":"2025-08-20T02:20:40.280Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28408712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T01:52:23.358Z","status":"online","status_checked_at":"2026-01-14T02:00:06.678Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-14T02:41:40.644Z","updated_at":"2026-01-14T02:41:41.227Z","avatar_url":"https://github.com/jgroups-extras.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"= Kubernetes discovery protocol for JGroups\n\n`KUBE_PING` is a discovery protocol for JGroups cluster nodes managed by Kubernetes.\n\nNOTE: Another discovery protocol, which is container-agnostic (docker, openshift, kubernetes), is\n`DNS_PING` (http://www.jgroups.org/manual5/index.html#_dns_ping). This could be considered as an alternative.\n\nSince Kubernetes is in charge of launching nodes, it knows the IP addresses of all pods it started, and is therefore\nthe best place to ask for cluster discovery.\n\nDiscovery is therefore done by asking Kubernetes for a list of IP addresses of all cluster nodes.\n\nCombined with `bind_port` / `port_range`, the protocol will then send a discovery request to all instances and wait for\nthe responses.\n\nA sample configuration looks like this:\n\n.Sample KUBE_PING config\n[source,xml]\n----\n  \u003cTCP\n     bind_addr=\"loopback,match-interface:eth0\"\n     bind_port=\"7800\"\n     ...\n  /\u003e\n  \u003corg.jgroups.protocols.kubernetes.KUBE_PING\n     port_range=\"1\"\n     namespace=\"${KUBERNETES_NAMESPACE:production}\"\n     labels=\"${KUBERNETES_LABELS:cluster=nyc}\"\n  /\u003e\n  ...\n----\n\nWhen a discovery is started, `KUBE_PING` asks Kubernetes for a list of the IP addresses of all pods which it launched,\nmatching the given _namespace_ and _labels_ (see below).\n\nLet's say Kubernetes launched a cluster of 3 pods with IP addresses `172.17.0.2`, `172.17.0.3` and `172.17.0.5` (all\nlaunched into the same namespace and without any (or the same) labels).\n\nOn a discovery request, Kubernetes returns a list of 3 IP addresses. JGroups now knows that the ports have been\nallocated from range [`7800` .. `7801`] (`bind_port` .. (`bind_port` + `port_range`) in `TCP`).\n\nKUBE_PING therefore sends discovery requests to members at addresses `172.17.0.2:7800`, `172.17.0.2:7801`, `172.17.0.3:7800`,\n`172.17.0.3:7801`, `172.17.0.5:7800` and `172.17.0.5:7801`.\n\nNOTE: Clients need permission to ask Kubernetes for a list of pod IPs. This is done by creating various policies e.g.\nwith YAML. See the 3 example policies at the top of the \u003c\u003cDemo\u003e\u003e section below.\n\n\n== Separating different clusters\n\nIf pods with containers in different clusters are launched, we'd get a list of IP addresses of all nodes, not just the\nones in the same cluster, as Kubernetes knows nothing about clusters.\n\nIf we start multiple clusters, we need to separate them using namespaces and/or labels. If no namespaces or labels were\nused, things would still work, but we'd see warning messages in the logs about messages from different clusters that\nwere discarded.\n\n\n=== Namespaces\n\nNamespaces can be used to separate deployments, services and pods. The example below shows namespaces `default`\n(the default namespace) and `kube-system` (the name space used by Kubernetes for its own deployments, pods etc):\n\n----\n[belasmac] /Users/bela/IspnPerfTest$ kubectl get services,deployments,pods --all-namespaces\nNAMESPACE     NAME                       CLUSTER-IP   EXTERNAL-IP   PORT(S)          AGE\ndefault       svc/ispn-perf-test         10.0.0.137   \u003cnodes\u003e       8090:32700/TCP   8h\ndefault       svc/kubernetes             10.0.0.1     \u003cnone\u003e        443/TCP          53d\nkube-system   svc/kube-dns               10.0.0.10    \u003cnone\u003e        53/UDP,53/TCP    53d\nkube-system   svc/kubernetes-dashboard   10.0.0.30    \u003cnodes\u003e       80:30000/TCP     53d\n\nNAMESPACE   NAME                     DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE\ndefault     deploy/ispn-perf-test2   3         3         3            3           8h\n\nNAMESPACE     NAME                                  READY     STATUS    RESTARTS   AGE\ndefault       po/ispn-perf-test2-2831437780-g07c5   1/1       Running   1          8h\ndefault       po/ispn-perf-test2-2831437780-np83d   1/1       Running   0          6h\ndefault       po/ispn-perf-test2-2831437780-szl60   1/1       Running   1          8h\nkube-system   po/kube-addon-manager-minikube        1/1       Running   12         53d\nkube-system   po/kube-dns-v20-b63lk                 3/3       Running   34         53d\nkube-system   po/kubernetes-dashboard-73c7v         1/1       Running   11         53d\n----\n\nThe last section shows 6 pods that have been started, 3 in the `default` namespace and 3 by Kubernetes itself in the\n`kube-system` namespace. The following 3 namespaces exist:\n\n----\n[belasmac] /Users/bela$ kubectl get namespaces\nNAME          STATUS    AGE\nbelaban       Active    2d\ndefault       Active    53d\nkube-system   Active    53d\n----\n\nTo create a new namespace `foo`, run `kubectl create namespace foo`.\n\nNamespaces have to be created and deleted manually via kubectl.\n\nWhen launching a new deployment in a pod, the namespace can be given with `-n \u003cname space\u003e` or\n`--namespace=\u003cname space\u003e`. Alternatively, the namespace can be defined in the YAML or JSON config passed to\n`kubectl create -f \u003cconfig\u003e`.\n\nIn the JGroups configuration, attribute `namespace` is used to define the namespace to be used for discovery. The\nexample above used `namespace=\"${KUBERNETES_NAMESPACE:production}\"`. This means that the namespace is\n\n* the value of system property `KUBERNETES_NAMESPACE`, if set\n* the value of environment variable `KUBERNETES_NAMESPACE` if set, or\n* `\"production\"` if neither system property nor env var are set\n\nIn the example above, Kubernetes will return only IP addresses of pods created in namespace `\"production\"`.\n\n\n=== Labels\n\nLabels are similar to namespaces; different labels can separate clusters running inside the _same namespace_.\n\nSimilarly to namespaces, labels also have to be defined when launching a pod, either via `--labels=\u003clabel\u003e` passed\nto `kubectl run`, or in the YAML or JSON configuration file passed to `kubectl create -f \u003cconfig\u003e`.\n\nIn the sample configuration above, labels were defined as `labels=\"${KUBERNETES_LABELS:cluster=nyc}\"`. This means that\nKubernetes will only return IP addresses of pods started with label `cluster=nyc`.\n\nNamespaces and labels can be both set; in this case, Kubernetes will return the IP addresses of all pods started in\nthe given namespace matching the given label(s).\n\nIf neither namespace nor labels are set, then the IP addresses of all pods created by Kubernetes in the default\nnamespace `\"default\"` will be returned.\n\n\n=== KUBE_PING configuration\n\n[align=\"left\",width=\"90%\",cols=\"3,3,3,10\",options=\"header\"]\n|===============\n| Attribute name | System property | Default | Description\n\n| port_range || `1` | Number of additional ports to be probed for membership. A port_range of 0 does not\n                    probe additional ports. Example: `initial_hosts=A[7800] port_range=0` probes `A:7800`, `port_range=1`\n                    probes `A:7800` and `A:7801`\n\n| connectTimeout | KUBERNETES_CONNECT_TIMEOUT | `5000` | Maximum time (in milliseconds) to wait for a connection to the Kubernetes server. If exceeded, an exception will be thrown.\n\n| readTimeout | KUBERNETES_READ_TIMEOUT | `30000` | Maximum time in milliseconds to wait for a response from the Kubernetes server.\n\n| operationAttempts | KUBERNETES_OPERATION_ATTEMPTS | `3` | Maximum number of attempts to send discovery requests.\n\n| operationSleep | KUBERNETES_OPERATION_SLEEP | `1000` | Time in milliseconds between operation attempts.\n\n| masterProtocol | KUBERNETES_MASTER_PROTOCOL | `https` | Schema http or https to be used to send the initial discovery request to the Kubernetes server.\n\n| masterHost | KUBERNETES_SERVICE_HOST || The URL of the Kubernetes server.\n\n| masterPort | KUBERNETES_SERVICE_PORT || The port on which the Kubernetes server is listening.\n\n| apiVersion | KUBERNETES_API_VERSION | `v1` | The version of the protocol to the Kubernetes server.\n\n| namespace | KUBERNETES_NAMESPACE | `default` | The namespace to be used.\n\n| labels | KUBERNETES_LABELS || The labels to use in the discovery request to the Kubernetes server.\n\n| clientCertFile | KUBERNETES_CLIENT_CERTIFICATE_FILE || Certificate to access the Kubernetes server.\n\n| clientKeyFile | KUBERNETES_CLIENT_KEY_FILE || Client key file (store).\n\n| clientKeyPassword | KUBERNETES_CLIENT_KEY_PASSWORD || The password to access the client key store.\n\n| clientKeyAlgo | KUBERNETES_CLIENT_KEY_ALGO | `RSA` | The algorithm used by the client.\n\n| caCertFile | KUBERNETES_CA_CERTIFICATE_FILE | `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt` | Client CA certificate.\n\n| saTokenFile | SA_TOKEN_FILE | `/var/run/secrets/kubernetes.io/serviceaccount/token` | Token file.\n\n| dump_requests || `false` | Dumps all discovery requests and responses to the Kubernetes server to stdout when true.\n\n| split_clusters_during_rolling_update | KUBERNETES_SPLIT_CLUSTERS_DURING_ROLLING_UPDATE | `false` | During the Rolling Update, prevents from putting all Pods into a single cluster.\n\n| useNotReadyAddresses | KUBERNETES_USE_NOT_READY_ADDRESSES | `true` | True if initial discovery should take unready Pods into consideration.\n\n|===============\n\n\n[[Demo]]\n== Demo\n\nIn this demo, we're going to let Kubernetes start 3 instances of\nhttp://www.github.com/belaban/IspnPerfTest[IspnPerfTest] via a YAML configuration. Then we'll\nrun a separate instance interactively and confirm that the instances have formed a cluster of 4. All instances\nare created in the default namespace and no labels are used.\n\nCopy n' paste the snippet below in a terminal where kubectl is running against your K8S cluster\n\n----\n# ---------------------------------------------------------------------\n# This demo assumes that RBAC is enabled on the Kubernetes cluster.\n#\n# The serviceaccount, clusterrole and clusterrolebinding provide\n# permission for the pods to query K8S api\n# ---------------------------------------------------------------------\n\n# Change to a Kubernetes namespace of your preference\nexport TARGET_NAMESPACE=default\n\nkubectl create serviceaccount jgroups-kubeping-service-account -n $TARGET_NAMESPACE\n\ncat \u003c\u003cEOF | kubectl apply -f -\nkind: ClusterRole\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n  name: jgroups-kubeping-pod-reader\nrules:\n- apiGroups: [\"\"]\n  resources: [\"pods\"]\n  verbs: [\"get\", \"list\"]\n\n---\n\napiVersion: rbac.authorization.k8s.io/v1beta1\nkind: ClusterRoleBinding\nmetadata:\n  name: jgroups-kubeping-api-access\nroleRef:\n  apiGroup: rbac.authorization.k8s.io\n  kind: ClusterRole\n  name: jgroups-kubeping-pod-reader\nsubjects:\n- kind: ServiceAccount\n  name: jgroups-kubeping-service-account\n  namespace: $TARGET_NAMESPACE\n\n---\n\napiVersion: v1\nitems:\n- apiVersion: apps/v1\n  kind: Deployment\n  metadata:\n    annotations:\n    name: ispn-perf-test\n    namespace: $TARGET_NAMESPACE\n  spec:\n    replicas: 3\n    selector:\n      matchLabels:\n        run: ispn-perf-test\n    template:\n      metadata:\n        labels:\n          run: ispn-perf-test\n      spec:\n        serviceAccountName: jgroups-kubeping-service-account\n        containers:\n        - args:\n          - /opt/ispn/IspnPerfTest/bin/kube.sh\n          - -nohup\n          env:\n          - name: KUBERNETES_NAMESPACE\n            valueFrom:\n              fieldRef:\n                apiVersion: v1\n                fieldPath: metadata.namespace\n          image: belaban/ispn_perf_test\n          name: ispn-perf-test\n          resources: {}\n          terminationMessagePath: /dev/termination-log\nkind: List\nmetadata: {}\n\nEOF\n----\n\nTo remove the resources when demo time is over:\n----\nkubectl delete deployment/ispn-perf-test clusterrolebinding/jgroups-kubeping-api-access clusterrole/jgroups-kubeping-pod-reader serviceaccount/jgroups-kubeping-service-account -n $TARGET_NAMESPACE\n----\n\n\nThe image is `belaban/ispn_perf_test` which contains the IspnPerfTest project plus some scripts to start nodes. 3\ninstances are started and the start command is `kube-debug.sh -nohup`; this launches the programs without the loop\nwhich reads commands from stdin.\n\n`kubectl get pods` confirms that 3 instances have been created:\n----\nbelasmac] /Users/bela/kubetest$ kubectl get pods\nNAME                              READY     STATUS    RESTARTS   AGE\nispn-perf-test-2224433472-6l456   1/1       Running   0          29s\nispn-perf-test-2224433472-ksh58   1/1       Running   0          29s\nispn-perf-test-2224433472-rlr0m   1/1       Running   0          29s\n----\n\nWe can now run a shell in one of the nodes and confirm that a cluster of 3 has formed. First, we have to exec a bash shell\nin one of the 3 nodes:\n----\n[belasmac] /Users/bela/kubetest$ kubectl exec -it ispn-perf-test-2224433472-rlr0m bash\nbash-4.3$\n----\n\nNow http://www.jgroups.org/manual4/index.html#Probe[probe] can be used to list all cluster members:\n----\nbash-4.3$ cd IspnPerfTest/\nbash-4.3$ bin/probe.sh\n-- sending probe request to /224.0.75.75:7500\n\n#1 (300 bytes):\nlocal_addr=ispn-perf-test-2224433472-rlr0m-12151\nphysical_addr=172.17.0.5:7800\nview=[ispn-perf-test-2224433472-ksh58-1200|2] (3) [ispn-perf-test-2224433472-ksh58-1200, ispn-perf-test-2224433472-6l456-41832, ispn-perf-test-2224433472-rlr0m-12151]\ncluster=default\nversion=4.0.3-SNAPSHOT (Schiener Berg)\n\n#2 (299 bytes):\nlocal_addr=ispn-perf-test-2224433472-ksh58-1200\nphysical_addr=172.17.0.6:7800\nview=[ispn-perf-test-2224433472-ksh58-1200|2] (3) [ispn-perf-test-2224433472-ksh58-1200, ispn-perf-test-2224433472-6l456-41832, ispn-perf-test-2224433472-rlr0m-12151]\ncluster=default\nversion=4.0.3-SNAPSHOT (Schiener Berg)\n\n#3 (300 bytes):\nlocal_addr=ispn-perf-test-2224433472-6l456-41832\nphysical_addr=172.17.0.7:7800\nview=[ispn-perf-test-2224433472-ksh58-1200|2] (3) [ispn-perf-test-2224433472-ksh58-1200, ispn-perf-test-2224433472-6l456-41832, ispn-perf-test-2224433472-rlr0m-12151]\ncluster=default\nversion=4.0.3-SNAPSHOT (Schiener Berg)\n\n3 responses (3 matches, 0 non matches)\n----\n\nAs can be seen, every member has the same view `ispn-perf-test-2224433472-ksh58-1200|2] (3)` containing 3 members, so\nthe cluster has formed correctly.\n\nNow a fourth instance can be created, but this time we'll enable the event loop reading from stdin. To this end, we\nhave to use `kubectl run -it` (`-it` for interactively):\n----\n[belasmac] /Users/bela/kubetest$ kubectl run ispn -it --rm=true --image=belaban/ispn_perf_test kube.sh\nWaiting for pod default/ispn-3105267510-nr9dp to be running, status is Pending, pod ready: false\nIf you don't see a command prompt, try pressing enter.\n\n-------------------------------------------------------------------\nGMS: address=ispn-3105267510-nr9dp-29942, cluster=default, physical address=172.17.0.8:7800\n-------------------------------------------------------------------\n\n-------------------------------------------------------------------\nGMS: address=ispn-3105267510-nr9dp-43008, cluster=cfg, physical address=172.17.0.8:7900\n-------------------------------------------------------------------\ncreated 100,000 keys: [1-100,000], old key set size: 0\nFetched config from ispn-perf-test-2224433472-ksh58-51617: {print_details=true, num_threads=100, print_invokers=false, num_keys=100000, time_secs=60, msg_size=1000, read_percentage=1.0}\ncreated 100,000 keys: [1-100,000]\n[1] Start test [2] View [3] Cache size [4] Threads (100)\n[5] Keys (100,000) [6] Time (secs) (60) [7] Value size (1.00KB) [8] Validate\n[p] Populate cache [c] Clear cache [v] Versions\n[r] Read percentage (1.00)\n[d] Details (true)  [i] Invokers (false) [l] dump local cache\n[q] Quit [X] Quit all\n----\n\nThis starts the instance and it should have joined the cluster, which should now have 4 nodes. This can be confirmed by\nrunning `probe.sh` again in the other shell, or by pressing `[2] View`):\n----\n2\n\n-- local: ispn-3105267510-nr9dp-43008\n-- view: [ispn-perf-test-2224433472-ksh58-51617|3] (4) [ispn-perf-test-2224433472-ksh58-51617, ispn-perf-test-2224433472-rlr0m-11878, ispn-perf-test-2224433472-6l456-28251, ispn-3105267510-nr9dp-43008]\n----\n\nWe can see that the view is now `ispn-perf-test-2224433472-ksh58-51617|3] (4)`, and the cluster has correctly added\nthe fourth member.\n\n=== Running on Google Container Engine\n\nThe commands for running on https://cloud.google.com/container-engine/docs/[Google Container Engine (GKE)] are the same\nas when running locally in https://github.com/kubernetes/minikube[minikube].\n\nThe only difference is that on GKE, contrary to minikube, IP multicasting is not available. This means that the `probe.sh`\ncommand has to be run as `probe.sh -addr localhost` instead of simply running `probe.sh`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgroups-extras%2Fjgroups-kubernetes","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjgroups-extras%2Fjgroups-kubernetes","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjgroups-extras%2Fjgroups-kubernetes/lists"}