Este cliente fornece acesso às APIs REST completas do Kubernetes e OpenShift por meio de uma DSL fluente.
Módulo | Maven Central | Javadoc |
---|---|---|
cliente kubernetes | ||
cliente openshift |
Extensões | Maven Central | Javadoc |
---|---|---|
cliente knative | ||
cliente tekton | ||
cliente caosmesh | ||
volumesnapshot-cliente | ||
cliente vulcão | ||
cliente istio | ||
cliente de gerenciamento de cluster aberto |
A maneira mais fácil de criar um cliente é:
KubernetesClient client = new KubernetesClientBuilder (). build ();
DefaultOpenShiftClient
implementa as interfaces KubernetesClient
e OpenShiftClient
portanto, se você precisar das extensões OpenShift, como Build
s, etc., basta fazer:
OpenShiftClient osClient = new KubernetesClientBuilder (). build (). adapt ( OpenShiftClient . class );
Isso usará configurações de diferentes fontes na seguinte ordem de prioridade:
As propriedades do sistema são preferidas às variáveis de ambiente. As seguintes propriedades do sistema e variáveis de ambiente podem ser usadas para configuração:
Variável de propriedade/ambiente | Descrição | Valor padrão |
---|---|---|
kubernetes.disable.autoConfig / KUBERNETES_DISABLE_AUTOCONFIG | Desative a configuração automática (KubernetesClient não procuraria em ~/.kube/config , ServiceAccount montado, variáveis de ambiente ou propriedades do sistema para obter informações do cluster Kubernetes) | false |
kubernetes.master / KUBERNETES_MASTER | URL mestre do Kubernetes | https://kubernetes.default.svc |
kubernetes.api.version / KUBERNETES_API_VERSION | Versão da API | v1 |
openshift.url / OPENSHIFT_URL | URL mestre do OpenShift | Valor do URL mestre do Kubernetes |
kubernetes.oapi.version / KUBERNETES_OAPI_VERSION | Versão da API OpenShift | v1 |
kubernetes.trust.certificates / KUBERNETES_TRUST_CERTIFICATES | Confie em todos os 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 criptografia de chave do 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 | Nome do arquivo de token da conta de serviço | /var/run/secrets/kubernetes.io/serviceaccount/token |
kubernetes.auth.tryKubeConfig / KUBERNETES_AUTH_TRYKUBECONFIG | Configurar o cliente usando a configuração do Kubernetes | true |
kubeconfig / KUBECONFIG | Nome do arquivo de configuração do Kubernetes para leitura | ~/.kube/config |
kubernetes.auth.tryServiceAccount / KUBERNETES_AUTH_TRYSERVICEACCOUNT | Configurar cliente da conta de serviço | true |
kubernetes.tryNamespacePath / KUBERNETES_TRYNAMESPACEPATH | Configurar o namespace do cliente a partir do caminho do namespace da conta de serviço do Kubernetes | true |
kubernetes.auth.token / KUBERNETES_AUTH_TOKEN | ||
kubernetes.watch.reconnectInterval / KUBERNETES_WATCH_RECONNECTINTERVAL | Observe o intervalo de reconexão em ms | 1000 |
kubernetes.watch.reconnectLimit / KUBERNETES_WATCH_RECONNECTLIMIT | Número de tentativas de reconexão (-1 para infinito) | -1 |
kubernetes.connection.timeout / KUBERNETES_CONNECTION_TIMEOUT | Tempo limite de conexão em ms (0 sem tempo limite) | 10000 |
kubernetes.request.timeout / KUBERNETES_REQUEST_TIMEOUT | Tempo limite de leitura em ms | 10000 |
kubernetes.upload.connection.timeout / KUBERNETES_UPLOAD_CONNECTION_TIMEOUT | Tempo limite de conexão de upload do pod em ms | 10000 |
kubernetes.upload.request.timeout / KUBERNETES_UPLOAD_REQUEST_TIMEOUT | Tempo limite da solicitação de upload do pod em ms | 120000 |
kubernetes.request.retry.backoffLimit / KUBERNETES_REQUEST_RETRY_BACKOFFLIMIT | Número de novas tentativas (-1 para infinito) | 10 |
kubernetes.request.retry.backoffInterval / KUBERNETES_REQUEST_RETRY_BACKOFFINTERVAL | Intervalo de espera inicial novamente em ms | 100 |
kubernetes.rolling.timeout / KUBERNETES_ROLLING_TIMEOUT | Tempo limite de rolagem em ms | 900000 |
kubernetes.logging.interval / KUBERNETES_LOGGING_INTERVAL | Intervalo de registro em ms | 20000 |
kubernetes.scale.timeout / KUBERNETES_SCALE_TIMEOUT | Tempo limite de escala em ms | 600000 |
kubernetes.websocket.timeout / KUBERNETES_WEBSOCKET_TIMEOUT | Tempo limite do Websocket em ms | 5000 |
kubernetes.websocket.ping.interval / KUBERNETES_WEBSOCKET_PING_INTERVAL | Intervalo de ping do Websocket em 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 do cabeçalho HTTP Impersonate-User | |
kubernetes.impersonate.group / KUBERNETES_IMPERSONATE_GROUP | Valor do cabeçalho HTTP Impersonate-Group | |
kubernetes.tls.versions / KUBERNETES_TLS_VERSIONS | Versões 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 | Desative o BackwardsCompatibilityInterceptor | true |
no.proxy / NO_PROXY | lista separada por vírgula de proxy de extensões de domínio não deve ser usada para | |
http.proxy / HTTP_PROXY | URL para o proxy para solicitações HTTP (consulte Precedência do proxy) | |
https.proxy / HTTPS_PROXY | URL para o proxy para solicitações HTTPS (consulte Precedência do proxy) |
Alternativamente, você pode usar o ConfigBuilder
para criar um objeto de configuração para o cliente Kubernetes:
Config config = new ConfigBuilder (). withMasterUrl ( "https://mymaster.com" ). build ();
KubernetesClient client = new KubernetesClientBuilder (). withConfig ( config ). build ();
O uso do DSL é o mesmo para todos os recursos.
Listar recursos:
NamespaceList myNs = client . namespaces (). list ();
ServiceList myServices = client . services (). list ();
ServiceList myNsServices = client . services (). inNamespace ( "default" ). list ();
Obtenha um recurso:
Namespace myns = client . namespaces (). withName ( "myns" ). get ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). get ();
Excluir:
Namespace myns = client . namespaces (). withName ( "myns" ). delete ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). delete ();
A edição de recursos usa os construtores in-line do modelo 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 ());
Com o mesmo espírito, você pode incorporar construtores para criar:
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 ());
Você também pode definir a apiVersion do recurso como no caso de SecurityContextConstraints:
SecurityContextConstraints scc = new SecurityContextConstraintsBuilder ()
. withApiVersion ( "v1" )
. withNewMetadata (). withName ( "scc" ). endMetadata ()
. withAllowPrivilegedContainer ( true )
. withNewRunAsUser ()
. withType ( "RunAsAny" )
. endRunAsUser ()
. build ();
Use 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 );
}
});
A API kubernetes define um monte de extensões como daemonSets
, jobs
, ingresses
e assim por diante, todas utilizáveis na DSL extensions()
:
por exemplo, para listar os empregos ...
jobs = client.batch().jobs().list();
Há casos em que você deseja ler um recurso de uma fonte externa, em vez de defini-lo usando a DSL do cliente. Para esses casos, o cliente permite carregar o recurso de:
Depois que o recurso for carregado, você poderá tratá-lo como faria se tivesse criado você mesmo.
Por exemplo, vamos ler um pod a partir de um arquivo yml e trabalhar com ele:
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);
Com o mesmo espírito, você pode usar um objeto criado externamente (seja uma referência ou usando sua representação em string).
Por exemplo:
Pod pod = someThirdPartyCodeThatCreatesAPod();
client.resource(pod).delete();
O cliente oferece suporte a adaptadores conectáveis. Um exemplo de adaptador é o OpenShift Adapter, que permite adaptar uma instância existente do KubernetesClient para uma instância do OpenShiftClient.
Por exemplo:
KubernetesClient client = new KubernetesClientBuilder (). build ();
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
O cliente também suporta o método isAdaptable() que verifica se a adaptação é possível e retorna verdadeiro se for possível.
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." );
}
Observe que ao usar adapt() tanto o adaptado quanto o alvo compartilharão os mesmos recursos (cliente http subjacente, pools de threads, etc.). Isso significa que close() não precisa ser usado em todas as instâncias criadas via adapt. Chamar close() em qualquer uma das instâncias gerenciadas adapt() ou na instância original limpará adequadamente todos os recursos e, portanto, nenhuma das instâncias poderá mais ser usada.
Junto com o cliente, este projeto também fornece um servidor simulado Kubernetes que você pode usar para fins de teste. O servidor simulado é baseado em https://github.com/square/okhttp/tree/master/mockwebserver
mas é habilitado pelo DSL e pelos recursos fornecidos por https://github.com/fabric8io/mockwebserver
.
O Mock Web Server possui dois modos de operação:
É o modo típico em que você primeiro define quais são as solicitações http esperadas e quais devem ser as respostas para cada solicitação. Mais detalhes sobre o uso podem ser encontrados em: https://github.com/fabric8io/mockwebserver
Este modo tem sido amplamente utilizado para testar o próprio cliente. Certifique-se de verificar o teste kubernetes.
Para adicionar um servidor Kubernetes ao seu teste:
@ Rule
public KubernetesServer server = new KubernetesServer ();
Definir cada solicitação e resposta pode se tornar cansativo. Dado que na maioria dos casos o servidor web simulado é usado para executar operações simples baseadas em dados brutos, um modo bruto foi adicionado. Ao usar o modo crud, o servidor web simulado armazenará, lerá, atualizará e excluirá recursos do Kubernetes usando um mapa na memória e aparecerá como um servidor API real.
Para adicionar um servidor Kubernetes em modo bruto ao seu teste:
@ Rule
public KubernetesServer server = new KubernetesServer ( true , true );
Então você pode usar o 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 ));
}
Você pode usar o mecanismo de simulação KubernetesClient com JUnit5. Como não oferece suporte @Rule
e @ClassRule
há uma anotação dedicada @EnableKubernetesMockClient
. Se você deseja criar uma instância do KubernetesClient
simulado para cada teste (JUnit4 @Rule
), você precisa declarar a instância do KubernetesClient
conforme mostrado abaixo.
@ EnableKubernetesMockClient
class ExampleTest {
KubernetesClient client ;
@ Test
public void testInStandardMode () {
...
}
}
Caso você queira definir a instância estática do servidor simulado para todos os testes (JUnit4 @ClassRule
), você precisa declarar a instância do KubernetesClient
conforme mostrado abaixo. Você também pode ativar o crudMode usando o campo de anotação crud
.
@ EnableKubernetesMockClient ( crud = true )
class ExampleTest {
static KubernetesClient client ;
@ Test
public void testInCrudMode () {
// ...
}
}
Para testar a API Kubernetes real, o projeto fornece uma abordagem leve, iniciando assim o servidor API Kubernetes e os binários etcd.
@ EnableKubeAPIServer
class KubeAPITestSample {
static KubernetesClient client ;
@ Test
void testWithClient () {
// test using the client against real K8S API Server
}
}
Para obter detalhes, consulte a documentação do Kube API Test.
A partir da v5.5, o cliente Kubernetes deve ser compatível com qualquer versão de cluster Kubernetes compatível. Fornecemos métodos DSL (por exemplo client.pods()
, client.namespaces()
e assim por diante) para os recursos do Kubernetes mais comumente usados. Se o recurso que você procura não estiver disponível por meio da DSL, você sempre poderá usar o método genérico client.resource()
para interagir com ele. Você também pode abrir um novo problema para solicitar a adição de um novo recurso à DSL.
Fornecemos tipos de modelo Java do Kubernetes (por exemplo Pod
) e seus construtores correspondentes (por exemplo PodBuilder
) para cada recurso vanilla do Kubernetes (e algumas extensões). Se você não encontrar um recurso específico e achar que ele deveria fazer parte do Cliente Kubernetes, abra um novo problema.
A partir da v5.5, o OpenShift Client deve ser compatível com qualquer versão de cluster OpenShift atualmente suportada pela Red Hat. O Fabric8 Kubernetes Client é um dos poucos clientes Kubernetes Java que fornece suporte completo para qualquer versão de cluster OpenShift compatível. Se você encontrar alguma incompatibilidade ou algo faltando, abra um novo problema.
Todos os objetos de recursos usados aqui estarão de acordo com OpenShift 3.9.0 e Kubernetes 1.9.0. Todos os objetos de recursos fornecerão todos os campos de acordo com OpenShift 3.9.0 e Kubernetes 1.9.0
batch
e extensions
(as extensões estão obsoletas)apps
e extensions
(as extensões estão obsoletas)apps
e extensions
(as extensões estão obsoletas)apps
e extensions
(as extensões estão obsoletas)network
e extensions
(as extensões estão obsoletas)client base DSL
para DSL storage
client base DSL
e extensions
da base de clientes para apenas extensions
Extensões:
Estruturas/bibliotecas/ferramentas:
Plug-ins CI:
Ferramentas de construção:
Plataformas:
Plataformas proprietárias:
À medida que nossa comunidade cresce, gostaríamos de acompanhar nossos usuários. Por favor, envie um PR com o nome da sua organização/comunidade.
Existem os links do Github Actions e Jenkins para os testes que rodam a cada novo Pull Request. Você também pode ver todas as compilações recentes.
Para obter atualizações sobre os lançamentos, você pode ingressar em https://groups.google.com/forum/embed/?place=forum/fabric8-devclients
Esta tabela fornece kubectl
para mapeamentos de cliente Java do Kubernetes. A maioria dos mapeamentos são bastante simples e são operações de um liner. No entanto, alguns podem exigir um pouco mais de código para obter o mesmo resultado:
kubectl | Cliente Fabric8 Kubernetes |
---|---|
kubectl config view | ConfigViewEquivalent.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 | PodWatchEquivalent.java |
kubectl get pods --sort-by='.metadata.creationTimestamp' | PodListGlobalEquivalent.java |
kubectl run | PodRunEquivalente.java |
kubectl create -f test-pod.yaml | PodCreateYamlEquivalent.java |
kubectl exec my-pod -- ls / | PodExecEquivalente.java |
kubectl attach my-pod | PodAttachEquivalent.java |
kubectl delete pod my-pod | PodDelete.java |
kubectl delete -f test-pod.yaml | PodDeleteViaYaml.java |
kubectl cp /foo_dir my-pod:/bar_dir | UploadDirectoryToPod.java |
kubectl cp my-pod:/tmp/foo /tmp/bar | BaixarFileFromPod.java |
kubectl cp my-pod:/tmp/foo -c c1 /tmp/bar | BaixarFileFromMultiContainerPod.java |
kubectl cp /foo_dir my-pod:/tmp/bar_dir | UploadFileToPod.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 | PortForwardEquivalent.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 | ScaleWithLabelsEquivalent.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 | NamespaceListEquivalent.java |
kubectl create namespace test | NamespaceCreateEquivalent.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 | CanIEquivalent.java |
kubectl create -f test-csr-v1.yml | CertificateSigningRequestCreateYamlEquivalent.java |
kubectl certificate approve my-cert | CertificateSigningRequestApproveYamlEquivalent.java |
kubectl certificate deny my-cert | CertificateSigningRequestDenyYamlEquivalent.java |
kubectl create -f quota.yaml --namespace=default | CreateResourceQuotaInNamespaceYamlEquivalent.java |