heat_template_version: 2013-05-23 description: > This is a nested stack that defines a single Kubernetes minion, based on a vanilla Fedora 20 cloud image. This stack is included by a ResourceGroup resource in the parent template (kubecluster.yaml). parameters: server_image: type: string description: glance image used to boot the server minion_flavor: type: string description: flavor to use when booting the server ssh_key_name: type: string description: name of ssh key to be provisioned on our server external_network: type: string description: uuid/name of a network to use for floating ip addresses kube_allow_priv: type: string description: > whether or not kubernetes should permit privileged containers. constraints: - allowed_values: ["true", "false"] kube_master_ip: type: string description: IP address of the Kubernetes master server. fixed_network: type: string description: Network from which to allocate fixed addresses. wait_condition_timeout: type: number description : > timeout for the Wait Conditions resources: minion_wait_handle: type: OS::Heat::WaitConditionHandle minion_wait_condition: type: OS::Heat::WaitCondition depends_on: kube-minion properties: handle: {get_resource: minion_wait_handle} timeout: {get_param: wait_condition_timeout} ###################################################################### # # software configs. these are components that are combined into # a multipart MIME user-data archive. # write_heat_params: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: str_replace: template: {get_file: fragments/write-heat-params.yaml} params: $KUBE_ALLOW_PRIV: {get_param: kube_allow_priv} $KUBE_MASTER_IP: {get_param: kube_master_ip} $WAIT_HANDLE: {get_resource: minion_wait_handle} configure_kubernetes_minion: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/configure-kubernetes-minion.sh} kube_user: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/kube-user.yaml} kube_examples: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/kube-examples.yaml} docker_service: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/docker.service.yaml} enable_services: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/enable-services-minion.sh} minion_wc_notify: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: str_replace: template: | #!/bin/bash -v wc_notify --data-binary '{"status": "SUCCESS"}' params: wc_notify: {get_attr: [minion_wait_handle, curl_cli]} disable_selinux: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/disable-selinux.sh} kube_minion_init: type: OS::Heat::MultipartMime properties: parts: - config: {get_resource: disable_selinux} - config: {get_resource: write_heat_params} - config: {get_resource: kube_user} - config: {get_resource: kube_examples} - config: {get_resource: configure_kubernetes_minion} - config: {get_resource: docker_service} - config: {get_resource: enable_services} - config: {get_resource: minion_wc_notify} # Important: the name for the heat resource kube-minion below must # not contain "_" (underscore) because it will be used in the # hostname. Because DNS domain name does not allow "_", the "_" # will be converted to a "-" and this will make the hostname different # from the Nova instance name. This in turn will break the load # balancer feature in Kubernetes. kube-minion: type: OS::Nova::Server properties: image: {get_param: server_image} flavor: {get_param: minion_flavor} key_name: {get_param: ssh_key_name} user_data_format: RAW user_data: {get_resource: kube_minion_init} networks: - network: {get_param: fixed_network} kube_minion_floating: type: OS::Neutron::FloatingIP properties: floating_network: {get_param: external_network} port_id: get_attr: [kube-minion, addresses, {get_param: fixed_network}, 0, port] outputs: kube_minion_ip: value: {get_attr: [kube-minion, networks, private, 0]} kube_minion_external_ip: value: {get_attr: [kube_minion_floating, floating_ip_address]} OS::stack_id: value: {get_attr: [kube-minion, networks, private, 0]}