Этот клиент предоставляет доступ ко всем API REST Kubernetes и OpenShift через свободный DSL.
Модуль | Мавен Центральный | Javadoc |
---|---|---|
Kubernetes-клиент | ||
openshift-клиент |
Расширения | Мавен Центральный | Javadoc |
---|---|---|
натив-клиент | ||
Tekton-клиент | ||
Chaosmesh-клиент | ||
Volumesnapshot-клиент | ||
вулкан-клиент | ||
istio-клиент | ||
клиент управления открытым кластером |
Самый простой способ создать клиента:
KubernetesClient client = new KubernetesClientBuilder (). build ();
DefaultOpenShiftClient
реализует интерфейс KubernetesClient
и OpenShiftClient
поэтому, если вам нужны расширения OpenShift, такие как Build
и т. д., просто выполните:
OpenShiftClient osClient = new KubernetesClientBuilder (). build (). adapt ( OpenShiftClient . class );
При этом будут использоваться настройки из разных источников в следующем порядке приоритета:
Системные свойства предпочтительнее переменных среды. Для настройки можно использовать следующие системные свойства и переменные среды:
Переменная свойства/среды | Описание | Значение по умолчанию |
---|---|---|
kubernetes.disable.autoConfig / KUBERNETES_DISABLE_AUTOCONFIG | Отключить автоматическую настройку (KubernetesClient не будет искать в ~/.kube/config , подключенном ServiceAccount, переменных среды или свойствах системы информацию о кластере Kubernetes). | false |
kubernetes.master / KUBERNETES_MASTER | Главный URL-адрес Kubernetes | https://kubernetes.default.svc |
kubernetes.api.version / KUBERNETES_API_VERSION | версия API | v1 |
openshift.url / OPENSHIFT_URL | Главный URL-адрес OpenShift | Значение главного URL-адреса Kubernetes |
kubernetes.oapi.version / KUBERNETES_OAPI_VERSION | Версия API OpenShift | v1 |
kubernetes.trust.certificates / KUBERNETES_TRUST_CERTIFICATES | Доверять всем сертификатам | 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 | Алгоритм шифрования ключа клиента | 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 | Имя файла токена сервисной учетной записи | /var/run/secrets/kubernetes.io/serviceaccount/token |
kubernetes.auth.tryKubeConfig / KUBERNETES_AUTH_TRYKUBECONFIG | Настройка клиента с помощью конфигурации Kubernetes | true |
kubeconfig / KUBECONFIG | Имя файла конфигурации Kubernetes для чтения | ~/.kube/config |
kubernetes.auth.tryServiceAccount / KUBERNETES_AUTH_TRYSERVICEACCOUNT | Настройка клиента из учетной записи службы | true |
kubernetes.tryNamespacePath / KUBERNETES_TRYNAMESPACEPATH | Настройте пространство имен клиента на основе пути к пространству имен учетной записи службы Kubernetes. | true |
kubernetes.auth.token / KUBERNETES_AUTH_TOKEN | ||
kubernetes.watch.reconnectInterval / KUBERNETES_WATCH_RECONNECTINTERVAL | Интервал повторного подключения часов в мс | 1000 |
kubernetes.watch.reconnectLimit / KUBERNETES_WATCH_RECONNECTLIMIT | Количество попыток переподключения (-1 для бесконечности) | -1 |
kubernetes.connection.timeout / KUBERNETES_CONNECTION_TIMEOUT | Тайм-аут соединения в мс (0 — без тайм-аута) | 10000 |
kubernetes.request.timeout / KUBERNETES_REQUEST_TIMEOUT | Таймаут чтения в мс | 10000 |
kubernetes.upload.connection.timeout / KUBERNETES_UPLOAD_CONNECTION_TIMEOUT | Тайм-аут соединения для загрузки модуля в мс | 10000 |
kubernetes.upload.request.timeout / KUBERNETES_UPLOAD_REQUEST_TIMEOUT | Тайм-аут запроса на загрузку модуля в мс | 120000 |
kubernetes.request.retry.backoffLimit / KUBERNETES_REQUEST_RETRY_BACKOFFLIMIT | Количество повторных попыток (-1 для бесконечности) | 10 |
kubernetes.request.retry.backoffInterval / KUBERNETES_REQUEST_RETRY_BACKOFFINTERVAL | Повторить первоначальный интервал задержки в мс | 100 |
kubernetes.rolling.timeout / KUBERNETES_ROLLING_TIMEOUT | Прокручивающийся тайм-аут в мс | 900000 |
kubernetes.logging.interval / KUBERNETES_LOGGING_INTERVAL | Интервал регистрации в мс | 20000 |
kubernetes.scale.timeout / KUBERNETES_SCALE_TIMEOUT | Масштабировать тайм-аут в мс | 600000 |
kubernetes.websocket.timeout / KUBERNETES_WEBSOCKET_TIMEOUT | Таймаут вебсокета в мс | 5000 |
kubernetes.websocket.ping.interval / KUBERNETES_WEBSOCKET_PING_INTERVAL | Интервал пинга веб-сокета в мс | 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 | Значение HTTP-заголовка Impersonate-User | |
kubernetes.impersonate.group / KUBERNETES_IMPERSONATE_GROUP | Значение HTTP-заголовка Impersonate-Group | |
kubernetes.tls.versions / KUBERNETES_TLS_VERSIONS | Версии TLS, разделенные , | 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 | Отключите перехватчик BackwardsCompatibilityInterceptor | true |
no.proxy / NO_PROXY | список расширений домена, разделенный запятыми, не следует использовать для | |
http.proxy / HTTP_PROXY | URL-адрес прокси-сервера для HTTP-запросов (см. Приоритет прокси-сервера). | |
https.proxy / HTTPS_PROXY | URL-адрес прокси-сервера для HTTPS-запросов (см. Приоритет прокси-сервера). |
Альтернативно вы можете использовать ConfigBuilder
для создания объекта конфигурации для клиента Kubernetes:
Config config = new ConfigBuilder (). withMasterUrl ( "https://mymaster.com" ). build ();
KubernetesClient client = new KubernetesClientBuilder (). withConfig ( config ). build ();
Использование DSL одинаково для всех ресурсов.
Список ресурсов:
NamespaceList myNs = client . namespaces (). list ();
ServiceList myServices = client . services (). list ();
ServiceList myNsServices = client . services (). inNamespace ( "default" ). list ();
Получите ресурс:
Namespace myns = client . namespaces (). withName ( "myns" ). get ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). get ();
Удалить:
Namespace myns = client . namespaces (). withName ( "myns" ). delete ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). delete ();
При редактировании ресурсов используются встроенные построители из модели 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 ());
В том же духе вы можете использовать встроенные конструкторы для создания:
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 ());
Вы также можете установить apiVersion ресурса, как в случае с SecurityContextConstraints:
SecurityContextConstraints scc = new SecurityContextConstraintsBuilder ()
. withApiVersion ( "v1" )
. withNewMetadata (). withName ( "scc" ). endMetadata ()
. withAllowPrivilegedContainer ( true )
. withNewRunAsUser ()
. withType ( "RunAsAny" )
. endRunAsUser ()
. build ();
Используйте io.fabric8.kubernetes.api.model.Event
как T для 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 );
}
});
API kubernetes определяет набор расширений, таких как daemonSets
, jobs
, ingresses
и т. д., которые можно использовать в DSL extensions()
:
например, перечислить вакансии...
jobs = client.batch().jobs().list();
Бывают случаи, когда вы хотите прочитать ресурс из внешнего источника, а не определять его с помощью клиентского DSL. В этих случаях клиент позволяет загружать ресурс из:
После загрузки ресурса вы можете обращаться с ним так же, как если бы вы создали его самостоятельно.
Например, давайте прочитаем модуль из файла yml и поработаем с ним:
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);
В том же духе вы можете использовать объект, созданный извне (либо ссылку, либо используя его строковое представление).
Например:
Pod pod = someThirdPartyCodeThatCreatesAPod();
client.resource(pod).delete();
Клиент поддерживает подключаемые адаптеры. Примером адаптера является адаптер OpenShift, который позволяет адаптировать существующий экземпляр KubernetesClient к экземпляру OpenShiftClient.
Например:
KubernetesClient client = new KubernetesClientBuilder (). build ();
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
Клиент также поддерживает метод isAdaptable(), который проверяет, возможна ли адаптация, и возвращает true, если да.
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." );
}
Обратите внимание, что при использовании Adapt() и адаптируемый, и целевой объект будут использовать одни и те же ресурсы (базовый http-клиент, пулы потоков и т. д.). Это означает, что close() не требуется использовать для каждого отдельного экземпляра, созданного с помощью Adapt. Вызов close() на любом из управляемых экземпляров Adapt() или исходном экземпляре приведет к правильной очистке всех ресурсов, и, таким образом, ни один из экземпляров больше не будет пригоден для использования.
Наряду с клиентом этот проект также предоставляет макет сервера Kubernetes, который вы можете использовать в целях тестирования. Мак-сервер основан на https://github.com/square/okhttp/tree/master/mockwebserver
но поддерживается DSL и функциями, предоставляемыми https://github.com/fabric8io/mockwebserver
.
Mock Web Server имеет два режима работы:
Это типичный режим, в котором вы сначала устанавливаете, какие HTTP-запросы ожидаются, а какие должны быть ответами на каждый запрос. Более подробную информацию об использовании можно найти по адресу: https://github.com/fabric8io/mockwebserver.
Этот режим широко использовался для тестирования самого клиента. Обязательно проверьте kubernetes-test.
Чтобы добавить сервер Kubernetes в тест:
@ Rule
public KubernetesServer server = new KubernetesServer ();
Определение каждого отдельного запроса и ответа может оказаться утомительным. Учитывая, что в большинстве случаев макет веб-сервера используется для выполнения простых операций на основе crud, был добавлен режим crud. При использовании режима crud макет веб-сервера будет хранить, читать, обновлять и удалять ресурсы Kubernetes, используя карту памяти, и будет выглядеть как настоящий API-сервер.
Чтобы добавить в тест сервер Kubernetes в режиме crud:
@ Rule
public KubernetesServer server = new KubernetesServer ( true , true );
Затем вы можете использовать сервер следующим образом:
@ 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 ));
}
Вы можете использовать механизм имитации KubernetesClient с JUnit5. Поскольку он не поддерживает @Rule
и @ClassRule
существует специальная аннотация @EnableKubernetesMockClient
. Если вы хотите создать экземпляр имитированного KubernetesClient
для каждого теста (JUnit4 @Rule
), вам необходимо объявить экземпляр KubernetesClient
, как показано ниже.
@ EnableKubernetesMockClient
class ExampleTest {
KubernetesClient client ;
@ Test
public void testInStandardMode () {
...
}
}
Если вы хотите определить статический экземпляр имитируемого сервера для всех тестов (JUnit4 @ClassRule
), вам необходимо объявить экземпляр KubernetesClient
как показано ниже. Вы также можете включить crudMode, используя поле аннотации crud
.
@ EnableKubernetesMockClient ( crud = true )
class ExampleTest {
static KubernetesClient client ;
@ Test
public void testInCrudMode () {
// ...
}
}
Для тестирования реального API Kubernetes проект предлагает упрощенный подход, таким образом запуская сервер Kubernetes API и двоичные файлы etcd.
@ EnableKubeAPIServer
class KubeAPITestSample {
static KubernetesClient client ;
@ Test
void testWithClient () {
// test using the client against real K8S API Server
}
}
Подробности см. в документации Kube API Test.
Начиная с версии 5.5, клиент Kubernetes должен быть совместим с любой поддерживаемой версией кластера Kubernetes. Мы предоставляем методы DSL (например, client.pods()
, client.namespaces()
и т. д.) для наиболее часто используемых ресурсов Kubernetes. Если ресурс, который вы ищете, недоступен через DSL, вы всегда можете использовать общий метод client.resource()
для взаимодействия с ним. Вы также можете открыть новую задачу, чтобы запросить добавление нового ресурса в DSL.
Мы предоставляем типы моделей Kubernetes Java (например, Pod
) и соответствующие им конструкторы (например, PodBuilder
) для каждого стандартного ресурса Kubernetes (и некоторых расширений). Если вы не нашли конкретный ресурс и считаете, что он должен быть частью клиента Kubernetes, откройте новый выпуск.
Начиная с версии 5.5, клиент OpenShift должен быть совместим с любой версией кластера OpenShift, поддерживаемой в настоящее время Red Hat. Клиент Fabric8 Kubernetes — один из немногих Java-клиентов Kubernetes, который обеспечивает полную поддержку любой поддерживаемой версии кластера OpenShift. Если вы обнаружите какую-либо несовместимость или что-то не хватает, пожалуйста, откройте новый вопрос.
Все используемые здесь объекты ресурсов будут соответствовать OpenShift 3.9.0 и Kubernetes 1.9.0. Все объекты ресурсов будут предоставлять все поля в соответствии с OpenShift 3.9.0 и Kubernetes 1.9.0.
batch
, так и в extensions
(расширения устарели)apps
, так и в extensions
(расширения устарели)apps
, так и в extensions
(расширения устарели).apps
, так и в extensions
(расширения устарели).network
, так и в extensions
(расширения устарели)client base DSL
в storage
DSL.client base DSL
и extensions
только на extensions
Расширения:
Фреймворки/Библиотеки/Инструменты:
Плагины CI:
Инструменты сборки:
Платформы:
Собственные платформы:
По мере роста нашего сообщества мы хотели бы отслеживать наших пользователей. Пожалуйста, отправьте PR с указанием названия вашей организации/сообщества.
Существуют ссылки на Github Actions и Jenkins для тестов, которые выполняются для каждого нового запроса на извлечение. Вы также можете просмотреть все последние сборки.
Чтобы получать обновления о выпусках, вы можете присоединиться к https://groups.google.com/forum/embed/?place=forum/fabric8-devclients.
В этой таблице представлены сопоставления kubectl
с Java-клиентом Kubernetes. Большинство сопоставлений довольно просты и представляют собой однострочные операции. Однако некоторым может потребоваться немного больше кода для достижения того же результата:
кубектл | Клиент Fabric8 Kubernetes |
---|---|
kubectl config view | ConfigViewEquiвалент.java |
kubectl config get-contexts | ConfigGetContextsEquiвалент.java |
kubectl config current-context | ConfigGetCurrentContextEquiвалент.java |
kubectl config use-context minikube | ConfigUseContext.java |
kubectl config view -o jsonpath='{.users[*].name}' | ConfigGetCurrentContextEquiвалент.java |
kubectl get pods --all-namespaces | PodListGlobalEquiвалент.java |
kubectl get pods | PodListEquiвалент.java |
kubectl get pods -w | PodWatchEquiвалент.java |
kubectl get pods --sort-by='.metadata.creationTimestamp' | PodListGlobalEquiвалент.java |
kubectl run | PodRunEquiвалент.java |
kubectl create -f test-pod.yaml | PodCreateYamlEquiвалент.java |
kubectl exec my-pod -- ls / | PodExecEquiвалент.java |
kubectl attach my-pod | PodAttachEquiвалент.java |
kubectl delete pod my-pod | PodDelete.java |
kubectl delete -f test-pod.yaml | PodDeleteViaYaml.java |
kubectl cp /foo_dir my-pod:/bar_dir | ЗагрузитьDirectoryToPod.java |
kubectl cp my-pod:/tmp/foo /tmp/bar | СкачатьФайлИзPod.java |
kubectl cp my-pod:/tmp/foo -c c1 /tmp/bar | СкачатьФайлИзMultiContainerPod.java |
kubectl cp /foo_dir my-pod:/tmp/bar_dir | Загрузить файлToPod.java |
kubectl logs pod/my-pod | PodLogsEquiвалент.java |
kubectl logs pod/my-pod -f | PodLogsFollowEquiвалент.java |
kubectl logs pod/my-pod -c c1 | PodLogsMultiContainerEquiвалент.java |
kubectl port-forward my-pod 8080:80 | PortForwardEquiвалент.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}' | ConfigMapJsonPathEquiвалент.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 | RolloutSetImageEquiвалент.java |
kubectl scale --replicas=4 deploy/nginx-deployment | ScaleEquiвалент.java |
kubectl scale statefulset --selector=app=my-database --replicas=4 | ScaleWithLabelsEquiвалент.java |
kubectl rollout restart deploy/d1 | RolloutRestartEquiвалент.java |
kubectl rollout pause deploy/d1 | RolloutPauseEquiвалент.java |
kubectl rollout resume deploy/d1 | RolloutResumeEquiвалент.java |
kubectl rollout undo deploy/d1 | RolloutUndoEquiвалент.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 | NamespaceListEquiвалентно.java |
kubectl create namespace test | Пространство именCreateEquiвалент.java |
kubectl apply -f test-resource-list.yml | CreateOrReplaceResourceList.java |
kubectl get events | EventsGetEquiвалент.java |
kubectl top nodes | TopEquiвалент.java |
kubectl auth can-i create deployment.apps | CanIEquiвалент.java |
kubectl create -f test-csr-v1.yml | CertificateSigningRequestCreateYamlEquiвалент.java |
kubectl certificate approve my-cert | CertificateSigningRequestApproveYamlEquiвалент.java |
kubectl certificate deny my-cert | CertificateSigningRequestDenyYamlEquiвалент.java |
kubectl create -f quota.yaml --namespace=default | CreateResourceQuotaInNamespaceYamlEquiвалент.java |