FunTester Fabric8 Kubernetes 教程——Replication、ConfigMap、Secret

FunTester · March 22, 2025 · 1778 hits

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 删除成功!
FunTester 原创精华
【免费合集】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
白盒、工具、爬虫、UI 自动化
理论、感悟、视频
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up