Klien ini menyediakan akses ke REST API Kubernetes & OpenShift lengkap melalui DSL yang lancar.
Modul | Pusat Maven | Javadoc |
---|---|---|
kubernetes-klien | ||
klien shift terbuka |
Ekstensi | Pusat Maven | Javadoc |
---|---|---|
klien asli | ||
klien tekton | ||
klien chaosmesh | ||
klien volumesnapshot | ||
klien gunung berapi | ||
istio-klien | ||
klien-manajemen-kluster terbuka |
Cara termudah untuk membuat klien adalah:
KubernetesClient client = new KubernetesClientBuilder (). build ();
DefaultOpenShiftClient
mengimplementasikan antarmuka KubernetesClient
& OpenShiftClient
jadi jika Anda memerlukan ekstensi OpenShift, seperti Build
s, dll, cukup lakukan:
OpenShiftClient osClient = new KubernetesClientBuilder (). build (). adapt ( OpenShiftClient . class );
Ini akan menggunakan pengaturan dari sumber berbeda dengan urutan prioritas berikut:
Properti sistem lebih disukai daripada variabel lingkungan. Properti sistem & variabel lingkungan berikut dapat digunakan untuk konfigurasi:
Variabel Properti / Lingkungan | Keterangan | Nilai bawaan |
---|---|---|
kubernetes.disable.autoConfig / KUBERNETES_DISABLE_AUTOCONFIG | Menonaktifkan konfigurasi otomatis (KubernetesClient tidak akan mencari ~/.kube/config , ServiceAccount yang terpasang, variabel lingkungan, atau properti Sistem untuk informasi cluster Kubernetes) | false |
kubernetes.master / KUBERNETES_MASTER | URL utama Kubernetes | https://kubernetes.default.svc |
kubernetes.api.version / KUBERNETES_API_VERSION | versi API | v1 |
openshift.url / OPENSHIFT_URL | URL utama OpenShift | Nilai URL master Kubernetes |
kubernetes.oapi.version / KUBERNETES_OAPI_VERSION | Versi API OpenShift | v1 |
kubernetes.trust.certificates / KUBERNETES_TRUST_CERTIFICATES | Percayai semua sertifikat | 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 | Algoritma enkripsi kunci klien | 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 | Nama file token akun layanan | /var/run/secrets/kubernetes.io/serviceaccount/token |
kubernetes.auth.tryKubeConfig / KUBERNETES_AUTH_TRYKUBECONFIG | Konfigurasikan klien menggunakan konfigurasi Kubernetes | true |
kubeconfig / KUBECONFIG | Nama file konfigurasi kubernetes yang akan dibaca | ~/.kube/config |
kubernetes.auth.tryServiceAccount / KUBERNETES_AUTH_TRYSERVICEACCOUNT | Konfigurasikan klien dari akun Layanan | true |
kubernetes.tryNamespacePath / KUBERNETES_TRYNAMESPACEPATH | Konfigurasikan namespace klien dari jalur namespace akun layanan Kubernetes | true |
kubernetes.auth.token / KUBERNETES_AUTH_TOKEN | ||
kubernetes.watch.reconnectInterval / KUBERNETES_WATCH_RECONNECTINTERVAL | Tonton interval penyambungan kembali dalam ms | 1000 |
kubernetes.watch.reconnectLimit / KUBERNETES_WATCH_RECONNECTLIMIT | Jumlah upaya penyambungan kembali (-1 tanpa batas) | -1 |
kubernetes.connection.timeout / KUBERNETES_CONNECTION_TIMEOUT | Batas waktu koneksi habis dalam ms (0 tanpa batas waktu) | 10000 |
kubernetes.request.timeout / KUBERNETES_REQUEST_TIMEOUT | Batas waktu baca dalam ms | 10000 |
kubernetes.upload.connection.timeout / KUBERNETES_UPLOAD_CONNECTION_TIMEOUT | Batas waktu koneksi unggah pod dalam ms | 10000 |
kubernetes.upload.request.timeout / KUBERNETES_UPLOAD_REQUEST_TIMEOUT | Batas waktu permintaan unggahan pod dalam ms | 120000 |
kubernetes.request.retry.backoffLimit / KUBERNETES_REQUEST_RETRY_BACKOFFLIMIT | Jumlah percobaan ulang (-1 tanpa batas) | 10 |
kubernetes.request.retry.backoffInterval / KUBERNETES_REQUEST_RETRY_BACKOFFINTERVAL | Coba lagi interval kemunduran awal dalam ms | 100 |
kubernetes.rolling.timeout / KUBERNETES_ROLLING_TIMEOUT | Batas waktu bergulir dalam ms | 900000 |
kubernetes.logging.interval / KUBERNETES_LOGGING_INTERVAL | Interval pencatatan dalam ms | 20000 |
kubernetes.scale.timeout / KUBERNETES_SCALE_TIMEOUT | Batas waktu skala dalam ms | 600000 |
kubernetes.websocket.timeout / KUBERNETES_WEBSOCKET_TIMEOUT | Batas waktu soket web dalam ms | 5000 |
kubernetes.websocket.ping.interval / KUBERNETES_WEBSOCKET_PING_INTERVAL | Interval ping soket web dalam 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 | Nilai header HTTP Impersonate-User | |
kubernetes.impersonate.group / KUBERNETES_IMPERSONATE_GROUP | Nilai header HTTP Impersonate-Group | |
kubernetes.tls.versions / KUBERNETES_TLS_VERSIONS | Versi TLS dipisahkan oleh , | 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 | Nonaktifkan Interceptor BackwardsCompatibilityInterceptor | true |
no.proxy / NO_PROXY | daftar proxy ekstensi domain yang dipisahkan koma tidak boleh digunakan | |
http.proxy / HTTP_PROXY | URL ke proksi untuk permintaan HTTP (Lihat prioritas Proksi) | |
https.proxy / HTTPS_PROXY | URL ke proksi untuk permintaan HTTPS (Lihat prioritas Proksi) |
Alternatifnya, Anda dapat menggunakan ConfigBuilder
untuk membuat objek konfigurasi untuk klien Kubernetes:
Config config = new ConfigBuilder (). withMasterUrl ( "https://mymaster.com" ). build ();
KubernetesClient client = new KubernetesClientBuilder (). withConfig ( config ). build ();
Penggunaan DSL sama untuk semua sumber daya.
Daftar sumber daya:
NamespaceList myNs = client . namespaces (). list ();
ServiceList myServices = client . services (). list ();
ServiceList myNsServices = client . services (). inNamespace ( "default" ). list ();
Dapatkan sumber daya:
Namespace myns = client . namespaces (). withName ( "myns" ). get ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). get ();
Menghapus:
Namespace myns = client . namespaces (). withName ( "myns" ). delete ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). delete ();
Pengeditan sumber daya menggunakan pembuat inline dari Model 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 ());
Dengan semangat yang sama, Anda dapat menyejajarkan pembuat untuk membuat:
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 ());
Anda juga dapat mengatur apiVersion sumber daya seperti dalam kasus SecurityContextConstraints :
SecurityContextConstraints scc = new SecurityContextConstraintsBuilder ()
. withApiVersion ( "v1" )
. withNewMetadata (). withName ( "scc" ). endMetadata ()
. withAllowPrivilegedContainer ( true )
. withNewRunAsUser ()
. withType ( "RunAsAny" )
. endRunAsUser ()
. build ();
Gunakan io.fabric8.kubernetes.api.model.Event
sebagai T untuk 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 mendefinisikan sekumpulan ekstensi seperti daemonSets
, jobs
, ingresses
dan sebagainya yang semuanya dapat digunakan di extensions()
DSL:
misalnya untuk membuat daftar pekerjaan...
jobs = client.batch().jobs().list();
Ada kasus di mana Anda ingin membaca sumber daya dari sumber eksternal, daripada mendefinisikannya menggunakan DSL klien. Untuk kasus tersebut, klien mengizinkan Anda memuat sumber daya dari:
Setelah sumber daya dimuat, Anda dapat memperlakukannya seperti yang Anda inginkan, seandainya Anda membuatnya sendiri.
Misalnya mari kita membaca sebuah pod, dari file yml dan mengerjakannya:
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);
Dengan semangat yang sama Anda dapat menggunakan objek yang dibuat secara eksternal (baik referensi atau menggunakan representasi stringnya).
Misalnya:
Pod pod = someThirdPartyCodeThatCreatesAPod();
client.resource(pod).delete();
Klien mendukung adaptor yang dapat dicolokkan. Contoh adaptornya adalah Adaptor OpenShift yang memungkinkan adaptasi instance KubernetesClient yang ada ke instance OpenShiftClient.
Misalnya:
KubernetesClient client = new KubernetesClientBuilder (). build ();
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
Klien juga mendukung metode isAdaptable() yang memeriksa apakah adaptasi dapat dilakukan dan mengembalikan nilai true jika memungkinkan.
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." );
}
Perhatikan bahwa saat menggunakan adapt() baik orang yang diadaptasi maupun target akan berbagi sumber daya yang sama (klien http yang mendasari, kumpulan thread, dll). Artinya close() tidak perlu digunakan pada setiap instance yang dibuat melalui adaptasi. Memanggil close() pada salah satu instance terkelola adapt() atau instance asli, akan membersihkan semua sumber daya dengan benar sehingga tidak ada instance yang dapat digunakan lagi.
Bersama dengan kliennya, proyek ini juga menyediakan server tiruan kubernetes yang dapat Anda gunakan untuk tujuan pengujian. Server tiruan didasarkan pada https://github.com/square/okhttp/tree/master/mockwebserver
tetapi didukung oleh DSL dan fitur yang disediakan oleh https://github.com/fabric8io/mockwebserver
.
Server Web Mock memiliki dua mode operasi:
Ini adalah mode umum di mana Anda pertama kali menetapkan permintaan http mana yang diharapkan dan mana yang harus menjadi respons untuk setiap permintaan. Detail lebih lanjut tentang penggunaan dapat ditemukan di: https://github.com/fabric8io/mockwebserver
Mode ini telah banyak digunakan untuk menguji klien itu sendiri. Pastikan Anda memeriksa kubernetes-test.
Untuk menambahkan server Kubernetes ke pengujian Anda:
@ Rule
public KubernetesServer server = new KubernetesServer ();
Mendefinisikan setiap permintaan dan respons bisa jadi melelahkan. Mengingat bahwa dalam banyak kasus server web tiruan digunakan untuk melakukan operasi sederhana berbasis mentah, mode kasar telah ditambahkan. Saat menggunakan mode kasar, server web tiruan akan menyimpan, membaca, memperbarui, dan menghapus sumber daya kubernetes menggunakan peta dalam memori dan akan muncul sebagai server api nyata.
Untuk menambahkan Server Kubernetes dalam mode kasar ke pengujian Anda:
@ Rule
public KubernetesServer server = new KubernetesServer ( true , true );
Kemudian Anda dapat menggunakan server seperti:
@ 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 ));
}
Anda dapat menggunakan mekanisme mocking KubernetesClient dengan JUnit5. Karena tidak mendukung @Rule
dan @ClassRule
ada anotasi khusus @EnableKubernetesMockClient
. Jika Anda ingin membuat instance KubernetesClient
tiruan untuk setiap pengujian (JUnit4 @Rule
), Anda perlu mendeklarasikan instance KubernetesClient
seperti yang ditunjukkan di bawah ini.
@ EnableKubernetesMockClient
class ExampleTest {
KubernetesClient client ;
@ Test
public void testInStandardMode () {
...
}
}
Jika Anda ingin mendefinisikan instance statis dari server tiruan untuk semua pengujian (JUnit4 @ClassRule
), Anda perlu mendeklarasikan instance KubernetesClient
seperti yang ditunjukkan di bawah ini. Anda juga dapat mengaktifkan crudMode dengan menggunakan kolom anotasi crud
.
@ EnableKubernetesMockClient ( crud = true )
class ExampleTest {
static KubernetesClient client ;
@ Test
public void testInCrudMode () {
// ...
}
}
Untuk menguji API Kubernetes yang sebenarnya, proyek ini menyediakan pendekatan yang ringan, sehingga memulai Server API Kubernetes dan binari dll.
@ EnableKubeAPIServer
class KubeAPITestSample {
static KubernetesClient client ;
@ Test
void testWithClient () {
// test using the client against real K8S API Server
}
}
Untuk detailnya lihat dokumen untuk Uji API Kube.
Mulai dari v5.5, Klien Kubernetes harus kompatibel dengan versi cluster Kubernetes apa pun yang didukung. Kami menyediakan metode DSL (misalnya client.pods()
, client.namespaces()
, dan seterusnya) untuk resource Kubernetes yang paling umum digunakan. Jika sumber daya yang Anda cari tidak tersedia melalui DSL, Anda selalu dapat menggunakan metode client.resource()
generik untuk berinteraksi dengannya. Anda juga dapat membuka terbitan baru untuk meminta penambahan sumber daya baru ke DSL.
Kami menyediakan tipe model Java Kubernetes (misalnya Pod
) dan pembuatnya yang sesuai (misalnya PodBuilder
) untuk setiap sumber daya vanilla Kubernetes (dan beberapa ekstensi). Jika Anda tidak menemukan sumber daya tertentu, dan menurut Anda sumber daya tersebut seharusnya menjadi bagian dari Klien Kubernetes, silakan buka terbitan baru.
Mulai dari v5.5, Klien OpenShift harus kompatibel dengan versi cluster OpenShift apa pun yang saat ini didukung oleh Red Hat. Klien Fabric8 Kubernetes adalah salah satu dari sedikit klien Java Kubernetes yang memberikan dukungan penuh untuk semua versi cluster OpenShift yang didukung. Jika Anda menemukan ketidakcocokan atau ada yang hilang, silakan buka terbitan baru.
Semua objek sumber daya yang digunakan di sini akan mengikuti OpenShift 3.9.0 dan Kubernetes 1.9.0. Semua objek sumber daya akan memberikan semua kolom sesuai dengan OpenShift 3.9.0 dan Kubernetes 1.9.0
batch
dan extensions
(Ekstensi tidak digunakan lagi)apps
dan extensions
(Ekstensi tidak digunakan lagi)apps
dan extensions
(Ekstensi tidak digunakan lagi)apps
dan extensions
(Ekstensi tidak digunakan lagi)network
dan extensions
(Ekstensi tidak digunakan lagi)client base DSL
ke DSL storage
client base DSL
dan extensions
ke extensions
sajaEkstensi:
Kerangka/Perpustakaan/Alat:
Plugin CI:
Alat Bangun:
Platform:
Platform Kepemilikan:
Seiring pertumbuhan komunitas kami, kami ingin melacak pengguna kami. Silakan kirim PR dengan nama organisasi/komunitas Anda.
Ada tautan dari Tindakan Github dan Jenkins untuk pengujian yang dijalankan untuk setiap Permintaan Tarik baru. Anda juga dapat melihat semua versi terbaru.
Untuk mendapatkan informasi terbaru tentang rilis ini, Anda dapat bergabung dengan https://groups.google.com/forum/embed/?place=forum/fabric8-devclients
Tabel ini menyediakan pemetaan kubectl
ke Kubernetes Java Client. Sebagian besar pemetaan cukup mudah dan merupakan operasi satu baris. Namun, beberapa mungkin memerlukan lebih banyak kode untuk mencapai hasil yang sama:
kubectl | Klien Kubernetes Fabric8 |
---|---|
kubectl config view | ConfigViewEquivalent.java |
kubectl config get-contexts | ConfigGetContextsEquivalent.java |
kubectl config current-context | ConfigGetCurrentContextEquivalent.java |
kubectl config use-context minikube | KonfigurasiUseContext.java |
kubectl config view -o jsonpath='{.users[*].name}' | ConfigGetCurrentContextEquivalent.java |
kubectl get pods --all-namespaces | PodListGlobalEquivalent.java |
kubectl get pods | PodListEquivalent.java |
kubectl get pods -w | PodWatchEquivalent.java |
kubectl get pods --sort-by='.metadata.creationTimestamp' | PodListGlobalEquivalent.java |
kubectl run | PodRunEquivalent.java |
kubectl create -f test-pod.yaml | PodCreateYamlEquivalent.java |
kubectl exec my-pod -- ls / | PodExecEquivalent.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 | UnggahDirectoryToPod.java |
kubectl cp my-pod:/tmp/foo /tmp/bar | UnduhFileFromPod.java |
kubectl cp my-pod:/tmp/foo -c c1 /tmp/bar | UnduhFileFromMultiContainerPod.java |
kubectl cp /foo_dir my-pod:/tmp/bar_dir | UnggahFileToPod.java |
kubectl logs pod/my-pod | PodLogsEquivalent.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 | ScaleEquivalent.java |
kubectl scale statefulset --selector=app=my-database --replicas=4 | ScaleWithLabelsEquivalent.java |
kubectl rollout restart deploy/d1 | PeluncuranRestartEquivalent.java |
kubectl rollout pause deploy/d1 | RolloutPauseEquivalent.java |
kubectl rollout resume deploy/d1 | PeluncuranResumeEquivalent.java |
kubectl rollout undo deploy/d1 | PeluncuranUndoEquivalent.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 | BuatOrReplaceResourceList.java |
kubectl get events | AcaraGetEquivalent.java |
kubectl top nodes | TopEquivalent.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 |