写点什么

Fabric8 Kubernetes 教程——Replication、ConfigMap、Secret

作者:FunTester
  • 2025-03-22
    河北
  • 本文字数:6377 字

    阅读完需:约 21 分钟

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-rcReplicationController 副本数已更新为 3ConfigMap 创建成功!查询到的 ConfigMap: {key1=value1, key2=value2}Secret 创建成功!查询到的 Secret: {username=dXNlcm5hbWU=, password=cGFzc3dvcmQ=}监听到 ReplicationController 事件: ADDED - fun-tester-rcReplicationController 删除成功!ConfigMap 删除成功!Secret 删除成功!
复制代码



发布于: 刚刚阅读数: 4
用户头像

FunTester

关注

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

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

评论

发布
暂无评论
Fabric8 Kubernetes 教程——Replication、ConfigMap、Secret_FunTester_InfoQ写作社区