「All right reserved, any unauthorized reproduction or transfer is prohibitted」
OpenShift 客户端(oc)是 Red Hat 推出的开源容器平台 OpenShift 的命令行工具,用于与 OpenShift 集群交互。通过 oc,开发者可以高效管理应用全生命周期——包括部署、扩展、监控及调试容器化应用。它支持 Kubernetes 原生操作,同时扩展了 OpenShift 特有功能(如构建镜像、触发部署)。
Fabric8 Kubernetes 客户端提供了一个 OpenShift 扩展,支持 OpenShift 特有的资源。以下是 OpenShift 客户端 DSL 的使用示例。
1. 初始化 OpenShift 客户端
默认初始化:
try (OpenShiftClient client = new KubernetesClientBuilder().build().adapt(OpenShiftClient.class)) {
// 使用客户端进行操作
}
自定义配置初始化:
Config kubeConfig = new ConfigBuilder()
.withMasterUrl("https://api.ci-ln-3sbdl1b-d5d6b.origin-ci-int-aws.dev.FunTestercloud.com:6443")
.withOauthToken("xxxxxxxx-41FunTesteroafKI6iU637-xxxxxxxxxxxxx")
.build();
try (OpenShiftClient client = new KubernetesClientBuilder().withConfig(kubeConfig).build().adapt(OpenShiftClient.class)) {
// 使用客户端进行操作
}
2. DeploymentConfig
从 YAML 加载 DeploymentConfig
:
DeploymentConfig deploymentConfig = client.deploymentConfigs()
.inNamespace("FunTester")
.load(new FileInputStream("FunTester-deploymentconfig.yml")).item();
获取 DeploymentConfig
:
DeploymentConfig dc = client.deploymentConfigs()
.inNamespace("FunTester")
.withName("deploymentconfig1").get();
创建 DeploymentConfig
:
DeploymentConfig dc = new DeploymentConfigBuilder()
.withNewMetadata().withName("deploymentconfig1").endMetadata()
.withNewSpec()
.withReplicas(2)
.withNewTemplate()
.withNewMetadata().addToLabels("app", "database").endMetadata()
.withNewSpec()
.addNewContainer()
.withName("mysql")
.withImage("openshift/mysql-55-centos7")
.endContainer()
.endSpec()
.endTemplate()
.endSpec()
.build();
DeploymentConfig dcCreated = client.deploymentConfigs()
.inNamespace("FunTester").resource(dc).create();
列出 DeploymentConfig
:
DeploymentConfigList dcList = client.deploymentConfigs()
.inNamespace("FunTester").list();
删除 DeploymentConfig
:
client.deploymentConfigs()
.inNamespace("FunTester")
.withName("deploymentconfig1").delete();
3. BuildConfig
从 YAML 加载 BuildConfig
:
BuildConfig buildConfig = client.buildConfigs()
.inNamespace("FunTester")
.load(new FileInputStream("test-buildconfig.yml")).item();
创建 BuildConfig
:
BuildConfig buildConfig = new BuildConfigBuilder()
.withNewMetadata().withName("bc1").endMetadata()
.withNewSpec()
.addNewTrigger().withType("GitHub").withNewGithub().withSecret("secret101").endGithub().endTrigger()
.withNewSource().withType("Git").withNewGit().withUri("https://github.com/openshift/ruby-hello-world").endGit().endSource()
.withNewStrategy().withType("Source").withNewSourceStrategy()
.withNewFrom().withKind("ImageStreamTag").withName("origin-ruby-sample:latest").endFrom()
.endSourceStrategy().endStrategy()
.withNewOutput().withNewTo().withKind("ImageStreamTag").withName("origin-ruby-sample:latest").endTo().endOutput()
.endSpec()
.build();
client.buildConfigs().inNamespace("FunTester").resource(buildConfig).create();
列出 BuildConfig
:
BuildConfigList bcList = client.buildConfigs()
.inNamespace("FunTester").list();
4. Route
从 YAML 加载 Route
:
Route route = client.routes()
.inNamespace("FunTester")
.load(new FileInputStream("test-route.yml")).item();
创建 Route
:
Route route = new RouteBuilder()
.withNewMetadata().withName("route1").endMetadata()
.withNewSpec()
.withHost("www.FunTester.com")
.withNewTo().withKind("Service").withName("service-name1").endTo()
.endSpec()
.build();
client.routes().inNamespace("FunTester").resource(route).create();
5. Project
创建 Project
:
ProjectRequest request = client.projectrequests().create(
new ProjectRequestBuilder()
.withNewMetadata().withName("thisisatest").endMetadata()
.withDescription("Fabric8")
.withDisplayName("Fabric8")
.build()
);
列出 Project
:
ProjectList projectList = client.projects().list();
6. ImageStream
从 YAML 加载 ImageStream
:
ImageStream imageStream = client.imageStreams()
.load(new FileInputStream("test-imagestream.yml")).item();
创建 ImageStream
:
ImageStream imageStream = new ImageStreamBuilder()
.withNewMetadata().withName("FunTester-camel-cdi").endMetadata()
.withNewSpec()
.addNewTag().withName("latest").endTag()
.withDockerImageRepository("fabric8/FunTester-camel-cdi")
.endSpec()
.build();
client.imageStreams().inNamespace("FunTester").resource(imageStream).create();
7. CatalogSource
创建 CatalogSource
:
CatalogSource cs = new CatalogSourceBuilder()
.withNewMetadata().withName("foo").endMetadata()
.withNewSpec()
.withSourceType("Foo")
.withImage("nginx:latest")
.withDisplayName("Foo Bar")
.withPublisher("Fabric8")
.endSpec()
.build();
client.operatorHub().catalogSources().inNamespace("FunTester").resource(cs).create();
8. PrometheusRule
创建 PrometheusRule
:
PrometheusRule prometheusRule = new PrometheusRuleBuilder()
.withNewMetadata().withName("foo").endMetadata()
.withNewSpec()
.addNewGroup()
.withName("./FunTester-rules")
.addNewRule()
.withAlert("FunTesterAlert")
.withNewExpr().withStrVal("vector(1)").endExpr()
.endRule()
.endGroup()
.endSpec()
.build();
client.monitoring().prometheusRules().inNamespace("FunTester").resource(prometheusRule).create();
9. ServiceMonitor
创建 ServiceMonitor
:
ServiceMonitor serviceMonitor = new ServiceMonitorBuilder()
.withNewMetadata()
.withName("foo")
.addToLabels("prometheus", "frontend")
.endMetadata()
.withNewSpec()
.withNewNamespaceSelector().withAny(true).endNamespaceSelector()
.withNewSelector()
.addToMatchLabels("prometheus", "frontend")
.endSelector()
.addNewEndpoint()
.withPort("http-metric")
.withInterval("15s")
.endEndpoint()
.endSpec()
.build();
client.monitoring().serviceMonitors().inNamespace("FunTester").resource(serviceMonitor).create();
10. ClusterResourceQuota
创建 ClusterResourceQuota
:
Map<String, Quantity> hard = new HashMap<>();
hard.put("pods", new Quantity("10"));
hard.put("secrets", new Quantity("20"));
ClusterResourceQuota crq = new ClusterResourceQuotaBuilder()
.withNewMetadata().withName("foo").endMetadata()
.withNewSpec()
.withNewSelector()
.addToAnnotations("openshift.io/requester", "foo-user")
.endSelector()
.withQuota(new ResourceQuotaSpecBuilder().withHard(hard).build())
.endSpec()
.build();
client.quotas().clusterResourceQuotas().resource(crq).create();
11. EgressNetworkPolicy
创建 EgressNetworkPolicy
:
EgressNetworkPolicy enp = new EgressNetworkPolicyBuilder()
.withNewMetadata()
.withName("foo")
.withNamespace("FunTester")
.endMetadata()
.withNewSpec()
.addNewEgress()
.withType("Allow")
.withNewTo().withCidrSelector("1.2.3.0/24").endTo()
.endEgress()
.addNewEgress()
.withType("Allow")
.withNewTo().withDnsName("www.foo.com").endTo()
.endEgress()
.endSpec()
.build();
client.egressNetworkPolicies().inNamespace("FunTester").resource(enp).create();
12. Tekton 客户端
初始化 Tekton 客户端:
try (TektonClient client = new KubernetesClientBuilder().build().adapt(TektonClient.class)) {
// 使用客户端进行操作
}
创建 PipelineRun
:
PipelineRun pipelineRun = new PipelineRunBuilder()
.withNewMetadata().withName("demo-run-1").endMetadata()
.withNewSpec()
.withNewPipelineRef().withName("demo-pipeline").endPipelineRef()
.addNewParam().withName("greeting").withNewValue("Hello World!").endParam()
.endSpec()
.build();
client.v1().pipelineRuns().inNamespace("FunTester").resource(pipelineRun).create();
13. Knative 客户端
初始化 Knative 客户端:
try (KnativeClient client = new KubernetesClientBuilder().build().adapt(KnativeClient.class)) {
// 使用客户端进行操作
}
创建 Service
:
Service service = new ServiceBuilder()
.withNewMetadata().withName("helloworld-go").endMetadata()
.withNewSpec()
.withNewTemplate()
.withNewSpec()
.addToContainers(new ContainerBuilder()
.withImage("gcr.io/knative-samples/helloworld-go")
.addNewEnv().withName("TARGET").withValue("Go Sample V1").endEnv()
.build())
.endSpec()
.endTemplate()
.endSpec()
.build();
client.services().inNamespace("FunTester").resource(service).serverSideApply();
14. 日志记录
配置日志记录:
在 simplelogger.properties
文件中设置日志级别:
org.slf4j.simpleLogger.defaultLogLevel=trace
Show You Code
以下是一个完整的示例,展示如何使用 Fabric8 OpenShift 客户端 DSL 来管理 OpenShift 集群中的资源。这个示例包括初始化 OpenShift 客户端、创建 DeploymentConfig
、创建 Route
,以及列出和删除资源。
示例代码
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.openshift.api.model.*;
import io.fabric8.openshift.client.OpenShiftClient;
import io.fabric8.openshift.client.DefaultOpenShiftClient;
import java.io.FileInputStream;
import java.util.Collections;
public class OpenShiftClientFunTester {
public static void main(String[] args) {
// 初始化 OpenShift 客户端
try (OpenShiftClient client = new DefaultOpenShiftClient()) {
String namespace = "FunTester";
// 1. 创建 DeploymentConfig
DeploymentConfig deploymentConfig = new DeploymentConfigBuilder()
.withNewMetadata()
.withName("FunTester-dc")
.endMetadata()
.withNewSpec()
.withReplicas(2)
.withNewTemplate()
.withNewMetadata()
.addToLabels("app", "FunTester-app")
.endMetadata()
.withNewSpec()
.addNewContainer()
.withName("nginx")
.withImage("nginx:latest")
.addNewPort().withContainerPort(80).endPort()
.endContainer()
.endSpec()
.endTemplate()
.endSpec()
.build();
// 创建 DeploymentConfig
client.deploymentConfigs().inNamespace(namespace).resource(deploymentConfig).create();
System.out.println("DeploymentConfig 创建成功!");
// 2. 创建 Route
Route route = new RouteBuilder()
.withNewMetadata()
.withName("FunTester-route")
.endMetadata()
.withNewSpec()
.withHost("www.FunTester.com")
.withNewTo()
.withKind("Service")
.withName("FunTester-service")
.endTo()
.endSpec()
.build();
// 创建 Route
client.routes().inNamespace(namespace).resource(route).create();
System.out.println("Route 创建成功!");
// 3. 列出 DeploymentConfig
DeploymentConfigList dcList = client.deploymentConfigs().inNamespace(namespace).list();
System.out.println("当前命名空间中的 DeploymentConfig:");
dcList.getItems().forEach(dc -> System.out.println(dc.getMetadata().getName()));
// 4. 列出 Route
RouteList routeList = client.routes().inNamespace(namespace).list();
System.out.println("当前命名空间中的 Route:");
routeList.getItems().forEach(r -> System.out.println(r.getMetadata().getName()));
// 5. 删除 DeploymentConfig
client.deploymentConfigs().inNamespace(namespace).withName("FunTester-dc").delete();
System.out.println("DeploymentConfig 删除成功!");
// 6. 删除 Route
client.routes().inNamespace(namespace).withName("FunTester-route").delete();
System.out.println("Route 删除成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
}
示例说明
-
初始化 OpenShift 客户端:
- 使用
DefaultOpenShiftClient
初始化客户端,默认会从~/.kube/config
文件中读取配置。
- 使用
-
创建
DeploymentConfig
:- 定义了一个
DeploymentConfig
,包含 2 个副本的 Nginx 容器。 - 使用
client.deploymentConfigs().create()
方法创建资源。
- 定义了一个
-
创建
Route
:- 定义了一个
Route
,将流量路由到名为FunTester-service
的服务。 - 使用
client.routes().create()
方法创建资源。
- 定义了一个
-
列出资源:
- 使用
client.deploymentConfigs().list()
和client.routes().list()
列出当前命名空间中的资源。
- 使用
-
删除资源:
- 使用
client.deploymentConfigs().delete()
和client.routes().delete()
删除之前创建的资源。
- 使用
运行示例
- 确保已安装 OpenShift 集群,并且
kubeconfig
文件已正确配置。 - 将上述代码保存为
OpenShiftClientFunTester.java
。 - 编译并运行:
bash javac -cp fabric8-openshift-client-<version>.jar OpenShiftClientFunTester.java java -cp .:fabric8-openshift-client-<version>.jar OpenShiftClientFunTester
- 观察控制台输出,确认资源创建、列出和删除的操作是否成功。
输出示例
DeploymentConfig 创建成功!
Route 创建成功!
当前命名空间中的 DeploymentConfig:
FunTester-dc
当前命名空间中的 Route:
FunTester-route
DeploymentConfig 删除成功!
Route 删除成功!
FunTester 原创精华
【免费合集】从 Java 开始性能测试
故障测试与 Web 前端
服务端功能测试
性能测试专题
Java、Groovy、Go
测试开发、自动化、白盒
测试理论、FunTester 风采
视频专题
TesterHome 为用户提供「保留所有权利,禁止转载」的选项。
除非获得原作者的单独授权,任何第三方不得转载标注了「All right reserved, any unauthorized reproduction or transfer is prohibitted」的内容,否则均视为侵权。
具体请参见TesterHome 知识产权保护协议。
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
No Reply at the moment.