Skip to content

Commit 91c0250

Browse files
author
Dahai
committed
fabric8 client
1 parent c34faec commit 91c0250

File tree

11 files changed

+793
-311
lines changed

11 files changed

+793
-311
lines changed

README.md

+7-7
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,23 @@ DHorse是一个简单易用、以应用为中心的云原生DevOps系统,具
2323

2424
## 快速开始
2525

26-
1. 环境要求
26+
1.环境要求
2727

2828
| Java | kubernetes | Harbor |
2929
| :----: | :----: | :----: |
3030
| >=8 | [1.18.x, 1.26.x] | >=2.0.0 |
3131

32-
2. 下载安装文件
32+
2.下载安装文件
3333

3434
[最新稳定版](https://gitee.com/i512team/dhorse/releases/download/v1.3.0/dhorse-v1.3.0-bin.tar.gz)
3535

36-
3. 解压
36+
3.解压
3737

3838
```bash
3939
$ tar zxvf dhorse-*.tar.gz
4040
```
4141

42-
4. 查看文件列表
42+
4.查看文件列表
4343

4444
```bash
4545
$ cd dhorse-* && ls -l
@@ -53,17 +53,17 @@ drwxr-xr-x 3 root root 46 Oct 6 19:56 lib
5353
drwxr-xr-x 8 root root 93 Sep 23 16:09 static
5454
```
5555

56-
5. 启动服务
56+
5.启动服务
5757

5858
```bash
5959
$ bin/dhorse-start.sh
6060
```
6161

62-
6. 在浏览器里输入地址:`http://127.0.0.1:8100`,并输入认证信息:admin/admin,登录之后如下图所示
62+
6.在浏览器里输入地址:`http://127.0.0.1:8100`,并输入认证信息:admin/admin,登录之后如下图所示
6363

6464
![Image text](./static/images/home.jpg)
6565

66-
7. 最后,关闭服务
66+
7.最后,关闭服务
6767

6868
```bash
6969
$ bin/dhorse-stop.sh

conf/kubernetes-filebeat.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,8 @@ spec:
215215
volumes:
216216
- name: config
217217
configMap:
218-
defaultMode: 0640
218+
#493是十进制,对应的八进制是0755
219+
defaultMode: 493
219220
name: filebeat-config
220221
- name: varlibdockercontainers
221222
hostPath:

dhorse-application/src/main/java/org/dhorse/application/service/ApplicationService.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@
5454
import org.dhorse.infrastructure.repository.po.ClusterPO;
5555
import org.dhorse.infrastructure.strategy.cluster.ClusterStrategy;
5656
import org.dhorse.infrastructure.strategy.cluster.K8sClusterStrategy;
57-
import org.dhorse.infrastructure.strategy.cluster.K8sClusterStrategy2;
5857
import org.dhorse.infrastructure.strategy.login.dto.LoginUser;
5958
import org.dhorse.infrastructure.utils.Constants;
6059
import org.dhorse.infrastructure.utils.DeploymentContext;
@@ -184,7 +183,7 @@ public AppPO validateApp(String appId) {
184183

185184
protected ClusterStrategy clusterStrategy(Integer clusterType) {
186185
if (ClusterTypeEnum.K8S.getCode().equals(clusterType)) {
187-
return new K8sClusterStrategy2();
186+
return new K8sClusterStrategy();
188187
} else {
189188
return new K8sClusterStrategy();
190189
}

dhorse-infrastructure/src/main/java/org/dhorse/infrastructure/strategy/cluster/ClusterStrategy.java

-2
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,6 @@ PageData<EnvReplica> replicaPage(EnvReplicaPageParam pageParam, ClusterPO cluste
5050

5151
InputStream downloadFile(ClusterPO clusterPO, String namespace, String replicaName, String fileName);
5252

53-
String getClusterVersion(String clusterUrl, String authToken);
54-
5553
List<ClusterNamespace> namespaceList(ClusterPO clusterPO, ClusterNamespacePageParam clusterNamespacePageParam);
5654

5755
boolean addNamespace(ClusterPO clusterPO, String namespaceName);

dhorse-infrastructure/src/main/java/org/dhorse/infrastructure/strategy/cluster/K8sClusterStrategy.java

+4-13
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
import io.kubernetes.client.openapi.apis.AutoscalingV1Api;
7676
import io.kubernetes.client.openapi.apis.CoreV1Api;
7777
import io.kubernetes.client.openapi.apis.NetworkingV1Api;
78-
import io.kubernetes.client.openapi.apis.VersionApi;
7978
import io.kubernetes.client.openapi.models.V1Affinity;
8079
import io.kubernetes.client.openapi.models.V1ConfigMapVolumeSource;
8180
import io.kubernetes.client.openapi.models.V1Container;
@@ -145,6 +144,10 @@
145144
import io.kubernetes.client.util.Yaml;
146145
import io.kubernetes.client.util.credentials.AccessTokenAuthentication;
147146

147+
/**
148+
* k8s操作功能
149+
* @author Dahai
150+
*/
148151
public class K8sClusterStrategy implements ClusterStrategy {
149152

150153
private static final Logger logger = LoggerFactory.getLogger(K8sClusterStrategy.class);
@@ -1808,18 +1811,6 @@ public InputStream downloadFile(ClusterPO clusterPO, String namespace, String r
18081811
return null;
18091812
}
18101813

1811-
public String getClusterVersion(String clusterUrl, String authToken) {
1812-
ApiClient apiClient = this.apiClient(clusterUrl, authToken);
1813-
VersionApi versionApi = new VersionApi(apiClient);
1814-
try {
1815-
return versionApi.getCode().getGitVersion();
1816-
} catch (ApiException e) {
1817-
String message = e.getResponseBody() == null ? e.getMessage() : e.getResponseBody();
1818-
LogUtils.throwException(logger, message, MessageCodeEnum.CLUSTER_FAILURE);
1819-
}
1820-
return null;
1821-
}
1822-
18231814
public List<ClusterNamespace> namespaceList(ClusterPO clusterPO,
18241815
ClusterNamespacePageParam pageParam) {
18251816
ApiClient apiClient = this.apiClient(clusterPO.getClusterUrl(), clusterPO.getAuthToken());
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package org.dhorse.infrastructure.strategy.cluster.k8s;
2+
3+
import java.util.Collections;
4+
import java.util.HashSet;
5+
import java.util.Set;
6+
7+
import org.apache.commons.lang3.StringUtils;
8+
import org.dhorse.api.enums.MessageCodeEnum;
9+
import org.dhorse.infrastructure.component.ComponentConstants;
10+
import org.dhorse.infrastructure.component.SpringBeanContext;
11+
import org.dhorse.infrastructure.repository.po.ClusterPO;
12+
import org.dhorse.infrastructure.utils.Constants;
13+
import org.dhorse.infrastructure.utils.HttpUtils;
14+
import org.dhorse.infrastructure.utils.K8sUtils;
15+
import org.dhorse.infrastructure.utils.LogUtils;
16+
import org.slf4j.Logger;
17+
import org.slf4j.LoggerFactory;
18+
import org.springframework.util.CollectionUtils;
19+
20+
import io.fabric8.kubernetes.api.model.ConfigMap;
21+
import io.fabric8.kubernetes.api.model.Namespace;
22+
import io.fabric8.kubernetes.api.model.NamespaceList;
23+
import io.fabric8.kubernetes.api.model.ObjectMeta;
24+
import io.fabric8.kubernetes.client.KubernetesClient;
25+
import io.fabric8.kubernetes.client.dsl.Resource;
26+
27+
public class DHorseConfigHelper {
28+
29+
private static final Logger logger = LoggerFactory.getLogger(DHorseConfigHelper.class);
30+
31+
/**
32+
* 通过ConfigMap向k8s集群写入dhorse服务器的地址,地址格式为:ip1:8100,ip2:8100
33+
*/
34+
public static void writeServerIp(ClusterPO clusterPO, KubernetesClient client) {
35+
NamespaceList namespaceList = client.namespaces().list();
36+
if(CollectionUtils.isEmpty(namespaceList.getItems())) {
37+
return;
38+
}
39+
40+
ComponentConstants componentConstants = SpringBeanContext.getBean(ComponentConstants.class);
41+
for(Namespace n : namespaceList.getItems()) {
42+
String namespace = n.getMetadata().getName();
43+
if(!K8sUtils.DHORSE_NAMESPACE.equals(namespace)
44+
&& K8sUtils.getSystemNamspaces().contains(namespace)) {
45+
continue;
46+
}
47+
if(!"Active".equals(n.getStatus().getPhase())){
48+
continue;
49+
}
50+
51+
ConfigMap configMap = dhorseConfigMap();
52+
Resource<ConfigMap> resource = client.configMaps().inNamespace(namespace)
53+
.resource(configMap);
54+
ConfigMap existedCP = resource.get();
55+
if(existedCP == null) {
56+
String ipPortUri = Constants.hostIp() + ":" + componentConstants.getServerPort();
57+
if(ipPortUri.startsWith(Constants.LOCALHOST_IP)) {
58+
LogUtils.throwException(logger, "Your dhorse server mast have a valid ip, not 127.0.0.1", MessageCodeEnum.DHORSE_SERVER_URL_FAILURE);
59+
}
60+
configMap.setData(Collections.singletonMap(K8sUtils.DHORSE_SERVER_URL_KEY, ipPortUri));
61+
resource.create();
62+
}else {
63+
Set<String> newIp = new HashSet<>();
64+
newIp.add(Constants.hostIp() + ":" + componentConstants.getServerPort());
65+
String ipStr = existedCP.getData().get(K8sUtils.DHORSE_SERVER_URL_KEY);
66+
if(!StringUtils.isBlank(ipStr)) {
67+
String[] ips = ipStr.split(",");
68+
for(String ip : ips) {
69+
if(ip.startsWith(Constants.LOCALHOST_IP)) {
70+
continue;
71+
}
72+
if(!HttpUtils.pingDHorseServer(ip)) {
73+
continue;
74+
}
75+
newIp.add(ip);
76+
}
77+
}
78+
configMap.setData(Collections.singletonMap(K8sUtils.DHORSE_SERVER_URL_KEY, String.join(",", newIp)));
79+
resource.update();
80+
}
81+
}
82+
}
83+
84+
/**
85+
* 通过ConfigMap向k8s集群删除dhorse服务器的地址,地址格式为:ip1:8100,ip2:8100
86+
*/
87+
public static void deleteServerIp(ClusterPO clusterPO, KubernetesClient client) {
88+
NamespaceList namespaceList = client.namespaces().list();
89+
if(CollectionUtils.isEmpty(namespaceList.getItems())) {
90+
return;
91+
}
92+
for(Namespace n : namespaceList.getItems()) {
93+
String namespace = n.getMetadata().getName();
94+
if(!K8sUtils.DHORSE_NAMESPACE.equals(namespace)
95+
&& K8sUtils.getSystemNamspaces().contains(namespace)) {
96+
continue;
97+
}
98+
if(!"Active".equals(n.getStatus().getPhase())){
99+
continue;
100+
}
101+
ConfigMap configMap = client.configMaps().inNamespace(namespace)
102+
.withName(K8sUtils.DHORSE_CONFIGMAP_NAME).get();
103+
if(configMap == null) {
104+
continue;
105+
}
106+
Set<String> newIp = new HashSet<>();
107+
String ipStr = configMap.getData().get(K8sUtils.DHORSE_SERVER_URL_KEY);
108+
if(!StringUtils.isBlank(ipStr)) {
109+
String[] ips = ipStr.split(",");
110+
//ip格式为:127.0.0.1:8100
111+
for(String ip : ips) {
112+
if(Constants.hostIp().equals(ip.split(":")[0])) {
113+
continue;
114+
}
115+
if(!HttpUtils.pingDHorseServer(ip)) {
116+
continue;
117+
}
118+
newIp.add(ip);
119+
}
120+
}
121+
configMap.setData(Collections.singletonMap(K8sUtils.DHORSE_SERVER_URL_KEY, String.join(",", newIp)));
122+
Resource<ConfigMap> resource = client.configMaps().inNamespace(namespace).resource(configMap);
123+
if(newIp.size() == 0) {
124+
resource.delete();
125+
}else {
126+
resource.update();
127+
}
128+
}
129+
}
130+
131+
private static ConfigMap dhorseConfigMap() {
132+
ConfigMap configMap = new ConfigMap();
133+
ObjectMeta meta = new ObjectMeta();
134+
meta.setName(K8sUtils.DHORSE_CONFIGMAP_NAME);
135+
meta.setLabels(Collections.singletonMap(K8sUtils.DHORSE_LABEL_KEY, K8sUtils.DHORSE_CONFIGMAP_NAME));
136+
configMap.setMetadata(meta);
137+
return configMap;
138+
}
139+
}

0 commit comments

Comments
 (0)