Este cliente proporciona acceso a las API REST completas de Kubernetes y OpenShift a través de un DSL fluido.
Módulo | Central Maven | javadoc |
---|---|---|
cliente-kubernetes | ||
cliente openshift |
Extensiones | Central Maven | javadoc |
---|---|---|
cliente nativo | ||
cliente-tekton | ||
cliente-chaosmesh | ||
cliente de instantáneas de volúmenes | ||
cliente-volcan | ||
istio-cliente | ||
cliente-de-gestión-de-clúster-abierto |
La forma más sencilla de crear un cliente es:
KubernetesClient client = new KubernetesClientBuilder (). build ();
DefaultOpenShiftClient
implementa la interfaz KubernetesClient
y OpenShiftClient
por lo que si necesita las extensiones de OpenShift, como Build
s, etc., simplemente haga:
OpenShiftClient osClient = new KubernetesClientBuilder (). build (). adapt ( OpenShiftClient . class );
Esto utilizará configuraciones de diferentes fuentes en el siguiente orden de prioridad:
Se prefieren las propiedades del sistema a las variables de entorno. Las siguientes propiedades del sistema y variables de entorno se pueden utilizar para la configuración:
Propiedad/Variable de entorno | Descripción | Valor predeterminado |
---|---|---|
kubernetes.disable.autoConfig / KUBERNETES_DISABLE_AUTOCONFIG | Deshabilite la configuración automática (KubernetesClient no buscará en ~/.kube/config , ServiceAccount montada, variables de entorno o propiedades del sistema información del clúster de Kubernetes) | false |
kubernetes.master / KUBERNETES_MASTER | URL maestra de Kubernetes | https://kubernetes.default.svc |
kubernetes.api.version / KUBERNETES_API_VERSION | Versión API | v1 |
openshift.url / OPENSHIFT_URL | URL maestra de OpenShift | Valor de la URL maestra de Kubernetes |
kubernetes.oapi.version / KUBERNETES_OAPI_VERSION | Versión de la API de OpenShift | v1 |
kubernetes.trust.certificates / KUBERNETES_TRUST_CERTIFICATES | Confía en todos los certificados | false |
kubernetes.disable.hostname.verification / KUBERNETES_DISABLE_HOSTNAME_VERIFICATION | false | |
kubernetes.certs.ca.file / KUBERNETES_CERTS_CA_FILE | ||
kubernetes.certs.ca.data / KUBERNETES_CERTS_CA_DATA | ||
kubernetes.certs.client.file / KUBERNETES_CERTS_CLIENT_FILE | ||
kubernetes.certs.client.data / KUBERNETES_CERTS_CLIENT_DATA | ||
kubernetes.certs.client.key.file / KUBERNETES_CERTS_CLIENT_KEY_FILE | ||
kubernetes.certs.client.key.data / KUBERNETES_CERTS_CLIENT_KEY_DATA | ||
kubernetes.certs.client.key.algo / KUBERNETES_CERTS_CLIENT_KEY_ALGO | Algoritmo de cifrado de clave de cliente | RSA |
kubernetes.certs.client.key.passphrase / KUBERNETES_CERTS_CLIENT_KEY_PASSPHRASE | ||
kubernetes.auth.basic.username / KUBERNETES_AUTH_BASIC_USERNAME | ||
kubernetes.auth.basic.password / KUBERNETES_AUTH_BASIC_PASSWORD | ||
kubernetes.auth.serviceAccount.token / KUBERNETES_AUTH_SERVICEACCOUNT_TOKEN | Nombre del archivo del token de la cuenta de servicio | /var/run/secrets/kubernetes.io/serviceaccount/token |
kubernetes.auth.tryKubeConfig / KUBERNETES_AUTH_TRYKUBECONFIG | Configurar el cliente usando la configuración de Kubernetes | true |
kubeconfig / KUBECONFIG | Nombre del archivo de configuración de Kubernetes para leer | ~/.kube/config |
kubernetes.auth.tryServiceAccount / KUBERNETES_AUTH_TRYSERVICEACCOUNT | Configurar el cliente desde la cuenta de servicio | true |
kubernetes.tryNamespacePath / KUBERNETES_TRYNAMESPACEPATH | Configurar el espacio de nombres del cliente desde la ruta del espacio de nombres de la cuenta de servicio de Kubernetes | true |
kubernetes.auth.token / KUBERNETES_AUTH_TOKEN | ||
kubernetes.watch.reconnectInterval / KUBERNETES_WATCH_RECONNECTINTERVAL | Intervalo de reconexión del reloj en ms | 1000 |
kubernetes.watch.reconnectLimit / KUBERNETES_WATCH_RECONNECTLIMIT | Número de intentos de reconexión (-1 para infinito) | -1 |
kubernetes.connection.timeout / KUBERNETES_CONNECTION_TIMEOUT | Tiempo de espera de conexión en ms (0 sin tiempo de espera) | 10000 |
kubernetes.request.timeout / KUBERNETES_REQUEST_TIMEOUT | Tiempo de espera de lectura en ms | 10000 |
kubernetes.upload.connection.timeout / KUBERNETES_UPLOAD_CONNECTION_TIMEOUT | Tiempo de espera de conexión de carga del pod en ms | 10000 |
kubernetes.upload.request.timeout / KUBERNETES_UPLOAD_REQUEST_TIMEOUT | Tiempo de espera de solicitud de carga de pod en ms | 120000 |
kubernetes.request.retry.backoffLimit / KUBERNETES_REQUEST_RETRY_BACKOFFLIMIT | Número de reintentos (-1 para infinito) | 10 |
kubernetes.request.retry.backoffInterval / KUBERNETES_REQUEST_RETRY_BACKOFFINTERVAL | Reintentar el intervalo de retroceso inicial en ms | 100 |
kubernetes.rolling.timeout / KUBERNETES_ROLLING_TIMEOUT | Tiempo de espera rodante en ms | 900000 |
kubernetes.logging.interval / KUBERNETES_LOGGING_INTERVAL | Intervalo de registro en ms | 20000 |
kubernetes.scale.timeout / KUBERNETES_SCALE_TIMEOUT | Tiempo de espera de escala en ms | 600000 |
kubernetes.websocket.timeout / KUBERNETES_WEBSOCKET_TIMEOUT | Tiempo de espera de Websocket en ms | 5000 |
kubernetes.websocket.ping.interval / KUBERNETES_WEBSOCKET_PING_INTERVAL | Intervalo de ping de Websocket en ms | 30000 |
kubernetes.max.concurrent.requests / KUBERNETES_MAX_CONCURRENT_REQUESTS | 64 | |
kubernetes.max.concurrent.requests.per.host / KUBERNETES_MAX_CONCURRENT_REQUESTS_PER_HOST | 5 | |
kubernetes.impersonate.username / KUBERNETES_IMPERSONATE_USERNAME | Valor del encabezado HTTP Impersonate-User | |
kubernetes.impersonate.group / KUBERNETES_IMPERSONATE_GROUP | Valor del encabezado HTTP Impersonate-Group | |
kubernetes.tls.versions / KUBERNETES_TLS_VERSIONS | Versiones TLS separadas por , | TLSv1.2,TLSv1.3 |
kubernetes.truststore.file / KUBERNETES_TRUSTSTORE_FILE | ||
kubernetes.truststore.passphrase / KUBERNETES_TRUSTSTORE_PASSPHRASE | ||
kubernetes.keystore.file / KUBERNETES_KEYSTORE_FILE | ||
kubernetes.keystore.passphrase / KUBERNETES_KEYSTORE_PASSPHRASE | ||
kubernetes.backwardsCompatibilityInterceptor.disable / KUBERNETES_BACKWARDSCOMPATIBILITYINTERCEPTOR_DISABLE | Deshabilitar el BackwardsCompatibilityInterceptor | true |
no.proxy / NO_PROXY | La lista de extensiones de dominio separadas por comas no debe utilizarse para | |
http.proxy / HTTP_PROXY | URL al proxy para solicitudes HTTP (consulte Prioridad de proxy) | |
https.proxy / HTTPS_PROXY | URL al proxy para solicitudes HTTPS (consulte Prioridad de proxy) |
Alternativamente, puede utilizar ConfigBuilder
para crear un objeto de configuración para el cliente Kubernetes:
Config config = new ConfigBuilder (). withMasterUrl ( "https://mymaster.com" ). build ();
KubernetesClient client = new KubernetesClientBuilder (). withConfig ( config ). build ();
El uso de DSL es el mismo para todos los recursos.
Lista de recursos:
NamespaceList myNs = client . namespaces (). list ();
ServiceList myServices = client . services (). list ();
ServiceList myNsServices = client . services (). inNamespace ( "default" ). list ();
Obtenga un recurso:
Namespace myns = client . namespaces (). withName ( "myns" ). get ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). get ();
Borrar:
Namespace myns = client . namespaces (). withName ( "myns" ). delete ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). delete ();
La edición de recursos utiliza los constructores en línea del modelo de Kubernetes:
Namespace myns = client . namespaces (). withName ( "myns" ). edit ( n -> new NamespaceBuilder ( n )
. editMetadata ()
. addToLabels ( "a" , "label" )
. endMetadata ()
. build ());
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). edit ( s -> new ServiceBuilder ( s )
. editMetadata ()
. addToLabels ( "another" , "label" )
. endMetadata ()
. build ());
Con el mismo espíritu, puedes incorporar constructores para crear:
Namespace myns = client . namespaces (). create ( new NamespaceBuilder ()
. withNewMetadata ()
. withName ( "myns" )
. addToLabels ( "a" , "label" )
. endMetadata ()
. build ());
Service myservice = client . services (). inNamespace ( "default" ). create ( new ServiceBuilder ()
. withNewMetadata ()
. withName ( "myservice" )
. addToLabels ( "another" , "label" )
. endMetadata ()
. build ());
También puede configurar la apiVersion del recurso como en el caso de SecurityContextConstraints:
SecurityContextConstraints scc = new SecurityContextConstraintsBuilder ()
. withApiVersion ( "v1" )
. withNewMetadata (). withName ( "scc" ). endMetadata ()
. withAllowPrivilegedContainer ( true )
. withNewRunAsUser ()
. withType ( "RunAsAny" )
. endRunAsUser ()
. build ();
Utilice io.fabric8.kubernetes.api.model.Event
como T para Watcher:
client . events (). inAnyNamespace (). watch ( new Watcher <>() {
@ Override
public void eventReceived ( Action action , Event resource ) {
System . out . println ( "event " + action . name () + " " + resource . toString ());
}
@ Override
public void onClose ( WatcherException cause ) {
System . out . println ( "Watcher close due to " + cause );
}
});
La API de Kubernetes define un montón de extensiones como daemonSets
, jobs
, ingresses
, etc., que se pueden utilizar en el DSL extensions()
:
por ejemplo, para enumerar los trabajos...
jobs = client.batch().jobs().list();
Hay casos en los que desea leer un recurso de una fuente externa, en lugar de definirlo mediante el DSL del cliente. Para esos casos el cliente te permite cargar el recurso desde:
Una vez cargado el recurso, puede tratarlo como lo haría si lo hubiera creado usted mismo.
Por ejemplo, leamos un pod desde un archivo yml y trabajemos con él:
Pod refreshed = client.load('/path/to/a/pod.yml').fromServer().get();
client.load('/workspace/pod.yml').delete();
LogWatch handle = client.load('/workspace/pod.yml').watchLog(System.out);
Con el mismo espíritu, puedes usar un objeto creado externamente (ya sea una referencia o usando su representación de cadena).
Por ejemplo:
Pod pod = someThirdPartyCodeThatCreatesAPod();
client.resource(pod).delete();
El cliente admite adaptadores enchufables. Un adaptador de ejemplo es el Adaptador OpenShift que permite adaptar una instancia de KubernetesClient existente a una de OpenShiftClient.
Por ejemplo:
KubernetesClient client = new KubernetesClientBuilder (). build ();
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
El cliente también admite el método isAdaptable() que comprueba si la adaptación es posible y devuelve verdadero si es así.
KubernetesClient client = new KubernetesClientBuilder (). build ();
if ( client . isAdaptable ( OpenShiftClient . class )) {
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
} else {
throw new Exception ( "Adapting to OpenShiftClient not support. Check if adapter is present, and that env provides /oapi root path." );
}
Tenga en cuenta que cuando se utiliza adapt(), tanto el usuario adaptado como el objetivo compartirán los mismos recursos (cliente http subyacente, grupos de subprocesos, etc.). Esto significa que no es necesario utilizar close() en cada instancia creada mediante adapt. Llamar a close() en cualquiera de las instancias administradas de adapt() o en la instancia original limpiará adecuadamente todos los recursos y, por lo tanto, ninguna de las instancias ya será utilizable.
Junto con el cliente, este proyecto también proporciona un servidor simulado de Kubernetes que puede utilizar con fines de prueba. El servidor simulado se basa en https://github.com/square/okhttp/tree/master/mockwebserver
pero está habilitado por DSL y las funciones proporcionadas por https://github.com/fabric8io/mockwebserver
.
El servidor web simulado tiene dos modos de funcionamiento:
Es el modo típico en el que primero configura cuáles son las solicitudes http esperadas y cuáles deberían ser las respuestas para cada solicitud. Se pueden encontrar más detalles sobre el uso en: https://github.com/fabric8io/mockwebserver
Este modo se ha utilizado ampliamente para probar el propio cliente. Asegúrate de comprobar kubernetes-test.
Para agregar un servidor Kubernetes a su prueba:
@ Rule
public KubernetesServer server = new KubernetesServer ();
Definir cada solicitud y respuesta puede resultar tedioso. Dado que en la mayoría de los casos el servidor web simulado se utiliza para realizar operaciones simples basadas en crud, se ha agregado un modo crud. Cuando se utiliza el modo crudo, el servidor web simulado almacenará, leerá, actualizará y eliminará recursos de Kubernetes utilizando un mapa en memoria y aparecerá como un servidor API real.
Para agregar un servidor Kubernetes en modo crudo a su prueba:
@ Rule
public KubernetesServer server = new KubernetesServer ( true , true );
Entonces puedes usar el servidor como:
@ Test
public void testInCrudMode () {
KubernetesClient client = server . getClient ();
final CountDownLatch deleteLatch = new CountDownLatch ( 1 );
final CountDownLatch closeLatch = new CountDownLatch ( 1 );
//CREATE
client . pods (). inNamespace ( "ns1" ). create ( new PodBuilder (). withNewMetadata (). withName ( "pod1" ). endMetadata (). build ());
//READ
podList = client . pods (). inNamespace ( "ns1" ). list ();
assertNotNull ( podList );
assertEquals ( 1 , podList . getItems (). size ());
//WATCH
Watch watch = client . pods (). inNamespace ( "ns1" ). withName ( "pod1" ). watch ( new Watcher <>() {
@ Override
public void eventReceived ( Action action , Pod resource ) {
switch ( action ) {
case DELETED :
deleteLatch . countDown ();
break ;
default :
throw new AssertionFailedError ( action . toString (). concat ( " isn't recognised." ));
}
}
@ Override
public void onClose ( WatcherException cause ) {
closeLatch . countDown ();
}
});
//DELETE
client . pods (). inNamespace ( "ns1" ). withName ( "pod1" ). delete ();
//READ AGAIN
podList = client . pods (). inNamespace ( "ns1" ). list ();
assertNotNull ( podList );
assertEquals ( 0 , podList . getItems (). size ());
assertTrue ( deleteLatch . await ( 1 , TimeUnit . MINUTES ));
watch . close ();
assertTrue ( closeLatch . await ( 1 , TimeUnit . MINUTES ));
}
Puede utilizar el mecanismo de burla de KubernetesClient con JUnit5. Como no es compatible con @Rule
y @ClassRule
hay una anotación dedicada @EnableKubernetesMockClient
. Si desea crear una instancia de KubernetesClient
simulado para cada prueba (JUnit4 @Rule
), debe declarar una instancia de KubernetesClient
como se muestra a continuación.
@ EnableKubernetesMockClient
class ExampleTest {
KubernetesClient client ;
@ Test
public void testInStandardMode () {
...
}
}
En caso de que desee definir una instancia estática del servidor simulado para todas las pruebas (JUnit4 @ClassRule
), debe declarar la instancia de KubernetesClient
como se muestra a continuación. También puede habilitar crudMode utilizando el campo de anotación crud
.
@ EnableKubernetesMockClient ( crud = true )
class ExampleTest {
static KubernetesClient client ;
@ Test
public void testInCrudMode () {
// ...
}
}
Para realizar pruebas con la API de Kubernetes real, el proyecto proporciona un enfoque liviano, iniciando así el servidor API de Kubernetes y los binarios etcd.
@ EnableKubeAPIServer
class KubeAPITestSample {
static KubernetesClient client ;
@ Test
void testWithClient () {
// test using the client against real K8S API Server
}
}
Para obtener más información, consulte los documentos de Kube API Test.
A partir de la versión 5.5, el cliente Kubernetes debe ser compatible con cualquier versión de clúster de Kubernetes compatible. Proporcionamos métodos DSL (por ejemplo, client.pods()
, client.namespaces()
, etc.) para los recursos de Kubernetes más utilizados. Si el recurso que está buscando no está disponible a través de DSL, siempre puede usar el método genérico client.resource()
para interactuar con él. También puede abrir una nueva edición para solicitar la adición de un nuevo recurso al DSL.
Proporcionamos tipos de modelos Java de Kubernetes (por ejemplo, Pod
) y sus constructores correspondientes (por ejemplo, PodBuilder
) para cada recurso básico de Kubernetes (y algunas extensiones). Si no encuentra un recurso específico y cree que debería ser parte del Cliente Kubernetes, abra una nueva edición.
A partir de la versión 5.5, el cliente OpenShift debería ser compatible con cualquier versión del clúster OpenShift actualmente admitida por Red Hat. El cliente Fabric8 Kubernetes es uno de los pocos clientes Java de Kubernetes que brinda soporte completo para cualquier versión de clúster OpenShift compatible. Si encuentra alguna incompatibilidad o falta algo, abra una nueva edición.
Todos los objetos de recursos utilizados aquí estarán de acuerdo con OpenShift 3.9.0 y Kubernetes 1.9.0. Todos los objetos de recursos proporcionarán todos los campos según OpenShift 3.9.0 y Kubernetes 1.9.0.
batch
como extensions
(las extensiones están en desuso)apps
como extensions
(las extensiones están en desuso)apps
como extensions
(las extensiones están en desuso)apps
como extensions
(las extensiones están en desuso)network
como en extensions
(las extensiones están en desuso)client base DSL
al storage
DSLclient base DSL
y extensions
a solo extensions
Extensiones:
Marcos/Bibliotecas/Herramientas:
Complementos de CI:
Herramientas de construcción:
Plataformas:
Plataformas propietarias:
A medida que nuestra comunidad crece, nos gustaría realizar un seguimiento de nuestros usuarios. Envíe un PR con el nombre de su organización/comunidad.
Están los enlaces de Github Actions y Jenkins para las pruebas que se ejecutan para cada nueva Pull Request. También puede ver todas las compilaciones recientes.
Para recibir actualizaciones sobre los lanzamientos, puede unirse a https://groups.google.com/forum/embed/?place=forum/fabric8-devclients
Esta tabla proporciona asignaciones kubectl
a Kubernetes Java Client. La mayoría de los mapeos son bastante sencillos y son operaciones de una sola línea. Sin embargo, algunos podrían requerir un poco más de código para lograr el mismo resultado:
kubectl | Cliente Fabric8 Kubernetes |
---|---|
kubectl config view | ConfigViewEquivalente.java |
kubectl config get-contexts | ConfigGetContextsEquivalent.java |
kubectl config current-context | ConfigGetCurrentContextEquivalent.java |
kubectl config use-context minikube | ConfigUseContext.java |
kubectl config view -o jsonpath='{.users[*].name}' | ConfigGetCurrentContextEquivalent.java |
kubectl get pods --all-namespaces | PodListGlobalEquivalent.java |
kubectl get pods | PodListEquivalente.java |
kubectl get pods -w | PodWatchEquivalente.java |
kubectl get pods --sort-by='.metadata.creationTimestamp' | PodListGlobalEquivalent.java |
kubectl run | PodRunEquivalente.java |
kubectl create -f test-pod.yaml | PodCreateYamlEquivalente.java |
kubectl exec my-pod -- ls / | PodExecEquivalente.java |
kubectl attach my-pod | PodAttachEquivalente.java |
kubectl delete pod my-pod | PodDelete.java |
kubectl delete -f test-pod.yaml | PodDeleteViaYaml.java |
kubectl cp /foo_dir my-pod:/bar_dir | SubirDirectorioAlPod.java |
kubectl cp my-pod:/tmp/foo /tmp/bar | Descargar archivo desde Pod.java |
kubectl cp my-pod:/tmp/foo -c c1 /tmp/bar | Descargar archivo desde MultiContainerPod.java |
kubectl cp /foo_dir my-pod:/tmp/bar_dir | Cargar archivo al Pod.java |
kubectl logs pod/my-pod | PodLogsEquivalente.java |
kubectl logs pod/my-pod -f | PodLogsFollowEquivalent.java |
kubectl logs pod/my-pod -c c1 | PodLogsMultiContainerEquivalent.java |
kubectl port-forward my-pod 8080:80 | PortForwardEquivalente.java |
kubectl get pods --selector=version=v1 -o jsonpath='{.items[*].metadata.name}' | PodListFilterByLabel.java |
kubectl get pods --field-selector=status.phase=Running | PodListFilterFieldSelector.java |
kubectl get pods --show-labels | PodShowLabels.java |
kubectl label pods my-pod new-label=awesome | PodAddLabel.java |
kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq | PodAddAnnotation.java |
kubectl get configmap cm1 -o jsonpath='{.data.database}' | ConfigMapJsonPathEquivalent.java |
kubectl create -f test-svc.yaml | LoadAndCreateService.java |
kubectl create -f test-deploy.yaml | LoadAndCreateDeployment.java |
kubectl set image deploy/d1 nginx=nginx:v2 | RolloutSetImageEquivalent.java |
kubectl scale --replicas=4 deploy/nginx-deployment | EscalaEquivalente.java |
kubectl scale statefulset --selector=app=my-database --replicas=4 | EscalaConLabelsEquivalente.java |
kubectl rollout restart deploy/d1 | RolloutRestartEquivalent.java |
kubectl rollout pause deploy/d1 | RolloutPauseEquivalent.java |
kubectl rollout resume deploy/d1 | RolloutResumeEquivalent.java |
kubectl rollout undo deploy/d1 | RolloutUndoEquivalente.java |
kubectl create -f test-crd.yaml | LoadAndCreateCustomResourceDefinition.java |
kubectl create -f customresource.yaml | CustomResourceCreateDemo.java |
kubectl create -f customresource.yaml | CustomResourceCreateDemoTypeless.java |
kubectl get ns | Lista de espacios de nombresEquivalente.java |
kubectl create namespace test | Espacio de nombresCrearEquivalente.java |
kubectl apply -f test-resource-list.yml | CreateOrReplaceResourceList.java |
kubectl get events | EventosGetEquivalent.java |
kubectl top nodes | TopEquivalente.java |
kubectl auth can-i create deployment.apps | CanIEquivalente.java |
kubectl create -f test-csr-v1.yml | CertificateSigningRequestCreateYamlEquivalent.java |
kubectl certificate approve my-cert | CertificadoSigningRequestApproveYamlEquivalent.java |
kubectl certificate deny my-cert | CertificateSigningRequestDenyYamlEquivalent.java |
kubectl create -f quota.yaml --namespace=default | CreateResourceQuotaInNamespaceYamlEquivalent.java |