kubernetes/pkg/controller
k8s-merge-robot 994239dc00 Merge pull request #28821 from colemickens/azure-cloudprovider-pr
Automatic merge from submit-queue

Add an Azure CloudProvider Implementation

This PR adds `Azure` as a cloudprovider provider for Kubernetes. It specifically adds support for native pod networking (via Azure User Defined Routes) and L4 Load Balancing (via Azure Load Balancers).

I did have to add `clusterName` as a parameter to the `LoadBalancers` methods. This is because Azure only allows one "LoadBalancer" object per set of backend machines. This means a single "LoadBalancer" object must be shared across the cluster. The "LoadBalancer" is named via the `cluster-name` parameter passed to `kube-controller-manager` so as to enable multiple clusters per resource group if the user desires such a configuration.

There are few things that I'm a bit unsure about:

1. The implementation of the `Instances` interface. It's not extensively documented, it's not really clear what the different functions are used for, and my questions on the ML didn't get an answer.

2. Counter to the comments on the `LoadBalancers` Interface, I modify the `api.Service` object in `EnsureLoadBalancerDeleted`, but not with the intention of affecting Kube's view of the Service. I simply do it so that I can remove the `Port`s on the `Service` object and then re-use my reconciliation logic that can handle removing stale/deleted Ports. 

3. The logging is a bit verbose. I'm looking for guidance on the appropriate log level to use for the chattier bits.

Due to the (current) lack of Instance Metadata Service and lack of Virtual Machine Identity in Azure, the user is required to do a few things to opt-in to this provider. These things are called-out as they are in contrast to AWS/GCE:

1. The user must provision an Azure Active Directory ServicePrincipal with `Contributor` level access to the resource group that the cluster is deployed in. This creation process is documented [by Hashicorp](https://www.packer.io/docs/builders/azure-setup.html) or [on the MSDN Blog](https://blogs.msdn.microsoft.com/arsen/2016/05/11/how-to-create-and-test-azure-service-principal-using-azure-cli/).

2. The user must place a JSON file somewhere on each Node that conforms to the `AzureConfig` struct defined in `azure.go`. (This is automatically done in the Azure flavor of [Kubernetes-Anywhere](https://github.com/kubernetes/kubernetes-anywhere).)

3. The user must specify `--cloud-config=/path/to/azure.json` as an option to `kube-apiserver` and `kube-controller-manager` similarly to how the user would need to pass `--cloud-provider=azure`.

I've been running approximately this code for a month and a half. I only encountered one bug which has since been fixed and covered by a unit test. I've just deployed a new cluster (and a Type=LoadBalancer nginx Service) using this code (via `kubernetes-anywhere`) and have posted [the `kube-controller-manager` logs](https://gist.github.com/colemickens/1bf6a26e7ef9484a72a30b1fcf9fc3cb) for anyone who is interested in seeing the logs of the logic.

If you're interested in this PR, you can use the instructions in my [`azure-kubernetes-demo` repository](https://github.com/colemickens/azure-kubernetes-demo) to deploy a cluster with minimal effort via [`kubernetes-anywhere`](https://github.com/kubernetes/kubernetes-anywhere). (There is currently [a pending PR in `kubernetes-anywhere` that is needed](https://github.com/kubernetes/kubernetes-anywhere/pull/172) in conjuncture with this PR). I also have a pre-built `hyperkube` image: `docker.io/colemickens/hyperkube-amd64:v1.4.0-alpha.0-azure`, which will be kept in sync with the branch this PR stems from.

I'm hoping this can land in the Kubernetes 1.4 timeframe.

CC (potential code reviewers from Azure): @ahmetalpbalkan @brendandixon @paulmey

CC (other interested Azure folk): @brendandburns @johngossman @anandramakrishna @jmspring @jimzim

CC (others who've expressed interest): @codefx9 @edevil @thockin @rootfs
2016-07-26 21:56:49 -07:00
..
certificates certificates: implement certificates controller 2016-07-19 11:25:38 -07:00
daemon Merge pull request #28803 from lukaszo/ds 2016-07-18 22:12:14 -07:00
deployment Use nonexistent image instead of minReadySeconds in deployment rollover e2e test 2016-07-25 11:45:46 -07:00
endpoint Use Go canonical import paths 2016-07-16 13:48:21 -04:00
framework Factory for SharedIndexInformers 2016-07-21 14:04:48 +02:00
garbagecollector Garbagecollector.go 2016-07-21 22:31:08 +08:00
job Use Go canonical import paths 2016-07-16 13:48:21 -04:00
namespace Use Go canonical import paths 2016-07-16 13:48:21 -04:00
node Merge pull request #29101 from gmarek/allocator2 2016-07-19 04:35:23 -07:00
petset Merge pull request #28909 from foxish/foxish-issue-28785 2016-07-22 02:39:06 -07:00
podautoscaler Merge pull request #29125 from mwielgus/extra-debug-hpa 2016-07-19 10:41:09 -07:00
podgc Use Go canonical import paths 2016-07-16 13:48:21 -04:00
replicaset ReplicaSet controller can set/remove ControllerRef 2016-07-21 11:36:52 +02:00
replication ReplicaSet controller can set/remove ControllerRef 2016-07-21 11:36:52 +02:00
resourcequota Merge pull request #29133 from deads2k/priority-queue 2016-07-21 04:46:59 -07:00
route Use Go canonical import paths 2016-07-16 13:48:21 -04:00
service add clusterName to Loadbalancer methods 2016-07-26 14:50:33 -07:00
serviceaccount Use Go canonical import paths 2016-07-16 13:48:21 -04:00
volume Merge pull request #28813 from xiang90/pv_1 2016-07-23 00:51:49 -07:00
controller_ref_manager.go let RC manager utilize the GC 2016-07-14 19:59:31 -07:00
controller_utils.go let RC manager utilize the GC 2016-07-14 19:59:31 -07:00
controller_utils_test.go let RC manager utilize the GC 2016-07-14 19:59:31 -07:00
doc.go Use Go canonical import paths 2016-07-16 13:48:21 -04:00
lookup_cache.go Remove "All rights reserved" from all the headers. 2016-06-29 17:47:36 -07:00
OWNERS Remove myself from a bunch of OWNERS files, as I am too overloaded 2016-05-11 13:34:51 -07:00