Skip to content

Commit fd860d5

Browse files
committed
cks: initial functionality
Signed-off-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
1 parent ef2acbb commit fd860d5

51 files changed

Lines changed: 8099 additions & 1 deletion

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/src/main/java/org/apache/cloudstack/api/ApiConstants.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -742,6 +742,14 @@ public class ApiConstants {
742742
public static final String TARGET_ID = "targetid";
743743
public static final String VOLUME_IDS = "volumeids";
744744

745+
public static final String KUBERNETES_VERSION_ID = "kubernetesversionid";
746+
public static final String CONSOLE_END_POINT = "consoleendpoint";
747+
public static final String DOCKER_REGISTRY_USER_NAME = "dockerregistryusername";
748+
public static final String DOCKER_REGISTRY_PASSWORD = "dockerregistrypassword";
749+
public static final String DOCKER_REGISTRY_URL = "dockerregistryurl";
750+
public static final String DOCKER_REGISTRY_EMAIL = "dockerregistryemail";
751+
public static final String NODE_ROOT_DISK_SIZE = "noderootdisksize";
752+
745753
public enum HostDetails {
746754
all, capacity, events, stats, min;
747755
}

client/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,11 @@
479479
<artifactId>cloud-plugin-integrations-prometheus-exporter</artifactId>
480480
<version>${project.version}</version>
481481
</dependency>
482+
<dependency>
483+
<groupId>org.apache.cloudstack</groupId>
484+
<artifactId>cloud-plugin-integrations-kubernetes-service</artifactId>
485+
<version>${project.version}</version>
486+
</dependency>
482487
</dependencies>
483488
<build>
484489
<plugins>

engine/schema/src/main/resources/META-INF/db/schema-41300to41400.sql

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,101 @@
2121

2222
-- KVM: enable storage data motion on KVM hypervisor_capabilities
2323
UPDATE `cloud`.`hypervisor_capabilities` SET `storage_motion_supported` = 1 WHERE `hypervisor_capabilities`.`hypervisor_type` = 'KVM';
24+
25+
-- Kubernetes service
26+
CREATE TABLE IF NOT EXISTS `cloud`.`kubernetes_cluster` (
27+
`id` bigint unsigned NOT NULL auto_increment COMMENT 'id',
28+
`uuid` varchar(40) DEFAULT NULL,
29+
`name` varchar(255) NOT NULL,
30+
`description` varchar(4096) COMMENT 'display text for this kubernetes cluster',
31+
`zone_id` bigint unsigned NOT NULL COMMENT 'zone id',
32+
`kubernetes_version_id` bigint unsigned NOT NULL COMMENT 'kubernetes version id for the cluster',
33+
`service_offering_id` bigint unsigned COMMENT 'service offering id for the cluster VM',
34+
`template_id` bigint unsigned COMMENT 'vm_template.id',
35+
`network_id` bigint unsigned COMMENT 'network this kubernetes cluster uses',
36+
`node_count` bigint NOT NULL default '0',
37+
`account_id` bigint unsigned NOT NULL COMMENT 'owner of this cluster',
38+
`domain_id` bigint unsigned NOT NULL COMMENT 'owner of this cluster',
39+
`state` char(32) NOT NULL COMMENT 'current state of this cluster',
40+
`key_pair` varchar(40),
41+
`cores` bigint unsigned NOT NULL COMMENT 'number of cores',
42+
`memory` bigint unsigned NOT NULL COMMENT 'total memory',
43+
`node_root_disk_size` bigint(20) unsigned DEFAULT 0 COMMENT 'root disk size of root disk for each node',
44+
`endpoint` varchar(255) COMMENT 'url endpoint of the kubernetes cluster manager api access',
45+
`console_endpoint` varchar(255) COMMENT 'url for the kubernetes cluster manager dashbaord',
46+
`created` datetime NOT NULL COMMENT 'date created',
47+
`removed` datetime COMMENT 'date removed if not null',
48+
`gc` tinyint unsigned NOT NULL DEFAULT 1 COMMENT 'gc this kubernetes cluster or not',
49+
50+
PRIMARY KEY(`id`),
51+
CONSTRAINT `fk_cluster__zone_id` FOREIGN KEY `fk_cluster__zone_id`(`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE,
52+
CONSTRAINT `fk_cluster__kubernetes_version_id` FOREIGN KEY `fk_cluster__kubernetes_version_id`(`kubernetes_version_id`) REFERENCES `kubernetes_supported_version` (`id`) ON DELETE CASCADE,
53+
CONSTRAINT `fk_cluster__service_offering_id` FOREIGN KEY `fk_cluster__service_offering_id`(`service_offering_id`) REFERENCES `service_offering`(`id`) ON DELETE CASCADE,
54+
CONSTRAINT `fk_cluster__template_id` FOREIGN KEY `fk_cluster__template_id`(`template_id`) REFERENCES `vm_template`(`id`) ON DELETE CASCADE,
55+
CONSTRAINT `fk_cluster__network_id` FOREIGN KEY `fk_cluster__network_id`(`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE
56+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
57+
58+
CREATE TABLE IF NOT EXISTS `cloud`.`kubernetes_cluster_vm_map` (
59+
`id` bigint unsigned NOT NULL auto_increment COMMENT 'id',
60+
`cluster_id` bigint unsigned NOT NULL COMMENT 'cluster id',
61+
`vm_id` bigint unsigned NOT NULL COMMENT 'vm id',
62+
63+
PRIMARY KEY(`id`),
64+
CONSTRAINT `fk_kubernetes_cluster_vm_map__cluster_id` FOREIGN KEY `fk_kubernetes_cluster_vm_map__cluster_id`(`cluster_id`) REFERENCES `kubernetes_cluster`(`id`) ON DELETE CASCADE
65+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
66+
67+
CREATE TABLE IF NOT EXISTS `cloud`.`kubernetes_cluster_details` (
68+
`id` bigint unsigned NOT NULL auto_increment COMMENT 'id',
69+
`cluster_id` bigint unsigned NOT NULL COMMENT 'kubernetes cluster id',
70+
`name` varchar(255) NOT NULL,
71+
`value` varchar(10240) NOT NULL,
72+
`display` tinyint(1) NOT NULL DEFAULT '1' COMMENT 'True if the detail can be displayed to the end user',
73+
74+
PRIMARY KEY(`id`),
75+
CONSTRAINT `fk_kubernetes_cluster_details__cluster_id` FOREIGN KEY `fk_kubernetes_cluster_details__cluster_id`(`cluster_id`) REFERENCES `kubernetes_cluster`(`id`) ON DELETE CASCADE
76+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
77+
78+
CREATE TABLE IF NOT EXISTS `cloud`.`kubernetes_supported_version` (
79+
`id` bigint unsigned NOT NULL auto_increment COMMENT 'id',
80+
`uuid` varchar(40) DEFAULT NULL COMMENT 'uuid',
81+
`name` varchar(255) NOT NULL COMMENT 'kubernetes version name',
82+
`iso_id` bigint unsigned NOT NULL COMMENT 'kubernetes version binary ISO id',
83+
`zone_id` bigint unsigned DEFAULT NULL COMMENT 'zone id in which kubernetes version is available',
84+
`created` datetime NOT NULL COMMENT 'date created',
85+
`removed` datetime COMMENT 'date removed if not null',
86+
87+
PRIMARY KEY(`id`),
88+
CONSTRAINT `fk_kubernetes_supported_version__iso_id` FOREIGN KEY `fk_kubernetes_supported_version__iso_id`(`iso_id`) REFERENCES `vm_template`(`id`) ON DELETE CASCADE,
89+
CONSTRAINT `fk_kubernetes_supported_version__zone_id` FOREIGN KEY `fk_kubernetes_supported_version__zone_id`(`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE
90+
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
91+
92+
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server',
93+
'cloud.kubernetes.cluster.template.name', "Kubernetes-Service-Template", 'Name of the template to be used for creating Kubernetes cluster nodes', 'Kubernetes-Service-Template', NULL, NULL, 0);
94+
95+
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server',
96+
'cloud.kubernetes.cluster.binaries.iso.name', 'Kubernetes-Service-Binaries-ISO' , 'Name of the ISO that contains Kubernetes binaries and docker images for offline installation.', 'Kubernetes-Service-Binaries-ISO', NULL , NULL, 0);
97+
98+
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server',
99+
'cloud.kubernetes.cluster.master.cloudconfig', '/etc/cloudstack/management/k8s-master.yml' , 'file location path of the cloud config used for creating kubernetes cluster master node', '/etc/cloudstack/management/k8s-master.yml', NULL , NULL, 0);
100+
101+
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server',
102+
'cloud.kubernetes.cluster.node.cloudconfig', '/etc/cloudstack/management/k8s-node.yml', 'file location path of the cloud config used for creating kubernetes cluster node', '/etc/cloudstack/management/k8s-node.yml', NULL , NULL, 0);
103+
104+
INSERT IGNORE INTO `cloud`.`network_offerings` (name, uuid, unique_name, display_text, nw_rate, mc_rate, traffic_type, tags, system_only, specify_vlan, service_offering_id, conserve_mode, created,availability, dedicated_lb_service, shared_source_nat_service, sort_key, redundant_router_service, state, guest_type, elastic_ip_service, eip_associate_public_ip, elastic_lb_service, specify_ip_ranges, inline,is_persistent,internal_lb, public_lb, egress_default_policy, concurrent_connections, keep_alive_enabled, supports_streched_l2, `default`, removed) VALUES ('DefaultNetworkOfferingforKubernetesService', UUID(), 'DefaultNetworkOfferingforKubernetesService', 'Network Offering used for CloudStack kubernetes service', NULL,NULL,'Guest',NULL,0,0,NULL,1,now(),'Required',1,0,0,0,'Enabled','Isolated',0,1,0,0,0,0,0,1,1,NULL,0,0,0,NULL);
105+
106+
UPDATE `cloud`.`network_offerings` SET removed=NULL WHERE unique_name='DefaultNetworkOfferingforKubernetesService';
107+
108+
SET @k8snetwork = (select id from network_offerings where name='DefaultNetworkOfferingforKubernetesService' and removed IS NULL);
109+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'Dhcp','VirtualRouter',now());
110+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'Dns','VirtualRouter',now());
111+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'Firewall','VirtualRouter',now());
112+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'Gateway','VirtualRouter',now());
113+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'Lb','VirtualRouter',now());
114+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'PortForwarding','VirtualRouter',now());
115+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'SourceNat','VirtualRouter',now());
116+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'StaticNat','VirtualRouter',now());
117+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'UserData','VirtualRouter',now());
118+
INSERT IGNORE INTO ntwk_offering_service_map (network_offering_id, service, provider, created) VALUES (@k8snetwork, 'Vpn','VirtualRouter',now());
119+
120+
INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server',
121+
'cloud.kubernetes.cluster.network.offering', 'DefaultNetworkOfferingforKubernetesService' , 'Network Offering used for CloudStack kubernetes service', 'DefaultNetworkOfferingforKubernetesService', NULL , NULL, 0);
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
<!--
2+
Copyright 2016 ShapeBlue Ltd
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
-->
16+
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
17+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
18+
http://maven.apache.org/xsd/maven-4.0.0.xsd">
19+
20+
<modelVersion>4.0.0</modelVersion>
21+
<artifactId>cloud-plugin-integrations-kubernetes-service</artifactId>
22+
<name>Apache CloudStack Plugin - Kubernetes Service</name>
23+
<parent>
24+
<groupId>org.apache.cloudstack</groupId>
25+
<artifactId>cloudstack-plugins</artifactId>
26+
<version>4.14.0.0-SNAPSHOT</version>
27+
<relativePath>../../pom.xml</relativePath>
28+
</parent>
29+
<dependencies>
30+
<dependency>
31+
<groupId>org.apache.cloudstack</groupId>
32+
<artifactId>cloud-core</artifactId>
33+
<version>${project.version}</version>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.apache.cloudstack</groupId>
37+
<artifactId>cloud-framework-db</artifactId>
38+
<version>${project.version}</version>
39+
</dependency>
40+
<dependency>
41+
<groupId>org.apache.cloudstack</groupId>
42+
<artifactId>cloud-framework-ca</artifactId>
43+
<version>${project.version}</version>
44+
</dependency>
45+
<dependency>
46+
<groupId>org.apache.cloudstack</groupId>
47+
<artifactId>cloud-framework-security</artifactId>
48+
<version>${project.version}</version>
49+
</dependency>
50+
<dependency>
51+
<groupId>org.apache.cloudstack</groupId>
52+
<artifactId>cloud-engine-schema</artifactId>
53+
<version>${project.version}</version>
54+
</dependency>
55+
<dependency>
56+
<groupId>org.apache.cloudstack</groupId>
57+
<artifactId>cloud-engine-api</artifactId>
58+
<version>${project.version}</version>
59+
</dependency>
60+
<dependency>
61+
<groupId>org.apache.cloudstack</groupId>
62+
<artifactId>cloud-engine-components-api</artifactId>
63+
<version>${project.version}</version>
64+
</dependency>
65+
<dependency>
66+
<groupId>org.apache.cloudstack</groupId>
67+
<artifactId>cloud-framework-managed-context</artifactId>
68+
<version>${project.version}</version>
69+
</dependency>
70+
<dependency>
71+
<groupId>org.eclipse.persistence</groupId>
72+
<artifactId>javax.persistence</artifactId>
73+
<version>${cs.jpa.version}</version>
74+
</dependency>
75+
<dependency>
76+
<groupId>com.google.code.gson</groupId>
77+
<artifactId>gson</artifactId>
78+
<version>${cs.gson.version}</version>
79+
</dependency>
80+
<dependency>
81+
<groupId>com.google.guava</groupId>
82+
<artifactId>guava</artifactId>
83+
<version>${cs.guava.version}</version>
84+
</dependency>
85+
<dependency>
86+
<groupId>log4j</groupId>
87+
<artifactId>log4j</artifactId>
88+
<version>${cs.log4j.version}</version>
89+
</dependency>
90+
<dependency>
91+
<groupId>org.springframework</groupId>
92+
<artifactId>spring-context</artifactId>
93+
<version>${org.springframework.version}</version>
94+
</dependency>
95+
<dependency>
96+
<groupId>org.springframework</groupId>
97+
<artifactId>spring-aop</artifactId>
98+
<version>${org.springframework.version}</version>
99+
</dependency>
100+
<dependency>
101+
<groupId>org.springframework</groupId>
102+
<artifactId>spring-beans</artifactId>
103+
<version>${org.springframework.version}</version>
104+
</dependency>
105+
<dependency>
106+
<groupId>org.springframework</groupId>
107+
<artifactId>spring-test</artifactId>
108+
<version>${org.springframework.version}</version>
109+
</dependency>
110+
<dependency>
111+
<groupId>commons-codec</groupId>
112+
<artifactId>commons-codec</artifactId>
113+
<version>${cs.codec.version}</version>
114+
</dependency>
115+
<dependency>
116+
<groupId>org.hamcrest</groupId>
117+
<artifactId>hamcrest-library</artifactId>
118+
<version>${cs.hamcrest.version}</version>
119+
<scope>test</scope>
120+
</dependency>
121+
<dependency>
122+
<groupId>org.bouncycastle</groupId>
123+
<artifactId>bcprov-jdk15on</artifactId>
124+
<version>${cs.bcprov.version}</version>
125+
</dependency>
126+
<dependency>
127+
<groupId>joda-time</groupId>
128+
<artifactId>joda-time</artifactId>
129+
<version>${cs.joda-time.version}</version>
130+
</dependency>
131+
</dependencies>
132+
</project>
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#!/bin/bash
2+
# Licensed to the Apache Software Foundation (ASF) under one
3+
# or more contributor license agreements. See the NOTICE file
4+
# distributed with this work for additional information
5+
# regarding copyright ownership. The ASF licenses this file
6+
# to you under the Apache License, Version 2.0 (the
7+
# "License"); you may not use this file except in compliance
8+
# with the License. You may obtain a copy of the License at
9+
#
10+
# http://www.apache.org/licenses/LICENSE-2.0
11+
#
12+
# Unless required by applicable law or agreed to in writing,
13+
# software distributed under the License is distributed on an
14+
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15+
# KIND, either express or implied. See the License for the
16+
# specific language governing permissions and limitations
17+
# under the License.
18+
19+
RELEASE="v1.11.4"
20+
start_dir="$PWD"
21+
iso_dir="${start_dir}/iso"
22+
working_dir="${iso_dir}/${RELEASE}"
23+
mkdir -p "${working_dir}"
24+
25+
CNI_VERSION="v0.7.1"
26+
echo "Downloading CNI ${CNI_VERSION}..."
27+
cni_dir="${working_dir}/cni/${CNI_VERSION}"
28+
mkdir -p "${cni_dir}"
29+
curl -L "https://github.com/containernetworking/plugins/releases/download/${CNI_VERSION}/cni-plugins-amd64-${CNI_VERSION}.tgz" -o "${cni_dir}/cni-plugins-amd64-${CNI_VERSION}.tgz"
30+
31+
CRICTL_VERSION="v1.11.1"
32+
echo "Downloading CRI tools ${CRICTL_VERSION}..."
33+
crictl_dir="${working_dir}/cri-tools/${CRICTL_VERSION}"
34+
mkdir -p "${crictl_dir}"
35+
curl -L "https://github.com/kubernetes-incubator/cri-tools/releases/download/${CRICTL_VERSION}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz" -o "${crictl_dir}/crictl-${CRICTL_VERSION}-linux-amd64.tar.gz"
36+
37+
echo "Downloading Kubernetes tools ${RELEASE}..."
38+
k8s_dir="${working_dir}/k8s"
39+
mkdir -p "${k8s_dir}"
40+
cd "${k8s_dir}"
41+
curl -L --remote-name-all https://storage.googleapis.com/kubernetes-release/release/${RELEASE}/bin/linux/amd64/{kubeadm,kubelet,kubectl}
42+
kubeadm_file_permissions=`stat --format '%a' kubeadm`
43+
chmod +x kubeadm
44+
45+
echo "Downloading kubelet.service ${RELEASE}..."
46+
cd $start_dir
47+
kubelet_service_file="${working_dir}/kubelet.service"
48+
touch "${kubelet_service_file}"
49+
curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/kubelet.service" | sed "s:/usr/bin:/opt/bin:g" > ${kubelet_service_file}
50+
echo "Downloading 10-kubeadm.conf ${RELEASE}..."
51+
kubeadm_conf_file="${working_dir}/10-kubeadm.conf"
52+
touch "${kubeadm_conf_file}"
53+
curl -sSL "https://raw.githubusercontent.com/kubernetes/kubernetes/${RELEASE}/build/debs/10-kubeadm.conf" | sed "s:/usr/bin:/opt/bin:g" > ${kubeadm_conf_file}
54+
55+
echo "Fetching k8s docker images..."
56+
docker -v
57+
if [ $? -ne 0 ]; then
58+
echo "Installing docker..."
59+
sudo apt update && sudo apt install docker.io -y
60+
sudo systemctl enable docker && sudo systemctl start docker
61+
fi
62+
mkdir -p "${working_dir}/docker"
63+
output=`${k8s_dir}/kubeadm config images list`
64+
while read -r line; do
65+
echo "Downloading docker image $line ---"
66+
sudo docker pull "$line"
67+
image_name=`echo "$line" | grep -oE "[^/]+$"`
68+
sudo docker save "$line" > "${working_dir}/docker/$image_name.tar"
69+
done <<< "$output"
70+
71+
echo "Restore kubeadm permissions..."
72+
if [ "${kubeadm_file_permissions}" -eq "" ]; then
73+
kubeadm_file_permissions=644
74+
fi
75+
chmod ${kubeadm_file_permissions} "${working_dir}/k8s/kubeadm"
76+
77+
mkisofs -o setup.iso -J -R -l "${iso_dir}"
78+
79+
rm -rf "${iso_dir}"

0 commit comments

Comments
 (0)