Fabric8 Kubernetes 教程——Replication、ConfigMap、Secret

时间:2025-03-22 14:18:54

ReplicationController

ReplicationController (RC) 是 Kubernetes 中用于确保指定数量的 Pod 副本始终运行的早期控制器,已被更灵活的 ReplicaSet 取代。

ReplicationController 资源可以通过 client.replicationControllers() 访问。以下是一些常见的 ReplicationController 使用示例,掌握了这些操作,你就能在 Kubernetes 集群中游刃有余,如鱼得水。

  • 从 yaml 文件加载 ReplicationController:
ReplicationController aReplicationController = client.replicationControllers().inNamespace("default")
      .load(new FileInputStream("/test-replicationcontroller.yml")).item();
  • 从 API 服务器获取 ReplicationController:
ReplicationController rc = client.replicationControllers().inNamespace("default").withName("nginx-controller").get();
  • 创建 ReplicationController:
ReplicationController rc1 = new ReplicationControllerBuilder()
  .withNewMetadata().withName("nginx-controller").addToLabels("server", "nginx").endMetadata()
  .withNewSpec().withReplicas(3)
  .withNewTemplate()
  .withNewMetadata().addToLabels("server", "nginx").endMetadata()
  .withNewSpec()
  .addNewContainer().withName("nginx").withImage("nginx")
  .addNewPort().withContainerPort(80).endPort()
  .endContainer()
  .endSpec()
  .endTemplate()
  .endSpec().build();

ReplicationController rc = client.replicationControllers().inNamespace("default").resource(rc1).create();
  • 将 ReplicationController 对象应用到 Kubernetes 集群:
ReplicationController rc = client.replicationControllers().inNamespace("default").resource(rc1).serverSideApply();
  • 列出某个特定命名空间中的 ReplicationController 对象:
ReplicationControllerList rcList = client.replicationControllers().inNamespace("default").list();
  • 列出所有命名空间中的 ReplicationController 对象:
ReplicationControllerList rcList = client.replicationControllers().inAnyNamespace("default").list();
  • 列出具有某些特定标签的 ReplicationController 对象:
ReplicationControllerList rcList = client.replicationControllers().inNamespace("default").withLabel("foo", "bar").list();
  • 删除 ReplicationController:
client.replicationControlers().inNamespace("default").withName("nginx-controller").delete();
  • 监听 ReplicationController:
client.replicationControllers().inNamespace(currentNamespace).watch(new Watcher<>() {
  @Override
  public void eventReceived(Action action, ReplicationController resource) {
    // 根据操作类型执行某些操作    
  }

  @Override
  public void onClose(WatcherException cause) {

  }
});
  • 扩展 ReplicationController:
ReplicationController rc = client.replicationControllers().inNamespace("default").withName("nginx-controller").scale(2);
  • 更新 ReplicationController 中的镜像:
ReplicationController rc = client.replicationControllers()
       .inNamespace("default")
       .withName("nginx")
       .updateImage("nginx:latest");
  • 更新 ReplicationController 中的多个镜像:
Map<String, String> containerToImageMap = new HashMap<>();
containerToImageMap.put("c1", "image1");
containerToImageMap.put("c2", "image2");
ReplicationController rc = client.replicationControllers()
       .inNamespace("default")
       .withName("nginx")
       .updateImage(controllerToImageMap);

ConfigMap

ConfigMap 是 Kubernetes 中用于存储非敏感配置数据的对象,将配置信息与容器镜像解耦,供 Pod 挂载或作为环境变量使用。

ConfigMap 资源可以通过 client.configMaps() 访问。ConfigMap 是 Kubernetes 中管理配置的利器,以下是一些常见的 ConfigMap 使用示例,助你轻松应对配置管理的挑战。

  • 从 yaml 文件加载 ConfigMap:
ConfigMap configMap = client.configMaps().load(new FileInputStream("configmap1.yml")).item();
  • 从 API 服务器获取 ConfigMap:
ConfigMap configMap = client.configMaps().inNamespace("default").withName("configmap1").get();
  • 创建 ConfigMap:
ConfigMap configMap1 = new ConfigMapBuilder()
      .withNewMetadata().withName("configmap1").endMetadata()
      .addToData("1", "one")
      .addToData("2", "two")
      .addToData("3", "three")
      .build();
ConfigMap configMap = client.configMaps().inNamespace("default").resource(configMap1).create();
  • 将 ConfigMap 对象应用到 Kubernetes 集群:
ConfigMap configMap = client.configMaps().inNamespace("default").resource(configMap1).serverSideApply();
  • 列出某个特定命名空间中的 ConfigMap 对象:
ConfigMapList configMapList = client.configMaps().inNamespace("default").list();
  • 列出所有命名空间中的 ConfigMap 对象:
ConfigMapList configMapList = client.configMaps().inAnyNamespace().list();
  • 列出具有某些特定标签的 ConfigMap 对象:
ConfigMapList configMapList = client.configMaps().inNamespace("default").withLabel("foo", "bar").list();
  • 删除 ConfigMap:
client.configMaps().inNamespace("default").withName("configmap1").delete();
  • 监听 ConfigMap:
client.configMaps().inNamespace("default").watch(new Watcher<>() {
  @Override
  public void eventReceived(Action action, ConfigMap resource) {
    // 根据操作类型执行某些操作    
  }

  @Override
  public void onClose(WatcherException cause) {

  }
});
  • 更新 ConfigMap:
ConfigMap configMap1 = client.configMaps().inNamespace(currentNamespace).withName("configmap1").edit(
  c -> new ConfigMapBuilder(c).addToData("4", "four").build()
);

Secret

Secret 是 Kubernetes 中用于存储敏感信息(如密码、令牌、密钥)的对象,数据以 Base64 编码存储,供 Pod 挂载或作为环境变量使用。

Secret 资源可以通过 client.secrets() 访问。Secret 是 Kubernetes 中管理敏感信息的法宝,以下是一些常见的 Secret 使用示例,让你在安全管理的道路上事半功倍。

  • 从 yaml 文件加载 Secret:
Secret aSecret = client.secrets().inNamespace("default").load(new FileInputStream("test-secret.yml")).item();
  • 从 API 服务器获取 Secret:
Secret secret = client.secrets().inNamespace("default").withName("secret1").get()
  • 创建 Secret:
Secret secret1 = new SecretBuilder()
      .withNewMetadata().withName("secret1").endMetadata()
      .addToData("username", "guccifer")
      .addToData("password", "shadowgovernment")
      .build();
Secret secretCreated = client.secrets().inNamespace("default").resource(secret1).create();
  • 将 Secret 对象应用到 Kubernetes 集群:
Secret createdSecret = client.secrets().inNamespace("default").resource(secret1).serverSideApply();
  • 列出某个特定命名空间中的 Secret 对象:
SecretList secretList = client.secrets().inNamespace("default").list();
  • 列出所有命名空间中的 Secret 对象:
SecretList secretList = client.secrets().inAnyNamespace().list();
  • 列出具有某些特定标签的 Secret 对象:
SecretList secretList = client.secrets().inNamespace("default").withLabel("foo", "bar").list();
  • 编辑 Secret:
Secret secret1 = client.secrets().inNamespace(currentNamespace).withName("secret1").edit(
  s -> new SecretBuilder(s).withType("Opaque").build()
);
  • 删除 Secret:
client.secrets().inNamespace("default").withName("secret1").delete();
  • 监听 Secret:
client.secrets().inNamespace("default").watch(new Watcher<>() {
  @Override
  public void eventReceived(Action action, Secret resource) {
    // 根据操作类型执行某些操作
  }

  @Override
  public void onClose(WatcherException cause) {

  }
});

通过以上示例,你可以在 Kubernetes 中轻松驾驭 ReplicationController、ConfigMap 和 Secret 资源,做到心中有数,手到擒来。希望这些内容能为你的软件测试工作添砖加瓦,助你一臂之力!

Show You Code

下面是一个完整的示例,展示了如何使用 Kubernetes Java 客户端 API 来操作 ReplicationControllerConfigMapSecret 资源。这个例子涵盖了创建、查询、更新和删除这些资源的常见操作,适合软件测试工程师在实际工作中参考和使用。

示例代码:Kubernetes 资源操作

import io.fabric8.kubernetes.api.model.*;
import io.fabric8.kubernetes.api.model.apps.ReplicationController;
import io.fabric8.kubernetes.api.model.apps.ReplicationControllerBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.Watcher;
import io.fabric8.kubernetes.client.WatcherException;

import java.io.FileInputStream;
import java.util.HashMap;
import java.util.Map;

public class KubernetesResourceExample {

    public static void main(String[] args) throws Exception {
        // 创建 Kubernetes 客户端
        try (KubernetesClient client = new DefaultKubernetesClient()) {
            String namespace = "default";

            // 1. 创建 ReplicationController
            ReplicationController rc = new ReplicationControllerBuilder()
                    .withNewMetadata().withName("fun-tester-rc").endMetadata()
                    .withNewSpec().withReplicas(2)
                    .withNewTemplate()
                    .withNewMetadata().addToLabels("app", "fun-tester").endMetadata()
                    .withNewSpec()
                    .addNewContainer().withName("fun-tester-container").withImage("nginx:latest")
                    .addNewPort().withContainerPort(80).endPort()
                    .endContainer()
                    .endSpec()
                    .endTemplate()
                    .endSpec().build();

            client.replicationControllers().inNamespace(namespace).resource(rc).create();
            System.out.println("ReplicationController 创建成功!");

            // 2. 查询 ReplicationController
            ReplicationController fetchedRc = client.replicationControllers()
                    .inNamespace(namespace)
                    .withName("fun-tester-rc")
                    .get();
            System.out.println("查询到的 ReplicationController: " + fetchedRc.getMetadata().getName());

            // 3. 更新 ReplicationController 的副本数
            client.replicationControllers()
                    .inNamespace(namespace)
                    .withName("fun-tester-rc")
                    .scale(3);
            System.out.println("ReplicationController 副本数已更新为 3");

            // 4. 创建 ConfigMap
            ConfigMap configMap = new ConfigMapBuilder()
                    .withNewMetadata().withName("fun-tester-config").endMetadata()
                    .addToData("key1", "value1")
                    .addToData("key2", "value2")
                    .build();
            client.configMaps().inNamespace(namespace).resource(configMap).create();
            System.out.println("ConfigMap 创建成功!");

            // 5. 查询 ConfigMap
            ConfigMap fetchedConfigMap = client.configMaps()
                    .inNamespace(namespace)
                    .withName("fun-tester-config")
                    .get();
            System.out.println("查询到的 ConfigMap: " + fetchedConfigMap.getData());

            // 6. 创建 Secret
            Secret secret = new SecretBuilder()
                    .withNewMetadata().withName("fun-tester-secret").endMetadata()
                    .addToData("username", "dXNlcm5hbWU=")  // Base64 编码的 "username"
                    .addToData("password", "cGFzc3dvcmQ=")  // Base64 编码的 "password"
                    .build();
            client.secrets().inNamespace(namespace).resource(secret).create();
            System.out.println("Secret 创建成功!");

            // 7. 查询 Secret
            Secret fetchedSecret = client.secrets()
                    .inNamespace(namespace)
                    .withName("fun-tester-secret")
                    .get();
            System.out.println("查询到的 Secret: " + fetchedSecret.getData());

            // 8. 监听 ReplicationController 事件
            client.replicationControllers().inNamespace(namespace).watch(new Watcher<>() {
                @Override
                public void eventReceived(Action action, ReplicationController resource) {
                    System.out.println("监听到 ReplicationController 事件: " + action + " - " + resource.getMetadata().getName());
                }

                @Override
                public void onClose(WatcherException cause) {
                    System.out.println("监听关闭: " + cause.getMessage());
                }
            });

            // 9. 删除 ReplicationController
            client.replicationControllers().inNamespace(namespace).withName("fun-tester-rc").delete();
            System.out.println("ReplicationController 删除成功!");

            // 10. 删除 ConfigMap
            client.configMaps().inNamespace(namespace).withName("fun-tester-config").delete();
            System.out.println("ConfigMap 删除成功!");

            // 11. 删除 Secret
            client.secrets().inNamespace(namespace).withName("fun-tester-secret").delete();
            System.out.println("Secret 删除成功!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

运行结果

运行上述代码后,您将看到以下输出(具体内容可能因环境不同而有所差异):

ReplicationController 创建成功!
查询到的 ReplicationController: fun-tester-rc
ReplicationController 副本数已更新为 3
ConfigMap 创建成功!
查询到的 ConfigMap: {key1=value1, key2=value2}
Secret 创建成功!
查询到的 Secret: {username=dXNlcm5hbWU=, password=cGFzc3dvcmQ=}
监听到 ReplicationController 事件: ADDED - fun-tester-rc
ReplicationController 删除成功!
ConfigMap 删除成功!
Secret 删除成功!