Automatic merge from submit-queue Coreos kube-up now with less cloud init This update includes significant refactoring. It moves almost all of the logic into bash scripts, modeled after the `gci` cluster scripts. The reason to do this is: 1. Avoid duplicating the saltbase manifests by reusing gci's parsing logic (easier maintenance) 2. Take an incremental step towards sharing more code between gci/trusty/coreos, again for better maintenance 3. Pave the way for making future changes (e.g. improved rkt support, kubelet support) easier to share The primary differences from the gci scripts are the following: 1. Use of the `/opt/kubernetes` directory over `/home/kubernetes` 2. Support for rkt as a runtime 3. No use of logrotate 4. No use of `/etc/default/` 5. No logic related to noexec mounts or gci-specific firewall-stuff It will make sense to move 2 over to gci, as well as perhaps a few other small improvements. That will be a separate PR for ease of review. Ref #29720, this is a part of that because it removes a copy of them. Fixes #24165 cc @yifan-gu Since this logic largely duplicates logic from the gci folder, it would be nice if someone closely familiar with that gave an OK or made sure I didn't fall into any gotchas related to that, so cc @andyzheng0831
Cluster add-ons
Cluster add-ons are resources like Services and Deployments (with pods) that are
shipped with the Kubernetes binaries and are considered an inherent part of the
Kubernetes clusters. The add-ons are visible through the API (they can be listed using
kubectl), but direct manipulation of these objects through Apiserver is discouraged
because the system will bring them back to the original state, in particular:
- If an add-on is deleted, it will be recreated automatically.
- If an add-on is updated through Apiserver, it will be reconfigured to the state given by the supplied fields in the initial config.
On the cluster, the add-ons are kept in /etc/kubernetes/addons on the master node, in
yaml / json files. The addon manager periodically kubectl applys the contents of this
directory. Any legit modification would be reflected on the API objects accordingly.
Particularly, rolling-update for deployments is now supported.
Each add-on must specify the following label: kubernetes.io/cluster-service: true.
Config files that do not define this label will be ignored. For those resources
exist in kube-system namespace but not in /etc/kubernetes/addons, addon manager
will attempt to remove them if they are attached with this label. Currently the other
usage of kubernetes.io/cluster-service is for kubectl cluster-info command to recognize
these cluster services.
The suggested naming for most types of resources is just <basename> (with no version
number) because we do not expect the resource name to change. But resources like Pod
, ReplicationController and DaemonSet are exceptional. As Pod updates may not change
fields other than containers[*].image or spec.activeDeadlineSeconds and may not add or
remove containers, it may not be sufficient during a major update. For ReplicationController,
most of the modifications would be legit, but the underlying pods would not got re-created
automatically. DaemonSet has similar problem as the ReplicationController. In these
cases, the suggested naming is <basename>-<version>. When version changes, the system will
delete the old one and create the new one (order not guaranteed).
Add-on update procedure
To update add-ons, just update the contents of /etc/kubernetes/addons
directory with the desired definition of add-ons. Then the system will take care
of:
- Removing objects from the API server whose manifest was removed.
- Creating objects from new manifests
- Updating objects whose fields are legally changed.
Cooperating with Horizontal / Vertical Auto-Scaling
As all cluster add-ons will be reconciled to the original state given by the initial config.
In order to make Horizontal / Vertical Auto-scaling functional, the related fields in config should
be left unset. More specifically, leave replicas in ReplicationController / Deployment
/ ReplicaSet unset for Horizontal Scaling, and leave resources for container unset for Vertical
Scaling. The periodical update won't include these specs, which will be managed by Horizontal / Vertical
Auto-scaler.