Merge branch 'master' into updoc3

This commit is contained in:
Mike Spreitzer
2016-09-30 23:05:47 -04:00
committed by GitHub
25 changed files with 287 additions and 121 deletions
+4
View File
@@ -10,4 +10,8 @@ toc:
section: section:
- title: Using an HTTP Proxy to Access the Kubernetes API - title: Using an HTTP Proxy to Access the Kubernetes API
path: /docs/tasks/access-kubernetes-api/http-proxy-access-api/ path: /docs/tasks/access-kubernetes-api/http-proxy-access-api/
- title: Administering a Cluster
section:
- title: Assigning Pods to Nodes
path: /docs/tasks/administer-cluster/assign-pods-nodes/
+1 -1
View File
@@ -56,5 +56,5 @@ toc:
section: section:
- title: Running a Stateless Application Using a Deployment - title: Running a Stateless Application Using a Deployment
path: /docs/tutorials/stateless-application/run-stateless-application-deployment/ path: /docs/tutorials/stateless-application/run-stateless-application-deployment/
- title: Exposing an External IP Address Using a Service - title: Using a Service to Access an Application in a Cluster
path: /docs/tutorials/stateless-application/expose-external-ip-address-service/ path: /docs/tutorials/stateless-application/expose-external-ip-address-service/
+38 -38
View File
@@ -3,40 +3,40 @@
margin-top: 1em !important; margin-top: 1em !important;
} }
#caseStudies p { .gridPage p {
color: rgb(26,26,26) !important; color: rgb(26,26,26) !important;
margin-left: 0 !important; margin-left: 0 !important;
padding-left: 0 !important; padding-left: 0 !important;
font-weight: 300 !important; font-weight: 300 !important;
} }
#caseStudies #mainContent { .gridPage #mainContent {
padding: 0; padding: 0;
} }
#caseStudies #mainContent .content { .gridPage #mainContent .content {
padding-top: 0; padding-top: 0;
} }
#caseStudies main { .gridPage main {
max-width: 1100px !important; max-width: 1100px !important;
} }
#caseStudies .content { .gridPage .content {
position: relative; position: relative;
margin: 0 auto 50px; margin: 0 auto 50px;
max-width: 90%; max-width: 90%;
} }
#caseStudies .content p { .gridPage .content p {
line-height: 24px !important; line-height: 24px !important;
} }
#caseStudies .content h3 { .gridPage .content h3 {
padding: 0 !important; padding: 0 !important;
} }
#caseStudies #hero h5 { .gridPage #hero h5 {
padding-left: 20px; padding-left: 20px;
margin: 0; margin: 0;
} }
@@ -67,7 +67,7 @@
left: 0; left: 0;
} }
#caseStudies #mainContent .content .case-study p { .gridPage #mainContent .content .case-study p {
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
font-size: 16px; font-size: 16px;
padding: 0; padding: 0;
@@ -77,13 +77,13 @@
font-style: italic; font-style: italic;
} }
#caseStudies #video { .gridPage #video {
background: #f9f9f9; background: #f9f9f9;
height: auto; height: auto;
/*height: 340px;*/ /*height: 340px;*/
} }
#caseStudies #video main { .gridPage #video main {
position: relative; position: relative;
max-width: 900px !important; max-width: 900px !important;
height: 100%; height: 100%;
@@ -93,19 +93,19 @@
padding: 50px 20px; padding: 50px 20px;
} }
#caseStudies #video main > div { .gridPage #video main > div {
width: 50%; width: 50%;
} }
#caseStudies #video main #zulilyLogo { .gridPage #video main #zulilyLogo {
width: 100px; width: 100px;
} }
#caseStudies #video main img { .gridPage #video main img {
max-width: 100%; max-width: 100%;
} }
#caseStudies #video h3 { .gridPage #video h3 {
font-size: 32px; font-size: 32px;
font-weight: 300; font-weight: 300;
line-height: 38px; line-height: 38px;
@@ -113,57 +113,57 @@
margin: 0 0 1em 0; margin: 0 0 1em 0;
} }
#caseStudies #video p { .gridPage #video p {
margin: 0; margin: 0;
} }
#caseStudies #video p.attrib { .gridPage #video p.attrib {
margin-bottom: 20px; margin-bottom: 20px;
} }
#caseStudies #video button > h6 { .gridPage #video button > h6 {
font-size: 18px; font-size: 18px;
font-weight: 500; font-weight: 500;
margin: 1em 0; margin: 1em 0;
color: #326de6; color: #326de6;
} }
#caseStudies #users { .gridPage #users {
padding: 50px; padding: 50px;
} }
#caseStudies #users main { .gridPage #users main {
max-width: 1150px !important; max-width: 1150px !important;
} }
#caseStudies #users main h3 { .gridPage #users main h3 {
padding-left: 20px; padding-left: 20px;
margin-bottom: 20px; margin-bottom: 20px;
} }
#caseStudies #usersGrid { .gridPage #usersGrid {
position: relative; position: relative;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
} }
#caseStudies #usersGrid a { .gridPage #usersGrid a {
display: inline-block; display: inline-block;
margin: 5px; margin: 5px;
} }
#caseStudies #usersGrid a img { .gridPage #usersGrid a img {
box-shadow: 1px 1px 2px transparent; box-shadow: 1px 1px 2px transparent;
transition: box-shadow 0.25s; transition: box-shadow 0.25s;
} }
#caseStudies #usersGrid a img:hover { .gridPage #usersGrid a img:hover {
box-shadow: 1px 1px 2px #cccccc; box-shadow: 1px 1px 2px #cccccc;
} }
#caseStudies #usersGrid a:last-child img, .gridPage #usersGrid a:last-child img,
#caseStudies #usersGrid a:last-child img:hover { .gridPage #usersGrid a:last-child img:hover {
box-shadow: 1px 1px 2px transparent; box-shadow: 1px 1px 2px transparent;
} }
@@ -173,12 +173,12 @@
box-shadow: 1px 2px 2px #dddddd; box-shadow: 1px 2px 2px #dddddd;
} }
#caseStudies .feature { .gridPage .feature {
position: relative; position: relative;
padding: 20px 0 20px 242px; padding: 20px 0 20px 242px;
} }
#caseStudies .feature img { .gridPage .feature img {
position: absolute; position: absolute;
top: 20px; top: 20px;
left: 0; left: 0;
@@ -225,7 +225,7 @@
margin-bottom: 0.5em; margin-bottom: 0.5em;
} }
#caseStudies .feature p.quote { .gridPage .feature p.quote {
font-size: 20px; font-size: 20px;
line-height: 28px !important; line-height: 28px !important;
} }
@@ -250,20 +250,20 @@
} }
@media screen and (max-width: 900px){ @media screen and (max-width: 900px){
#caseStudies #video main { .gridPage #video main {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
#caseStudies #video main > div { .gridPage #video main > div {
width: 400px; width: 400px;
} }
#caseStudies #video main > div + div { .gridPage #video main > div + div {
margin-top: 30px; margin-top: 30px;
} }
#caseStudies #video h3 { .gridPage #video h3 {
max-width: 100%; max-width: 100%;
} }
} }
@@ -282,12 +282,12 @@
transform: translateX(-50%); transform: translateX(-50%);
} }
#caseStudies .feature { .gridPage .feature {
margin-top: 50px; margin-top: 50px;
padding: 180px 0 0; padding: 180px 0 0;
} }
#caseStudies .feature img { .gridPage .feature img {
top: 0; top: 0;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
@@ -295,12 +295,12 @@
} }
@media screen and (max-width: 480px){ @media screen and (max-width: 480px){
#caseStudies #hero { .gridPage #hero {
padding-right: 20px; padding-right: 20px;
padding-left: 20px; padding-left: 20px;
} }
#caseStudies #video main > div { .gridPage #video main > div {
width: 80%; width: 80%;
min-width: 280px; min-width: 280px;
} }
+2 -1
View File
@@ -1131,7 +1131,7 @@ $feature-box-div-margin-bottom: 40px
// Community // Community
#community, #caseStudies #community, .gridPage
&.open-nav, &.flip-nav &.open-nav, &.flip-nav
.logo .logo
background-image: url(/images/nav_logo2.svg) background-image: url(/images/nav_logo2.svg)
@@ -1340,3 +1340,4 @@ $feature-box-div-margin-bottom: 40px
// //
// //
// //
//
+1 -1
View File
@@ -270,7 +270,7 @@ $video-section-height: 550px
#community, #caseStudies #community, .gridPage
#hero #hero
text-align: left text-align: left
+1 -1
View File
@@ -3,7 +3,7 @@ title: Case Studies
--- ---
<!Doctype html> <!Doctype html>
<html id="caseStudies"> <html id="caseStudies" class="gridPage">
{% include head-header.html %} {% include head-header.html %}
<section id="hero" class="light-text"> <section id="hero" class="light-text">
+1 -1
View File
@@ -3,7 +3,7 @@ title: Pearson Case Study
--- ---
<!Doctype html> <!Doctype html>
<html id="caseStudies"> <html id="caseStudies" class="gridPage">
{% include head-header.html %} {% include head-header.html %}
<section id="hero" class="light-text"> <section id="hero" class="light-text">
+1 -1
View File
@@ -3,7 +3,7 @@ title: Wikimedia Case Study
--- ---
<!Doctype html> <!Doctype html>
<html id="caseStudies"> <html id="caseStudies" class="gridPage">
{% include head-header.html %} {% include head-header.html %}
<section id="hero" class="light-text"> <section id="hero" class="light-text">
+2 -2
View File
@@ -349,8 +349,8 @@ logs or through `journalctl`. More information is provided in
Additional resources: Additional resources:
- http://wiki.apparmor.net/index.php/QuickProfileLanguage - [Quick guide to the AppArmor profile language](http://wiki.apparmor.net/index.php/QuickProfileLanguage)
- http://wiki.apparmor.net/index.php/ProfileLanguage - [AppArmor core policy reference](http://wiki.apparmor.net/index.php/ProfileLanguage)
## API Reference ## API Reference
+3 -10
View File
@@ -42,16 +42,6 @@ You will install the following packages on all the machines:
For each host in turn: For each host in turn:
<!--
# curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
# cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://packages.cloud.google.com/apt kubernetes-xenial main
EOF
# apt-get update
# apt-get install -y kubeadm docker.io§
-->
* SSH into the machine and become `root` if you are not already (for example, run `sudo su -`). * SSH into the machine and become `root` if you are not already (for example, run `sudo su -`).
* If the machine is running Ubuntu 16.04, run: * If the machine is running Ubuntu 16.04, run:
@@ -92,6 +82,9 @@ To initialize the master, pick one of the machines you previously installed `kub
# kubeadm init # kubeadm init
**Note:** this will autodetect the network interface to advertise the master on as the interface with the default gateway.
If you want to use a different interface, specify `--api-advertise-addresses=<ip-address>` argument to `kubeadm init`.
This will download and install the cluster database and "control plane" components. This will download and install the cluster database and "control plane" components.
This may take several minutes. This may take several minutes.
@@ -134,7 +134,7 @@ export KUBERNETES_PROVIDER=libvirt-coreos; wget -q -O - https://get.k8s.io | bas
Here is the curl version of this command: Here is the curl version of this command:
```shell ```shell
export KUBERNETES_PROVIDER=libvirt-coreos; curl -sS https://get.k8s.io | bash` export KUBERNETES_PROVIDER=libvirt-coreos; curl -sS https://get.k8s.io | bash
``` ```
This script downloads and unpacks the tarball, then spawns a Kubernetes cluster on CoreOS instances with the following characteristics: This script downloads and unpacks the tarball, then spawns a Kubernetes cluster on CoreOS instances with the following characteristics:
+2 -3
View File
@@ -47,9 +47,8 @@ ssh jclouds@${ip_address_of_master_node}
Build Kubernetes-Mesos. Build Kubernetes-Mesos.
```shell ```shell
git clone https://github.com/kubernetes/kubernetes git clone https://github.com/kubernetes-incubator/kube-mesos-framework
cd kubernetes cd kube-mesos-framework
export KUBERNETES_CONTRIB=mesos
make make
``` ```
+1 -1
View File
@@ -94,7 +94,7 @@ To start a cluster, run the command:
```shell ```shell
minikube start minikube start
Starting local Kubernetes cluster... Starting local Kubernetes cluster...
Kubernetes is available at https://192.168.99.100:443. Kubectl is now configured to use the cluster.
``` ```
This will build and start a lightweight local cluster, consisting of a master, etcd, Docker and a single node. This will build and start a lightweight local cluster, consisting of a master, etcd, Docker and a single node.
@@ -0,0 +1,88 @@
---
---
{% capture overview %}
This page shows how to assign a Kubernetes Pod to a particular node in a
Kubernetes cluster.
{% endcapture %}
{% capture prerequisites %}
* Install [kubectl](http://kubernetes.io/docs/user-guide/prereqs).
* Create a Kubernetes cluster, including a running Kubernetes
API server. One way to create a new cluster is to use
[Minikube](/docs/getting-started-guides/minikube).
* Configure `kubectl` to communicate with your Kubernetes API server. This
configuration is done automatically if you use Minikube.
{% endcapture %}
{% capture steps %}
### Adding a label to a node
1. List the nodes in your cluster:
kubectl get nodes
The output is similar to this:
NAME STATUS AGE
worker0 Ready 1d
worker1 Ready 1d
worker2 Ready 1d
1. Chose one of your nodes, and add a label to it:
kubectl label nodes <your-node-name> disktype=ssd
where `<your-node-name>` is the name of your chosen node.
1. Verify that your chosen node has a `disktype=ssd` label:
kubectl get nodes --show-labels
The output is similar to this:
NAME STATUS AGE LABELS
worker0 Ready 1d ...,disktype=ssd,kubernetes.io/hostname=worker0
worker1 Ready 1d ...,kubernetes.io/hostname=worker1
worker2 Ready 1d ...,kubernetes.io/hostname=worker2
In the preceding output, you can see that the `worker0` node has a
`disktype=ssd` label.
### Creating a pod that gets scheduled to your chosen node
This pod configuration file describes a pod that has a node selector,
`disktype: ssd`. This means that the pod will get scheduled on a node that has
a `disktype=ssd` label.
{% include code.html language="yaml" file="pod.yaml" ghlink="/docs/tasks/administer-cluster/pod.yaml" %}
1. Use the configuration file to create a pod that will get scheduled on your
chosen node:
export REPO=https://raw.githubusercontent.com/kubernetes/kubernetes.github.io/master
kubectl create -f $REPO/docs/tasks/administer-cluster/pod.yaml
1. Verify that the pod is running on your chosen node:
kubectl get pods --output=wide
The output is similar to this:
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 13s 10.200.0.4 worker0
{% endcapture %}
{% capture whatsnext %}
Learn more about
[labels and selectors](/docs/user-guide/labels/).
{% endcapture %}
{% include templates/task.md %}
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
+3
View File
@@ -11,6 +11,9 @@ The Tasks section of the Kubernetes documentation is a work in progress
* [Using an HTTP Proxy to Access the Kubernetes API](/docs/tasks/access-kubernetes-api/http-proxy-access-api) * [Using an HTTP Proxy to Access the Kubernetes API](/docs/tasks/access-kubernetes-api/http-proxy-access-api)
#### Administering a Cluster
* [Assigning Pods to Nodes](/docs/tasks/administer-cluster/assign-pods-nodes/)
### What's next ### What's next
+1 -1
View File
@@ -7,7 +7,7 @@ The Tutorials section of the Kubernetes documentation is a work in progress.
* [Running a Stateless Application Using a Deployment](/docs/tutorials/stateless-application/run-stateless-application-deployment/) * [Running a Stateless Application Using a Deployment](/docs/tutorials/stateless-application/run-stateless-application-deployment/)
* [Exposing an External IP Address Using a Service](/docs/tutorials/stateless-application/expose-external-ip-address-service/) * [Using a Service to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address-service/)
### What's next ### What's next
@@ -16,4 +16,3 @@ spec:
image: nginx:1.7.9 image: nginx:1.7.9
ports: ports:
- containerPort: 80 - containerPort: 80
Contact GitHub API Training Shop Blog About
@@ -4,9 +4,8 @@
{% capture overview %} {% capture overview %}
This page shows how to create a Kubernetes Service object that external This page shows how to create a Kubernetes Service object that external
clients can use to access an application running in a cluster. The clients can use to access an application running in a cluster. The Service
Service exposes a stable IP address and provides load balancing for provides load balancing for an application that has two running instances.
an application that has two running instances.
{% endcapture %} {% endcapture %}
@@ -28,7 +27,7 @@ an application that has two running instances.
{% capture objectives %} {% capture objectives %}
* Run two instances of a Hello World application. * Run two instances of a Hello World application.
* Create a Service object that exposes an external IP address. * Create a Service object that exposes a node port.
* Use the Service object to access the running application. * Use the Service object to access the running application.
{% endcapture %} {% endcapture %}
@@ -55,63 +54,68 @@ an application that has two running instances.
kubectl get deployments hello-world kubectl get deployments hello-world
kubectl describe deployments hello-world kubectl describe deployments hello-world
1. Display information about the ReplicaSet: 1. Display information about your ReplicaSet objects:
kubectl get replicasets hello-world kubectl get replicasets
kubectl describe replicasets hello-world kubectl describe replicasets
1. List the pods that are running the Hello World application:
kubectl get pods --selector="run=load-balancer-example"
The output is similar to this:
NAME READY STATUS RESTARTS AGE
hello-world-2189936611-8fyp0 1/1 Running 0 6m
hello-world-2189936611-9isq8 1/1 Running 0 6m
1. Create a Service object that exposes the deployment: 1. Create a Service object that exposes the deployment:
kubectl expose deployment hello-world --type="LoadBalancer" --name="example-service" kubectl expose deployment hello-world --type=NodePort --name=example-service
1. Display the IP addresses for your service: 1. Display information about the Service:
kubectl get services example-service
The output shows the internal IP address and the external IP address of
your service. If the external IP address shows as `<pending>`, repeat the
command.
Note: If you are using Minikube, you don't get an external IP address. The
external IP address remains in the pending state.
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
example-service 10.0.0.160 <pending> 8080/TCP 40s
1. Use your service to access the Hello World application:
curl <your-external-ip-address>:8080
where `<your-external-ip-address>` is the external IP address of your
service.
The output is a hello message from the application:
Hello Kubernetes!
Note: If you are using Minikube, enter these commands:
kubectl cluster-info
kubectl describe services example-service kubectl describe services example-service
The output displays the IP address of your Minikube node and the NodePort The output is similar to this:
value for your service. Enter this command to access the Hello World
application:
curl <minikube-node-ip-address>:<service-node-port> Name: example-service
Namespace: default
Labels: run=load-balancer-example
Selector: run=load-balancer-example
Type: NodePort
IP: 10.32.0.16
Port: <unset> 8080/TCP
NodePort: <unset> 31496/TCP
Endpoints: 10.200.1.4:8080,10.200.2.5:8080
Session Affinity: None
No events.
where `<minikube-node-ip-address>` us the IP address of your Minikube node, Make a note of the NodePort value for the service. For example,
and `<service-node-port>` is the NodePort value for your service. in the preceding output, the NodePort value is 31496.
1. List the pods that are running the Hello World application:
kubectl get pods --selector="run=load-balancer-example" --output=wide
The output is similar to this:
NAME READY STATUS ... IP NODE
hello-world-2895499144-bsbk5 1/1 Running ... 10.200.1.4 worker1
hello-world-2895499144-m1pwt 1/1 Running ... 10.200.2.5 worker2
1. Get the public IP address of one of your nodes that is running
a Hello World pod. How you get this address depends on how you set
up your cluster. For example, if you are using Minikube, you can
see the node address by running `kubectl cluster-info`. If you are
using Google Compute Engine instances, you can use the
`gcloud compute instances list` command to see the public addresses of your
nodes.
1. On your chosen node, create a firewall rule that allows TCP traffic
on your node port. For example, if your Service has a NodePort value of
31568, create a firewall rule that allows TCP traffic on port 31568.
1. Use the node address and node port to access the Hello World application:
curl http://<public-node-ip>:<node-port>
where `<public-node-ip>` us the public IP address of your node,
and `<node-port>` is the NodePort value for your service.
The response to a successful request is a hello message:
Hello Kubernetes!
### Using a service configuration file ### Using a service configuration file
@@ -75,7 +75,7 @@ a Deployment that runs the nginx:1.7.9 Docker image:
1. Display information about a pod: 1. Display information about a pod:
kubectl display pod <pod-name> kubectl describe pod <pod-name>
where `<pod-name>` is the name of one of your pods. where `<pod-name>` is the name of one of your pods.
+2 -1
View File
@@ -451,7 +451,8 @@ nginx-deployment-2035384211 0 0 1h
nginx-deployment-3066724191 0 0 1h nginx-deployment-3066724191 0 0 1h
``` ```
Note: A paused Deployment cannot be scaled at this moment, and we will add this feature in 1.3 release, see [issue #20853](https://github.com/kubernetes/kubernetes/issues/20853). You cannot rollback a paused Deployment either, and you should resume a Deployment first before doing a rollback. Note: You cannot rollback a paused Deployment until you resume it.
## Use Cases ## Use Cases
+2 -2
View File
@@ -89,5 +89,5 @@ Pods and containers
* [Images and registries](/docs/user-guide/images/) * [Images and registries](/docs/user-guide/images/)
* [Migrating from docker-cli to kubectl](/docs/user-guide/docker-cli-to-kubectl/) * [Migrating from docker-cli to kubectl](/docs/user-guide/docker-cli-to-kubectl/)
* [Configuration Best Practices and Tips](/docs/user-guide/config-best-practices/) * [Configuration Best Practices and Tips](/docs/user-guide/config-best-practices/)
* [Assign pods to selected nodes](https://github.com/kubernetes/kubernetes.github.io/tree/{{page.docsbranch}}/docs/user-guide/node-selection/) * [Assign pods to selected nodes](/docs/user-guide/node-selection/)
* [Perform a rolling update on a running group of pods](https://github.com/kubernetes/kubernetes.github.io/tree/{{page.docsbranch}}/docs/user-guide/update-demo/) * [Perform a rolling update on a running group of pods](/docs/user-guide/update-demo/)
+2 -2
View File
@@ -238,11 +238,11 @@ considering one set of work items that the user wants to manage together &mdash;
There are several different patterns for parallel computation, each with strengths and weaknesses. There are several different patterns for parallel computation, each with strengths and weaknesses.
The tradeoffs are: The tradeoffs are:
- One Job object for each work item, vs a single Job object for all work items. The latter is - One Job object for each work item, vs. a single Job object for all work items. The latter is
better for large numbers of work items. The former creates some overhead for the user and for the better for large numbers of work items. The former creates some overhead for the user and for the
system to manage large numbers of Job objects. Also, with the latter, the resource usage of the job system to manage large numbers of Job objects. Also, with the latter, the resource usage of the job
(number of concurrently running pods) can be easily adjusted using the `kubectl scale` command. (number of concurrently running pods) can be easily adjusted using the `kubectl scale` command.
- Number of pods created equals number of work items, vs each pod can process multiple work items. - Number of pods created equals number of work items, vs. each pod can process multiple work items.
The former typically requires less modification to existing code and containers. The latter The former typically requires less modification to existing code and containers. The latter
is better for large numbers of work items, for similar reasons to the previous bullet. is better for large numbers of work items, for similar reasons to the previous bullet.
- Several approaches use a work queue. This requires running a queue service, - Several approaches use a work queue. This requires running a queue service,
+2 -1
View File
@@ -135,8 +135,9 @@ var kub = (function () {
// case 'caseStudies': // case 'caseStudies':
bodyHeight = windowHeight; bodyHeight = windowHeight;
break; break;
case 'caseStudies': case 'caseStudies':
case 'partners':
bodyHeight = windowHeight * 2; bodyHeight = windowHeight * 2;
break; break;
+60
View File
@@ -0,0 +1,60 @@
---
title: Partners
---
<!Doctype html>
<html id="partners" class="gridPage">
{% include head-header.html %}
<section id="hero" class="light-text">
<h1>Kubernetes Partners</h1>
<h5>Growing the Kubernetes ecosystem.</h5>
<!--<h5></h5>-->
</section>
<section id="users">
<main>
<h5>We are working with a broad group of partners who contribute to the Kubernetes core codebase, making it stronger and richer, creating a vibrant Kubernetes ecosystem supporting a spectrum of complementing platforms, from open source solutions to market-leading technologies.</h5>
<h3>ISV Partners</h3>
<div id="usersGrid">
<a target="_blank" href="https://coreos.com/kubernetes"><img src="/images/community_logos/core_os_logo.png"></a>
<a target="_blank" href="https://deis.com"><img src="/images/community_logos/deis_logo.png"></a>
<a target="_blank" href="https://sysdig.com/blog/monitoring-kubernetes-with-sysdig-cloud"><img src="/images/community_logos/sysdig_cloud_logo.png"></a>
<a target="_blank" href="https://puppet.com/blog/managing-kubernetes-configuration-puppet"><img src="/images/community_logos/puppet_logo.png"></a>
<a target="_blank" href="https://www.microloadbalancer.com/docs/deploy-netscaler-cpx-kubernetes-environment"><img src="/images/community_logos/citrix_logo.png"></a>
<a target="_blank" href="http://wercker.com/workflows/partners/kubernetes/"><img src="/images/community_logos/wercker_logo.png"></a>
<a target="_blank" href="http://rancher.com/kubernetes/"><img src="/images/community_logos/rancher_logo.png"></a>
<a target="_blank" href="https://www.openshift.com/"><img src="/images/community_logos/red_hat_logo.png"></a>
<a target="_blank" href="https://tectonic.com/press/intel-coreos-collaborate-on-openstack-with-kubernetes.html"><img src="/images/community_logos/intel_logo.png"></a>
<a target="_blank" href="https://elasticbox.com/kubernetes/"><img src="/images/community_logos/elastickube_logo.png"></a>
<a target="_blank" href="https://platform9.com/blog/containers-as-a-service-kubernetes-docker"><img src="/images/community_logos/platform9_logo.png"></a>
<a target="_blank" href="http://www.appformix.com/solutions/appformix-for-kubernetes/"><img src="/images/community_logos/appformix_logo.png"></a>
<a target="_blank" href="http://kubernetes.io/docs/getting-started-guides/dcos"><img src="/images/community_logos/mesosphere_logo.png"></a>
<a target="_blank" href="http://docs.datadoghq.com/integrations/kubernetes/"><img src="/images/community_logos/datadog_logo.png"></a>
<a target="_blank" href="https://apprenda.com/kubernetes-support/"><img src="/images/community_logos/apprenda_logo.png"></a>
<a target="_blank" href="http://www.ibm.com/cloud-computing/"><img src="/images/community_logos/ibm_logo.png"></a>
<a target="_blank" href="http://info.crunchydata.com/blog/advanced-crunchy-containers-for-postgresql"><img src="/images/community_logos/crunchy_data_logo.png"></a>
<a target="_blank" href="https://content.mirantis.com/Containerizing-OpenStack-on-Kubernetes-Video-Landing-Page.html"><img src="/images/community_logos/mirantis_logo.png"></a>
<a target="_blank" href="http://blog.aquasec.com/security-best-practices-for-kubernetes-deployment"><img src="/images/community_logos/aqua_logo.png"></a>
<a target="_blank" href="https://jujucharms.com/canonical-kubernetes/"><img src="/images/community_logos/ubuntu_cannonical_logo.png"></a>
</div>
</main>
</section>
<style>
h5 {
font-size: 18px;
line-height: 1.5em;
margin-bottom: 2em;
}
#usersGrid a {
display: inline-block;
background-color: #f9f9f9;
}
</style>
{% include footer.html %}
{% include case-study-styles.html %}
</body>
</html>