heat_template_version: 2013-05-23 description: > This is a nested stack that defines a Kubernetes master. This stack is included by an ResourceGroup resource in the parent template (kubecluster-coreos.yaml). parameters: server_image: type: string description: glance image used to boot the server master_flavor: type: string default: m1.small 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 default: public token: type: string description: token is generated from https://discovery.etcd.io/new ssh_authorized_key: type: string description: complete ssh key. dns_nameserver: type: string description: address of a dns nameserver reachable in your environment default: 8.8.8.8 portal_network_cidr: type: string description: > address range used by kubernetes for service portals default: 10.254.0.0/16 kube_allow_priv: type: string description: > whether or not kubernetes should permit privileged containers. default: "true" constraints: - allowed_values: ["true", "false"] flannel_network_cidr: type: string description: network range for flannel overlay network default: 10.100.0.0/16 flannel_network_subnetlen: type: string description: size of subnet assigned to each master default: 24 flannel_use_vxlan: type: string description: > if true use the vxlan backend, otherwise use the default udp backend default: "false" constraints: - allowed_values: ["true", "false"] fixed_network: type: string description: Network from which to allocate fixed addresses. fixed_subnet: type: string description: Subnet from which to allocate fixed addresses. wait_condition_timeout: type: number default: 6000 description : > timeout for the Wait Conditions auth_url: type: string description: > url for kubernetes to authenticate before sending request to neutron username: type: string description: > user account password: type: string description: > user password tenant_name: type: string description: > tenant name resources: master_wait_handle: type: AWS::CloudFormation::WaitConditionHandle master_wait_condition: type: AWS::CloudFormation::WaitCondition depends_on: - kube_master properties: Handle: get_resource: master_wait_handle Timeout: {get_param: wait_condition_timeout} ###################################################################### # # security groups. we need to permit network traffic of various # sorts. # secgroup_base: type: OS::Neutron::SecurityGroup properties: rules: - protocol: icmp - protocol: tcp port_range_min: 22 port_range_max: 22 secgroup_kubernetes: type: OS::Neutron::SecurityGroup properties: rules: - protocol: tcp port_range_min: 7080 port_range_max: 7080 - protocol: tcp port_range_min: 8080 port_range_max: 8080 - protocol: tcp port_range_min: 2379 port_range_max: 2379 - protocol: tcp port_range_min: 2380 port_range_max: 2380 - protocol: tcp port_range_min: 6443 port_range_max: 6443 ###################################################################### # # 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-master.yaml} params: "$KUBE_ALLOW_PRIV": {get_param: kube_allow_priv} "$FLANNEL_NETWORK_CIDR": {get_param: flannel_network_cidr} "$FLANNEL_NETWORK_SUBNETLEN": {get_param: flannel_network_subnetlen} "$FLANNEL_USE_VXLAN": {get_param: flannel_use_vxlan} "$PORTAL_NETWORK_CIDR": {get_param: portal_network_cidr} "$AUTH_URL": {get_param: auth_url} "$USERNAME": {get_param: username} "$PASSWORD": {get_param: password} "$TENANT_NAME": {get_param: tenant_name} "$CLUSTER_SUBNET": {get_param: fixed_subnet} write_kube_os_config: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/write-kube-os-config.sh} configure_kubernetes: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/configure-kubernetes-master.sh} write_flannel_config: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/write-flannel-config.sh} flannel_config_service: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/flannel-config.service.yaml} enable_services: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/enable-services-master.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} cfn_signal: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/cfn-signal.sh} disable_selinux: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: {get_file: fragments/disable-selinux.sh} coreos_params: type: OS::Heat::SoftwareConfig properties: group: ungrouped config: str_replace: template: {get_file: fragments/coreos.params.yaml} params: token: {get_param: token} ssh_authorized_key: {get_param: ssh_authorized_key} kube_master_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: write_kube_os_config} - config: {get_resource: configure_kubernetes} - config: {get_resource: enable_services} - config: {get_resource: write_flannel_config} - config: {get_resource: flannel_config_service} - config: {get_resource: kube_examples} - config: {get_resource: cfn_signal} - config: {get_resource: coreos_params} ###################################################################### # # a single kubernetes master. # kube_master: type: OS::Nova::Server properties: image: {get_param: server_image} flavor: {get_param: master_flavor} key_name: {get_param: ssh_key_name} user_data_format: RAW user_data: {get_resource: kube_master_init} networks: - port: {get_resource: kube_master_eth0} kube_master_eth0: type: OS::Neutron::Port properties: network: {get_param: fixed_network} security_groups: - {get_resource: secgroup_base} - {get_resource: secgroup_kubernetes} fixed_ips: - subnet: {get_param: fixed_subnet} replacement_policy: AUTO kube_master_floating: type: OS::Neutron::FloatingIP properties: floating_network: {get_param: external_network} port_id: {get_resource: kube_master_eth0} outputs: kube_master_ip: value: {get_attr: [kube_master_eth0, fixed_ips, 0, ip_address]} kube_master_external_ip: value: {get_attr: [kube_master_floating, floating_ip_address]}