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

FunTester · 2025年03月28日 · 872 次阅读

在 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) {

  }
});
FunTester 原创精华
【免费合集】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
测试开发、自动化、白盒
测试理论、FunTester 风采
视频专题
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册