在 Kubernetes 的世界中,掌握各种资源的管理和操作是每个开发者和运维人员的必修课。无论是 Job、CronJob、Namespace、ServiceAccount 还是 Ingress,它们都是 Kubernetes 生态中不可或缺的一部分。下面,我们将通过一些常见的操作示例,带您深入了解这些资源的使用方法。
Job
Job 是 Kubernetes 中用于运行一次性任务的控制器,确保任务成功完成并退出,适用于批处理作业或数据处理任务。
Job 资源可以通过 client.batch().jobs()
访问。以下是 Job 的一些常见操作示例:
- 从 YAML 文件加载 Job:
Job job = client.batch().jobs().load(new FileInputStream("sample-job.yml")).item();
- 从 API 服务器获取 Job:
Job job = client.batch().jobs().inNamespace("FunTester").withName("pi").get();
- 创建 Job:
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 对象应用到 Kubernetes 集群:
Job job = client.batch().v1().jobs().inNamespace("FunTester").resource(job1).serverSideApply();
- 列出某个特定命名空间中的 Job 对象:
JobList jobList = client.batch().jobs().inNamespace("FunTester").list();
- 列出所有命名空间中的 Job 对象:
JobList jobList = client.batch().jobs().inAnyNamespace().list();
- 列出具有某些特定标签的 Job 对象:
JobList jobList = client.batch().jobs().inNamespace("FunTester").withLabel("foo", "bar").list();
- 删除 Job:
client.batch().jobs().inNamespace("FunTester").withName("pi").delete();
- 监听 Job:
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 的一些常见操作示例:
- 从 YAML 文件加载 CronJob:
CronJob cronJob = client.batch().cronjobs().load(new FileInputStream("cronjob.yml")).item();
- 从 Kubernetes API 服务器获取 CronJob:
CronJob aCronJob = client.batch().cronjobs().inNamespace("FunTester").withName("some-cj").get();
- 创建 CronJob:
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 应用到 Kubernetes 集群:
CronJob cronJob = client.batch().v1().cronjobs().inNamespace("FunTester").resource(cronJob1).serverSideApply();
- 列出某个命名空间中的 CronJob 对象:
CronJobList cronJobList = client.batch().cronjobs().inNamespace("FunTester").list();
- 列出所有命名空间中的 CronJob 对象:
CronJobList cronJobList = client.batch().cronjobs().inAnyNamespace().list();
- 列出具有某些标签的 CronJob 对象:
CronJobList cronJobList = client.batch().cronjobs().inNamespace("FunTester").withLabel("foo", "bar").list();
- 编辑/更新 CronJob:
CronJob cronJob1 = client.batch().cronjobs().inNamespace("FunTester").withName(cronJob1.getMetadata().getName()).edit(
cj -> new CronJobBuilder(cj).editSpec().withSchedule("*/1 * * * *").endSpec().build()
);
- 删除 CronJob:
client.batch().cronjobs().inNamespace("FunTester").withName("pi").delete();
Namespace
Namespace 可以通过 client.namespaces()
访问。以下是 Namespace 的一些常见操作示例:
- 从 YAML 文件加载 Namespace:
Namespace namespace = client.namespaces().load(new FileInputStream("namespace-test.yml")).item();
- 从 Kubernetes API 服务器获取 Namespace:
Namespace namespace = client.namespaces().withName("namespace1").get();
- 列出 Namespace 对象:
NamespaceList namespaceList = client.namespaces().list();
- 列出具有某些标签的 Namespace 对象:
NamespaceList namespaceList = client.namespaces().withLabel("key1", "value1").list();
- 删除 Namespace 对象:
client.namespaces().withName("ns1").delete();
ServiceAccount
ServiceAccount 是 Kubernetes 中为 Pod 提供身份认证的对象,用于控制 Pod 与 API Server 的交互权限,通常与 Role
或 ClusterRole
绑定。
ServiceAccount 资源可以通过 client.serviceAccounts()
访问。以下是 ServiceAccount 的一些常见操作示例:
- 从 YAML 文件加载 ServiceAccount:
ServiceAccount svcAccount = client.serviceAccounts().inNamespace("FunTester")
.load(new FileInputStream("sa.yml")).item();
- 从 Kubernetes API 服务器获取 ServiceAccount:
ServiceAccount sa = client.serviceAccounts().inNamespace("FunTester").withName("sa-ribbon").get();
- 创建 ServiceAccount:
ServiceAccount serviceAccount1 = new ServiceAccountBuilder()
.withNewMetadata().withName("serviceaccount1").endMetadata()
.withAutomountServiceAccountToken(false)
.build();
client.serviceAccounts().inNamespace("FunTester").resource(serviceAccount1).create();
- 将 ServiceAccount 应用到 Kubernetes 集群:
ServiceAccount serviceAccount = client.serviceAccounts().inNamespace("FunTester").resource(serviceAccount1).serverSideApply();
- 列出某个命名空间中的 ServiceAccount 对象:
ServiceAccountList svcAccountList = client.serviceAccounts().inNamespace("FunTester").list();
- 列出具有某些标签的 ServiceAccount 对象:
ServiceAccountList saList = client.serviceAccounts().inNamespace("FunTester").withLabel("foo", "bar").list();
- 更新/编辑 ServiceAccount:
ServiceAccount serviceAccount1 = client.serviceAccounts().inNamespace("FunTester").withName("serviceaccount1").edit(
sa -> new ServiceAccountBuilder(sa).addNewSecret().withName("default-token-uudp").endSecret()
.addNewImagePullSecret().withName("myregistrykey").endImagePullSecret()
.build();
);
- 删除 ServiceAccount:
client.serviceAccounts().inNamespace("FunTester").withName("serviceaccount1").delete();
Ingress
Ingress 是 Kubernetes 中用于管理外部 HTTP/HTTPS 访问的对象,通过定义路由规则将外部流量转发到集群内的 Service,通常与 Ingress Controller 配合使用。
Ingress 资源可以通过 client.network().v1().ingress()
访问。以下是 Ingress 的一些常见操作示例:
- 从 YAML 文件加载 Ingress:
Ingress ingress = client.network().v1().ingress().load(new FileInputStream("ingress.yml")).item();
- 从 Kubernetes API 服务器获取 Ingress:
Ingress ingress = client.network().v1().ingress().inNamespace("FunTester").withName("ingress1").get();
- 创建 Ingress:
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 应用到 Kubernetes 集群:
Ingress igx = client.network().v1().ingresses().inNamespace("FunTester").resource(ingress).serverSideApply();
- 列出某个命名空间中的 Ingress 对象:
IngressList ingressList = client.network().v1().ingress().inNamespace("FunTester").list();
- 列出所有命名空间中的 Ingress 对象:
IngressList ingressList = client.network().v1().ingress().inAnyNamespace().list();
- 列出具有某些标签的 Ingress 对象:
IngressList ingressList = client.network().v1().ingress().inNamespace("FunTester").withLabel("foo", "bar").list();
- 删除 Ingress:
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
使用示例:
- 从 yaml 文件加载
StatefulSet
:
StatefulSet aStatefulSet = client.apps().statefulSets()
.load(new FileInputStream("test-statefulset.yml")).item();
- 从 Kubernetes API 服务器获取
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
DaemonSet 是 Kubernetes 中确保每个节点(或符合标签条件的节点)上都运行一个 Pod 副本的控制器,适用于节点级别的守护进程或服务(如日志收集、网络插件)。
DaemonSet
资源可以通过 client.apps().daemonSets()
访问。以下是一些常见的 DaemonSet
使用示例:
- 从 yaml 文件加载
DaemonSet
:
DaemonSet ds = client.apps().daemonSets().load(new FileInputStream("daemonset.yaml")).item();
- 从 Kubernetes API 服务器获取
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 风采
视频专题