在 Kubernetes 的世界中,掌握各种资源的管理和操作是每个开发者和运维人员的必修课。无论是 Job、CronJob、Namespace、ServiceAccount 还是 Ingress,它们都是 Kubernetes 生态中不可或缺的一部分。下面,我们将通过一些常见的操作示例,带您深入了解这些资源的使用方法。
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 是 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 可以通过 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 是 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 是 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 是 Kubernetes 中用于管理有状态应用的控制器,确保 Pod 具有唯一的网络标识和稳定的持久化存储,适用于需要有序部署和稳定网络标识的场景。
StatefulSet
资源可以通过 client.apps().statefulsets()
访问。以下是一些常见的 StatefulSet
使用示例:
StatefulSet
:StatefulSet aStatefulSet = client.apps().statefulSets()
.load(new FileInputStream("test-statefulset.yml")).item();
StatefulSet
:StatefulSet ss1 = client.apps().statefulSets().inNamespace("FunTester").withName("ss1").get();
StatefulSet
: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
应用到 Kubernetes 集群:StatefulSet ss = client.apps().statefulSets().inNamespace("FunTester").resource(ss1).serverSideApply();
StatefulSet
对象:StatefulSetList statefulSetList = client.apps().statefulSets().inNamespace("FunTester").list();
StatefulSet
对象:StatefulSetList statefulSetList = client.apps().statefulSets().inAnyNamespace().list();
StatefulSet
对象:StatefulSetList statefulSetList = client.apps().statefulSets().inNamespace("FunTester").withLabel("foo", "bar").list();
StatefulSet
:client.apps().statefulSets().inNamespace("FunTester").withName("ss1").delete();
StatefulSet
:client.apps().statefulSets().inNamespace("FunTester").withName("ss1").scale(2);
StatefulSet
: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 statefulSet = client.apps().statefulSets()
.inNamespace("FunTester")
.withName("web")
.updateImage("nginx:1.19");
StatefulSet
中的多个容器镜像: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
的滚动更新:StatefulSet ss = client.apps().statefulSets()
.inNamespace("FunTester")
.withName("web")
.rolling()
.restart();
StatefulSet
的滚动更新:StatefulSet ss = client.apps().statefulSets()
.inNamespace("FunTester")
.withName("web")
.rolling()
.pause();
StatefulSet
的滚动更新:StatefulSet ss = client.apps().statefulSets()
.inNamespace("FunTester")
.withName("web")
.rolling()
.resume();
StatefulSet
的滚动更新:StatefulSet ss = client.apps().statefulSets()
.inNamespace("FunTester")
.withName("web")
.rolling()
.undo();
DaemonSet 是 Kubernetes 中确保每个节点(或符合标签条件的节点)上都运行一个 Pod 副本的控制器,适用于节点级别的守护进程或服务(如日志收集、网络插件)。
DaemonSet
资源可以通过 client.apps().daemonSets()
访问。以下是一些常见的 DaemonSet
使用示例:
DaemonSet
:DaemonSet ds = client.apps().daemonSets().load(new FileInputStream("daemonset.yaml")).item();
DaemonSet
:DaemonSet ds = client.apps().daemonSets().inNamespace("FunTester").withName("ds1").get();
DaemonSet
: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) {
}
});
FunTester 原创精华
【免费合集】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
测试开发、自动化、白盒
测试理论、FunTester 风采
视频专题