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

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

  }
});
FunTester 原创精华
【免费合集】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
测试开发、自动化、白盒
测试理论、FunTester 风采
视频专题


↙↙↙阅读原文可查看相关链接,并与作者交流