Using A Manifest to Manage kops Clusters

    Background

    Because of the above statement kops includes an API which provides a feature for users to utilize YAML or JSON manifests for managing their kops created Kubernetes installations. In the same way that you can use a YAML manifest to deploy a Job, you can deploy and manage a kops Kubernetes instance with a manifest. All of these values are also usable via the interactive editor with kops edit.

    You can see all the options that are currently supported in Kops or more prettily here

    The following is a list of the benefits of using a file to manage instances.

    • Capability to access API values that are not accessible via the command line such as setting the max price for spot instances.
    • Create, replace, update, and delete clusters without entering an interactive editor. This feature is helpful when automating cluster creation.
    • Ability to check-in files to source control that represents an installation.
    • Run commands such as kops delete -f mycluster.yaml.

    At this time you must run kops create cluster and then export the YAML from the state store. We plan in the future to have the capability to generate kops YAML via the command line. The following is an example of creating a cluster and exporting the YAML.

    The above command exports a YAML document which contains the definition of the cluster, kind: Cluster, and the definitions of the instance groups, kind: InstanceGroup.

    NOTE: If you run kops get cluster $NAME -o yaml > $NAME.yaml, you will only get a cluster spec. Use the command above (kops get $NAME ...)for both the cluster spec and all instance groups.

    1. apiVersion: kops/v1alpha2
    2. kind: Cluster
    3. metadata:
    4. creationTimestamp: 2017-05-04T23:21:47Z
    5. name: k8s.example.com
    6. spec:
    7. api:
    8. loadBalancer:
    9. type: Public
    10. authorization:
    11. alwaysAllow: {}
    12. channel: stable
    13. cloudProvider: aws
    14. configBase: s3://example-state-store/k8s.example.com
    15. etcdClusters:
    16. - etcdMembers:
    17. - instanceGroup: master-us-east-2d
    18. name: a
    19. - instanceGroup: master-us-east-2b
    20. name: b
    21. - instanceGroup: master-us-east-2c
    22. name: c
    23. name: main
    24. - etcdMembers:
    25. - instanceGroup: master-us-east-2d
    26. name: a
    27. - instanceGroup: master-us-east-2b
    28. name: b
    29. - instanceGroup: master-us-east-2c
    30. name: c
    31. name: events
    32. kubernetesApiAccess:
    33. - 0.0.0.0/0
    34. kubernetesVersion: 1.6.6
    35. masterPublicName: api.k8s.example.com
    36. networkCIDR: 172.20.0.0/16
    37. networkID: vpc-6335dd1a
    38. networking:
    39. weave: {}
    40. nonMasqueradeCIDR: 100.64.0.0/10
    41. sshAccess:
    42. - 0.0.0.0/0
    43. subnets:
    44. - cidr: 172.20.32.0/19
    45. name: us-east-2d
    46. type: Private
    47. zone: us-east-2d
    48. - cidr: 172.20.64.0/19
    49. name: us-east-2b
    50. type: Private
    51. zone: us-east-2b
    52. - cidr: 172.20.96.0/19
    53. type: Private
    54. zone: us-east-2c
    55. - cidr: 172.20.0.0/22
    56. name: utility-us-east-2d
    57. type: Utility
    58. - cidr: 172.20.4.0/22
    59. name: utility-us-east-2b
    60. type: Utility
    61. zone: us-east-2b
    62. - cidr: 172.20.8.0/22
    63. name: utility-us-east-2c
    64. type: Utility
    65. zone: us-east-2c
    66. topology:
    67. bastion:
    68. bastionPublicName: bastion.k8s.example.com
    69. dns:
    70. type: Public
    71. masters: private
    72. nodes: private
    73. ---
    74. apiVersion: kops/v1alpha2
    75. kind: InstanceGroup
    76. metadata:
    77. creationTimestamp: 2017-05-04T23:21:48Z
    78. labels:
    79. kops.k8s.io/cluster: k8s.example.com
    80. name: bastions
    81. spec:
    82. image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
    83. machineType: t2.micro
    84. maxSize: 1
    85. minSize: 1
    86. role: Bastion
    87. subnets:
    88. - utility-us-east-2d
    89. - utility-us-east-2b
    90. - utility-us-east-2c
    91. ---
    92. apiVersion: kops/v1alpha2
    93. kind: InstanceGroup
    94. metadata:
    95. creationTimestamp: 2017-05-04T23:21:47Z
    96. labels:
    97. kops.k8s.io/cluster: k8s.example.com
    98. name: master-us-east-2d
    99. spec:
    100. image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
    101. machineType: m4.large
    102. maxSize: 1
    103. minSize: 1
    104. role: Master
    105. subnets:
    106. - us-east-2d
    107. ---
    108. apiVersion: kops/v1alpha2
    109. kind: InstanceGroup
    110. metadata:
    111. creationTimestamp: 2017-05-04T23:21:47Z
    112. labels:
    113. kops.k8s.io/cluster: k8s.example.com
    114. name: master-us-east-2b
    115. spec:
    116. machineType: m4.large
    117. maxSize: 1
    118. role: Master
    119. subnets:
    120. - us-east-2b
    121. ---
    122. apiVersion: kops/v1alpha2
    123. kind: InstanceGroup
    124. metadata:
    125. creationTimestamp: 2017-05-04T23:21:48Z
    126. labels:
    127. kops.k8s.io/cluster: k8s.example.com
    128. name: master-us-east-2c
    129. spec:
    130. image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
    131. machineType: m4.large
    132. maxSize: 1
    133. minSize: 1
    134. role: Master
    135. subnets:
    136. - us-east-2c
    137. ---
    138. apiVersion: kops/v1alpha2
    139. kind: InstanceGroup
    140. metadata:
    141. creationTimestamp: 2017-05-04T23:21:48Z
    142. labels:
    143. kops.k8s.io/cluster: k8s.example.com
    144. name: nodes
    145. spec:
    146. image: kope.io/k8s-1.6-debian-jessie-amd64-hvm-ebs-2017-05-02
    147. machineType: m4.xlarge
    148. maxSize: 3
    149. minSize: 3
    150. role: Node
    151. subnets:
    152. - us-east-2d
    153. - us-east-2b
    154. - us-east-2c

    YAML Examples

    With the above YAML file, a user can add configurations that are not available via the command line. For instance, you can add a maxPrice value to a new instance group and use spot instances. Also add node and cloud labels for the new instance group.

    This configuration will create an autoscale group that will include 42 m4.10xlarge nodes running as spot instances with custom labels.

    To create the cluster execute:

    1. kops create -f $NAME.yaml
    2. kops create secret --name $NAME sshpublickey admin -i ~/.ssh/id_rsa.pub
    3. kops update cluster $NAME --yes
    4. kops rolling-update cluster $NAME --yes

    Please refer to the rolling-update documentation.

    Update the cluster spec YAML file, and to update the cluster run:

    Please refer to the rolling-update .

    kops implements a full API that defines the various elements in the YAML file exported above. Two top level components exist; ClusterSpec and InstanceGroup.

    1. apiVersion: kops/v1alpha2
    2. kind: Cluster
    3. metadata:
    4. creationTimestamp: 2017-05-04T23:21:47Z
    5. name: k8s.example.com
    6. spec:
    7. api:

    The ClusterSpec allows a user to set configurations for such values as Docker log driver, Kubernetes API server log level, VPC for reusing a VPC (NetworkID), and the Kubernetes version.

    More information about some of the elements in the ClusterSpec is available in the following:

    • Cluster Spec document which outlines some of the values in the Cluster Specification.
    • GPU setup
    • - adding additional IAM roles.
    • Labels

    To access the full configuration that a kops installation is running execute:

    This command prints the entire YAML configuration. But do not use the full document, you may experience strange and unique unwanted behaviors.

    Instance Groups

    1. apiVersion: kops/v1alpha2
    2. kind: InstanceGroup
    3. metadata:
    4. creationTimestamp: 2017-05-04T23:21:48Z
    5. name: foo
    6. spec:

    Full documentation is accessible via .

    Instance Groups map to Auto Scaling Groups in AWS, and Instance Groups in GCE. They are an API level description of a group of compute instances used as Masters or Nodes.

    More documentation is available in the Instance Group document.

    Closing Thoughts

    • If you do not need to define or customize a value, let kops set that value. Setting too many values prevents kops from doing its job in setting up the cluster and you may end up with strange bugs.
    • If you end up with strange bugs, try letting kops do more.
    • Be cautious, take care, and test outside of production!

    If you need to run a custom version of Kubernetes Controller Manager, set kubeControllerManager.image and update your cluster. This is the beauty of using a manifest for your cluster!