写点什么

Fabric8 Kubernetes 教程——job、service、ingress、statefulSet、daemonSet

作者:FunTester
  • 2025-03-28
    河北
  • 本文字数:7412 字

    阅读完需:约 24 分钟

在 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 的交互权限,通常与 RoleClusterRole 绑定。


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) {
}});
复制代码

发布于: 4 小时前阅读数: 8
用户头像

FunTester

关注

公众号:FunTester,800篇原创,欢迎关注 2020-10-20 加入

Fun·BUG挖掘机·性能征服者·头顶锅盖·Tester

评论

发布
暂无评论
Fabric8 Kubernetes 教程——job、service、ingress、statefulSet、daemonSet_FunTester_InfoQ写作社区