diff --git a/README.md b/README.md index 381cd46567..2801eaead0 100644 --- a/README.md +++ b/README.md @@ -174,14 +174,7 @@ example. If creating an image for a doc, follow the section on "Docker images" from the Kubernetes repository. ## Partners -Kubernetes partners refers to the companies who contribute to the Kubernetes core codebase and/or extend their platform to support Kubernetes. Partners can get their logos added to the partner section of the [community page](http://k8s.io/community) by following the below steps and meeting the below logo specifications. Partners will also need to have a URL that is specific to integrating with Kubernetes ready; this URL will be the destination when the logo is clicked. - -* The partner product logo should be a transparent png image centered in a 215x125 px frame. (look at the existing logos for reference) -* The logo must link to a URL that is specific to integrating with Kubernetes, hosted on the partner's site. -* The logo should be named *product-name*_logo.png and placed in the `/images/community_logos` folder. -* The image reference (including the link to the partner URL) should be added in `community.html` under `
| Do | Don't |
|---|---|
| The Pod has two Containers. | The pod has two containers. |
| The Deployment is responsible for ... | The Deployment object is responsible for ... |
| Do | Don't |
|---|---|
| Click Fork. | Click "Fork". |
| Select Other. | Select 'Other'. |
| Do | Don't |
|---|---|
| A cluster is a set of nodes ... | A "cluster" is a set of nodes ... |
| These components form the control plane. | These components form the control plane. |
| Do | Don't |
|---|---|
Open the envars.yaml file. | Open the envars.yaml file. |
Go to the /docs/tutorials directory. | Go to the /docs/tutorials directory. |
Open the /_data/concepts.yaml file. | Open the /_data/concepts.yaml file. |
` tag. In a Markdown
+document, use the backtick (`).
+
+
+ Do Don't
+ Set the value of the replicas field in the configuration file. Set the value of the "replicas" field in the configuration file.
+ The kubectl run command creates a Deployment. The "kubectl run" command creates a Deployment.
+
+
+### Don't include the command prompt
+
+
+ Do Don't
+ kubectl get pods $ kubectl get pods
+
+
+### Separate commands from output
+
+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
+
+
+{% comment %}## Kubernetes.io word list
+
+A list of Kubernetes-specific terms and words to be used consistently across the site.
+
+
+ Term Useage
+ TBD TBD
+
{% endcomment %}
+
+
+## Content best practices
+
+This section contains suggested best practices for clear, concise, and consistent content.
+
+### Use present tense
+
+
+ Do Don't
+ This command starts a proxy. This command will start a proxy.
+
+
+Exception: Use future or past tense if it is required to convey the correct
+meaning.
+
+### Use active voice
+
+
+ Do Don't
+ You can explore the API using a browser. The API can be explored using a browser.
+ The YAML file specifies the replica count. The replica count is specified in the YAML file.
+
+
+Exception: Use passive voice if active voice leads to an awkward construction.
+
+### Use simple and direct language
+
+Use simple and direct language. Avoid using unnecessary phrases, such as saying "please."
+
+
+ Do Don't
+ To create a ReplicaSet, ... In order to create a ReplicaSet, ...
+ See the configuration file. Please see the configuration file.
+ View the Pods. With this next command, we'll view the Pods.
+
+
+
+### Address the reader as "you"
+
+
+ Do Don't
+ You can create a Deployment by ... We'll create a Deployment by ...
+ In the preceding output, you can see... In the preceding output, we can see ...
+
+
+## Patterns to avoid
+
+### Avoid using "we"
+
+Using "we" in a sentence can be confusing, because the reader might not know
+whether they're part of the "we" you're describing.
+
+
+ Do Don't
+ Version 1.4 includes ... In version 1.4, we have added ...
+ Kubernetes provides a new feature for ... We provide a new feature ...
+ This page teaches you how to use pods. In this page, we are going to learn about pods.
+
+
+### Avoid jargon and idioms
+
+Some readers speak English as a second language. Avoid jargon and idioms to help make their understanding easier.
+
+
+ Do Don't
+ Internally, ... Under the hood, ...
+ Create a new cluster. Turn up a new cluster.
+
+
+### Avoid statements about the future
+
+Avoid making promises or giving hints about the future. If you need to talk about
+an alpha feature, put the text under a heading that identifies it as alpha
+information.
+
+### Avoid statements that will soon be out of date
+
+Avoid words like "currently" and "new." A feature that is new today might not be
+considered new in a few months.
+
+
+ Do Don't
+ In version 1.4, ... In the current version, ...
+ The Federation feature provides ... The new Federation feature provides ...
+
+
+{% endcapture %}
+
+
+{% capture whatsnext %}
+* Learn about [writing a new topic](/docs/contribute/write-new-topic/).
+* Learn about [using page templates](/docs/contribute/page-templates/).
+* Learn about [staging your changes](/docs/contribute/stage-documentation-changes/)
+* Learn about [creating a pull request](/docs/contribute/create-pull-request/).
+{% endcapture %}
+
+{% include templates/concept.md %}
diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md
index 8f4a3db26c..bf40b9c283 100644
--- a/docs/getting-started-guides/kubeadm.md
+++ b/docs/getting-started-guides/kubeadm.md
@@ -13,7 +13,7 @@ li>.highlighter-rouge {position:relative; top:3px;}
## Overview
-This quickstart shows you how to easily install a secure Kubernetes cluster on machines running Ubuntu 16.04 or CentOS 7.
+This quickstart shows you how to easily install a secure Kubernetes cluster on machines running Ubuntu 16.04, CentOS 7 or HypriotOS v1.0.1+.
The installation uses a tool called `kubeadm` which is part of Kubernetes 1.4.
This process works with local VMs, physical servers and/or cloud servers.
@@ -23,7 +23,7 @@ See the full [`kubeadm` reference](/docs/admin/kubeadm) for information on all `
**The `kubeadm` tool is currently in alpha but please try it out and give us [feedback](/docs/getting-started-guides/kubeadm/#feedback)!
Be sure to read the [limitations](#limitations); in particular note that kubeadm doesn't have great support for
-automatically configuring cloud providers. Please refer to the specific cloud provider documentation or
+automatically configuring cloud providers. Please refer to the specific cloud provider documentation or
use another provisioning system.**
kubeadm assumes you have a set of machines (virtual or real) that are up and running. It is designed
@@ -38,7 +38,7 @@ If you are not constrained, other tools build on kubeadm to give you complete cl
## Prerequisites
-1. One or more machines running Ubuntu 16.04, CentOS 7 or HypriotOS v1.0.1
+1. One or more machines running Ubuntu 16.04, CentOS 7 or HypriotOS v1.0.1+
1. 1GB or more of RAM per machine (any less will leave little room for your apps)
1. Full network connectivity between all machines in the cluster (public or private network is fine)
@@ -61,6 +61,9 @@ You will install the following packages on all the machines:
You will only need this on the master, but it can be useful to have on the other nodes as well.
* `kubeadm`: the command to bootstrap the cluster.
+NOTE: If you already have kubeadm installed, you should do a `apt-get update && apt-get upgrade` or `yum update` to get the latest version of kubeadm.
+See the reference doc if you want to read about the different [kubeadm releases](/docs/admin/kubeadm)
+
For each host in turn:
* SSH into the machine and become `root` if you are not already (for example, run `sudo su -`).
@@ -94,7 +97,7 @@ For each host in turn:
The kubelet is now restarting every few seconds, as it waits in a crashloop for `kubeadm` to tell it what to do.
-Note: `setenforce 0` will no longer be necessary on CentOS once [#33555](https://github.com/kubernetes/kubernetes/pull/33555) is included in a released version of `kubeadm`.
+Note: To disable SELinux by running `setenforce 0` is required in order to allow containers to access the host filesystem, which is required by pod networks for example. You have to do this until kubelet can handle SELinux better.
### (2/4) Initializing your master
@@ -103,6 +106,8 @@ All of these components run in pods started by `kubelet`.
Right now you can't run `kubeadm init` twice without tearing down the cluster in between, see [Tear down](#tear-down).
+If you try to run `kubeadm init` and your machine is in a state that is incompatible with starting a Kubernetes cluster, `kubeadm` will warn you about things that might not work or it will error out for unsatisfied mandatory requirements.
+
To initialize the master, pick one of the machines you previously installed `kubelet` and `kubeadm` on, and run:
# kubeadm init
@@ -110,7 +115,7 @@ To initialize the master, pick one of the machines you previously installed `kub
**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=` argument to `kubeadm init`.
-If you want to use [flannel](https://github.com/coreos/flannel) as the pod network; specify `--pod-network-cidr=10.244.0.0/16` if you're using the daemonset manifest below. _However, please note that this is not required for any other networks, including Weave, which is the recommended pod network._
+If you want to use [flannel](https://github.com/coreos/flannel) as the pod network, specify `--pod-network-cidr=10.244.0.0/16` if you're using the daemonset manifest below. _However, please note that this is not required for any other networks besides Flannel._
Please refer to the [kubeadm reference doc](/docs/admin/kubeadm/) if you want to read more about the flags `kubeadm init` provides.
@@ -201,16 +206,27 @@ For example:
A few seconds later, you should notice that running `kubectl get nodes` on the master shows a cluster with as many machines as you created.
-### (Optional) Control your cluster from machines other than the master
+Note that there currently isn't a out-of-the-box way of connecting to the Master's API Server via `kubectl` from a node. Read issue [#35729](https://github.com/kubernetes/kubernetes/issues/35729) for more details.
+
+### (Optional) Controlling your cluster from machines other than the master
In order to get a kubectl on your laptop for example to talk to your cluster, you need to copy the `KubeConfig` file from your master to your laptop like this:
# scp root@:/etc/kubernetes/admin.conf .
# kubectl --kubeconfig ./admin.conf get nodes
+### (Optional) Connecting to the API Server
+
+If you want to connect to the API Server for viewing the dashboard (note: not deployed by default) from outside the cluster for example, you can use `kubectl proxy`:
+
+ # scp root@:/etc/kubernetes/admin.conf .
+ # kubectl --kubeconfig ./admin.conf proxy
+
+You can now access the API Server locally at `http://localhost:8001/api/v1`
+
### (Optional) Installing a sample application
-As an example, install a sample microservices application, a socks shop, to put your cluster through its paces.
+As an example, install a sample microservices application, a socks shop, to put your cluster through its paces. Note that this demo does only work on `amd64`.
To learn more about the sample microservices app, see the [GitHub README](https://github.com/microservices-demo/microservices-demo).
# kubectl create namespace sock-shop
@@ -242,17 +258,11 @@ If there is a firewall, make sure it exposes this port to the internet before yo
* To uninstall the socks shop, run `kubectl delete namespace sock-shop` on the master.
-* To undo what `kubeadm` did, simply delete the machines you created for this tutorial, or run the script below and then start over or uninstall the packages.
+* To undo what `kubeadm` did, simply run:
+
+ # kubeadm reset
-
- Reset local state:
- systemctl stop kubelet;
- docker rm -f -v $(docker ps -q);
- find /var/lib/kubelet | xargs -n 1 findmnt -n -t tmpfs -o TARGET -T | uniq | xargs -r umount -v;
- rm -r -f /etc/kubernetes /var/lib/kubelet /var/lib/etcd;
-
If you wish to start over, run `systemctl start kubelet` followed by `kubeadm init` or `kubeadm join`.
-
## Explore other add-ons
@@ -275,19 +285,22 @@ kubeadm deb packages and binaries are built for amd64, arm and arm64, following
deb-packages are released for ARM and ARM 64-bit, but not RPMs (yet, reach out if there's interest).
-Anyway, ARM had some issues when making v1.4, see [#32517](https://github.com/kubernetes/kubernetes/pull/32517) [#33485](https://github.com/kubernetes/kubernetes/pull/33485), [#33117](https://github.com/kubernetes/kubernetes/pull/33117) and [#33376](https://github.com/kubernetes/kubernetes/pull/33376).
+ARM had some issues when making v1.4, see [#32517](https://github.com/kubernetes/kubernetes/pull/32517) [#33485](https://github.com/kubernetes/kubernetes/pull/33485), [#33117](https://github.com/kubernetes/kubernetes/pull/33117) and [#33376](https://github.com/kubernetes/kubernetes/pull/33376).
However, thanks to the PRs above, `kube-apiserver` works on ARM from the `v1.4.1` release, so make sure you're at least using `v1.4.1` when running on ARM 32-bit
-The multiarch flannel daemonset can be installed this way. Make sure you replace `ARCH=amd64` with `ARCH=arm` or `ARCH=arm64` if necessary.
+The multiarch flannel daemonset can be installed this way.
- # ARCH=amd64 curl -sSL https://raw.githubusercontent.com/luxas/flannel/update-daemonset/Documentation/kube-flannel.yml | sed "s/amd64/${ARCH}/g" | kubectl create -f -
+ # export ARCH=amd64
+ # curl -sSL "https://github.com/coreos/flannel/blob/master/Documentation/kube-flannel.yml?raw=true" | sed "s/amd64/${ARCH}/g" | kubectl create -f -
-And obviously replace `ARCH=amd64` with `ARCH=arm` or `ARCH=arm64` depending on the platform you're running on.
+Replace `ARCH=amd64` with `ARCH=arm` or `ARCH=arm64` depending on the platform you're running on.
+Note that the Raspberry Pi 3 is in ARM 32-bit mode, so for RPi 3 you should set `ARCH` to `arm`, not `arm64`.
## Limitations
Please note: `kubeadm` is a work in progress and these limitations will be addressed in due course.
+Also you can take a look at the troubleshooting section in the [reference document](/docs/admin/kubeadm/#troubleshooting)
1. The cluster created here doesn't have cloud-provider integrations by default, so for example it doesn't work automatically with (for example) [Load Balancers](/docs/user-guide/load-balancer/) (LBs) or [Persistent Volumes](/docs/user-guide/persistent-volumes/walkthrough/) (PVs).
To set up kubeadm with CloudProvider integrations (it's experimental, but try), refer to the [kubeadm reference](/docs/admin/kubeadm/) document.
@@ -302,6 +315,15 @@ Please note: `kubeadm` is a work in progress and these limitations will be addre
1. `kubectl logs` is broken with `kubeadm` clusters due to [#22770](https://github.com/kubernetes/kubernetes/issues/22770).
Workaround: use `docker logs` on the nodes where the containers are running as a workaround.
+1. The HostPort functionality does not work with kubeadm due to that CNI networking is used, see issue [#31307](https://github.com/kubernetes/kubernetes/issues/31307).
+
+ Workaround: use the [NodePort feature of services](/docs/user-guide/services/#type-nodeport) instead, or use HostNetwork.
+1. A running `firewalld` service may conflict with kubeadm, so if you want to run `kubeadm`, you should disable `firewalld` until issue [#35535](https://github.com/kubernetes/kubernetes/issues/35535) is resolved.
+
+ Workaround: Disable `firewalld` or configure it to allow Kubernetes the pod and service cidrs.
+1. If you see errors like `etcd cluster unavailable or misconfigured`, it's because of high load on the machine which makes the `etcd` container a bit unresponsive (it might miss some requests) and therefore kubelet will restart it. This will get better with `etcd3`.
+
+ Workaround: Set `failureThreshold` in `/etc/kubernetes/manifests/etcd.json` to a larger value.
1. If you are using VirtualBox (directly or via Vagrant), you will need to ensure that `hostname -i` returns a routable IP address (i.e. one on the second network interface, not the first one).
By default, it doesn't do this and kubelet ends-up using first non-loopback network interface, which is usually NATed.
diff --git a/docs/getting-started-guides/kubectl.md b/docs/getting-started-guides/kubectl.md
new file mode 100644
index 0000000000..bd2512707b
--- /dev/null
+++ b/docs/getting-started-guides/kubectl.md
@@ -0,0 +1,110 @@
+---
+---
+
+
+
+## Overview
+
+kubectl is the command line tool you use to interact with Kubernetes clusters.
+
+You should use a version of kubectl that is at least as new as your server.
+`kubectl version` will print the server and client versions. Using the same version of kubectl
+as your server naturally works; using a newer kubectl than your server also works; but if you use
+an older kubectl with a newer server you may see odd validation errors .
+
+## Download a release
+
+Download kubectl from the [official Kubernetes releases](https://console.cloud.google.com/storage/browser/kubernetes-release/release/):
+
+On MacOS:
+
+```shell
+wget https://storage.googleapis.com/kubernetes-release/release/v1.4.4/bin/darwin/amd64/kubectl
+chmod +x kubectl
+mv kubectl /usr/local/bin/kubectl
+```
+
+On Linux:
+
+```shell
+wget https://storage.googleapis.com/kubernetes-release/release/v1.4.4/bin/linux/amd64/kubectl
+chmod +x kubectl
+mv kubectl /usr/local/bin/kubectl
+```
+
+
+You may need to `sudo` the `mv`; you can put it anywhere in your `PATH` - some people prefer to install to `~/bin`.
+
+
+## Alternatives
+
+### Download as part of the Google Cloud SDK
+
+kubectl can be installed as part of the Google Cloud SDK:
+
+First install the [Google Cloud SDK](https://cloud.google.com/sdk/).
+
+After Google Cloud SDK installs, run the following command to install `kubectl`:
+
+```shell
+gcloud components install kubectl
+```
+
+Do check that the version is sufficiently up-to-date using `kubectl version`.
+
+### Install with brew
+
+If you are on MacOS and using brew, you can install with:
+
+```shell
+brew install kubectl
+```
+
+The homebrew project is independent from kubernetes, so do check that the version is
+sufficiently up-to-date using `kubectl version`.
+
+
+# Enabling shell autocompletion
+
+kubectl includes autocompletion support, which can save a lot of typing!
+
+The completion script itself is generated by kubectl, so you typically just need to invoke it from your profile.
+
+Common examples are provided here, but for more details please consult `kubectl completion -h`
+
+## On Linux, using bash
+
+To add it to your current shell: `source <(kubectl completion bash)`
+
+To add kubectl autocompletion to your profile (so it is automatically loaded in future shells):
+
+```shell
+echo "source <(kubectl completion bash)" >> ~/.bashrc
+```
+
+## On MacOS, using bash
+
+On MacOS, you will need to install the bash-completion support first:
+
+```shell
+brew install bash-completion
+```
+
+To add it to your current shell:
+
+```shell
+source $(brew --prefix)/etc/bash_completion
+source <(kubectl completion bash)
+```
+
+To add kubectl autocompletion to your profile (so it is automatically loaded in future shells):
+
+```shell
+echo "source $(brew --prefix)/etc/bash_completion" >> ~/.bash_profile
+echo "source <(kubectl completion bash)" >> ~/.bash_profile
+```
+
+Please note that this only appears to work currently if you install using `brew install kubectl`,
+and not if you downloaded kubectl directly.
\ No newline at end of file
diff --git a/docs/getting-started-guides/minikube.md b/docs/getting-started-guides/minikube.md
index 2362424440..1ffc4859c0 100644
--- a/docs/getting-started-guides/minikube.md
+++ b/docs/getting-started-guides/minikube.md
@@ -82,6 +82,8 @@ curl -Lo kubectl http://storage.googleapis.com/kubernetes-release/release/{{page
curl -Lo kubectl http://storage.googleapis.com/kubernetes-release/release/{{page.version}}.0/bin/darwin/386/kubectl && chmod +x kubectl && sudo mv kubectl /usr/local/bin/
```
+For Windows, download [kubectl.exe](http://storage.googleapis.com/kubernetes-release/release/{{page.version}}.0/bin/windows/amd64/kubectl.exe) and save it to a location on your PATH.
+
The generic download path is:
```
https://storage.googleapis.com/kubernetes-release/release/${K8S_VERSION}/bin/${GOOS}/${GOARCH}/${K8S_BINARY}
diff --git a/docs/getting-started-guides/rkt/notes.md b/docs/getting-started-guides/rkt/notes.md
index 28a622d2ab..096beab3c5 100644
--- a/docs/getting-started-guides/rkt/notes.md
+++ b/docs/getting-started-guides/rkt/notes.md
@@ -59,7 +59,7 @@ Under rktnetes, `kubectl get logs` currently cannot get logs from applications t
## Init containers
-The alpha [init container](https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/container-init.md) feature is currently not supported.
+The beta [init container](/docs/user-guide/pods/init-containers.md) feature is currently not supported.
## Container restart back-off
diff --git a/docs/getting-started-guides/scratch.md b/docs/getting-started-guides/scratch.md
index 72a9ee3125..3fc23ec3dc 100644
--- a/docs/getting-started-guides/scratch.md
+++ b/docs/getting-started-guides/scratch.md
@@ -81,12 +81,12 @@ to implement one of the above options:
- **Use a network plugin which is called by Kubernetes**
- Kubernetes supports the [CNI](https://github.com/containernetworking/cni) network plugin interface.
- - There are a number of solutions which provide plugins for Kubernetes:
+ - There are a number of solutions which provide plugins for Kubernetes (listed alphabetically):
+ - [Calico](http://docs.projectcalico.org/)
- [Flannel](https://github.com/coreos/flannel)
- - [Calico](https://github.com/projectcalico/calico-containers)
- - [Weave](https://weave.works/)
- - [Romana](http://romana.io/)
- [Open vSwitch (OVS)](http://openvswitch.org/)
+ - [Romana](http://romana.io/)
+ - [Weave](http://weave.works/)
- [More found here](/docs/admin/networking#how-to-achieve-this)
- You can also write your own.
- **Compile support directly into Kubernetes**
@@ -381,7 +381,7 @@ The minimum version required is [v0.5.6](https://github.com/coreos/rkt/releases/
minimum version required to match rkt v0.5.6 is
[systemd 215](http://lists.freedesktop.org/archives/systemd-devel/2014-July/020903.html).
-[rkt metadata service](https://github.com/coreos/rkt/blob/master/Documentation/networking.md) is also required
+[rkt metadata service](https://github.com/coreos/rkt/blob/master/Documentation/networking/overview.md) is also required
for rkt networking support. You can start rkt metadata service by using command like
`sudo systemd-run rkt metadata-service`
diff --git a/docs/getting-started-guides/vsphere.md b/docs/getting-started-guides/vsphere.md
index b3679c56e8..a1e59b0cd0 100644
--- a/docs/getting-started-guides/vsphere.md
+++ b/docs/getting-started-guides/vsphere.md
@@ -65,6 +65,7 @@ export GOVC_DATACENTER='ha-datacenter' # The datacenter to be used by vSphere cl
```
Sample environment
+
```shell
export GOVC_URL='10.161.236.217'
export GOVC_USERNAME='administrator'
@@ -79,6 +80,7 @@ export GOVC_DATACENTER='Datacenter'
```
Import this VMDK into your vSphere datastore:
+
```shell
govc import.vmdk kube.vmdk ./kube/
```
diff --git a/docs/hellonode.md b/docs/hellonode.md
index a36f9b5770..b5b67a195d 100755
--- a/docs/hellonode.md
+++ b/docs/hellonode.md
@@ -129,7 +129,7 @@ Let’s now stop the container. You can list the docker containers with:
docker ps
```
-You should something like see:
+You should see something like this:
```shell
CONTAINER ID IMAGE COMMAND NAMES
diff --git a/docs/index.md b/docs/index.md
index 5501491e7a..c430dac710 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -4,130 +4,38 @@ assignees:
- thockin
---
-
-
-
- What is Kubernetes?
- Kubernetes is an open-source platform for automating deployment, scaling, and operations of application containers across clusters of hosts. Learn more about what this means for your app.
- Read the Overview
-
-
- Kubernetes Basics Interactive Tutorial
- The Kubernetes Basics interactive tutorials let you try out Kubernetes features using Minikube right out of your web browser in a virtual terminal. Learn about the Kubernetes system and deploy, expose, scale, and upgrade a containerized application in just a few minutes.
- Try the Interactive Tutorials
-
-
- Installing Kubernetes on Linux with kubeadm
- This quickstart will show you how to install a secure Kubernetes cluster on any computers running Linux, using a tool called kubeadm. It'll work with local VMs, physical servers and/or cloud servers, either manually or as a part of your own automation. It is currently in alpha but please try it out and give us feedback!
- If you are looking for a fully automated solution, note that kubeadm is intended as a building block. Tools such as GKE and kops build on kubeadm to provision a complete cluster.
- Install Kubernetes with kubeadm
-
-
- Installing Kubernetes on AWS with kops
- This quickstart will show you how to bring up a complete Kubernetes cluster on AWS, using a tool called kops.
- Install Kubernetes with kops
-
-
- Guided Tutorial
- If you’ve completed one of the quickstarts, a great next step is Kubernetes 101. You will follow a path through the various features of Kubernetes, with code examples along the way, learning all of the core concepts. There's also a Kubernetes 201!
- Kubernetes 101
-
-
-## Samples
+Kubernetes documentation can help you set up Kubernetes, learn about the system, or get your applications and workloads running on Kubernetes. To learn the basics of what Kubernetes is and how it works, read "What is Kubernetes".
-
+Interactive Tutorial
-
-
+The Kubernetes Basics interactive tutorial lets you try out Kubernetes right out of your web browser, using a virtual terminal. Learn about the Kubernetes system and deploy, expose, scale, and upgrade a containerized application in just a few minutes.
-
-
- Contribute to Our Docs
- The docs for Kubernetes are open-source, just like the code for Kubernetes itself. The docs are on GitHub Pages, so you can fork it and it will auto-stage on username.github.io, previewing your changes!
- Write Docs for K8s
-
-
- Need Help?
- Try consulting our troubleshooting guides, or our FAQ. Kubernetes is also supported by a great community of contributors and experts who hang out in our Slack channel, our Google Group and Stack Overflow.
- Get Support
-
-
+Installing/Setting Up Kubernetes
+
+Picking the Right Solution can help you get a Kubernetes cluster up and running, either for local development, or on your cloud provider of choice.
+
+Other/newer ways to set up a Kubernetes cluster include:
+
+- Minikube: Install a single-node Kubernetes cluster on your local machine for development and testing.
+- Installing Kubernetes on AWS with kops: Bring up a complete Kubernetes cluster on Amazon Web Services, using a tool called
kops.
+- Installing Kubernetes on Linux with kubeadm (Alpha): Install a secure Kubernetes cluster on any pre-existing machines running Linux, using the built-in
kubeadm tool.
+
+
+Guides, Tutorials, Tasks, and Concepts
+
+The Kubernetes documentation contains a number of resources to help you understand and work with Kubernetes.
+
+- Guides provides documentation for Kubernetes features as well as administering and spinning up clusters, including usage examples.
+- Tutorials contain detailed walkthroughs of the Kubernetes workflow.
+- Tasks contain step-by-step instructions for common Kubernetes tasks.
+- Concepts provide a deep understanding of how Kubernetes works.
+
+
+API and Command References
+
+The reference documentation provides complete information on the Kubernetes APIs and the kubectl command-line interface.
+
+Tools
+
+The tools page contains a list of native and third-party tools for Kubernetes.
diff --git a/docs/tasks/debug-application-cluster/determine-reason-pod-failure.md b/docs/tasks/debug-application-cluster/determine-reason-pod-failure.md
new file mode 100644
index 0000000000..f0f611e235
--- /dev/null
+++ b/docs/tasks/debug-application-cluster/determine-reason-pod-failure.md
@@ -0,0 +1,110 @@
+---
+---
+
+{% capture overview %}
+
+This page shows how to write and read a Container
+termination message.
+
+Termination messages provide a way for containers to write
+information about fatal events to a location where it can
+be easily retrieved and surfaced by tools like dashboards
+and monitoring software. In most cases, information that you
+put in a termination message should also be written to
+the general
+[Kubernetes logs](/docs/user-guide/logging/).
+
+{% endcapture %}
+
+
+{% capture prerequisites %}
+
+{% include task-tutorial-prereqs.md %}
+
+{% endcapture %}
+
+
+{% capture steps %}
+
+### Writing and reading a termination message
+
+In this exercise, you create a Pod that runs one container.
+The configuration file specifies a command that runs when
+the container starts.
+
+{% include code.html language="yaml" file="termination.yaml" ghlink="/docs/tasks/debug-pod-container/termination.yaml" %}
+
+1. Create a Pod based on the YAML configuration file:
+
+ export REPO=https://raw.githubusercontent.com/kubernetes/kubernetes.github.io/master
+ kubectl create -f $REPO/docs/tasks/debug-pod-container/termination.yaml
+
+ In the YAML file, in the `cmd` and `args` fields, you can see that the
+ container sleeps for 10 seconds and then writes "Sleep expired" to
+ the `/dev/termination-log` file. After the container writes
+ the "Sleep expired" message, it terminates.
+
+1. Display information about the Pod:
+
+ kubectl get pod termination-demo
+
+ Repeat the preceding command until the Pod is no longer running.
+
+1. Display detailed information about the Pod:
+
+ kubectl get pod --output=yaml
+
+ The output includes the "Sleep expired" message:
+
+ apiVersion: v1
+ kind: Pod
+ ...
+ lastState:
+ terminated:
+ containerID: ...
+ exitCode: 0
+ finishedAt: ...
+ message: |
+ Sleep expired
+ ...
+
+1. Use a Go template to filter the output so that it includes
+only the termination message:
+
+```
+{% raw %} kubectl get pod termination-demo -o go-template="{{range .status.containerStatuses}}{{.lastState.terminated.message}}{{end}}"{% endraw %}
+```
+
+### Setting the termination log file
+
+By default Kubernetes retrieves termination messages from
+`/dev/termination-log`. To change this to a different file,
+specify a `terminationMessagePath` field for your Container.
+
+For example, suppose your Container writes termination messages to
+`/tmp/my-log`, and you want Kubernetes to retrieve those messages.
+Set `terminationMessagePath` as shown here:
+
+ apiVersion: v1
+ kind: Pod
+ metadata:
+ name: msg-path-demo
+ spec:
+ containers:
+ - name: msg-path-demo-container
+ image: debian
+ terminationMessagePath: "/tmp/my-log"
+
+{% endcapture %}
+
+{% capture whatsnext %}
+
+* See the `terminationMessagePath` field in
+ [Container](/docs/api-reference/v1/definitions#_v1_container).
+* Learn about [retrieving logs](/docs/user-guide/logging/).
+* Learn about [Go templates](https://golang.org/pkg/text/template/).
+
+{% endcapture %}
+
+
+{% include templates/task.md %}
diff --git a/docs/tasks/debug-application-cluster/termination.yaml b/docs/tasks/debug-application-cluster/termination.yaml
new file mode 100644
index 0000000000..3f63748f72
--- /dev/null
+++ b/docs/tasks/debug-application-cluster/termination.yaml
@@ -0,0 +1,10 @@
+apiVersion: v1
+kind: Pod
+metadata:
+ name: termination-demo
+spec:
+ containers:
+ - name: termination-demo-container
+ image: debian
+ command: ["/bin/sh"]
+ args: ["-c", "sleep 10 && echo Sleep expired > /dev/termination-log"]
diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md
index 14530ca25e..60aab6a8fb 100644
--- a/docs/tutorials/index.md
+++ b/docs/tutorials/index.md
@@ -15,6 +15,10 @@ The Tutorials section of the Kubernetes documentation is a work in progress.
* [Exposing an External IP Address to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address/)
+#### Stateful Applications
+
+* [Running a Single-Instance Stateful Application](/docs/tutorials/stateful-application/run-stateful-application/)
+
### What's next
If you would like to write a tutorial, see
diff --git a/docs/tutorials/stateful-application/gce-volume.yaml b/docs/tutorials/stateful-application/gce-volume.yaml
new file mode 100644
index 0000000000..ddb9ecc3ce
--- /dev/null
+++ b/docs/tutorials/stateful-application/gce-volume.yaml
@@ -0,0 +1,12 @@
+apiVersion: v1
+kind: PersistentVolume
+metadata:
+ name: mysql-pv
+spec:
+ capacity:
+ storage: 20Gi
+ accessModes:
+ - ReadWriteOnce
+ gcePersistentDisk:
+ pdName: mysql-disk
+ fsType: ext4
diff --git a/docs/tutorials/stateful-application/mysql-deployment.yaml b/docs/tutorials/stateful-application/mysql-deployment.yaml
new file mode 100644
index 0000000000..3b2aa22f6c
--- /dev/null
+++ b/docs/tutorials/stateful-application/mysql-deployment.yaml
@@ -0,0 +1,51 @@
+apiVersion: v1
+kind: Service
+metadata:
+ name: mysql
+spec:
+ ports:
+ - port: 3306
+ selector:
+ app: mysql
+ clusterIP: None
+---
+apiVersion: v1
+kind: PersistentVolumeClaim
+metadata:
+ name: mysql-pv-claim
+spec:
+ accessModes:
+ - ReadWriteOnce
+ resources:
+ requests:
+ storage: 20Gi
+---
+apiVersion: extensions/v1beta1
+kind: Deployment
+metadata:
+ name: mysql
+spec:
+ strategy:
+ type: Recreate
+ template:
+ metadata:
+ labels:
+ app: mysql
+ spec:
+ containers:
+ - image: mysql:5.6
+ name: mysql
+ env:
+ # Use secret in real usage
+ - name: MYSQL_ROOT_PASSWORD
+ value: password
+ ports:
+ - containerPort: 3306
+ name: mysql
+ volumeMounts:
+ - name: mysql-persistent-storage
+ mountPath: /var/lib/mysql
+ volumes:
+ - name: mysql-persistent-storage
+ persistentVolumeClaim:
+ claimName: mysql-pv-claim
diff --git a/docs/tutorials/stateful-application/run-stateful-application.md b/docs/tutorials/stateful-application/run-stateful-application.md
new file mode 100644
index 0000000000..443d9cdea5
--- /dev/null
+++ b/docs/tutorials/stateful-application/run-stateful-application.md
@@ -0,0 +1,220 @@
+---
+---
+
+{% capture overview %}
+
+This page shows you how to run a single-instance stateful application
+in Kubernetes using a PersistentVolume and a Deployment. The
+application is MySQL.
+
+{% endcapture %}
+
+
+{% capture objectives %}
+
+* Create a PersistentVolume referencing a disk in your environment.
+* Create a MySQL Deployment.
+* Expose MySQL to other pods in the cluster at a known DNS name.
+
+{% endcapture %}
+
+
+{% capture prerequisites %}
+
+* {% include task-tutorial-prereqs.md %}
+
+* For data persistence we will create a Persistent Volume that
+ references a disk in your
+ environment. See
+ [here](/docs/user-guide/persistent-volumes/#types-of-persistent-volumes) for
+ the types of environments supported. This Tutorial will demonstrate
+ `GCEPersistentDisk` but any type will work. `GCEPersistentDisk`
+ volumes only work on Google Compute Engine.
+
+{% endcapture %}
+
+
+{% capture lessoncontent %}
+
+### Set up a disk in your environment
+
+You can use any type of persistent volume for your stateful app. See
+[Types of Persistent Volumes](/docs/user-guide/persistent-volumes/#types-of-persistent-volumes)
+for a list of supported environment disks. For Google Compute Engine, run:
+
+```
+gcloud compute disks create --size=20GB mysql-disk
+```
+
+Next create a PersistentVolume that points to the `mysql-disk`
+disk just created. Here is a configuration file for a PersistentVolume
+that points to the Compute Engine disk above:
+
+{% include code.html language="yaml" file="gce-volume.yaml" ghlink="/docs/tutorials/stateful-application/gce-volume.yaml" %}
+
+Notice that the `pdName: mysql-disk` line matches the name of the disk
+in the Compute Engine environment. See the
+[Persistent Volumes](/docs/user-guide/persistent-volumes/)
+for details on writing a PersistentVolume configuration file for other
+environments.
+
+Create the persistent volume:
+
+```
+kubectl create -f http://k8s.io/docs/tutorials/stateful-application/gce-volume.yaml
+```
+
+
+### Deploy MySQL
+
+You can run a stateful application by creating a Kubernetes Deployment
+and connecting it to an existing PersistentVolume using a
+PersistentVolumeClaim. For example, this YAML file describes a
+Deployment that runs MySQL and references the PersistentVolumeClaim. The file
+defines a volume mount for /var/lib/mysql, and then creates a
+PersistentVolumeClaim that looks for a 20G volume. This claim is
+satisfied by any volume that meets the requirements, in this case, the
+volume created above.
+
+Note: The password is defined in the config yaml, and this is insecure. See
+[Kubernetes Secrets](/docs/user-guide/secrets/)
+for a secure solution.
+
+{% include code.html language="yaml" file="mysql-deployment.yaml" ghlink="/docs/tutorials/stateful-application/mysql-deployment.yaml" %}
+
+1. Deploy the contents of the YAML file:
+
+ kubectl create -f http://k8s.io/docs/tutorials/stateful-application/mysql-deployment.yaml
+
+1. Display information about the Deployment:
+
+ kubectl describe deployment mysql
+
+ Name: mysql
+ Namespace: default
+ CreationTimestamp: Tue, 01 Nov 2016 11:18:45 -0700
+ Labels: app=mysql
+ Selector: app=mysql
+ Replicas: 1 updated | 1 total | 0 available | 1 unavailable
+ StrategyType: Recreate
+ MinReadySeconds: 0
+ OldReplicaSets:
+ NewReplicaSet: mysql-63082529 (1/1 replicas created)
+ Events:
+ FirstSeen LastSeen Count From SubobjectPath Type Reason Message
+ --------- -------- ----- ---- ------------- -------- ------ -------
+ 33s 33s 1 {deployment-controller } Normal ScalingReplicaSet Scaled up replica set mysql-63082529 to 1
+
+1. List the pods created by the Deployment:
+
+ kubectl get pods -l app=mysql
+
+ NAME READY STATUS RESTARTS AGE
+ mysql-63082529-2z3ki 1/1 Running 0 3m
+
+1. Inspect the Persistent Volume:
+
+ kubectl describe pv mysql-pv
+
+ Name: mysql-pv
+ Labels:
+ Status: Bound
+ Claim: default/mysql-pv-claim
+ Reclaim Policy: Retain
+ Access Modes: RWO
+ Capacity: 20Gi
+ Message:
+ Source:
+ Type: GCEPersistentDisk (a Persistent Disk resource in Google Compute Engine)
+ PDName: mysql-disk
+ FSType: ext4
+ Partition: 0
+ ReadOnly: false
+ No events.
+
+1. Inspect the PersistentVolumeClaim:
+
+ kubectl describe pvc mysql-pv-claim
+
+ Name: mysql-pv-claim
+ Namespace: default
+ Status: Bound
+ Volume: mysql-pv
+ Labels:
+ Capacity: 20Gi
+ Access Modes: RWO
+ No events.
+
+### Accessing the MySQL instance
+
+The preceding YAML file creates a service that
+allows other Pods in the cluster to access the database. The Service option
+`clusterIP: None` lets the Service DNS name resolve directly to the
+Pod's IP address. This is optimal when you have only one Pod
+behind a Service and you don't intend to increase the number of Pods.
+
+Run a MySQL client to connect to the server:
+
+```
+kubectl run -it --rm --image=mysql:5.6 mysql-client -- mysql -h mysql -ppassword
+```
+
+This command creates a new Pod in the cluster running a mysql client
+and connects it to the server through the Service. If it connects, you
+know your stateful MySQL database is up and running.
+
+```
+Waiting for pod default/mysql-client-274442439-zyp6i to be running, status is Pending, pod ready: false
+If you don't see a command prompt, try pressing enter.
+
+mysql>
+```
+
+### Updating
+
+The image or any other part of the Deployment can be updated as usual
+with the `kubectl apply` command. Here are some precautions that are
+specific to stateful apps:
+
+* Don't scale the app. This setup is for single-instance apps
+ only. The underlying PersistentVolume can only be mounted to one
+ Pod. For clustered stateful apps, see the
+ [StatefulSet documentation](/docs/user-guide/petset/).
+* Use `strategy:` `type: Recreate` in the Deployment configuration
+ YAML file. This instructs Kubernetes to _not_ use rolling
+ updates. Rolling updates will not work, as you cannot have more than
+ one Pod running at a time. The `Recreate` strategy will stop the
+ first pod before creating a new one with the updated configuration.
+
+### Deleting a deployment
+
+Delete the deployed objects by name:
+
+```
+kubectl delete deployment,svc mysql
+kubectl delete pvc mysql-pv-claim
+kubectl delete pv mysql-pv
+```
+
+Also, if you are using Compute Engine disks:
+
+```
+gcloud compute disks delete mysql-disk
+```
+
+{% endcapture %}
+
+
+{% capture whatsnext %}
+
+* Learn more about [Deployment objects](/docs/user-guide/deployments/).
+
+* Learn more about [Deploying applications](/docs/user-guide/deploying-applications/)
+
+* [kubectl run documentation](/docs/user-guide/kubectl/kubectl_run/)
+
+* [Volumes](/docs/user-guide/volumes/) and [Persistent Volumes](/docs/user-guide/persistent-volumes/)
+
+{% endcapture %}
+
+{% include templates/tutorial.md %}
diff --git a/docs/user-guide/accessing-the-cluster.md b/docs/user-guide/accessing-the-cluster.md
index 6f78ab5293..63134b4909 100644
--- a/docs/user-guide/accessing-the-cluster.md
+++ b/docs/user-guide/accessing-the-cluster.md
@@ -129,7 +129,7 @@ To use it,
* Write an application atop of the client-go clients. Note that client-go defines its own API objects, so if needed, please import API definitions from client-go rather than from the main repository, e.g., `import "k8s.io/client-go/1.4/pkg/api/v1"` is correct.
The Go client can use the same [kubeconfig file](/docs/user-guide/kubeconfig-file)
-as the kubectl CLI does to locate and authenticate to the apiserver. See this [example](https://github.com/kubernetes/client-go/examples/out-of-cluster.go):
+as the kubectl CLI does to locate and authenticate to the apiserver. See this [example](https://github.com/kubernetes/client-go/blob/master/examples/out-of-cluster/main.go):
```golang
import (
@@ -183,7 +183,8 @@ From within a pod the recommended ways to connect to API are:
in any container of the pod can access it. See this [example of using kubectl proxy
in a pod](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/examples/kubectl-container/).
- use the Go client library, and create a client using the `client.NewInCluster()` factory.
- This handles locating and authenticating to the apiserver. [example](https://github.com/kubernetes/client-go/examples/in-cluster.go)
+ This handles locating and authenticating to the apiserver. See this [example of using Go client
+ library in a pod](https://github.com/kubernetes/client-go/blob/master/examples/in-cluster/main.go).
In each case, the credentials of the pod are used to communicate securely with the apiserver.
diff --git a/docs/user-guide/federation/federated-ingress.md b/docs/user-guide/federation/federated-ingress.md
index 87965a3fc7..6198de1817 100644
--- a/docs/user-guide/federation/federated-ingress.md
+++ b/docs/user-guide/federation/federated-ingress.md
@@ -64,12 +64,12 @@ healthy backend service endpoint at all times, even in the event of
pod, cluster,
availability zone or regional outages.
-Note that in the
- case of Google Cloud, the logical L7 load balancer is not a single physical device (which
- would present both a single point of failure, and a single global
- network routing choke point), but rather a [truly global, highly available
- load balancing managed service](https://cloud.google.com/load-balancing/),
- globally reachable via a single, static IP address.
+Note that in the case of Google Cloud, the logical L7 load balancer is
+not a single physical device (which would present both a single point
+of failure, and a single global network routing choke point), but
+rather a
+[truly global, highly available load balancing managed service](https://cloud.google.com/load-balancing/),
+globally reachable via a single, static IP address.
Clients inside your federated Kubernetes clusters (i.e. Pods) will be
automatically routed to the cluster-local shard of the Federated Service
@@ -86,13 +86,13 @@ You can create a federated ingress in any of the usual ways, for example using k
``` shell
kubectl --context=federation-cluster create -f myingress.yaml
```
-
+For example ingress YAML configurations, see the [Ingress User Guide](/docs/user-guide/ingress/)
The '--context=federation-cluster' flag tells kubectl to submit the
request to the Federation API endpoint, with the appropriate
credentials. If you have not yet configured such a context, visit the
[federation admin guide](/docs/admin/federation/) or one of the
[administration tutorials](https://github.com/kelseyhightower/kubernetes-cluster-federation)
-to find out how to do so. TODO: Update links
+to find out how to do so.
As described above, the Federated Ingress will automatically create
and maintain matching Kubernetes ingresses in all of the clusters
@@ -147,17 +147,28 @@ Events:
2m 2m 1 {loadbalancer-controller } Normal CREATE ip: 130.211.5.194
```
-Note the address of your Federated Ingress
+Note that:
+
+1. the address of your Federated Ingress
corresponds with the address of all of the
underlying Kubernetes ingresses (once these have been allocated - this
may take up to a few minutes).
-
-Note also that we have not yet provisioned any backend Pods to receive
+2. we have not yet provisioned any backend Pods to receive
the network traffic directed to this ingress (i.e. 'Service
Endpoints' behind the service backing the Ingress), so the Federated Ingress does not yet consider these to
be healthy shards and will not direct traffic to any of these clusters.
+3. the federation control system will
+automatically reconfigure the load balancer controllers in all of the
+clusters in your federation to make them consistent, and allow
+them to share global load balancers. But this reconfiguration can
+only complete successfully if there are no pre-existing Ingresses in
+those clusters (this is a safety feature to prevent accidental
+breakage of existing ingresses). So to ensure that your federated
+ingresses function correctly, either start with new, empty clusters, or make
+sure that you delete (and recreate if necessary) all pre-existing
+Ingresses in the clusters comprising your federation.
-## Adding backend services and pods
+#Adding backend services and pods
To render the underlying ingress shards healthy, we need to add
backend Pods behind the service upon which the Ingress is based. There are several ways to achieve this, but
@@ -175,6 +186,16 @@ kubectl --context=federation-cluster create -f services/nginx.yaml
kubectl --context=federation-cluster create -f myreplicaset.yaml
```
+Note that in order for your federated ingress to work correctly on
+Google Cloud, the node ports of all of the underlying cluster-local
+services need to be identical. If you're using a federated service
+this is easy to do. Simply pick a node port that is not already
+being used in any of your clusters, and add that to the spec of your
+federated service. If you do not specify a node port for your
+federated service, each cluster will choose it's own node port for
+its cluster-local shard of the service, and these will probably end
+up being different, which is not what you want.
+
You can verify this by checking in each of the underlying clusters, for example:
``` shell
@@ -258,6 +279,35 @@ Check that:
`service-controller` or `replicaset-controller`,
errors in the output of `kubectl logs federation-controller-manager --namespace federation`).
+#### I can create a federated ingress successfully, but request load is not correctly distributed across the underlying clusters
+
+Check that:
+
+1. the services underlying your federated ingress in each cluster have
+ identical node ports. See [above](#creating_a_federated_ingress) for further explanation.
+2. the load balancer controllers in each of your clusters are of the
+ correct type ("GLBC") and have been correctly reconfigured by the
+ federation control plane to share a global GCE load balancer (this
+ should happen automatically). If they of the correct type, and
+ have been correctly reconfigured, the UID data item in the GLBC
+ configmap in each cluster will be identical across all clusters.
+ See
+ [the GLBC docs](https://github.com/kubernetes/contrib/blob/master/ingress/controllers/gce/BETA_LIMITATIONS.md#changing-the-cluster-uid)
+ for further details.
+ If this is not the case, check the logs of your federation
+ controller manager to determine why this automated reconfiguration
+ might be failing.
+3. no ingresses have been manually created in any of your clusters before the above
+ reconfiguration of the load balancer controller completed
+ successfully. Ingresses created before the reconfiguration of
+ your GLBC will interfere with the behavior of your federated
+ ingresses created after the reconfiguration (see
+ [the GLBC docs](https://github.com/kubernetes/contrib/blob/master/ingress/controllers/gce/BETA_LIMITATIONS.md#changing-the-cluster-uid)
+ for further information. To remedy this,
+ delete any ingresses created before the cluster joined the
+ federation (and had it's GLBC reconfigured), and recreate them if
+ necessary.
+
#### This troubleshooting guide did not help me solve my problem
Please use one of our [support channels](http://kubernetes.io/docs/troubleshooting/) to seek assistance.
diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md
index 70bcb5be6d..4a4eb3ab54 100644
--- a/docs/user-guide/index.md
+++ b/docs/user-guide/index.md
@@ -4,22 +4,15 @@ assignees:
---
-* TOC
-{:toc}
+The Kubernetes **Guides** can help you work with various aspects of the Kubernetes system.
+* The Kubernetes [User Guide](#user-guide-internal) can help you run programs and services on an existing Kubernetes cluster.
+* The [Cluster Admin Guide](/docs/admin/) can help you set up and administrate your own Kubernetes cluster.
+* The [Developer Guide](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel) can help you either write code to directly access the Kubernetes API, or to contribute directly to the Kubernetes project.
-The user guide is intended for anyone who wants to run programs and services on an existing Kubernetes cluster. Setup and administration of a Kubernetes cluster is described in the [Cluster Admin Guide](/docs/admin/). The [Developer Guide](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel) is for anyone wanting to either write code which directly accesses the Kubernetes API, or to contribute directly to the Kubernetes project.
+## Kubernetes User Guide
-Please ensure you have completed the [prerequisites for running examples from the user guide](/docs/user-guide/prereqs/).
-
-## Quick walkthrough
-
-1. [Kubernetes 101](/docs/user-guide/walkthrough/)
-1. [Kubernetes 201](/docs/user-guide/walkthrough/k8s201/)
-
-## Thorough walkthrough
-
-If you don't have any familiarity with Kubernetes, we recommend you read the following sections in order:
+The following topics in the Kubernetes User Guide can help you run applications and services on a Kubernetes cluster:
1. [Quick start: launch and expose an application](/docs/user-guide/quick-start/)
1. [Configuring and launching containers: configuring common container parameters](/docs/user-guide/configuring-containers/)
@@ -35,7 +28,9 @@ If you don't have any familiarity with Kubernetes, we recommend you read the fol
1. [Connecting to containers via proxies](/docs/user-guide/connecting-to-applications-proxy/)
1. [Connecting to containers via port forwarding](/docs/user-guide/connecting-to-applications-port-forward/)
-## Concept guide
+Before running examples in the user guides, please ensure you have completed the [prerequisites](/docs/user-guide/prereqs/).
+
+## Kubernetes Concepts
[**Cluster**](/docs/admin/)
: A cluster is a set of physical or virtual machines and other infrastructure resources used by Kubernetes to run your applications.
diff --git a/docs/user-guide/nginx-init-containers.yaml b/docs/user-guide/nginx-init-containers.yaml
index 34c20fa66a..24124c7459 100644
--- a/docs/user-guide/nginx-init-containers.yaml
+++ b/docs/user-guide/nginx-init-containers.yaml
@@ -3,7 +3,7 @@ kind: Pod
metadata:
name: nginx
annotations:
- pod.alpha.kubernetes.io/init-containers: '[
+ pod.beta.kubernetes.io/init-containers: '[
{
"name": "install",
"image": "busybox",
diff --git a/docs/user-guide/node-selection/index.md b/docs/user-guide/node-selection/index.md
index 49d30b51c9..725848b544 100644
--- a/docs/user-guide/node-selection/index.md
+++ b/docs/user-guide/node-selection/index.md
@@ -173,7 +173,7 @@ on node N if node N has a label with key `failure-domain.beta.kubernetes.io/zone
such that there is at least one node in the cluster with key `failure-domain.beta.kubernetes.io/zone` and
value V that is running a pod that has a label with key "security" and value "S1".) The pod anti-affinity
rule says that the pod cannot schedule onto a node if that node is already running a pod with label
-having key "security" and value "S2". (If the `topologyKey` were `failure-domain.beta.kuberntes.io/zone` then
+having key "security" and value "S2". (If the `topologyKey` were `failure-domain.beta.kubernetes.io/zone` then
it would mean that the pod cannot schedule onto a node if that node is in the same zone as a pod with
label having key "security" and value "S2".) See the [design doc](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/design/podaffinity.md).
for many more examples of pod affinity and anti-affinity, both the `requiredDuringSchedulingIgnoredDuringExecution`
diff --git a/docs/user-guide/petset/bootstrapping/index.md b/docs/user-guide/petset/bootstrapping/index.md
index 03ba721edc..9dc4f7e899 100644
--- a/docs/user-guide/petset/bootstrapping/index.md
+++ b/docs/user-guide/petset/bootstrapping/index.md
@@ -88,7 +88,7 @@ vm-1 # printf "GET / HTTP/1.0\r\n\r\n" | netcat vm-0.ub 80
It's worth exploring what just happened. Init containers run sequentially *before* the application container. In this example we used the init container to copy shared libraries from the rootfs, while preserving user installed packages across container restart.
```yaml
-pod.alpha.kubernetes.io/init-containers: '[
+pod.beta.kubernetes.io/init-containers: '[
{
"name": "rootfs",
"image": "ubuntu:15.10",
diff --git a/docs/user-guide/petset/bootstrapping/petset_peers.yaml b/docs/user-guide/petset/bootstrapping/petset_peers.yaml
index f8393b5c2c..4f992ead71 100644
--- a/docs/user-guide/petset/bootstrapping/petset_peers.yaml
+++ b/docs/user-guide/petset/bootstrapping/petset_peers.yaml
@@ -29,7 +29,7 @@ spec:
app: nginx
annotations:
pod.alpha.kubernetes.io/initialized: "true"
- pod.alpha.kubernetes.io/init-containers: '[
+ pod.beta.kubernetes.io/init-containers: '[
{
"name": "peerfinder",
"image": "gcr.io/google_containers/peer-finder:0.1",
diff --git a/docs/user-guide/pod-states.md b/docs/user-guide/pod-states.md
index b29270e5f8..8f745e9f56 100644
--- a/docs/user-guide/pod-states.md
+++ b/docs/user-guide/pod-states.md
@@ -66,8 +66,8 @@ The possible values for RestartPolicy are `Always`, `OnFailure`, or `Never`. If
Three types of controllers are currently available:
- Use a [`Job`](/docs/user-guide/jobs/) for pods which are expected to terminate (e.g. batch computations).
-- Use a [`ReplicationController`](/docs/user-guide/replication-controller/) for pods which are not expected to
- terminate (e.g. web servers).
+- Use a [`ReplicationController`](/docs/user-guide/replication-controller/) or [`Deployment`](/docs/user-guide/deployments/)
+ for pods which are not expected to terminate (e.g. web servers).
- Use a [`DaemonSet`](/docs/admin/daemons/): Use for pods which need to run 1 per machine because they provide a
machine-specific system service.
If you are unsure whether to use ReplicationController or Daemon, then see [Daemon Set versus
diff --git a/docs/user-guide/pods/init-container.md b/docs/user-guide/pods/init-container.md
new file mode 100644
index 0000000000..75b6efcac3
--- /dev/null
+++ b/docs/user-guide/pods/init-container.md
@@ -0,0 +1,169 @@
+---
+assignees:
+- erictune
+
+---
+
+* TOC
+{:toc}
+
+In addition to having one or more main containers (or **app containers**), a
+pod can also have one or more **init containers** which run before the app
+containers. Init containers allow you to reduce and reorganize setup scripts
+and "glue code".
+
+## Overview
+
+An init container is exactly like a regular container, except that it always
+runs to completion and each init container must complete successfully before
+the next one is started. If the init container fails, Kubernetes will restart
+the pod until the init container succeeds. If a pod is marked as `RestartNever`,
+the pod will fail if the init container fails.
+
+You specify a container as an init container by adding an annotation
+The annotation key is `pod.beta.kubernetes.io/init-containers`. The annotation
+value is a JSON array of [objects of type `v1.Container`
+](http://kubernetes.io/docs/api-reference/v1/definitions/#_v1_container)
+
+Once the feature exits beta, the init containers will be specified on the Pod
+Spec alongside the app `containers` array.
+The status of the init containers is returned as another annotation -
+`pod.beta.kubernetes.io/init-container-statuses` -- as an array of the
+container statuses (similar to the `status.containerStatuses` field).
+
+Init containers support all of the same features as normal containers,
+including resource limits, volumes, and security settings. The resource
+requests and limits for an init container are [handled slightly differently](
+#resources). Init containers do not support readiness probes since they will
+run to completion before the pod can be ready.
+An init container has all of the fields of an app container.
+
+If you specify multiple init containers for a pod, those containers run one at
+a time in sequential order. Each must succeed before the next can run. Once all
+init containers have run to completion, Kubernetes initializes the pod and runs
+the application containers as usual.
+
+## What are Init Containers Good For?
+
+Because init containers have separate images from application containers, they
+have some advantages for start-up related code. These include:
+
+* they can contain utilities that are not desirable to include in the app container
+ image for security reasons,
+* they can contain utilities or custom code for setup that is not present in an app
+ image. (No need to make an image `FROM` another image just to use a tool like
+ `sed`, `awk`, `python`, `dig`, etc during setup).
+* the application image builder and the deployer roles can work independently without
+ the need to jointly build a single app image.
+
+Because init containers have different filesystem view (Linux namespaces) from
+app containers, they can be given access to Secrets that the app containers are
+not able to access.
+
+Since init containers run to completion before any app containers start, and
+since app containers run in parallel, they provide an easier way to block or
+delay the startup of application containers until some precondition is met.
+
+Because init containers run in sequence and there can be multiple init containers,
+they can be composed easily.
+
+Here are some ideas for how to use init containers:
+- Wait for a service to be created with a shell command like:
+ `for i in {1..100}; do sleep 1; if dig myservice; then exit 0; fi; exit 1`
+- Register this pod with a remote server with a command like:
+ `curl -X POST http://$MANAGEMENT_SERVICE_HOST:$MANAGEMENT_SERVICE_PORT/register -d 'instance=$(POD_NAME)&ip=$(POD_IP)'`
+ using `POD_NAME` and `POD_IP` from the downward API.
+- Wait for some time before starting the app container with a command like `sleep 60`.
+- Clone a git repository into a volume
+- Place values like a POD_IP into a configuration file, and run a template tool (e.g. jinja)
+ to generate a configuration file to be consumed by the main app contianer.
+```
+
+Complete usage examples can be found in the [PetSets
+guide](docs/user-guide/petset/bootstrapping/index.md) and the [Production Pods
+guide](/docs/user-guide/production-pods.md#handling-initialization).
+
+
+## Detailed Behavior
+
+Each pod may have 0..N init containers defined along with the existing
+1..M app containers.
+
+On startup of the pod, after the network and volumes are initialized, the init
+containers are started in order. Each container must exit successfully before
+the next is invoked. If a container fails to start (due to the runtime) or
+exits with failure, it is retried according to the pod RestartPolicy, except
+when the pod restart policy is RestartPolicyAlways, in which case just the init
+containers use RestartPolicyOnFailure.
+
+A pod cannot be ready until all init containers have succeeded. The ports on an
+init container are not aggregated under a service. A pod that is being
+initialized is in the `Pending` phase but should has a condition `Initializing`
+set to `true`.
+
+If the pod is [restarted](#pod-restart-reasons) all init containers must
+execute again.
+
+Changes to the init container spec are limited to the container image field.
+Altering a init container image field is equivalent to restarting the pod.
+
+Because init containers can be restarted, retried, or reexecuted, init container
+code should be idempotent. In particular, code that writes to files on EmptyDirs
+should be prepared for the possibility that an output file already exists.
+
+An init container has all of the fields of an app container. The following
+fields are prohibited from being used on init containers by validation:
+
+* `readinessProbe` - init containers must exit for pod startup to continue,
+ are not included in rotation, and so cannot define readiness distinct from
+ completion.
+
+Init container authors may use `activeDeadlineSeconds` on the pod and
+`livenessProbe` on the container to prevent init containers from failing
+forever. The active deadline includes init containers.
+
+The name of each app and init container in a pod must be unique - it is a
+validation error for any container to share a name.
+
+### Resources
+
+Given the ordering and execution for init containers, the following rules
+for resource usage apply:
+
+* The highest of any particular resource request or limit defined on all init
+ containers is the **effective init request/limit**
+* The pod's **effective request/limit** for a resource is the higher of:
+ * sum of all app containers request/limit for a resource
+ * effective init request/limit for a resource
+* Scheduling is done based on effective requests/limits, which means
+ init containers can reserve resources for initialization that are not used
+ during the life of the pod.
+* QoS tier of the pod's **effective QoS tier** is the QoS tier for init containers
+ and app containers alike.
+
+Quota and limits are applied based on the effective pod request and
+limit.
+
+Pod level cGroups are based on the effective pod request and limit, the
+same as the scheduler.
+
+
+## Pod Restart Reasons
+
+A Pod may "restart", causing reexecution of init containers, for the following
+reasons:
+
+* An init container image is changed by a user updating the Pod Spec.
+ * App container image changes only restart the app container.
+* The pod infrastructure container is restarted
+ * This is uncommon and would have to be done by someone with root access to nodes.
+* All containers in a pod are terminated, requiring a restart (RestartPolicyAlways) AND the record of init container completion has been lost due to garbage collection.
+
+## Support and compatibilty
+
+A cluster with Kubelet and Apiserver version 1.4.0 or greater supports init
+containers with the beta annotations. Support varies for other combinations of
+Kubelet and Apiserver version; see the [release notes
+](https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md) for details.
+
+
diff --git a/docs/user-guide/production-pods.md b/docs/user-guide/production-pods.md
index 440ac4619a..1c3ac18142 100644
--- a/docs/user-guide/production-pods.md
+++ b/docs/user-guide/production-pods.md
@@ -204,6 +204,8 @@ The status of the init containers is returned as another annotation - `pod.beta.
Init containers support all of the same features as normal containers, including resource limits, volumes, and security settings. The resource requests and limits for an init container are handled slightly different than normal containers since init containers are run one at a time instead of all at once - any limits or quotas will be applied based on the largest init container resource quantity, rather than as the sum of quantities. Init containers do not support readiness probes since they will run to completion before the pod can be ready.
+[Complete Init Container Documentation](/docs/user-guide/pods/init-containers.md)
+
## Lifecycle hooks and termination notice
diff --git a/docs/user-guide/replicasets.md b/docs/user-guide/replicasets.md
index d06be55328..cd7f620b15 100644
--- a/docs/user-guide/replicasets.md
+++ b/docs/user-guide/replicasets.md
@@ -94,7 +94,7 @@ of the replicated pods.
kubectl create -f hpa-rs.yaml
```
-Alternatively, you can just use the `kubectl autoscale` command to acommplish the same
+Alternatively, you can just use the `kubectl autoscale` command to acomplish the same
(and it's easier!)
```shell
diff --git a/docs/user-guide/services/index.md b/docs/user-guide/services/index.md
index 94faabcd1c..e20d072d05 100644
--- a/docs/user-guide/services/index.md
+++ b/docs/user-guide/services/index.md
@@ -345,7 +345,7 @@ can do a DNS SRV query for `"_http._tcp.my-service.my-ns"` to discover the port
number for `"http"`.
The Kubernetes DNS server is the only way to access services of type
-`ExternalName`.
+`ExternalName`. More information is available in the [DNS Admin Guide](http://kubernetes.io/docs/admin/dns/).
## Headless services
diff --git a/docs/user-guide/working-with-resources.md b/docs/user-guide/working-with-resources.md
index 5b300ee6bd..d2aeeb621e 100644
--- a/docs/user-guide/working-with-resources.md
+++ b/docs/user-guide/working-with-resources.md
@@ -46,7 +46,7 @@ The system adds fields in several ways:
- Some fields are added synchronously with creation of the resource and some are set asynchronously.
- For example: `metadata.uid` is set synchronously. (Read more about [metadata](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/api-conventions.md#metadata)).
- - For example, `status.hostIP` is set only after the pod has been scheduled. This often happens fast, but you may notice pods which do not have this set yet. This is called Late Initialization. (Read mode about [status](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/api-conventions.md#spec-and-status) and [late initialization](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/api-conventions.md#late-initialization) ).
+ - For example, `status.hostIP` is set only after the pod has been scheduled. This often happens fast, but you may notice pods which do not have this set yet. This is called Late Initialization. (Read more about [status](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/api-conventions.md#spec-and-status) and [late initialization](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/api-conventions.md#late-initialization)).
- Some fields are set to default values. Some defaults vary by cluster and some are fixed for the API at a certain version. (Read more about [defaulting](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/api-conventions.md#defaulting)).
- For example, `spec.containers[0].imagePullPolicy` always defaults to `IfNotPresent` in api v1.
- For example, `spec.containers[0].resources.limits.cpu` may be defaulted to `100m` on some clusters, to some other value on others, and not defaulted at all on others.
diff --git a/editdocs.md b/editdocs.md
new file mode 100644
index 0000000000..0291912aca
--- /dev/null
+++ b/editdocs.md
@@ -0,0 +1,42 @@
+---
+layout: docwithnav
+---
+
+
+
+
+
+
+Continue your edit
+
+Click the below link to edit the page you were just on. When you are done, press "Commit Changes" at the bottom of the screen. This will create a copy of our site on your GitHub account called a "fork." You can make other changes in your fork after it is created, if you want. When you are ready to send us all your changes, go to the index page for your fork and click "New Pull Request" to let us know about it.
+
+
+
+
+
+
+Edit our site in the cloud
+
+Click the below button to visit the repo for our site. You can then click the "Fork" button in the upper-right area of the screen to create a copy of our site on your GitHub account called a "fork." Make any changes you want in your fork, and when you are ready to send those changes to us, go to the index page for your fork and click "New Pull Request" to let us know about it.
+
+
+
+
+
+
+
+{% include_relative README.md %}
diff --git a/images/square-logos/aporeto.png b/images/square-logos/aporeto.png
new file mode 100644
index 0000000000..94e16c7e2a
Binary files /dev/null and b/images/square-logos/aporeto.png differ
diff --git a/images/square-logos/cockroach_labs.png b/images/square-logos/cockroach_labs.png
new file mode 100644
index 0000000000..85750b1d7f
Binary files /dev/null and b/images/square-logos/cockroach_labs.png differ
diff --git a/images/square-logos/datadog.png b/images/square-logos/datadog.png
index 82d6d11aaf..aeab0f227f 100644
Binary files a/images/square-logos/datadog.png and b/images/square-logos/datadog.png differ
diff --git a/images/square-logos/endocode.png b/images/square-logos/endocode.png
new file mode 100644
index 0000000000..a90189d6f9
Binary files /dev/null and b/images/square-logos/endocode.png differ
diff --git a/images/square-logos/giant_swarm.png b/images/square-logos/giant_swarm.png
new file mode 100644
index 0000000000..6434f98735
Binary files /dev/null and b/images/square-logos/giant_swarm.png differ
diff --git a/images/square-logos/mirantis.png b/images/square-logos/mirantis.png
new file mode 100644
index 0000000000..9dc83103d9
Binary files /dev/null and b/images/square-logos/mirantis.png differ
diff --git a/images/square-logos/skippbox.png b/images/square-logos/skippbox.png
new file mode 100644
index 0000000000..2ec4fa46e0
Binary files /dev/null and b/images/square-logos/skippbox.png differ
diff --git a/images/square-logos/weave_works.png b/images/square-logos/weave_works.png
new file mode 100644
index 0000000000..8c05c4ba6d
Binary files /dev/null and b/images/square-logos/weave_works.png differ
diff --git a/test/examples_test.go b/test/examples_test.go
index 1853cdaf0a..7e5660c4f9 100644
--- a/test/examples_test.go
+++ b/test/examples_test.go
@@ -127,11 +127,11 @@ func validateObject(obj runtime.Object) (errors field.ErrorList) {
t.Namespace = api.NamespaceDefault
}
errors = expvalidation.ValidateDaemonSet(t)
- case *batch.ScheduledJob:
+ case *batch.CronJob:
if t.Namespace == "" {
t.Namespace = api.NamespaceDefault
}
- errors = batch_validation.ValidateScheduledJob(t)
+ errors = batch_validation.ValidateCronJob(t)
default:
errors = field.ErrorList{}
errors = append(errors, field.InternalError(field.NewPath(""), fmt.Errorf("no validation defined for %#v", obj)))
@@ -242,7 +242,7 @@ func TestExampleObjectSchemas(t *testing.T) {
"redis-resource-deployment": &extensions.Deployment{},
"redis-secret-deployment": &extensions.Deployment{},
"run-my-nginx": &extensions.Deployment{},
- "sj": &batch.ScheduledJob{},
+ "sj": &batch.CronJob{},
},
"../docs/admin": {
"daemon": &extensions.DaemonSet{},
@@ -272,7 +272,7 @@ func TestExampleObjectSchemas(t *testing.T) {
"../docs/user-guide/node-selection": {
"pod": &api.Pod{},
"pod-with-node-affinity": &api.Pod{},
- "pod-with-pod-affinity": &api.Pod{},
+ "pod-with-pod-affinity": &api.Pod{},
},
"../docs/admin/resourcequota": {
"best-effort": &api.ResourceQuota{},