在 Kubernetes 的世界中,掌握各种资源的管理和操作是每个开发者和运维人员的必修课。无论是 Job、CronJob、Namespace、ServiceAccount 还是 Ingress,它们都是 Kubernetes 生态中不可或缺的一部分。下面,我们将通过一些常见的操作示例,带您深入了解这些资源的使用方法。
Job
Job 是 Kubernetes 中用于运行一次性任务的控制器,确保任务成功完成并退出,适用于批处理作业或数据处理任务。
Job 资源可以通过 client.batch().jobs() 访问。以下是 Job 的一些常见操作示例:
Job job = client.batch().jobs().load(new FileInputStream("sample-job.yml")).item();
复制代码
Job job = client.batch().jobs().inNamespace("FunTester").withName("pi").get();
复制代码
final Job job = new JobBuilder() .withApiVersion("batch/v1") .withNewMetadata() .withName("pi") .withLabels(Collections.singletonMap("label1", "maximum-length-of-63-characters")) .withAnnotations(Collections.singletonMap("annotation1", "some-very-long-annotation")) .endMetadata() .withNewSpec() .withNewTemplate() .withNewSpec() .addNewContainer() .withName("pi") .withImage("perl") .withArgs("perl", "-Mbignum=bpi", "-wle", "print bpi(2000)") .endContainer() .withRestartPolicy("Never") .endSpec() .endTemplate() .endSpec() .build();
client.batch().jobs().inNamespace("FunTester").resource(job).create();
复制代码
Job job = client.batch().v1().jobs().inNamespace("FunTester").resource(job1).serverSideApply();
复制代码
JobList jobList = client.batch().jobs().inNamespace("FunTester").list();
复制代码
JobList jobList = client.batch().jobs().inAnyNamespace().list();
复制代码
JobList jobList = client.batch().jobs().inNamespace("FunTester").withLabel("foo", "bar").list();
复制代码
client.batch().jobs().inNamespace("FunTester").withName("pi").delete();
复制代码
client.batch().jobs().inNamespace("FunTester").watch(new Watcher<>() { @Override public void eventReceived(Action action, Job resource) { // 根据操作类型执行某些操作 }
@Override public void onClose(WatcherException cause) {
}});
复制代码
CronJob
CronJob 是 Kubernetes 中用于定期执行任务的控制器,基于时间表(类似 Cron 格式)运行 Job,适用于定时任务或周期性作业。
CronJob 资源可以通过 client.batch().cronjobs() 访问。以下是 CronJob 的一些常见操作示例:
CronJob cronJob = client.batch().cronjobs().load(new FileInputStream("cronjob.yml")).item();
复制代码
CronJob aCronJob = client.batch().cronjobs().inNamespace("FunTester").withName("some-cj").get();
复制代码
CronJob cronJob1 = new CronJobBuilder() .withApiVersion("batch/v1beta1") .withNewMetadata() .withName("hello") .withLabels(Collections.singletonMap("foo", "bar")) .endMetadata() .withNewSpec() .withSchedule("*/1 * * * *") .withNewJobTemplate() .withNewSpec() .withNewTemplate() .withNewSpec() .addNewContainer() .withName("hello") .withImage("busybox") .withArgs("/bin/sh", "-c", "date; echo Hello from Kubernetes") .endContainer() .withRestartPolicy("OnFailure") .endSpec() .endTemplate() .endSpec() .endJobTemplate() .endSpec() .build();
cronJob1 = client.batch().cronjobs().inNamespace("FunTester").resource(cronJob1).create();
复制代码
CronJob cronJob = client.batch().v1().cronjobs().inNamespace("FunTester").resource(cronJob1).serverSideApply();
复制代码
CronJobList cronJobList = client.batch().cronjobs().inNamespace("FunTester").list();
复制代码
CronJobList cronJobList = client.batch().cronjobs().inAnyNamespace().list();
复制代码
CronJobList cronJobList = client.batch().cronjobs().inNamespace("FunTester").withLabel("foo", "bar").list();
复制代码
CronJob cronJob1 = client.batch().cronjobs().inNamespace("FunTester").withName(cronJob1.getMetadata().getName()).edit( cj -> new CronJobBuilder(cj).editSpec().withSchedule("*/1 * * * *").endSpec().build());
复制代码
client.batch().cronjobs().inNamespace("FunTester").withName("pi").delete();
复制代码
Namespace
Namespace 可以通过 client.namespaces() 访问。以下是 Namespace 的一些常见操作示例:
Namespace namespace = client.namespaces().load(new FileInputStream("namespace-test.yml")).item();
复制代码
Namespace namespace = client.namespaces().withName("namespace1").get();
复制代码
NamespaceList namespaceList = client.namespaces().list();
复制代码
NamespaceList namespaceList = client.namespaces().withLabel("key1", "value1").list();
复制代码
client.namespaces().withName("ns1").delete();
复制代码
ServiceAccount
ServiceAccount 是 Kubernetes 中为 Pod 提供身份认证的对象,用于控制 Pod 与 API Server 的交互权限,通常与 Role 或 ClusterRole 绑定。
ServiceAccount 资源可以通过 client.serviceAccounts() 访问。以下是 ServiceAccount 的一些常见操作示例:
ServiceAccount svcAccount = client.serviceAccounts().inNamespace("FunTester") .load(new FileInputStream("sa.yml")).item();
复制代码
ServiceAccount sa = client.serviceAccounts().inNamespace("FunTester").withName("sa-ribbon").get();
复制代码
ServiceAccount serviceAccount1 = new ServiceAccountBuilder() .withNewMetadata().withName("serviceaccount1").endMetadata() .withAutomountServiceAccountToken(false) .build();
client.serviceAccounts().inNamespace("FunTester").resource(serviceAccount1).create();
复制代码
ServiceAccount serviceAccount = client.serviceAccounts().inNamespace("FunTester").resource(serviceAccount1).serverSideApply();
复制代码
ServiceAccountList svcAccountList = client.serviceAccounts().inNamespace("FunTester").list();
复制代码
ServiceAccountList saList = client.serviceAccounts().inNamespace("FunTester").withLabel("foo", "bar").list();
复制代码
ServiceAccount serviceAccount1 = client.serviceAccounts().inNamespace("FunTester").withName("serviceaccount1").edit( sa -> new ServiceAccountBuilder(sa).addNewSecret().withName("default-token-uudp").endSecret() .addNewImagePullSecret().withName("myregistrykey").endImagePullSecret() .build(););
复制代码
client.serviceAccounts().inNamespace("FunTester").withName("serviceaccount1").delete();
复制代码
Ingress
Ingress 是 Kubernetes 中用于管理外部 HTTP/HTTPS 访问的对象,通过定义路由规则将外部流量转发到集群内的 Service,通常与 Ingress Controller 配合使用。
Ingress 资源可以通过 client.network().v1().ingress() 访问。以下是 Ingress 的一些常见操作示例:
Ingress ingress = client.network().v1().ingress().load(new FileInputStream("ingress.yml")).item();
复制代码
Ingress ingress = client.network().v1().ingress().inNamespace("FunTester").withName("ingress1").get();
复制代码
Ingress ingress = new IngressBuilder() .withNewMetadata().withName("test-ingress").addToAnnotations("nginx.ingress.kubernetes.io/rewrite-target", "/").endMetadata() .withNewSpec() .addNewRule() .withNewHttp() .addNewPath() .withPath("/testPath").withNewBackend().withServiceName("test").withServicePort(new IntOrString(80)).endBackend() .endPath() .endHttp() .endRule() .endSpec() .build();client.network().v1().ingress().inNamespace("FunTester").resource(ingress).create();
复制代码
Ingress igx = client.network().v1().ingresses().inNamespace("FunTester").resource(ingress).serverSideApply();
复制代码
IngressList ingressList = client.network().v1().ingress().inNamespace("FunTester").list();
复制代码
IngressList ingressList = client.network().v1().ingress().inAnyNamespace().list();
复制代码
IngressList ingressList = client.network().v1().ingress().inNamespace("FunTester").withLabel("foo", "bar").list();
复制代码
client.network().v1().ingress().inNamespace("FunTester").withName("ingress1").delete();
复制代码
通过这些示例,我们可以看到 Kubernetes 提供了丰富的 API 来管理各种资源。无论是 Job、CronJob、Namespace、ServiceAccount 还是 Ingress,掌握这些操作都能让我们在 Kubernetes 的世界中游刃有余。
StatefulSet
StatefulSet 是 Kubernetes 中用于管理有状态应用的控制器,确保 Pod 具有唯一的网络标识和稳定的持久化存储,适用于需要有序部署和稳定网络标识的场景。
StatefulSet 资源可以通过 client.apps().statefulsets() 访问。以下是一些常见的 StatefulSet 使用示例:
StatefulSet aStatefulSet = client.apps().statefulSets() .load(new FileInputStream("test-statefulset.yml")).item();
复制代码
StatefulSet ss1 = client.apps().statefulSets().inNamespace("FunTester").withName("ss1").get();
复制代码
StatefulSet ss1 = new StatefulSetBuilder() .withNewMetadata().withName("ss1").endMetadata() .withNewSpec() .withReplicas(2) .withNewSelector().withMatchLabels(Collections.singletonMap("app", "nginx")).endSelector() .withNewTemplate() .withNewMetadata() .addToLabels("app", "nginx") .endMetadata() .withNewSpec() .addNewContainer() .withName("nginx") .withImage("nginx") .addNewPort() .withContainerPort(80) .withName("web") .endPort() .addNewVolumeMount() .withName("www") .withMountPath("/usr/share/nginx/html") .endVolumeMount() .endContainer() .endSpec() .endTemplate() .addNewVolumeClaimTemplate() .withNewMetadata() .withName("www") .endMetadata() .withNewSpec() .addToAccessModes("ReadWriteOnce") .withNewResources() .withRequests(Collections.singletonMap("storage", new Quantity("1Gi"))) .endResources() .endSpec() .endVolumeClaimTemplate() .endSpec() .build();
StatefulSet ss = client.apps().statefulSets().inNamespace("FunTester").resource(ss1).create();
复制代码
StatefulSet ss = client.apps().statefulSets().inNamespace("FunTester").resource(ss1).serverSideApply();
复制代码
StatefulSetList statefulSetList = client.apps().statefulSets().inNamespace("FunTester").list();
复制代码
StatefulSetList statefulSetList = client.apps().statefulSets().inAnyNamespace().list();
复制代码
StatefulSetList statefulSetList = client.apps().statefulSets().inNamespace("FunTester").withLabel("foo", "bar").list();
复制代码
client.apps().statefulSets().inNamespace("FunTester").withName("ss1").delete();
复制代码
client.apps().statefulSets().inNamespace("FunTester").withName("ss1").scale(2);
复制代码
client.apps().statefulSets().inNamespace("FunTester").withName("ss1").watch(new Watcher<>() { @Override public void eventReceived(Action action, StatefulSet resource) { // 根据操作类型执行某些操作 }
@Override public void onClose(WatcherException cause) {
}});
复制代码
StatefulSet statefulSet = client.apps().statefulSets() .inNamespace("FunTester") .withName("web") .updateImage("nginx:1.19");
复制代码
Map<String, String> containerToImageMap = new HashMap<>();containerToImageMap("container1", "nginx:1.9");containerToImageMap("container2", "busybox:latest");Statefulset statefulSet = client.apps().statefulSets() .inNamespace("FunTester") .withName("web") .updateImage(params);
复制代码
StatefulSet ss = client.apps().statefulSets() .inNamespace("FunTester") .withName("web") .rolling() .restart();
复制代码
StatefulSet ss = client.apps().statefulSets() .inNamespace("FunTester") .withName("web") .rolling() .pause();
复制代码
StatefulSet ss = client.apps().statefulSets() .inNamespace("FunTester") .withName("web") .rolling() .resume();
复制代码
StatefulSet ss = client.apps().statefulSets() .inNamespace("FunTester") .withName("web") .rolling() .undo();
复制代码
DaemonSet
DaemonSet 是 Kubernetes 中确保每个节点(或符合标签条件的节点)上都运行一个 Pod 副本的控制器,适用于节点级别的守护进程或服务(如日志收集、网络插件)。
DaemonSet 资源可以通过 client.apps().daemonSets() 访问。以下是一些常见的 DaemonSet 使用示例:
DaemonSet ds = client.apps().daemonSets().load(new FileInputStream("daemonset.yaml")).item();
复制代码
DaemonSet ds = client.apps().daemonSets().inNamespace("FunTester").withName("ds1").get();
复制代码
DaemonSet ds = new DaemonSetBuilder() .withNewMetadata().withName("fluentd-elasticsearch").addToLabels("k8s-app", "fluentd-logging").endMetadata() .withNewSpec() .withNewSelector() .addToMatchLabels("name", "fluentd-elasticsearch") .endSelector() .withNewTemplate() .withNewSpec() .addNewToleration().withKey("node-role.kubernetes.io/master").withEffect("NoSchedule").endToleration() .addNewContainer() .withName("fluentd-elasticsearch").withImage("quay.io/fluentd_elasticsearch/fluentd:v2.5.2") .withNewResources() .addToLimits(Collections.singletonMap("memory", new Quantity("200Mi"))) .addToRequests(Collections.singletonMap("cpu", new Quantity("100m"))) .endResources() .addNewVolumeMount().withName("varlog").withMountPath("/var/log").endVolumeMount() .endContainer() .withTerminationGracePeriodSeconds(30l) .addNewVolume() .withName("varlog").withNewHostPath().withPath("/var/log").endHostPath() .endVolume() .endSpec() .endTemplate() .endSpec() .build();ds = client.apps().daemonSets().inNamespace("FunTester").resource(ds).create();
复制代码
将 DaemonSet 应用到 Kubernetes 集群:
DaemonSet ds = client.apps().daemonSets().inNamespace("FunTester").resource(ds1).serverSideApply();
复制代码
列出某个命名空间中的 DaemonSet:
DaemonSetList dsList = client.apps().daemonSets().inNamespace("FunTester").list();
复制代码
列出所有命名空间中的 DaemonSet:
DaemonSetList dsList = client.apps().daemonSets().inAnyNamespace().list();
复制代码
列出具有某些标签的 DaemonSet:
DaemonSetList dsList = client.apps().daemonSets().inNamespace("FunTester").withLabel("foo", "bar").list();
复制代码
删除 DaemonSet:
client.apps().daemonSets().inNamespace("FunTester").withName("ds1").delete();
复制代码
监听 DaemonSet:
client.apps().daemonSets().inNamespace("FunTester").watch(new Watcher<>() { @Override public void eventReceived(Action action, DaemonSet resource) { // 根据操作类型执行某些操作 }
@Override public void onClose(WatcherException cause) {
}});
复制代码
评论