blob: ae5700918689d3e8f5774e7266e6835887476a63 [file] [log] [blame]
# ============LICENSE_START==========================================
# ===================================================================
# Copyright (c) 2017 AT&T
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#============LICENSE_END============================================
tosca_definitions_version: cloudify_dsl_1_3
description: >
This blueprint creates a Kubernetes Cluster.
It is based on this documentation: https://kubernetes.io/docs/getting-started-guides/kubeadm/
imports:
- https://raw.githubusercontent.com/cloudify-cosmo/cloudify-manager/4.1/resources/rest-service/cloudify/types/types.yaml
- https://raw.githubusercontent.com/cloudify-cosmo/cloudify-openstack-plugin/2.2.0/plugin.yaml
- https://raw.githubusercontent.com/cloudify-incubator/cloudify-utilities-plugin/1.2.5/plugin.yaml
- https://raw.githubusercontent.com/cloudify-cosmo/cloudify-fabric-plugin/1.5/plugin.yaml
- https://raw.githubusercontent.com/cloudify-cosmo/cloudify-diamond-plugin/1.3.5/plugin.yaml
- imports/cloud-config.yaml
- imports/kubernetes.yaml
inputs:
image:
description: Image to be used when launching agent VMs
default: { get_secret: centos_core_image }
flavor:
description: Flavor of the agent VMs
default: { get_secret: large_image_flavor }
agent_user:
description: >
User for connecting to agent VMs
default: centos
helm_version:
description: helm version to be installed
default: v2.9.1
dsl_definitions:
openstack_config: &openstack_config
username: { get_secret: keystone_username }
password: { get_secret: keystone_password }
tenant_name: { get_secret: keystone_tenant_name }
auth_url: { get_secret: keystone_url }
region: { get_secret: region }
node_templates:
nfs_server:
type: cloudify.nodes.SoftwareComponent
properties:
interfaces:
cloudify.interfaces.lifecycle:
start:
implementation: fabric.fabric_plugin.tasks.run_script
inputs:
script_path: scripts/nfs.sh
use_sudo: true
process:
args:
fabric_env:
host_string: { get_attribute: [ kubernetes_master_host, ip ] }
user: { get_input: agent_user }
key: { get_secret: agent_key_private }
relationships:
- type: cloudify.relationships.contained_in
target: kubernetes_master_host
k8s_tools:
type: cloudify.nodes.SoftwareComponent
properties:
interfaces:
cloudify.interfaces.lifecycle:
start:
implementation: fabric.fabric_plugin.tasks.run_script
inputs:
script_path: scripts/k8s_tools.sh
process:
args: [{ get_input: helm_version }]
fabric_env:
host_string: { get_attribute: [ kubernetes_master_host, ip ] }
user: { get_input: agent_user }
key: { get_secret: agent_key_private }
relationships:
- type: cloudify.relationships.contained_in
target: kubernetes_master
kubernetes_master_host:
type: cloudify.openstack.nodes.Server
properties:
openstack_config: *openstack_config
agent_config:
user: { get_input: agent_user }
install_method: remote
port: 22
key: { get_secret: agent_key_private }
server:
key_name: ''
image: ''
flavor: ''
management_network_name: { get_property: [ public_network, resource_id ] }
interfaces:
cloudify.interfaces.lifecycle:
create:
inputs:
args:
image: { get_input: image }
flavor: { get_input: flavor }
userdata: { get_attribute: [ cloudify_host_cloud_config, cloud_config ] }
relationships:
- target: kubernetes_master_port
type: cloudify.openstack.server_connected_to_port
- type: cloudify.relationships.depends_on
target: cloudify_host_cloud_config
kubernetes_node_host:
type: cloudify.openstack.nodes.Server
properties:
openstack_config: *openstack_config
agent_config:
user: { get_input: agent_user }
install_method: remote
port: 22
key: { get_secret: agent_key_private }
server:
key_name: ''
image: ''
flavor: ''
management_network_name: { get_property: [ private_network, resource_id ] }
relationships:
- type: cloudify.relationships.contained_in
target: k8s_node_scaling_tier
- target: kubernetes_node_port
type: cloudify.openstack.server_connected_to_port
interfaces:
cloudify.interfaces.lifecycle:
create:
inputs:
args:
image: { get_input: image }
flavor: { get_input: flavor }
userdata: { get_attribute: [ cloudify_host_cloud_config, cloud_config ] }
cloudify.interfaces.monitoring_agent:
install:
implementation: diamond.diamond_agent.tasks.install
inputs:
diamond_config:
interval: 1
start: diamond.diamond_agent.tasks.start
stop: diamond.diamond_agent.tasks.stop
uninstall: diamond.diamond_agent.tasks.uninstall
cloudify.interfaces.monitoring:
start:
implementation: diamond.diamond_agent.tasks.add_collectors
inputs:
collectors_config:
CPUCollector: {}
MemoryCollector: {}
LoadAverageCollector: {}
DiskUsageCollector:
config:
devices: x?vd[a-z]+[0-9]*$
NetworkCollector: {}
ProcessResourcesCollector:
config:
enabled: true
unit: B
measure_collector_time: true
cpu_interval: 0.5
process:
hyperkube:
name: hyperkube
kubernetes_security_group:
type: cloudify.openstack.nodes.SecurityGroup
properties:
openstack_config: *openstack_config
security_group:
name: kubernetes_security_group
description: kubernetes master security group
rules:
- remote_ip_prefix: 0.0.0.0/0
port_range_min: 1
port_range_max: 65535
protocol: tcp
direction: ingress
ethertype: IPv4
- remote_ip_prefix: 0.0.0.0/0
port_range_min: 1
port_range_max: 65535
protocol: tcp
direction: egress
ethertype: IPv4
- remote_ip_prefix: 0.0.0.0/0
port_range_min: 1
port_range_max: 65535
protocol: udp
direction: ingress
ethertype: IPv4
- remote_ip_prefix: 0.0.0.0/0
port_range_min: 1
port_range_max: 65535
protocol: udp
direction: egress
ethertype: IPv4
kubernetes_master_port:
type: cloudify.openstack.nodes.Port
properties:
openstack_config: *openstack_config
relationships:
- type: cloudify.relationships.contained_in
target: public_network
- type: cloudify.relationships.depends_on
target: public_subnet
- type: cloudify.openstack.port_connected_to_security_group
target: kubernetes_security_group
- type: cloudify.openstack.port_connected_to_floating_ip
target: kubernetes_master_ip
kubernetes_node_port:
type: cloudify.openstack.nodes.Port
properties:
openstack_config: *openstack_config
relationships:
- type: cloudify.relationships.contained_in
target: k8s_node_scaling_tier
- type: cloudify.relationships.connected_to
target: private_network
- type: cloudify.relationships.depends_on
target: private_subnet
- type: cloudify.openstack.port_connected_to_security_group
target: kubernetes_security_group
private_subnet:
type: cloudify.openstack.nodes.Subnet
properties:
openstack_config: *openstack_config
use_external_resource: true
resource_id: { get_secret: private_subnet_name }
relationships:
- target: private_network
type: cloudify.relationships.contained_in
private_network:
type: cloudify.openstack.nodes.Network
properties:
openstack_config: *openstack_config
use_external_resource: true
resource_id: { get_secret: private_network_name }
public_subnet:
type: cloudify.openstack.nodes.Subnet
properties:
openstack_config: *openstack_config
use_external_resource: true
resource_id: { get_secret: public_subnet_name }
relationships:
- target: public_network
type: cloudify.relationships.contained_in
- target: router
type: cloudify.openstack.subnet_connected_to_router
public_network:
type: cloudify.openstack.nodes.Network
properties:
openstack_config: *openstack_config
use_external_resource: true
resource_id: { get_secret: public_network_name }
router:
type: cloudify.openstack.nodes.Router
properties:
openstack_config: *openstack_config
use_external_resource: true
resource_id: { get_secret: router_name }
relationships:
- target: external_network
type: cloudify.relationships.connected_to
external_network:
type: cloudify.openstack.nodes.Network
properties:
openstack_config: *openstack_config
use_external_resource: true
resource_id: { get_secret: external_network_name }
k8s_node_scaling_tier:
type: cloudify.nodes.Root
kubernetes_master_ip:
type: cloudify.openstack.nodes.FloatingIP
properties:
openstack_config: *openstack_config
floatingip:
floating_network_name: { get_property: [ external_network, resource_id ] }
groups:
k8s_node_group:
members:
- kubernetes_node_host
- kubernetes_node_port
policies:
kubernetes_node_vms_scaling_policy:
type: cloudify.policies.scaling
properties:
default_instances: 6
targets: [k8s_node_group]
outputs:
kubernetes_master_public_ip:
value: { get_attribute: [ kubernetes_master_ip, floating_ip_address ] }