From 838352ff6eac694dddfcad2aab5fe771bbda7428 Mon Sep 17 00:00:00 2001 From: adieu Date: Thu, 1 Sep 2016 22:25:57 +0800 Subject: [PATCH 001/120] Change files in dos format to unix format. Removing ^M. --- docs/admin/limitrange/index.md | 428 ++++++++-------- docs/admin/salt.md | 212 ++++---- .../centos/centos_manual_config.md | 364 ++++++------- .../coreos/bare_metal_calico.md | 418 +++++++-------- .../fedora/fedora_ansible_config.md | 482 +++++++++--------- .../fedora/fedora_manual_config.md | 438 ++++++++-------- .../fedora/flannel_multi_node_cluster.md | 382 +++++++------- ...connecting-to-applications-port-forward.md | 100 ++-- .../connecting-to-applications-proxy.md | 62 +-- docs/user-guide/getting-into-containers.md | 146 +++--- docs/user-guide/logging.md | 158 +++--- 11 files changed, 1595 insertions(+), 1595 deletions(-) diff --git a/docs/admin/limitrange/index.md b/docs/admin/limitrange/index.md index f38737981d..74c0957f23 100644 --- a/docs/admin/limitrange/index.md +++ b/docs/admin/limitrange/index.md @@ -1,214 +1,214 @@ ---- -assignees: -- derekwaynecarr -- janetkuo - ---- - -By default, pods run with unbounded CPU and memory limits. This means that any pod in the -system will be able to consume as much CPU and memory on the node that executes the pod. - -Users may want to impose restrictions on the amount of resource a single pod in the system may consume -for a variety of reasons. - -For example: - -1. Each node in the cluster has 2GB of memory. The cluster operator does not want to accept pods -that require more than 2GB of memory since no node in the cluster can support the requirement. To prevent a -pod from being permanently unscheduled to a node, the operator instead chooses to reject pods that exceed 2GB -of memory as part of admission control. -2. A cluster is shared by two communities in an organization that runs production and development workloads -respectively. Production workloads may consume up to 8GB of memory, but development workloads may consume up -to 512MB of memory. The cluster operator creates a separate namespace for each workload, and applies limits to -each namespace. -3. Users may create a pod which consumes resources just below the capacity of a machine. The left over space -may be too small to be useful, but big enough for the waste to be costly over the entire cluster. As a result, -the cluster operator may want to set limits that a pod must consume at least 20% of the memory and cpu of their -average node size in order to provide for more uniform scheduling and to limit waste. - -This example demonstrates how limits can be applied to a Kubernetes [namespace](/docs/admin/namespaces/walkthrough/) to control -min/max resource limits per pod. In addition, this example demonstrates how you can -apply default resource limits to pods in the absence of an end-user specified value. - -See [LimitRange design doc](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/design/admission_control_limit_range.md) for more information. For a detailed description of the Kubernetes resource model, see [Resources](/docs/user-guide/compute-resources/) - -## Step 0: Prerequisites - -This example requires a running Kubernetes cluster. See the [Getting Started guides](/docs/getting-started-guides/) for how to get started. - -Change to the `` directory if you're not already there. - -## Step 1: Create a namespace - -This example will work in a custom namespace to demonstrate the concepts involved. - -Let's create a new namespace called limit-example: - -```shell -$ kubectl create namespace limit-example -namespace "limit-example" created -``` - -Note that `kubectl` commands will print the type and name of the resource created or mutated, which can then be used in subsequent commands: - -```shell -$ kubectl get namespaces -NAME STATUS AGE -default Active 51s -limit-example Active 45s -``` - -## Step 2: Apply a limit to the namespace - -Let's create a simple limit in our namespace. - -```shell -$ kubectl create -f docs/admin/limitrange/limits.yaml --namespace=limit-example -limitrange "mylimits" created -``` - -Let's describe the limits that we have imposed in our namespace. - -```shell -$ kubectl describe limits mylimits --namespace=limit-example -Name: mylimits -Namespace: limit-example -Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio ----- -------- --- --- --------------- ------------- ----------------------- -Pod cpu 200m 2 - - - -Pod memory 6Mi 1Gi - - - -Container cpu 100m 2 200m 300m - -Container memory 3Mi 1Gi 100Mi 200Mi - -``` - -In this scenario, we have said the following: - -1. If a max constraint is specified for a resource (2 CPU and 1Gi memory in this case), then a limit -must be specified for that resource across all containers. Failure to specify a limit will result in -a validation error when attempting to create the pod. Note that a default value of limit is set by -*default* in file `limits.yaml` (300m CPU and 200Mi memory). -2. If a min constraint is specified for a resource (100m CPU and 3Mi memory in this case), then a -request must be specified for that resource across all containers. Failure to specify a request will -result in a validation error when attempting to create the pod. Note that a default value of request is -set by *defaultRequest* in file `limits.yaml` (200m CPU and 100Mi memory). -3. For any pod, the sum of all containers memory requests must be >= 6Mi and the sum of all containers -memory limits must be <= 1Gi; the sum of all containers CPU requests must be >= 200m and the sum of all -containers CPU limits must be <= 2. - -## Step 3: Enforcing limits at point of creation - -The limits enumerated in a namespace are only enforced when a pod is created or updated in -the cluster. If you change the limits to a different value range, it does not affect pods that -were previously created in a namespace. - -If a resource (cpu or memory) is being restricted by a limit, the user will get an error at time -of creation explaining why. - -Let's first spin up a [Deployment](/docs/user-guide/deployments) that creates a single container Pod to demonstrate -how default values are applied to each pod. - -```shell -$ kubectl run nginx --image=nginx --replicas=1 --namespace=limit-example -deployment "nginx" created -``` - -Note that `kubectl run` creates a Deployment named "nginx" on Kubernetes cluster >= v1.2. If you are running older versions, it creates replication controllers instead. -If you want to obtain the old behavior, use `--generator=run/v1` to create replication controllers. See [`kubectl run`](/docs/user-guide/kubectl/kubectl_run/) for more details. -The Deployment manages 1 replica of single container Pod. Let's take a look at the Pod it manages. First, find the name of the Pod: - -```shell -$ kubectl get pods --namespace=limit-example -NAME READY STATUS RESTARTS AGE -nginx-2040093540-s8vzu 1/1 Running 0 11s -``` - -Let's print this Pod with yaml output format (using `-o yaml` flag), and then `grep` the `resources` field. Note that your pod name will be different. - -``` shell -$ kubectl get pods nginx-2040093540-s8vzu --namespace=limit-example -o yaml | grep resources -C 8 - resourceVersion: "57" - selfLink: /api/v1/namespaces/limit-example/pods/nginx-2040093540-ivimu - uid: 67b20741-f53b-11e5-b066-64510658e388 -spec: - containers: - - image: nginx - imagePullPolicy: Always - name: nginx - resources: - limits: - cpu: 300m - memory: 200Mi - requests: - cpu: 200m - memory: 100Mi - terminationMessagePath: /dev/termination-log - volumeMounts: -``` - -Note that our nginx container has picked up the namespace default cpu and memory resource *limits* and *requests*. - -Let's create a pod that exceeds our allowed limits by having it have a container that requests 3 cpu cores. - -```shell -$ kubectl create -f docs/admin/limitrange/invalid-pod.yaml --namespace=limit-example -Error from server: error when creating "docs/admin/limitrange/invalid-pod.yaml": Pod "invalid-pod" is forbidden: [Maximum cpu usage per Pod is 2, but limit is 3., Maximum cpu usage per Container is 2, but limit is 3.] -``` - -Let's create a pod that falls within the allowed limit boundaries. - -```shell -$ kubectl create -f docs/admin/limitrange/valid-pod.yaml --namespace=limit-example -pod "valid-pod" created -``` - -Now look at the Pod's resources field: - -```shell -$ kubectl get pods valid-pod --namespace=limit-example -o yaml | grep -C 6 resources - uid: 3b1bfd7a-f53c-11e5-b066-64510658e388 -spec: - containers: - - image: gcr.io/google_containers/serve_hostname - imagePullPolicy: Always - name: kubernetes-serve-hostname - resources: - limits: - cpu: "1" - memory: 512Mi - requests: - cpu: "1" - memory: 512Mi -``` - -Note that this pod specifies explicit resource *limits* and *requests* so it did not pick up the namespace -default values. - -Note: The *limits* for CPU resource are enforced in the default Kubernetes setup on the physical node -that runs the container unless the administrator deploys the kubelet with the folllowing flag: - -```shell -$ kubelet --help -Usage of kubelet -.... - --cpu-cfs-quota[=true]: Enable CPU CFS quota enforcement for containers that specify CPU limits -$ kubelet --cpu-cfs-quota=false ... -``` - -## Step 4: Cleanup - -To remove the resources used by this example, you can just delete the limit-example namespace. - -```shell -$ kubectl delete namespace limit-example -namespace "limit-example" deleted -$ kubectl get namespaces -NAME STATUS AGE -default Active 12m -``` - -## Summary - -Cluster operators that want to restrict the amount of resources a single container or pod may consume -are able to define allowable ranges per Kubernetes namespace. In the absence of any explicit assignments, -the Kubernetes system is able to apply default resource *limits* and *requests* if desired in order to -constrain the amount of resource a pod consumes on a node. +--- +assignees: +- derekwaynecarr +- janetkuo + +--- + +By default, pods run with unbounded CPU and memory limits. This means that any pod in the +system will be able to consume as much CPU and memory on the node that executes the pod. + +Users may want to impose restrictions on the amount of resource a single pod in the system may consume +for a variety of reasons. + +For example: + +1. Each node in the cluster has 2GB of memory. The cluster operator does not want to accept pods +that require more than 2GB of memory since no node in the cluster can support the requirement. To prevent a +pod from being permanently unscheduled to a node, the operator instead chooses to reject pods that exceed 2GB +of memory as part of admission control. +2. A cluster is shared by two communities in an organization that runs production and development workloads +respectively. Production workloads may consume up to 8GB of memory, but development workloads may consume up +to 512MB of memory. The cluster operator creates a separate namespace for each workload, and applies limits to +each namespace. +3. Users may create a pod which consumes resources just below the capacity of a machine. The left over space +may be too small to be useful, but big enough for the waste to be costly over the entire cluster. As a result, +the cluster operator may want to set limits that a pod must consume at least 20% of the memory and cpu of their +average node size in order to provide for more uniform scheduling and to limit waste. + +This example demonstrates how limits can be applied to a Kubernetes [namespace](/docs/admin/namespaces/walkthrough/) to control +min/max resource limits per pod. In addition, this example demonstrates how you can +apply default resource limits to pods in the absence of an end-user specified value. + +See [LimitRange design doc](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/design/admission_control_limit_range.md) for more information. For a detailed description of the Kubernetes resource model, see [Resources](/docs/user-guide/compute-resources/) + +## Step 0: Prerequisites + +This example requires a running Kubernetes cluster. See the [Getting Started guides](/docs/getting-started-guides/) for how to get started. + +Change to the `` directory if you're not already there. + +## Step 1: Create a namespace + +This example will work in a custom namespace to demonstrate the concepts involved. + +Let's create a new namespace called limit-example: + +```shell +$ kubectl create namespace limit-example +namespace "limit-example" created +``` + +Note that `kubectl` commands will print the type and name of the resource created or mutated, which can then be used in subsequent commands: + +```shell +$ kubectl get namespaces +NAME STATUS AGE +default Active 51s +limit-example Active 45s +``` + +## Step 2: Apply a limit to the namespace + +Let's create a simple limit in our namespace. + +```shell +$ kubectl create -f docs/admin/limitrange/limits.yaml --namespace=limit-example +limitrange "mylimits" created +``` + +Let's describe the limits that we have imposed in our namespace. + +```shell +$ kubectl describe limits mylimits --namespace=limit-example +Name: mylimits +Namespace: limit-example +Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio +---- -------- --- --- --------------- ------------- ----------------------- +Pod cpu 200m 2 - - - +Pod memory 6Mi 1Gi - - - +Container cpu 100m 2 200m 300m - +Container memory 3Mi 1Gi 100Mi 200Mi - +``` + +In this scenario, we have said the following: + +1. If a max constraint is specified for a resource (2 CPU and 1Gi memory in this case), then a limit +must be specified for that resource across all containers. Failure to specify a limit will result in +a validation error when attempting to create the pod. Note that a default value of limit is set by +*default* in file `limits.yaml` (300m CPU and 200Mi memory). +2. If a min constraint is specified for a resource (100m CPU and 3Mi memory in this case), then a +request must be specified for that resource across all containers. Failure to specify a request will +result in a validation error when attempting to create the pod. Note that a default value of request is +set by *defaultRequest* in file `limits.yaml` (200m CPU and 100Mi memory). +3. For any pod, the sum of all containers memory requests must be >= 6Mi and the sum of all containers +memory limits must be <= 1Gi; the sum of all containers CPU requests must be >= 200m and the sum of all +containers CPU limits must be <= 2. + +## Step 3: Enforcing limits at point of creation + +The limits enumerated in a namespace are only enforced when a pod is created or updated in +the cluster. If you change the limits to a different value range, it does not affect pods that +were previously created in a namespace. + +If a resource (cpu or memory) is being restricted by a limit, the user will get an error at time +of creation explaining why. + +Let's first spin up a [Deployment](/docs/user-guide/deployments) that creates a single container Pod to demonstrate +how default values are applied to each pod. + +```shell +$ kubectl run nginx --image=nginx --replicas=1 --namespace=limit-example +deployment "nginx" created +``` + +Note that `kubectl run` creates a Deployment named "nginx" on Kubernetes cluster >= v1.2. If you are running older versions, it creates replication controllers instead. +If you want to obtain the old behavior, use `--generator=run/v1` to create replication controllers. See [`kubectl run`](/docs/user-guide/kubectl/kubectl_run/) for more details. +The Deployment manages 1 replica of single container Pod. Let's take a look at the Pod it manages. First, find the name of the Pod: + +```shell +$ kubectl get pods --namespace=limit-example +NAME READY STATUS RESTARTS AGE +nginx-2040093540-s8vzu 1/1 Running 0 11s +``` + +Let's print this Pod with yaml output format (using `-o yaml` flag), and then `grep` the `resources` field. Note that your pod name will be different. + +```shell +$ kubectl get pods nginx-2040093540-s8vzu --namespace=limit-example -o yaml | grep resources -C 8 + resourceVersion: "57" + selfLink: /api/v1/namespaces/limit-example/pods/nginx-2040093540-ivimu + uid: 67b20741-f53b-11e5-b066-64510658e388 +spec: + containers: + - image: nginx + imagePullPolicy: Always + name: nginx + resources: + limits: + cpu: 300m + memory: 200Mi + requests: + cpu: 200m + memory: 100Mi + terminationMessagePath: /dev/termination-log + volumeMounts: +``` + +Note that our nginx container has picked up the namespace default cpu and memory resource *limits* and *requests*. + +Let's create a pod that exceeds our allowed limits by having it have a container that requests 3 cpu cores. + +```shell +$ kubectl create -f docs/admin/limitrange/invalid-pod.yaml --namespace=limit-example +Error from server: error when creating "docs/admin/limitrange/invalid-pod.yaml": Pod "invalid-pod" is forbidden: [Maximum cpu usage per Pod is 2, but limit is 3., Maximum cpu usage per Container is 2, but limit is 3.] +``` + +Let's create a pod that falls within the allowed limit boundaries. + +```shell +$ kubectl create -f docs/admin/limitrange/valid-pod.yaml --namespace=limit-example +pod "valid-pod" created +``` + +Now look at the Pod's resources field: + +```shell +$ kubectl get pods valid-pod --namespace=limit-example -o yaml | grep -C 6 resources + uid: 3b1bfd7a-f53c-11e5-b066-64510658e388 +spec: + containers: + - image: gcr.io/google_containers/serve_hostname + imagePullPolicy: Always + name: kubernetes-serve-hostname + resources: + limits: + cpu: "1" + memory: 512Mi + requests: + cpu: "1" + memory: 512Mi +``` + +Note that this pod specifies explicit resource *limits* and *requests* so it did not pick up the namespace +default values. + +Note: The *limits* for CPU resource are enforced in the default Kubernetes setup on the physical node +that runs the container unless the administrator deploys the kubelet with the folllowing flag: + +```shell +$ kubelet --help +Usage of kubelet +.... + --cpu-cfs-quota[=true]: Enable CPU CFS quota enforcement for containers that specify CPU limits +$ kubelet --cpu-cfs-quota=false ... +``` + +## Step 4: Cleanup + +To remove the resources used by this example, you can just delete the limit-example namespace. + +```shell +$ kubectl delete namespace limit-example +namespace "limit-example" deleted +$ kubectl get namespaces +NAME STATUS AGE +default Active 12m +``` + +## Summary + +Cluster operators that want to restrict the amount of resources a single container or pod may consume +are able to define allowable ranges per Kubernetes namespace. In the absence of any explicit assignments, +the Kubernetes system is able to apply default resource *limits* and *requests* if desired in order to +constrain the amount of resource a pod consumes on a node. diff --git a/docs/admin/salt.md b/docs/admin/salt.md index 2cb634d7c6..5d82b54d39 100644 --- a/docs/admin/salt.md +++ b/docs/admin/salt.md @@ -1,106 +1,106 @@ ---- -assignees: -- davidopp -- lavalamp - ---- - -The Kubernetes cluster can be configured using Salt. - -The Salt scripts are shared across multiple hosting providers, so it's important to understand some background information prior to making a modification to ensure your changes do not break hosting Kubernetes across multiple environments. Depending on where you host your Kubernetes cluster, you may be using different operating systems and different networking configurations. As a result, it's important to understand some background information before making Salt changes in order to minimize introducing failures for other hosting providers. - -## Salt cluster setup - -The **salt-master** service runs on the kubernetes-master [(except on the default GCE setup)](#standalone-salt-configuration-on-gce). - -The **salt-minion** service runs on the kubernetes-master and each kubernetes-node in the cluster. - -Each salt-minion service is configured to interact with the **salt-master** service hosted on the kubernetes-master via the **master.conf** file [(except on GCE)](#standalone-salt-configuration-on-gce). - -```shell -[root@kubernetes-master] $ cat /etc/salt/minion.d/master.conf -master: kubernetes-master -``` - -The salt-master is contacted by each salt-minion and depending upon the machine information presented, the salt-master will provision the machine as either a kubernetes-master or kubernetes-node with all the required capabilities needed to run Kubernetes. - -If you are running the Vagrant based environment, the **salt-api** service is running on the kubernetes-master. It is configured to enable the vagrant user to introspect the salt cluster in order to find out about machines in the Vagrant environment via a REST API. - -## Standalone Salt Configuration on GCE - -On GCE, the master and nodes are all configured as [standalone minions](http://docs.saltstack.com/en/latest/topics/tutorials/standalone_minion.html). The configuration for each VM is derived from the VM's [instance metadata](https://cloud.google.com/compute/docs/metadata) and then stored in Salt grains (`/etc/salt/minion.d/grains.conf`) and pillars (`/srv/salt-overlay/pillar/cluster-params.sls`) that local Salt uses to enforce state. - -All remaining sections that refer to master/minion setups should be ignored for GCE. One fallout of the GCE setup is that the Salt mine doesn't exist - there is no sharing of configuration amongst nodes. - -## Salt security - -*(Not applicable on default GCE setup.)* - -Security is not enabled on the salt-master, and the salt-master is configured to auto-accept incoming requests from minions. It is not recommended to use this security configuration in production environments without deeper study. (In some environments this isn't as bad as it might sound if the salt master port isn't externally accessible and you trust everyone on your network.) - -```shell -[root@kubernetes-master] $ cat /etc/salt/master.d/auto-accept.conf -open_mode: True -auto_accept: True -``` - -## Salt minion configuration - -Each minion in the salt cluster has an associated configuration that instructs the salt-master how to provision the required resources on the machine. - -An example file is presented below using the Vagrant based environment. - -```shell -[root@kubernetes-master] $ cat /etc/salt/minion.d/grains.conf -grains: - etcd_servers: $MASTER_IP - cloud: vagrant - roles: - - kubernetes-master -``` - -Each hosting environment has a slightly different grains.conf file that is used to build conditional logic where required in the Salt files. - -The following enumerates the set of defined key/value pairs that are supported today. If you add new ones, please make sure to update this list. - -Key | Value -------------- | ------------- -`api_servers` | (Optional) The IP address / host name where a kubelet can get read-only access to kube-apiserver -`cbr-cidr` | (Optional) The minion IP address range used for the docker container bridge. -`cloud` | (Optional) Which IaaS platform is used to host Kubernetes, *gce*, *azure*, *aws*, *vagrant* -`etcd_servers` | (Optional) Comma-delimited list of IP addresses the kube-apiserver and kubelet use to reach etcd. Uses the IP of the first machine in the kubernetes_master role, or 127.0.0.1 on GCE. -`hostnamef` | (Optional) The full host name of the machine, i.e. uname -n -`node_ip` | (Optional) The IP address to use to address this node -`hostname_override` | (Optional) Mapped to the kubelet hostname-override -`network_mode` | (Optional) Networking model to use among nodes: *openvswitch* -`networkInterfaceName` | (Optional) Networking interface to use to bind addresses, default value *eth0* -`publicAddressOverride` | (Optional) The IP address the kube-apiserver should use to bind against for external read-only access -`roles` | (Required) 1. `kubernetes-master` means this machine is the master in the Kubernetes cluster. 2. `kubernetes-pool` means this machine is a kubernetes-node. Depending on the role, the Salt scripts will provision different resources on the machine. - -These keys may be leveraged by the Salt sls files to branch behavior. - -In addition, a cluster may be running a Debian based operating system or Red Hat based operating system (Centos, Fedora, RHEL, etc.). As a result, it's important to sometimes distinguish behavior based on operating system using if branches like the following. - -```liquid -{% raw %} -{% if grains['os_family'] == 'RedHat' %} -// something specific to a RedHat environment (Centos, Fedora, RHEL) where you may use yum, systemd, etc. -{% else %} -// something specific to Debian environment (apt-get, initd) -{% endif %} -{% endraw %} -``` - -## Best Practices - -1. When configuring default arguments for processes, it's best to avoid the use of EnvironmentFiles (Systemd in Red Hat environments) or init.d files (Debian distributions) to hold default values that should be common across operating system environments. This helps keep our Salt template files easy to understand for editors who may not be familiar with the particulars of each distribution. - -## Future enhancements (Networking) - -Per pod IP configuration is provider-specific, so when making networking changes, it's important to sandbox these as all providers may not use the same mechanisms (iptables, openvswitch, etc.) - -We should define a grains.conf key that captures more specifically what network configuration environment is being used to avoid future confusion across providers. - -## Further reading - -The [cluster/saltbase](http://releases.k8s.io/{{page.githubbranch}}/cluster/saltbase/) tree has more details on the current SaltStack configuration. \ No newline at end of file +--- +assignees: +- davidopp +- lavalamp + +--- + +The Kubernetes cluster can be configured using Salt. + +The Salt scripts are shared across multiple hosting providers, so it's important to understand some background information prior to making a modification to ensure your changes do not break hosting Kubernetes across multiple environments. Depending on where you host your Kubernetes cluster, you may be using different operating systems and different networking configurations. As a result, it's important to understand some background information before making Salt changes in order to minimize introducing failures for other hosting providers. + +## Salt cluster setup + +The **salt-master** service runs on the kubernetes-master [(except on the default GCE setup)](#standalone-salt-configuration-on-gce). + +The **salt-minion** service runs on the kubernetes-master and each kubernetes-node in the cluster. + +Each salt-minion service is configured to interact with the **salt-master** service hosted on the kubernetes-master via the **master.conf** file [(except on GCE)](#standalone-salt-configuration-on-gce). + +```shell +[root@kubernetes-master] $ cat /etc/salt/minion.d/master.conf +master: kubernetes-master +``` + +The salt-master is contacted by each salt-minion and depending upon the machine information presented, the salt-master will provision the machine as either a kubernetes-master or kubernetes-node with all the required capabilities needed to run Kubernetes. + +If you are running the Vagrant based environment, the **salt-api** service is running on the kubernetes-master. It is configured to enable the vagrant user to introspect the salt cluster in order to find out about machines in the Vagrant environment via a REST API. + +## Standalone Salt Configuration on GCE + +On GCE, the master and nodes are all configured as [standalone minions](http://docs.saltstack.com/en/latest/topics/tutorials/standalone_minion.html). The configuration for each VM is derived from the VM's [instance metadata](https://cloud.google.com/compute/docs/metadata) and then stored in Salt grains (`/etc/salt/minion.d/grains.conf`) and pillars (`/srv/salt-overlay/pillar/cluster-params.sls`) that local Salt uses to enforce state. + +All remaining sections that refer to master/minion setups should be ignored for GCE. One fallout of the GCE setup is that the Salt mine doesn't exist - there is no sharing of configuration amongst nodes. + +## Salt security + +*(Not applicable on default GCE setup.)* + +Security is not enabled on the salt-master, and the salt-master is configured to auto-accept incoming requests from minions. It is not recommended to use this security configuration in production environments without deeper study. (In some environments this isn't as bad as it might sound if the salt master port isn't externally accessible and you trust everyone on your network.) + +```shell +[root@kubernetes-master] $ cat /etc/salt/master.d/auto-accept.conf +open_mode: True +auto_accept: True +``` + +## Salt minion configuration + +Each minion in the salt cluster has an associated configuration that instructs the salt-master how to provision the required resources on the machine. + +An example file is presented below using the Vagrant based environment. + +```shell +[root@kubernetes-master] $ cat /etc/salt/minion.d/grains.conf +grains: + etcd_servers: $MASTER_IP + cloud: vagrant + roles: + - kubernetes-master +``` + +Each hosting environment has a slightly different grains.conf file that is used to build conditional logic where required in the Salt files. + +The following enumerates the set of defined key/value pairs that are supported today. If you add new ones, please make sure to update this list. + +Key | Value +-----------------------------------|---------------------------------------------------------------- +`api_servers` | (Optional) The IP address / host name where a kubelet can get read-only access to kube-apiserver +`cbr-cidr` | (Optional) The minion IP address range used for the docker container bridge. +`cloud` | (Optional) Which IaaS platform is used to host Kubernetes, *gce*, *azure*, *aws*, *vagrant* +`etcd_servers` | (Optional) Comma-delimited list of IP addresses the kube-apiserver and kubelet use to reach etcd. Uses the IP of the first machine in the kubernetes_master role, or 127.0.0.1 on GCE. +`hostnamef` | (Optional) The full host name of the machine, i.e. uname -n +`node_ip` | (Optional) The IP address to use to address this node +`hostname_override` | (Optional) Mapped to the kubelet hostname-override +`network_mode` | (Optional) Networking model to use among nodes: *openvswitch* +`networkInterfaceName` | (Optional) Networking interface to use to bind addresses, default value *eth0* +`publicAddressOverride` | (Optional) The IP address the kube-apiserver should use to bind against for external read-only access +`roles` | (Required) 1. `kubernetes-master` means this machine is the master in the Kubernetes cluster. 2. `kubernetes-pool` means this machine is a kubernetes-node. Depending on the role, the Salt scripts will provision different resources on the machine. + +These keys may be leveraged by the Salt sls files to branch behavior. + +In addition, a cluster may be running a Debian based operating system or Red Hat based operating system (Centos, Fedora, RHEL, etc.). As a result, it's important to sometimes distinguish behavior based on operating system using if branches like the following. + +```liquid +{% raw %} +{% if grains['os_family'] == 'RedHat' %} +// something specific to a RedHat environment (Centos, Fedora, RHEL) where you may use yum, systemd, etc. +{% else %} +// something specific to Debian environment (apt-get, initd) +{% endif %} +{% endraw %} +``` + +## Best Practices + +1. When configuring default arguments for processes, it's best to avoid the use of EnvironmentFiles (Systemd in Red Hat environments) or init.d files (Debian distributions) to hold default values that should be common across operating system environments. This helps keep our Salt template files easy to understand for editors who may not be familiar with the particulars of each distribution. + +## Future enhancements (Networking) + +Per pod IP configuration is provider-specific, so when making networking changes, it's important to sandbox these as all providers may not use the same mechanisms (iptables, openvswitch, etc.) + +We should define a grains.conf key that captures more specifically what network configuration environment is being used to avoid future confusion across providers. + +## Further reading + +The [cluster/saltbase](http://releases.k8s.io/{{page.githubbranch}}/cluster/saltbase/) tree has more details on the current SaltStack configuration. diff --git a/docs/getting-started-guides/centos/centos_manual_config.md b/docs/getting-started-guides/centos/centos_manual_config.md index d2d12e9e15..f794f485a4 100644 --- a/docs/getting-started-guides/centos/centos_manual_config.md +++ b/docs/getting-started-guides/centos/centos_manual_config.md @@ -1,182 +1,182 @@ ---- -assignees: -- lavalamp -- thockin - ---- - -* TOC -{:toc} - -## Prerequisites - -You need two machines with CentOS installed on them. - -## Starting a cluster - -This is a getting started guide for CentOS. It is a manual configuration so you understand all the underlying packages / services / ports, etc... - -This guide will only get ONE node working. Multiple nodes requires a functional [networking configuration](/docs/admin/networking) done outside of kubernetes. Although the additional Kubernetes configuration requirements should be obvious. - -The Kubernetes package provides a few services: kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy. These services are managed by systemd and the configuration resides in a central location: /etc/kubernetes. We will break the services up between the hosts. The first host, centos-master, will be the Kubernetes master. This host will run the kube-apiserver, kube-controller-manager, and kube-scheduler. In addition, the master will also run _etcd_. The remaining host, centos-minion will be the node and run kubelet, proxy, cadvisor and docker. - -**System Information:** - -Hosts: - -Please replace host IP with your environment. - -```conf -centos-master = 192.168.121.9 -centos-minion = 192.168.121.65 -``` - -**Prepare the hosts:** - -* Create a /etc/yum.repos.d/virt7-docker-common-release.repo on all hosts - centos-{master,minion} with following information. - -```conf -[virt7-docker-common-release] -name=virt7-docker-common-release -baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/ -gpgcheck=0 -``` - -* Install Kubernetes and etcd on all hosts - centos-{master,minion}. This will also pull in docker and cadvisor. - -```shell -yum -y install --enablerepo=virt7-docker-common-release kubernetes etcd -``` - -* Add master and node to /etc/hosts on all machines (not needed if hostnames already in DNS) - -```shell -echo "192.168.121.9 centos-master -192.168.121.65 centos-minion" >> /etc/hosts -``` - -* Edit /etc/kubernetes/config which will be the same on all hosts to contain: - -```shell -# Comma separated list of nodes in the etcd cluster -KUBE_ETCD_SERVERS="--etcd-servers=http://centos-master:2379" - -# logging to stderr means we get it in the systemd journal -KUBE_LOGTOSTDERR="--logtostderr=true" - -# journal message level, 0 is debug -KUBE_LOG_LEVEL="--v=0" - -# Should this cluster be allowed to run privileged docker containers -KUBE_ALLOW_PRIV="--allow-privileged=false" - -# How the replication controller and scheduler find the kube-apiserver -KUBE_MASTER="--master=http://centos-master:8080" -``` - -* Disable the firewall on both the master and node, as docker does not play well with other firewall rule managers - -```shell -systemctl disable iptables-services firewalld -systemctl stop iptables-services firewalld -``` - -**Configure the Kubernetes services on the master.** - -* Edit /etc/etcd/etcd.conf to appear as such: - -```shell -# [member] -ETCD_NAME=default -ETCD_DATA_DIR="/var/lib/etcd/default.etcd" -ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" - -#[cluster] -ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379" -``` - -* Edit /etc/kubernetes/apiserver to appear as such: - -```shell -# The address on the local server to listen to. -KUBE_API_ADDRESS="--address=0.0.0.0" - -# The port on the local server to listen on. -KUBE_API_PORT="--port=8080" - -# Port kubelets listen on -KUBELET_PORT="--kubelet-port=10250" - -# Address range to use for services -KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" - -# Add your own! -KUBE_API_ARGS="" -``` - -* Start the appropriate services on master: - -```shell -for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do - systemctl restart $SERVICES - systemctl enable $SERVICES - systemctl status $SERVICES -done -``` - -**Configure the Kubernetes services on the node.** - -***We need to configure the kubelet and start the kubelet and proxy*** - -* Edit /etc/kubernetes/kubelet to appear as such: - -```shell -# The address for the info server to serve on -KUBELET_ADDRESS="--address=0.0.0.0" - -# The port for the info server to serve on -KUBELET_PORT="--port=10250" - -# You may leave this blank to use the actual hostname -KUBELET_HOSTNAME="--hostname-override=centos-minion" - -# Location of the api-server -KUBELET_API_SERVER="--api-servers=http://centos-master:8080" - -# Add your own! -KUBELET_ARGS="" -``` - -* Start the appropriate services on node (centos-minion). - -```shell -for SERVICES in kube-proxy kubelet docker; do - systemctl restart $SERVICES - systemctl enable $SERVICES - systemctl status $SERVICES -done -``` - -*You should be finished!* - -* Check to make sure the cluster can see the node (on centos-master) - -```shell -$ kubectl get nodes -NAME LABELS STATUS -centos-minion Ready -``` - -**The cluster should be running! Launch a test pod.** - -You should have a functional cluster, check out [101](/docs/user-guide/walkthrough/)! - -## Support Level - - -IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level --------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- -Bare-metal | custom | CentOS | _none_ | [docs](/docs/getting-started-guides/centos/centos_manual_config) | | Community ([@coolsvap](https://github.com/coolsvap)) - -For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. - +--- +assignees: +- lavalamp +- thockin + +--- + +* TOC +{:toc} + +## Prerequisites + +You need two machines with CentOS installed on them. + +## Starting a cluster + +This is a getting started guide for CentOS. It is a manual configuration so you understand all the underlying packages / services / ports, etc... + +This guide will only get ONE node working. Multiple nodes requires a functional [networking configuration](/docs/admin/networking) done outside of kubernetes. Although the additional Kubernetes configuration requirements should be obvious. + +The Kubernetes package provides a few services: kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy. These services are managed by systemd and the configuration resides in a central location: /etc/kubernetes. We will break the services up between the hosts. The first host, centos-master, will be the Kubernetes master. This host will run the kube-apiserver, kube-controller-manager, and kube-scheduler. In addition, the master will also run _etcd_. The remaining host, centos-minion will be the node and run kubelet, proxy, cadvisor and docker. + +**System Information:** + +Hosts: + +Please replace host IP with your environment. + +```conf +centos-master = 192.168.121.9 +centos-minion = 192.168.121.65 +``` + +**Prepare the hosts:** + +* Create a /etc/yum.repos.d/virt7-docker-common-release.repo on all hosts - centos-{master,minion} with following information. + +```conf +[virt7-docker-common-release] +name=virt7-docker-common-release +baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/ +gpgcheck=0 +``` + +* Install Kubernetes and etcd on all hosts - centos-{master,minion}. This will also pull in docker and cadvisor. + +```shell +yum -y install --enablerepo=virt7-docker-common-release kubernetes etcd +``` + +* Add master and node to /etc/hosts on all machines (not needed if hostnames already in DNS) + +```shell +echo "192.168.121.9 centos-master +192.168.121.65 centos-minion" >> /etc/hosts +``` + +* Edit /etc/kubernetes/config which will be the same on all hosts to contain: + +```shell +# Comma separated list of nodes in the etcd cluster +KUBE_ETCD_SERVERS="--etcd-servers=http://centos-master:2379" + +# logging to stderr means we get it in the systemd journal +KUBE_LOGTOSTDERR="--logtostderr=true" + +# journal message level, 0 is debug +KUBE_LOG_LEVEL="--v=0" + +# Should this cluster be allowed to run privileged docker containers +KUBE_ALLOW_PRIV="--allow-privileged=false" + +# How the replication controller and scheduler find the kube-apiserver +KUBE_MASTER="--master=http://centos-master:8080" +``` + +* Disable the firewall on both the master and node, as docker does not play well with other firewall rule managers + +```shell +systemctl disable iptables-services firewalld +systemctl stop iptables-services firewalld +``` + +**Configure the Kubernetes services on the master.** + +* Edit /etc/etcd/etcd.conf to appear as such: + +```shell +# [member] +ETCD_NAME=default +ETCD_DATA_DIR="/var/lib/etcd/default.etcd" +ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" + +#[cluster] +ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379" +``` + +* Edit /etc/kubernetes/apiserver to appear as such: + +```shell +# The address on the local server to listen to. +KUBE_API_ADDRESS="--address=0.0.0.0" + +# The port on the local server to listen on. +KUBE_API_PORT="--port=8080" + +# Port kubelets listen on +KUBELET_PORT="--kubelet-port=10250" + +# Address range to use for services +KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" + +# Add your own! +KUBE_API_ARGS="" +``` + +* Start the appropriate services on master: + +```shell +for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do + systemctl restart $SERVICES + systemctl enable $SERVICES + systemctl status $SERVICES +done +``` + +**Configure the Kubernetes services on the node.** + +***We need to configure the kubelet and start the kubelet and proxy*** + +* Edit /etc/kubernetes/kubelet to appear as such: + +```shell +# The address for the info server to serve on +KUBELET_ADDRESS="--address=0.0.0.0" + +# The port for the info server to serve on +KUBELET_PORT="--port=10250" + +# You may leave this blank to use the actual hostname +KUBELET_HOSTNAME="--hostname-override=centos-minion" + +# Location of the api-server +KUBELET_API_SERVER="--api-servers=http://centos-master:8080" + +# Add your own! +KUBELET_ARGS="" +``` + +* Start the appropriate services on node (centos-minion). + +```shell +for SERVICES in kube-proxy kubelet docker; do + systemctl restart $SERVICES + systemctl enable $SERVICES + systemctl status $SERVICES +done +``` + +*You should be finished!* + +* Check to make sure the cluster can see the node (on centos-master) + +```shell +$ kubectl get nodes +NAME LABELS STATUS +centos-minion Ready +``` + +**The cluster should be running! Launch a test pod.** + +You should have a functional cluster, check out [101](/docs/user-guide/walkthrough/)! + +## Support Level + + +IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level +-------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- +Bare-metal | custom | CentOS | _none_ | [docs](/docs/getting-started-guides/centos/centos_manual_config) | | Community ([@coolsvap](https://github.com/coolsvap)) + +For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. + diff --git a/docs/getting-started-guides/coreos/bare_metal_calico.md b/docs/getting-started-guides/coreos/bare_metal_calico.md index 9cbdd89b17..7c3f7ccca0 100644 --- a/docs/getting-started-guides/coreos/bare_metal_calico.md +++ b/docs/getting-started-guides/coreos/bare_metal_calico.md @@ -1,209 +1,209 @@ ---- - ---- - -This document describes how to deploy Kubernetes with Calico networking on _bare metal_ CoreOS. For more information on Project Calico, visit [projectcalico.org](http://projectcalico.org) and the [calico-containers repository](https://github.com/projectcalico/calico-containers). - -To install Calico on an existing Kubernetes cluster, or for more information on deploying Calico with Kubernetes in a number of other environments take a look at our supported [deployment guides](https://github.com/projectcalico/calico-containers/tree/master/docs/cni/kubernetes). - -Specifically, this guide will have you do the following: - -- Deploy a Kubernetes master node on CoreOS using cloud-config. -- Deploy two Kubernetes compute nodes with Calico Networking using cloud-config. -- Configure `kubectl` to access your cluster. - -The resulting cluster will use SSL between Kubernetes components. It will run the SkyDNS service and kube-ui, and be fully conformant with the Kubernetes v1.1 conformance tests. - -## Prerequisites and Assumptions - -- At least three bare-metal machines (or VMs) to work with. This guide will configure them as follows: - - 1 Kubernetes Master - - 2 Kubernetes Nodes -- Your nodes should have IP connectivity to each other and the internet. -- This guide assumes a DHCP server on your network to assign server IPs. -- This guide uses `192.168.0.0/16` as the subnet from which pod IP addresses are assigned. If this overlaps with your host subnet, you will need to configure Calico to use a different [IP pool](https://github.com/projectcalico/calico-containers/blob/master/docs/calicoctl/pool.md#calicoctl-pool-commands). - -## Cloud-config - -This guide will use [cloud-config](https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/) to configure each of the nodes in our Kubernetes cluster. - -We'll use two cloud-config files: -- `master-config.yaml`: cloud-config for the Kubernetes master -- `node-config.yaml`: cloud-config for each Kubernetes node - -## Download CoreOS - -Download the stable CoreOS bootable ISO from the [CoreOS website](https://coreos.com/docs/running-coreos/platforms/iso/). - -## Configure the Kubernetes Master - -1. Once you've downloaded the ISO image, burn the ISO to a CD/DVD/USB key and boot from it (if using a virtual machine you can boot directly from the ISO). Once booted, you should be automatically logged in as the `core` user at the terminal. At this point CoreOS is running from the ISO and it hasn't been installed yet. - -2. *On another machine*, download the [master cloud-config template](https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/cloud-config/master-config-template.yaml) and save it as `master-config.yaml`. - -3. Replace the following variables in the `master-config.yaml` file. - - - ``: The public key you will use for SSH access to this server. See [generating ssh keys](https://help.github.com/articles/generating-ssh-keys/) - -4. Copy the edited `master-config.yaml` to your Kubernetes master machine (using a USB stick, for example). - -5. The CoreOS bootable ISO comes with a tool called `coreos-install` which will allow us to install CoreOS and configure the machine using a cloud-config file. The following command will download and install stable CoreOS using the `master-config.yaml` file we just created for configuration. Run this on the Kubernetes master. - - > **Warning:** this is a destructive operation that erases disk `sda` on your server. - - ```shell - sudo coreos-install -d /dev/sda -C stable -c master-config.yaml - ``` - -6. Once complete, restart the server and boot from `/dev/sda` (you may need to remove the ISO image). When it comes back up, you should have SSH access as the `core` user using the public key provided in the `master-config.yaml` file. - -### Configure TLS - -The master requires the CA certificate, `ca.pem`; its own certificate, `apiserver.pem` and its private key, `apiserver-key.pem`. This [CoreOS guide](https://coreos.com/kubernetes/docs/latest/openssl.html) explains how to generate these. - -1. Generate the necessary certificates for the master. This [guide for generating Kubernetes TLS Assets](https://coreos.com/kubernetes/docs/latest/openssl.html) explains how to use OpenSSL to generate the required assets. - -2. Send the three files to your master host (using `scp` for example). - -3. Move them to the `/etc/kubernetes/ssl` folder and ensure that only the root user can read the key: - - ```shell - # Move keys - sudo mkdir -p /etc/kubernetes/ssl/ - sudo mv -t /etc/kubernetes/ssl/ ca.pem apiserver.pem apiserver-key.pem - - # Set Permissions - sudo chmod 600 /etc/kubernetes/ssl/apiserver-key.pem - sudo chown root:root /etc/kubernetes/ssl/apiserver-key.pem - ``` - -4. Restart the kubelet to pick up the changes: - - ```shell - sudo systemctl restart kubelet - ``` - -## Configure the compute nodes - -The following steps will set up a single Kubernetes node for use as a compute host. Run these steps to deploy each Kubernetes node in your cluster. - -1. Boot up the node machine using the bootable ISO we downloaded earlier. You should be automatically logged in as the `core` user. - -2. Make a copy of the [node cloud-config template](https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/cloud-config/node-config-template.yaml) for this machine. - -3. Replace the following placeholders in the `node-config.yaml` file to match your deployment. - - - ``: Hostname for this node (e.g. kube-node1, kube-node2) - - ``: The public key you will use for SSH access to this server. - - ``: The IPv4 address of the Kubernetes master. - -4. Replace the following placeholders with the contents of their respective files. - - - ``: Complete contents of `ca.pem` - - ``: Complete contents of `ca-key.pem` - - > **Important:** in a production deployment, embedding the secret key in cloud-config is a bad idea! In production you should use an appropriate secret manager. - - > **Important:** Make sure you indent the entire file to match the indentation of the placeholder. For example: - > - > ```shell - > - path: /etc/kubernetes/ssl/ca.pem - > owner: core - > permissions: 0644 - > content: | - > - > ``` - > - > should look like this once the certificate is in place: - > - > ```shell - > - path: /etc/kubernetes/ssl/ca.pem - > owner: core - > permissions: 0644 - > content: | - > -----BEGIN CERTIFICATE----- - > MIIC9zCCAd+gAwIBAgIJAJMnVnhVhy5pMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV - > ...... - > QHwi1rNc8eBLNrd4BM/A1ZeDVh/Q9KxN+ZG/hHIXhmWKgN5wQx6/81FIFg== - > -----END CERTIFICATE----- - > ``` - -5. Move the modified `node-config.yaml` to your Kubernetes node machine and install and configure CoreOS on the node using the following command. - - > **Warning:** this is a destructive operation that erases disk `sda` on your server. - - ```shell - sudo coreos-install -d /dev/sda -C stable -c node-config.yaml - ``` - -6. Once complete, restart the server and boot into `/dev/sda`. When it comes back up, you should have SSH access as the `core` user using the public key provided in the `node-config.yaml` file. It will take some time for the node to be fully configured. - -## Configure Kubeconfig - -To administer your cluster from a separate host, you will need the client and admin certificates generated earlier (`ca.pem`, `admin.pem`, `admin-key.pem`). With certificates in place, run the following commands with the appropriate filepaths. - -```shell -kubectl config set-cluster calico-cluster --server=https:// --certificate-authority= -kubectl config set-credentials calico-admin --certificate-authority= --client-key= --client-certificate= -kubectl config set-context calico --cluster=calico-cluster --user=calico-admin -kubectl config use-context calico -``` - -Check your work with `kubectl get nodes`. - -## Install the DNS Addon - -Most Kubernetes deployments will require the DNS addon for service discovery. To install DNS, create the skydns service and replication controller provided. - -```shell -kubectl create -f https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/master/dns/skydns.yaml -``` - -## Install the Kubernetes UI Addon (Optional) - -The Kubernetes UI can be installed using `kubectl` to run the following manifest file. - -```shell -kubectl create -f https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/master/kube-ui/kube-ui.yaml -``` - -## Launch other Services With Calico-Kubernetes - -At this point, you have a fully functioning cluster running on Kubernetes with a master and two nodes networked with Calico. You can now follow any of the [standard documentation](https://github.com/kubernetes/kubernetes/tree/{{page.version}}.0/examples/) to set up other services on your cluster. - -## Connectivity to outside the cluster - -Because containers in this guide have private `192.168.0.0/16` IPs, you will need NAT to allow connectivity between containers and the internet. However, in a production data center deployment, NAT is not always necessary, since Calico can peer with the data center's border routers over BGP. - -### NAT on the nodes - -The simplest method for enabling connectivity from containers to the internet is to use outgoing NAT on your Kubernetes nodes. - -Calico can provide outgoing NAT for containers. To enable it, use the following `calicoctl` command: - -```shell -ETCD_AUTHORITY= calicoctl pool add --nat-outgoing -``` - -By default, `` will be `192.168.0.0/16`. You can find out which pools have been configured with the following command: - -```shell -ETCD_AUTHORITY= calicoctl pool show -``` - -### NAT at the border router - -In a data center environment, it is recommended to configure Calico to peer with the border routers over BGP. This means that the container IPs will be routable anywhere in the data center, and so NAT is not needed on the nodes (though it may be enabled at the data center edge to allow outbound-only internet connectivity). - -The Calico documentation contains more information on how to configure Calico to [peer with existing infrastructure](https://github.com/projectcalico/calico-containers/blob/master/docs/ExternalConnectivity.md). - -## Support Level - - -IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level --------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- -Bare-metal | CoreOS | CoreOS | Calico | [docs](/docs/getting-started-guides/coreos/bare_metal_calico) | | Community ([@caseydavenport](https://github.com/caseydavenport)) - - -For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. - +--- + +--- + +This document describes how to deploy Kubernetes with Calico networking on _bare metal_ CoreOS. For more information on Project Calico, visit [projectcalico.org](http://projectcalico.org) and the [calico-containers repository](https://github.com/projectcalico/calico-containers). + +To install Calico on an existing Kubernetes cluster, or for more information on deploying Calico with Kubernetes in a number of other environments take a look at our supported [deployment guides](https://github.com/projectcalico/calico-containers/tree/master/docs/cni/kubernetes). + +Specifically, this guide will have you do the following: + +- Deploy a Kubernetes master node on CoreOS using cloud-config. +- Deploy two Kubernetes compute nodes with Calico Networking using cloud-config. +- Configure `kubectl` to access your cluster. + +The resulting cluster will use SSL between Kubernetes components. It will run the SkyDNS service and kube-ui, and be fully conformant with the Kubernetes v1.1 conformance tests. + +## Prerequisites and Assumptions + +- At least three bare-metal machines (or VMs) to work with. This guide will configure them as follows: + - 1 Kubernetes Master + - 2 Kubernetes Nodes +- Your nodes should have IP connectivity to each other and the internet. +- This guide assumes a DHCP server on your network to assign server IPs. +- This guide uses `192.168.0.0/16` as the subnet from which pod IP addresses are assigned. If this overlaps with your host subnet, you will need to configure Calico to use a different [IP pool](https://github.com/projectcalico/calico-containers/blob/master/docs/calicoctl/pool.md#calicoctl-pool-commands). + +## Cloud-config + +This guide will use [cloud-config](https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/) to configure each of the nodes in our Kubernetes cluster. + +We'll use two cloud-config files: +- `master-config.yaml`: cloud-config for the Kubernetes master +- `node-config.yaml`: cloud-config for each Kubernetes node + +## Download CoreOS + +Download the stable CoreOS bootable ISO from the [CoreOS website](https://coreos.com/docs/running-coreos/platforms/iso/). + +## Configure the Kubernetes Master + +1. Once you've downloaded the ISO image, burn the ISO to a CD/DVD/USB key and boot from it (if using a virtual machine you can boot directly from the ISO). Once booted, you should be automatically logged in as the `core` user at the terminal. At this point CoreOS is running from the ISO and it hasn't been installed yet. + +2. *On another machine*, download the [master cloud-config template](https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/cloud-config/master-config-template.yaml) and save it as `master-config.yaml`. + +3. Replace the following variables in the `master-config.yaml` file. + + - ``: The public key you will use for SSH access to this server. See [generating ssh keys](https://help.github.com/articles/generating-ssh-keys/) + +4. Copy the edited `master-config.yaml` to your Kubernetes master machine (using a USB stick, for example). + +5. The CoreOS bootable ISO comes with a tool called `coreos-install` which will allow us to install CoreOS and configure the machine using a cloud-config file. The following command will download and install stable CoreOS using the `master-config.yaml` file we just created for configuration. Run this on the Kubernetes master. + + > **Warning:** this is a destructive operation that erases disk `sda` on your server. + + ```shell + sudo coreos-install -d /dev/sda -C stable -c master-config.yaml + ``` + +6. Once complete, restart the server and boot from `/dev/sda` (you may need to remove the ISO image). When it comes back up, you should have SSH access as the `core` user using the public key provided in the `master-config.yaml` file. + +### Configure TLS + +The master requires the CA certificate, `ca.pem`; its own certificate, `apiserver.pem` and its private key, `apiserver-key.pem`. This [CoreOS guide](https://coreos.com/kubernetes/docs/latest/openssl.html) explains how to generate these. + +1. Generate the necessary certificates for the master. This [guide for generating Kubernetes TLS Assets](https://coreos.com/kubernetes/docs/latest/openssl.html) explains how to use OpenSSL to generate the required assets. + +2. Send the three files to your master host (using `scp` for example). + +3. Move them to the `/etc/kubernetes/ssl` folder and ensure that only the root user can read the key: + + ```shell + # Move keys + sudo mkdir -p /etc/kubernetes/ssl/ + sudo mv -t /etc/kubernetes/ssl/ ca.pem apiserver.pem apiserver-key.pem + + # Set Permissions + sudo chmod 600 /etc/kubernetes/ssl/apiserver-key.pem + sudo chown root:root /etc/kubernetes/ssl/apiserver-key.pem + ``` + +4. Restart the kubelet to pick up the changes: + + ```shell + sudo systemctl restart kubelet + ``` + +## Configure the compute nodes + +The following steps will set up a single Kubernetes node for use as a compute host. Run these steps to deploy each Kubernetes node in your cluster. + +1. Boot up the node machine using the bootable ISO we downloaded earlier. You should be automatically logged in as the `core` user. + +2. Make a copy of the [node cloud-config template](https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/cloud-config/node-config-template.yaml) for this machine. + +3. Replace the following placeholders in the `node-config.yaml` file to match your deployment. + + - ``: Hostname for this node (e.g. kube-node1, kube-node2) + - ``: The public key you will use for SSH access to this server. + - ``: The IPv4 address of the Kubernetes master. + +4. Replace the following placeholders with the contents of their respective files. + + - ``: Complete contents of `ca.pem` + - ``: Complete contents of `ca-key.pem` + + > **Important:** in a production deployment, embedding the secret key in cloud-config is a bad idea! In production you should use an appropriate secret manager. + + > **Important:** Make sure you indent the entire file to match the indentation of the placeholder. For example: + > + > ```shell + > - path: /etc/kubernetes/ssl/ca.pem + > owner: core + > permissions: 0644 + > content: | + > + > ``` + > + > should look like this once the certificate is in place: + > + > ```shell + > - path: /etc/kubernetes/ssl/ca.pem + > owner: core + > permissions: 0644 + > content: | + > -----BEGIN CERTIFICATE----- + > MIIC9zCCAd+gAwIBAgIJAJMnVnhVhy5pMA0GCSqGSIb3DQEBCwUAMBIxEDAOBgNV + > ...... + > QHwi1rNc8eBLNrd4BM/A1ZeDVh/Q9KxN+ZG/hHIXhmWKgN5wQx6/81FIFg== + > -----END CERTIFICATE----- + > ``` + +5. Move the modified `node-config.yaml` to your Kubernetes node machine and install and configure CoreOS on the node using the following command. + + > **Warning:** this is a destructive operation that erases disk `sda` on your server. + + ```shell + sudo coreos-install -d /dev/sda -C stable -c node-config.yaml + ``` + +6. Once complete, restart the server and boot into `/dev/sda`. When it comes back up, you should have SSH access as the `core` user using the public key provided in the `node-config.yaml` file. It will take some time for the node to be fully configured. + +## Configure Kubeconfig + +To administer your cluster from a separate host, you will need the client and admin certificates generated earlier (`ca.pem`, `admin.pem`, `admin-key.pem`). With certificates in place, run the following commands with the appropriate filepaths. + +```shell +kubectl config set-cluster calico-cluster --server=https:// --certificate-authority= +kubectl config set-credentials calico-admin --certificate-authority= --client-key= --client-certificate= +kubectl config set-context calico --cluster=calico-cluster --user=calico-admin +kubectl config use-context calico +``` + +Check your work with `kubectl get nodes`. + +## Install the DNS Addon + +Most Kubernetes deployments will require the DNS addon for service discovery. To install DNS, create the skydns service and replication controller provided. + +```shell +kubectl create -f https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/master/dns/skydns.yaml +``` + +## Install the Kubernetes UI Addon (Optional) + +The Kubernetes UI can be installed using `kubectl` to run the following manifest file. + +```shell +kubectl create -f https://raw.githubusercontent.com/projectcalico/calico-cni/k8s-1.1-docs/samples/kubernetes/master/kube-ui/kube-ui.yaml +``` + +## Launch other Services With Calico-Kubernetes + +At this point, you have a fully functioning cluster running on Kubernetes with a master and two nodes networked with Calico. You can now follow any of the [standard documentation](https://github.com/kubernetes/kubernetes/tree/{{page.version}}.0/examples/) to set up other services on your cluster. + +## Connectivity to outside the cluster + +Because containers in this guide have private `192.168.0.0/16` IPs, you will need NAT to allow connectivity between containers and the internet. However, in a production data center deployment, NAT is not always necessary, since Calico can peer with the data center's border routers over BGP. + +### NAT on the nodes + +The simplest method for enabling connectivity from containers to the internet is to use outgoing NAT on your Kubernetes nodes. + +Calico can provide outgoing NAT for containers. To enable it, use the following `calicoctl` command: + +```shell +ETCD_AUTHORITY= calicoctl pool add --nat-outgoing +``` + +By default, `` will be `192.168.0.0/16`. You can find out which pools have been configured with the following command: + +```shell +ETCD_AUTHORITY= calicoctl pool show +``` + +### NAT at the border router + +In a data center environment, it is recommended to configure Calico to peer with the border routers over BGP. This means that the container IPs will be routable anywhere in the data center, and so NAT is not needed on the nodes (though it may be enabled at the data center edge to allow outbound-only internet connectivity). + +The Calico documentation contains more information on how to configure Calico to [peer with existing infrastructure](https://github.com/projectcalico/calico-containers/blob/master/docs/ExternalConnectivity.md). + +## Support Level + + +IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level +-------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- +Bare-metal | CoreOS | CoreOS | Calico | [docs](/docs/getting-started-guides/coreos/bare_metal_calico) | | Community ([@caseydavenport](https://github.com/caseydavenport)) + + +For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. + diff --git a/docs/getting-started-guides/fedora/fedora_ansible_config.md b/docs/getting-started-guides/fedora/fedora_ansible_config.md index aa439f07b0..b5fe3802e0 100644 --- a/docs/getting-started-guides/fedora/fedora_ansible_config.md +++ b/docs/getting-started-guides/fedora/fedora_ansible_config.md @@ -1,241 +1,241 @@ ---- -assignees: -- aveshagarwal -- erictune - ---- - -Configuring Kubernetes on Fedora via Ansible offers a simple way to quickly create a clustered environment with little effort. - -* TOC -{:toc} - -## Prerequisites - -1. Host able to run ansible and able to clone the following repo: [kubernetes](https://github.com/kubernetes/kubernetes.git) -2. A Fedora 21+ host to act as cluster master -3. As many Fedora 21+ hosts as you would like, that act as cluster nodes - -The hosts can be virtual or bare metal. Ansible will take care of the rest of the configuration for you - configuring networking, installing packages, handling the firewall, etc. This example will use one master and two nodes. - -## Architecture of the cluster - -A Kubernetes cluster requires etcd, a master, and n nodes, so we will create a cluster with three hosts, for example: - -```shell -master,etcd = kube-master.example.com - node1 = kube-node-01.example.com - node2 = kube-node-02.example.com -``` - -**Make sure your local machine has** - - - ansible (must be 1.9.0+) - - git - - python-netaddr - -If not - -```shell -yum install -y ansible git python-netaddr -``` - -**Now clone down the Kubernetes repository** - -```shell -git clone https://github.com/kubernetes/contrib.git -cd contrib/ansible -``` - -**Tell ansible about each machine and its role in your cluster** - -Get the IP addresses from the master and nodes. Add those to the `~/contrib/ansible/inventory` file on the host running Ansible. - -```shell -[masters] -kube-master.example.com - -[etcd] -kube-master.example.com - -[nodes] -kube-node-01.example.com -kube-node-02.example.com -``` - -## Setting up ansible access to your nodes - -If you already are running on a machine which has passwordless ssh access to the kube-master and kube-node-{01,02} nodes, and 'sudo' privileges, simply set the value of `ansible_ssh_user` in `~/contrib/ansible/group_vars/all.yml` to the username which you use to ssh to the nodes (i.e. `fedora`), and proceed to the next step... - -*Otherwise* setup ssh on the machines like so (you will need to know the root password to all machines in the cluster). - -edit: ~/contrib/ansible/group_vars/all.yml - -```yaml -ansible_ssh_user: root -``` - -**Configuring ssh access to the cluster** - -If you already have ssh access to every machine using ssh public keys you may skip to [setting up the cluster](#setting-up-the-cluster) - -Make sure your local machine (root) has an ssh key pair if not - -```shell -ssh-keygen -``` - -Copy the ssh public key to **all** nodes in the cluster - -```shell -for node in kube-master.example.com kube-node-01.example.com kube-node-02.example.com; do - ssh-copy-id ${node} -done -``` - -## Setting up the cluster - -Although the default value of variables in `~/contrib/ansible/group_vars/all.yml` should be good enough, if not, change them as needed. - -```conf -edit: ~/contrib/ansible/group_vars/all.yml -``` - -**Configure access to kubernetes packages** - -Modify `source_type` as below to access kubernetes packages through the package manager. - -```yaml -source_type: packageManager -``` - -**Configure the IP addresses used for services** - -Each Kubernetes service gets its own IP address. These are not real IPs. You need only select a range of IPs which are not in use elsewhere in your environment. - -```yaml -kube_service_addresses: 10.254.0.0/16 -``` - -**Managing flannel** - -Modify `flannel_subnet`, `flannel_prefix` and `flannel_host_prefix` only if defaults are not appropriate for your cluster. - - -**Managing add on services in your cluster** - -Set `cluster_logging` to false or true (default) to disable or enable logging with elasticsearch. - -```yaml -cluster_logging: true -``` - -Turn `cluster_monitoring` to true (default) or false to enable or disable cluster monitoring with heapster and influxdb. - -```yaml -cluster_monitoring: true -``` - -Turn `dns_setup` to true (recommended) or false to enable or disable whole DNS configuration. - -```yaml -dns_setup: true -``` - -**Tell ansible to get to work!** - -This will finally setup your whole Kubernetes cluster for you. - -```shell -cd ~/contrib/ansible/ - -./setup.sh -``` - -## Testing and using your new cluster - -That's all there is to it. It's really that easy. At this point you should have a functioning Kubernetes cluster. - -**Show kubernetes nodes** - -Run the following on the kube-master: - -```shell -kubectl get nodes -``` - -**Show services running on masters and nodes** - -```shell -systemctl | grep -i kube -``` - -**Show firewall rules on the masters and nodes** - -```shell -iptables -nvL - -``` - -**Create /tmp/apache.json on the master with the following contents and deploy pod** - -```json -{ - "kind": "Pod", - "apiVersion": "v1", - "metadata": { - "name": "fedoraapache", - "labels": { - "name": "fedoraapache" - } - }, - "spec": { - "containers": [ - { - "name": "fedoraapache", - "image": "fedora/apache", - "ports": [ - { - "hostPort": 80, - "containerPort": 80 - } - ] - } - ] - } -} -``` - -```shell -kubectl create -f /tmp/apache.json -``` - -**Check where the pod was created** - -```shell -kubectl get pods -``` - -**Check Docker status on nodes** - -```shell -docker ps -docker images -``` - -**After the pod is 'Running' Check web server access on the node** - -```shell -curl http://localhost -``` - -That's it ! - -## Support Level - - -IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level --------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- -Bare-metal | Ansible | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/fedora_ansible_config) | | Project - -For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. +--- +assignees: +- aveshagarwal +- erictune + +--- + +Configuring Kubernetes on Fedora via Ansible offers a simple way to quickly create a clustered environment with little effort. + +* TOC +{:toc} + +## Prerequisites + +1. Host able to run ansible and able to clone the following repo: [kubernetes](https://github.com/kubernetes/kubernetes.git) +2. A Fedora 21+ host to act as cluster master +3. As many Fedora 21+ hosts as you would like, that act as cluster nodes + +The hosts can be virtual or bare metal. Ansible will take care of the rest of the configuration for you - configuring networking, installing packages, handling the firewall, etc. This example will use one master and two nodes. + +## Architecture of the cluster + +A Kubernetes cluster requires etcd, a master, and n nodes, so we will create a cluster with three hosts, for example: + +```shell +master,etcd = kube-master.example.com + node1 = kube-node-01.example.com + node2 = kube-node-02.example.com +``` + +**Make sure your local machine has** + + - ansible (must be 1.9.0+) + - git + - python-netaddr + +If not + +```shell +yum install -y ansible git python-netaddr +``` + +**Now clone down the Kubernetes repository** + +```shell +git clone https://github.com/kubernetes/contrib.git +cd contrib/ansible +``` + +**Tell ansible about each machine and its role in your cluster** + +Get the IP addresses from the master and nodes. Add those to the `~/contrib/ansible/inventory` file on the host running Ansible. + +```shell +[masters] +kube-master.example.com + +[etcd] +kube-master.example.com + +[nodes] +kube-node-01.example.com +kube-node-02.example.com +``` + +## Setting up ansible access to your nodes + +If you already are running on a machine which has passwordless ssh access to the kube-master and kube-node-{01,02} nodes, and 'sudo' privileges, simply set the value of `ansible_ssh_user` in `~/contrib/ansible/group_vars/all.yml` to the username which you use to ssh to the nodes (i.e. `fedora`), and proceed to the next step... + +*Otherwise* setup ssh on the machines like so (you will need to know the root password to all machines in the cluster). + +edit: ~/contrib/ansible/group_vars/all.yml + +```yaml +ansible_ssh_user: root +``` + +**Configuring ssh access to the cluster** + +If you already have ssh access to every machine using ssh public keys you may skip to [setting up the cluster](#setting-up-the-cluster) + +Make sure your local machine (root) has an ssh key pair if not + +```shell +ssh-keygen +``` + +Copy the ssh public key to **all** nodes in the cluster + +```shell +for node in kube-master.example.com kube-node-01.example.com kube-node-02.example.com; do + ssh-copy-id ${node} +done +``` + +## Setting up the cluster + +Although the default value of variables in `~/contrib/ansible/group_vars/all.yml` should be good enough, if not, change them as needed. + +```conf +edit: ~/contrib/ansible/group_vars/all.yml +``` + +**Configure access to kubernetes packages** + +Modify `source_type` as below to access kubernetes packages through the package manager. + +```yaml +source_type: packageManager +``` + +**Configure the IP addresses used for services** + +Each Kubernetes service gets its own IP address. These are not real IPs. You need only select a range of IPs which are not in use elsewhere in your environment. + +```yaml +kube_service_addresses: 10.254.0.0/16 +``` + +**Managing flannel** + +Modify `flannel_subnet`, `flannel_prefix` and `flannel_host_prefix` only if defaults are not appropriate for your cluster. + + +**Managing add on services in your cluster** + +Set `cluster_logging` to false or true (default) to disable or enable logging with elasticsearch. + +```yaml +cluster_logging: true +``` + +Turn `cluster_monitoring` to true (default) or false to enable or disable cluster monitoring with heapster and influxdb. + +```yaml +cluster_monitoring: true +``` + +Turn `dns_setup` to true (recommended) or false to enable or disable whole DNS configuration. + +```yaml +dns_setup: true +``` + +**Tell ansible to get to work!** + +This will finally setup your whole Kubernetes cluster for you. + +```shell +cd ~/contrib/ansible/ + +./setup.sh +``` + +## Testing and using your new cluster + +That's all there is to it. It's really that easy. At this point you should have a functioning Kubernetes cluster. + +**Show kubernetes nodes** + +Run the following on the kube-master: + +```shell +kubectl get nodes +``` + +**Show services running on masters and nodes** + +```shell +systemctl | grep -i kube +``` + +**Show firewall rules on the masters and nodes** + +```shell +iptables -nvL + +``` + +**Create /tmp/apache.json on the master with the following contents and deploy pod** + +```json +{ + "kind": "Pod", + "apiVersion": "v1", + "metadata": { + "name": "fedoraapache", + "labels": { + "name": "fedoraapache" + } + }, + "spec": { + "containers": [ + { + "name": "fedoraapache", + "image": "fedora/apache", + "ports": [ + { + "hostPort": 80, + "containerPort": 80 + } + ] + } + ] + } +} +``` + +```shell +kubectl create -f /tmp/apache.json +``` + +**Check where the pod was created** + +```shell +kubectl get pods +``` + +**Check Docker status on nodes** + +```shell +docker ps +docker images +``` + +**After the pod is 'Running' Check web server access on the node** + +```shell +curl http://localhost +``` + +That's it ! + +## Support Level + + +IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level +-------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- +Bare-metal | Ansible | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/fedora_ansible_config) | | Project + +For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. diff --git a/docs/getting-started-guides/fedora/fedora_manual_config.md b/docs/getting-started-guides/fedora/fedora_manual_config.md index 238498d18c..d1948530a8 100644 --- a/docs/getting-started-guides/fedora/fedora_manual_config.md +++ b/docs/getting-started-guides/fedora/fedora_manual_config.md @@ -1,219 +1,219 @@ ---- -assignees: -- aveshagarwal -- eparis -- thockin - ---- - -* TOC -{:toc} - -## Prerequisites - -1. You need 2 or more machines with Fedora installed. - -## Instructions - -This is a getting started guide for Fedora. It is a manual configuration so you understand all the underlying packages / services / ports, etc... - -This guide will only get ONE node (previously minion) working. Multiple nodes require a functional [networking configuration](/docs/admin/networking/) done outside of Kubernetes. Although the additional Kubernetes configuration requirements should be obvious. - -The Kubernetes package provides a few services: kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy. These services are managed by systemd and the configuration resides in a central location: /etc/kubernetes. We will break the services up between the hosts. The first host, fed-master, will be the Kubernetes master. This host will run the kube-apiserver, kube-controller-manager, and kube-scheduler. In addition, the master will also run _etcd_ (not needed if _etcd_ runs on a different host but this guide assumes that _etcd_ and Kubernetes master run on the same host). The remaining host, fed-node will be the node and run kubelet, proxy and docker. - -**System Information:** - -Hosts: - -```conf -fed-master = 192.168.121.9 -fed-node = 192.168.121.65 -``` - -**Prepare the hosts:** - -* Install Kubernetes on all hosts - fed-{master,node}. This will also pull in docker. Also install etcd on fed-master. This guide has been tested with kubernetes-0.18 and beyond. -* The [--enablerepo=updates-testing](https://fedoraproject.org/wiki/QA:Updates_Testing) directive in the yum command below will ensure that the most recent Kubernetes version that is scheduled for pre-release will be installed. This should be a more recent version than the Fedora "stable" release for Kubernetes that you would get without adding the directive. -* If you want the very latest Kubernetes release [you can download and yum install the RPM directly from Fedora Koji](http://koji.fedoraproject.org/koji/packageinfo?packageID=19202) instead of using the yum install command below. -* Running on AWS EC2 with RHEL 7.2, you need to enable "extras" repository for yum by editing `/etc/yum.repos.d/redhat-rhui.repo` and changing the changing the `enable=0` to `enable=1` for extras. - -```shell -yum -y install --enablerepo=updates-testing kubernetes -``` - -* Install etcd and iptables - -```shell -yum -y install etcd iptables -``` - -* Add master and node to /etc/hosts on all machines (not needed if hostnames already in DNS). Make sure that communication works between fed-master and fed-node by using a utility such as ping. - -```shell -echo "192.168.121.9 fed-master -192.168.121.65 fed-node" >> /etc/hosts -``` - -* Edit /etc/kubernetes/config which will be the same on all hosts (master and node) to contain: - -```shell -# Comma separated list of nodes in the etcd cluster -KUBE_MASTER="--master=http://fed-master:8080" - -# logging to stderr means we get it in the systemd journal -KUBE_LOGTOSTDERR="--logtostderr=true" - -# journal message level, 0 is debug -KUBE_LOG_LEVEL="--v=0" - -# Should this cluster be allowed to run privileged docker containers -KUBE_ALLOW_PRIV="--allow-privileged=false" -``` - -* Disable the firewall on both the master and node, as docker does not play well with other firewall rule managers. Please note that iptables-services does not exist on default fedora server install. - -```shell -systemctl disable iptables-services firewalld -systemctl stop iptables-services firewalld -``` - -**Configure the Kubernetes services on the master.** - -* Edit /etc/kubernetes/apiserver to appear as such. The service-cluster-ip-range IP addresses must be an unused block of addresses, not used anywhere else. They do not need to be routed or assigned to anything. - -```shell -# The address on the local server to listen to. -KUBE_API_ADDRESS="--address=0.0.0.0" - -# Comma separated list of nodes in the etcd cluster -KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:4001" - -# Address range to use for services -KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" - -# Add your own! -KUBE_API_ARGS="" -``` - -* Edit /etc/etcd/etcd.conf,let the etcd to listen all the ip instead of 127.0.0.1, if not, you will get the error like "connection refused". Note that Fedora 22 uses etcd 2.0, One of the changes in etcd 2.0 is that now uses port 2379 and 2380 (as opposed to etcd 0.46 which userd 4001 and 7001). - -```shell -ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:4001" -``` - -* Create /var/run/kubernetes on master: - -```shell -mkdir /var/run/kubernetes -chown kube:kube /var/run/kubernetes -chmod 750 /var/run/kubernetes -``` - -* Start the appropriate services on master: - -```shell -for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do - systemctl restart $SERVICES - systemctl enable $SERVICES - systemctl status $SERVICES -done -``` - -* Addition of nodes: - -* Create following node.json file on Kubernetes master node: - -```json -{ - "apiVersion": "v1", - "kind": "Node", - "metadata": { - "name": "fed-node", - "labels":{ "name": "fed-node-label"} - }, - "spec": { - "externalID": "fed-node" - } -} -``` - -Now create a node object internally in your Kubernetes cluster by running: - -```shell -$ kubectl create -f ./node.json - -$ kubectl get nodes -NAME LABELS STATUS -fed-node name=fed-node-label Unknown -``` - -Please note that in the above, it only creates a representation for the node -_fed-node_ internally. It does not provision the actual _fed-node_. Also, it -is assumed that _fed-node_ (as specified in `name`) can be resolved and is -reachable from Kubernetes master node. This guide will discuss how to provision -a Kubernetes node (fed-node) below. - -**Configure the Kubernetes services on the node.** - -***We need to configure the kubelet on the node.*** - -* Edit /etc/kubernetes/kubelet to appear as such: - -```shell -### -# Kubernetes kubelet (node) config - -# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) -KUBELET_ADDRESS="--address=0.0.0.0" - -# You may leave this blank to use the actual hostname -KUBELET_HOSTNAME="--hostname-override=fed-node" - -# location of the api-server -KUBELET_API_SERVER="--api-servers=http://fed-master:8080" - -# Add your own! -#KUBELET_ARGS="" -``` - -* Start the appropriate services on the node (fed-node). - -```shell -for SERVICES in kube-proxy kubelet docker; do - systemctl restart $SERVICES - systemctl enable $SERVICES - systemctl status $SERVICES -done -``` - -* Check to make sure now the cluster can see the fed-node on fed-master, and its status changes to _Ready_. - -```shell -kubectl get nodes -NAME LABELS STATUS -fed-node name=fed-node-label Ready -``` - -* Deletion of nodes: - -To delete _fed-node_ from your Kubernetes cluster, one should run the following on fed-master (Please do not do it, it is just for information): - -```shell -kubectl delete -f ./node.json -``` - -*You should be finished!* - -**The cluster should be running! Launch a test pod.** - -You should have a functional cluster, check out [101](/docs/user-guide/walkthrough/)! - -## Support Level - - -IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level --------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- -Bare-metal | custom | Fedora | _none_ | [docs](/docs/getting-started-guides/fedora/fedora_manual_config) | | Project - -For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. - +--- +assignees: +- aveshagarwal +- eparis +- thockin + +--- + +* TOC +{:toc} + +## Prerequisites + +1. You need 2 or more machines with Fedora installed. + +## Instructions + +This is a getting started guide for Fedora. It is a manual configuration so you understand all the underlying packages / services / ports, etc... + +This guide will only get ONE node (previously minion) working. Multiple nodes require a functional [networking configuration](/docs/admin/networking/) done outside of Kubernetes. Although the additional Kubernetes configuration requirements should be obvious. + +The Kubernetes package provides a few services: kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy. These services are managed by systemd and the configuration resides in a central location: /etc/kubernetes. We will break the services up between the hosts. The first host, fed-master, will be the Kubernetes master. This host will run the kube-apiserver, kube-controller-manager, and kube-scheduler. In addition, the master will also run _etcd_ (not needed if _etcd_ runs on a different host but this guide assumes that _etcd_ and Kubernetes master run on the same host). The remaining host, fed-node will be the node and run kubelet, proxy and docker. + +**System Information:** + +Hosts: + +```conf +fed-master = 192.168.121.9 +fed-node = 192.168.121.65 +``` + +**Prepare the hosts:** + +* Install Kubernetes on all hosts - fed-{master,node}. This will also pull in docker. Also install etcd on fed-master. This guide has been tested with kubernetes-0.18 and beyond. +* The [--enablerepo=updates-testing](https://fedoraproject.org/wiki/QA:Updates_Testing) directive in the yum command below will ensure that the most recent Kubernetes version that is scheduled for pre-release will be installed. This should be a more recent version than the Fedora "stable" release for Kubernetes that you would get without adding the directive. +* If you want the very latest Kubernetes release [you can download and yum install the RPM directly from Fedora Koji](http://koji.fedoraproject.org/koji/packageinfo?packageID=19202) instead of using the yum install command below. +* Running on AWS EC2 with RHEL 7.2, you need to enable "extras" repository for yum by editing `/etc/yum.repos.d/redhat-rhui.repo` and changing the changing the `enable=0` to `enable=1` for extras. + +```shell +yum -y install --enablerepo=updates-testing kubernetes +``` + +* Install etcd and iptables + +```shell +yum -y install etcd iptables +``` + +* Add master and node to /etc/hosts on all machines (not needed if hostnames already in DNS). Make sure that communication works between fed-master and fed-node by using a utility such as ping. + +```shell +echo "192.168.121.9 fed-master +192.168.121.65 fed-node" >> /etc/hosts +``` + +* Edit /etc/kubernetes/config which will be the same on all hosts (master and node) to contain: + +```shell +# Comma separated list of nodes in the etcd cluster +KUBE_MASTER="--master=http://fed-master:8080" + +# logging to stderr means we get it in the systemd journal +KUBE_LOGTOSTDERR="--logtostderr=true" + +# journal message level, 0 is debug +KUBE_LOG_LEVEL="--v=0" + +# Should this cluster be allowed to run privileged docker containers +KUBE_ALLOW_PRIV="--allow-privileged=false" +``` + +* Disable the firewall on both the master and node, as docker does not play well with other firewall rule managers. Please note that iptables-services does not exist on default fedora server install. + +```shell +systemctl disable iptables-services firewalld +systemctl stop iptables-services firewalld +``` + +**Configure the Kubernetes services on the master.** + +* Edit /etc/kubernetes/apiserver to appear as such. The service-cluster-ip-range IP addresses must be an unused block of addresses, not used anywhere else. They do not need to be routed or assigned to anything. + +```shell +# The address on the local server to listen to. +KUBE_API_ADDRESS="--address=0.0.0.0" + +# Comma separated list of nodes in the etcd cluster +KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:4001" + +# Address range to use for services +KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" + +# Add your own! +KUBE_API_ARGS="" +``` + +* Edit /etc/etcd/etcd.conf,let the etcd to listen all the ip instead of 127.0.0.1, if not, you will get the error like "connection refused". Note that Fedora 22 uses etcd 2.0, One of the changes in etcd 2.0 is that now uses port 2379 and 2380 (as opposed to etcd 0.46 which userd 4001 and 7001). + +```shell +ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:4001" +``` + +* Create /var/run/kubernetes on master: + +```shell +mkdir /var/run/kubernetes +chown kube:kube /var/run/kubernetes +chmod 750 /var/run/kubernetes +``` + +* Start the appropriate services on master: + +```shell +for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do + systemctl restart $SERVICES + systemctl enable $SERVICES + systemctl status $SERVICES +done +``` + +* Addition of nodes: + +* Create following node.json file on Kubernetes master node: + +```json +{ + "apiVersion": "v1", + "kind": "Node", + "metadata": { + "name": "fed-node", + "labels":{ "name": "fed-node-label"} + }, + "spec": { + "externalID": "fed-node" + } +} +``` + +Now create a node object internally in your Kubernetes cluster by running: + +```shell +$ kubectl create -f ./node.json + +$ kubectl get nodes +NAME LABELS STATUS +fed-node name=fed-node-label Unknown +``` + +Please note that in the above, it only creates a representation for the node +_fed-node_ internally. It does not provision the actual _fed-node_. Also, it +is assumed that _fed-node_ (as specified in `name`) can be resolved and is +reachable from Kubernetes master node. This guide will discuss how to provision +a Kubernetes node (fed-node) below. + +**Configure the Kubernetes services on the node.** + +***We need to configure the kubelet on the node.*** + +* Edit /etc/kubernetes/kubelet to appear as such: + +```shell +### +# Kubernetes kubelet (node) config + +# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces) +KUBELET_ADDRESS="--address=0.0.0.0" + +# You may leave this blank to use the actual hostname +KUBELET_HOSTNAME="--hostname-override=fed-node" + +# location of the api-server +KUBELET_API_SERVER="--api-servers=http://fed-master:8080" + +# Add your own! +#KUBELET_ARGS="" +``` + +* Start the appropriate services on the node (fed-node). + +```shell +for SERVICES in kube-proxy kubelet docker; do + systemctl restart $SERVICES + systemctl enable $SERVICES + systemctl status $SERVICES +done +``` + +* Check to make sure now the cluster can see the fed-node on fed-master, and its status changes to _Ready_. + +```shell +kubectl get nodes +NAME LABELS STATUS +fed-node name=fed-node-label Ready +``` + +* Deletion of nodes: + +To delete _fed-node_ from your Kubernetes cluster, one should run the following on fed-master (Please do not do it, it is just for information): + +```shell +kubectl delete -f ./node.json +``` + +*You should be finished!* + +**The cluster should be running! Launch a test pod.** + +You should have a functional cluster, check out [101](/docs/user-guide/walkthrough/)! + +## Support Level + + +IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level +-------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- +Bare-metal | custom | Fedora | _none_ | [docs](/docs/getting-started-guides/fedora/fedora_manual_config) | | Project + +For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. + diff --git a/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md b/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md index 7f4504f2c9..bcd10f57b9 100644 --- a/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md +++ b/docs/getting-started-guides/fedora/flannel_multi_node_cluster.md @@ -1,191 +1,191 @@ ---- -assignees: -- dchen1107 -- erictune -- thockin - ---- -* TOC -{:toc} - -This document describes how to deploy Kubernetes on multiple hosts to set up a multi-node cluster and networking with flannel. Follow fedora [getting started guide](/docs/getting-started-guides/fedora/fedora_manual_config/) to setup 1 master (fed-master) and 2 or more nodes. Make sure that all nodes have different names (fed-node1, fed-node2 and so on) and labels (fed-node1-label, fed-node2-label, and so on) to avoid any conflict. Also make sure that the Kubernetes master host is running etcd, kube-controller-manager, kube-scheduler, and kube-apiserver services, and the nodes are running docker, kube-proxy and kubelet services. Now install flannel on Kubernetes nodes. flannel on each node configures an overlay network that docker uses. flannel runs on each node to setup a unique class-C container network. - -## Prerequisites - -You need 2 or more machines with Fedora installed. - -## Master Setup - -**Perform following commands on the Kubernetes master** - -* Configure flannel by creating a `flannel-config.json` in your current directory on fed-master. Flannel provides udp and vxlan among other overlay networking backend options. In this guide, we choose kernel based vxlan backend. The contents of the json are: - -```json -{ - "Network": "18.16.0.0/16", - "SubnetLen": 24, - "Backend": { - "Type": "vxlan", - "VNI": 1 - } -} -``` - -**NOTE:** Choose an IP range that is *NOT* part of the public IP address range. - -Add the configuration to the etcd server on fed-master. - -```shell -etcdctl set /coreos.com/network/config < flannel-config.json -``` - -* Verify the key exists in the etcd server on fed-master. - -```shell -etcdctl get /coreos.com/network/config -``` - -## Node Setup - -**Perform following commands on all Kubernetes nodes** - -Edit the flannel configuration file /etc/sysconfig/flanneld as follows: - -```shell -# Flanneld configuration options - -# etcd url location. Point this to the server where etcd runs -FLANNEL_ETCD="http://fed-master:4001" - -# etcd config key. This is the configuration key that flannel queries -# For address range assignment -FLANNEL_ETCD_KEY="/coreos.com/network" - -# Any additional options that you want to pass -FLANNEL_OPTIONS="" -``` - -**Note:** By default, flannel uses the interface for the default route. If you have multiple interfaces and would like to use an interface other than the default route one, you could add "-iface=" to FLANNEL_OPTIONS. For additional options, run `flanneld --help` on command line. - -Enable the flannel service. - -```shell -systemctl enable flanneld -``` - -If docker is not running, then starting flannel service is enough and skip the next step. - -```shell -systemctl start flanneld -``` - -If docker is already running, then stop docker, delete docker bridge (docker0), start flanneld and restart docker as follows. Another alternative is to just reboot the system (`systemctl reboot`). - -```shell -systemctl stop docker -ip link delete docker0 -systemctl start flanneld -systemctl start docker -``` - - -## **Test the cluster and flannel configuration** - -Now check the interfaces on the nodes. Notice there is now a flannel.1 interface, and the ip addresses of docker0 and flannel.1 interfaces are in the same network. You will notice that docker0 is assigned a subnet (18.16.29.0/24 as shown below) on each Kubernetes node out of the IP range configured above. A working output should look like this: - -```shell -# ip -4 a|grep inet - inet 127.0.0.1/8 scope host lo - inet 192.168.122.77/24 brd 192.168.122.255 scope global dynamic eth0 - inet 18.16.29.0/16 scope global flannel.1 - inet 18.16.29.1/24 scope global docker0 -``` - -From any node in the cluster, check the cluster members by issuing a query to etcd server via curl (only partial output is shown using `grep -E "\{|\}|key|value"`). If you set up a 1 master and 3 nodes cluster, you should see one block for each node showing the subnets they have been assigned. You can associate those subnets to each node by the MAC address (VtepMAC) and IP address (Public IP) that is listed in the output. - -```shell -curl -s http://fed-master:4001/v2/keys/coreos.com/network/subnets | python -mjson.tool -``` - -```json -{ - "node": { - "key": "/coreos.com/network/subnets", - { - "key": "/coreos.com/network/subnets/18.16.29.0-24", - "value": "{\"PublicIP\":\"192.168.122.77\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"46:f1:d0:18:d0:65\"}}" - }, - { - "key": "/coreos.com/network/subnets/18.16.83.0-24", - "value": "{\"PublicIP\":\"192.168.122.36\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"ca:38:78:fc:72:29\"}}" - }, - { - "key": "/coreos.com/network/subnets/18.16.90.0-24", - "value": "{\"PublicIP\":\"192.168.122.127\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"92:e2:80:ba:2d:4d\"}}" - } - } -} -``` - -From all nodes, review the `/run/flannel/subnet.env` file. This file was generated automatically by flannel. - -```shell -# cat /run/flannel/subnet.env -FLANNEL_SUBNET=18.16.29.1/24 -FLANNEL_MTU=1450 -FLANNEL_IPMASQ=false -``` - -At this point, we have etcd running on the Kubernetes master, and flannel / docker running on Kubernetes nodes. Next steps are for testing cross-host container communication which will confirm that docker and flannel are configured properly. - -Issue the following commands on any 2 nodes: - -```shell -# docker run -it fedora:latest bash -bash-4.3# -``` - -This will place you inside the container. Install iproute and iputils packages to install ip and ping utilities. Due to a [bug](https://bugzilla.redhat.com/show_bug.cgi?id=1142311), it is required to modify capabilities of ping binary to work around "Operation not permitted" error. - -```shell -bash-4.3# yum -y install iproute iputils -bash-4.3# setcap cap_net_raw-ep /usr/bin/ping -``` - -Now note the IP address on the first node: - -```shell -bash-4.3# ip -4 a l eth0 | grep inet - inet 18.16.29.4/24 scope global eth0 -``` - -And also note the IP address on the other node: - -```shell -bash-4.3# ip a l eth0 | grep inet - inet 18.16.90.4/24 scope global eth0 -``` -Now ping from the first node to the other node: - -```shell -bash-4.3# ping 18.16.90.4 -PING 18.16.90.4 (18.16.90.4) 56(84) bytes of data. -64 bytes from 18.16.90.4: icmp_seq=1 ttl=62 time=0.275 ms -64 bytes from 18.16.90.4: icmp_seq=2 ttl=62 time=0.372 ms -``` - -Now Kubernetes multi-node cluster is set up with overlay networking set up by flannel. - -## Support Level - - -IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level --------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- -Bare-metal | custom | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/flannel_multi_node_cluster) | | Community ([@aveshagarwal](https://github.com/aveshagarwal)) -libvirt | custom | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/flannel_multi_node_cluster) | | Community ([@aveshagarwal](https://github.com/aveshagarwal)) -KVM | custom | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/flannel_multi_node_cluster) | | Community ([@aveshagarwal](https://github.com/aveshagarwal)) - - - -For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. - +--- +assignees: +- dchen1107 +- erictune +- thockin + +--- +* TOC +{:toc} + +This document describes how to deploy Kubernetes on multiple hosts to set up a multi-node cluster and networking with flannel. Follow fedora [getting started guide](/docs/getting-started-guides/fedora/fedora_manual_config/) to setup 1 master (fed-master) and 2 or more nodes. Make sure that all nodes have different names (fed-node1, fed-node2 and so on) and labels (fed-node1-label, fed-node2-label, and so on) to avoid any conflict. Also make sure that the Kubernetes master host is running etcd, kube-controller-manager, kube-scheduler, and kube-apiserver services, and the nodes are running docker, kube-proxy and kubelet services. Now install flannel on Kubernetes nodes. flannel on each node configures an overlay network that docker uses. flannel runs on each node to setup a unique class-C container network. + +## Prerequisites + +You need 2 or more machines with Fedora installed. + +## Master Setup + +**Perform following commands on the Kubernetes master** + +* Configure flannel by creating a `flannel-config.json` in your current directory on fed-master. Flannel provides udp and vxlan among other overlay networking backend options. In this guide, we choose kernel based vxlan backend. The contents of the json are: + +```json +{ + "Network": "18.16.0.0/16", + "SubnetLen": 24, + "Backend": { + "Type": "vxlan", + "VNI": 1 + } +} +``` + +**NOTE:** Choose an IP range that is *NOT* part of the public IP address range. + +Add the configuration to the etcd server on fed-master. + +```shell +etcdctl set /coreos.com/network/config < flannel-config.json +``` + +* Verify the key exists in the etcd server on fed-master. + +```shell +etcdctl get /coreos.com/network/config +``` + +## Node Setup + +**Perform following commands on all Kubernetes nodes** + +Edit the flannel configuration file /etc/sysconfig/flanneld as follows: + +```shell +# Flanneld configuration options + +# etcd url location. Point this to the server where etcd runs +FLANNEL_ETCD="http://fed-master:4001" + +# etcd config key. This is the configuration key that flannel queries +# For address range assignment +FLANNEL_ETCD_KEY="/coreos.com/network" + +# Any additional options that you want to pass +FLANNEL_OPTIONS="" +``` + +**Note:** By default, flannel uses the interface for the default route. If you have multiple interfaces and would like to use an interface other than the default route one, you could add "-iface=" to FLANNEL_OPTIONS. For additional options, run `flanneld --help` on command line. + +Enable the flannel service. + +```shell +systemctl enable flanneld +``` + +If docker is not running, then starting flannel service is enough and skip the next step. + +```shell +systemctl start flanneld +``` + +If docker is already running, then stop docker, delete docker bridge (docker0), start flanneld and restart docker as follows. Another alternative is to just reboot the system (`systemctl reboot`). + +```shell +systemctl stop docker +ip link delete docker0 +systemctl start flanneld +systemctl start docker +``` + + +## **Test the cluster and flannel configuration** + +Now check the interfaces on the nodes. Notice there is now a flannel.1 interface, and the ip addresses of docker0 and flannel.1 interfaces are in the same network. You will notice that docker0 is assigned a subnet (18.16.29.0/24 as shown below) on each Kubernetes node out of the IP range configured above. A working output should look like this: + +```shell +# ip -4 a|grep inet + inet 127.0.0.1/8 scope host lo + inet 192.168.122.77/24 brd 192.168.122.255 scope global dynamic eth0 + inet 18.16.29.0/16 scope global flannel.1 + inet 18.16.29.1/24 scope global docker0 +``` + +From any node in the cluster, check the cluster members by issuing a query to etcd server via curl (only partial output is shown using `grep -E "\{|\}|key|value"`). If you set up a 1 master and 3 nodes cluster, you should see one block for each node showing the subnets they have been assigned. You can associate those subnets to each node by the MAC address (VtepMAC) and IP address (Public IP) that is listed in the output. + +```shell +curl -s http://fed-master:4001/v2/keys/coreos.com/network/subnets | python -mjson.tool +``` + +```json +{ + "node": { + "key": "/coreos.com/network/subnets", + { + "key": "/coreos.com/network/subnets/18.16.29.0-24", + "value": "{\"PublicIP\":\"192.168.122.77\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"46:f1:d0:18:d0:65\"}}" + }, + { + "key": "/coreos.com/network/subnets/18.16.83.0-24", + "value": "{\"PublicIP\":\"192.168.122.36\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"ca:38:78:fc:72:29\"}}" + }, + { + "key": "/coreos.com/network/subnets/18.16.90.0-24", + "value": "{\"PublicIP\":\"192.168.122.127\",\"BackendType\":\"vxlan\",\"BackendData\":{\"VtepMAC\":\"92:e2:80:ba:2d:4d\"}}" + } + } +} +``` + +From all nodes, review the `/run/flannel/subnet.env` file. This file was generated automatically by flannel. + +```shell +# cat /run/flannel/subnet.env +FLANNEL_SUBNET=18.16.29.1/24 +FLANNEL_MTU=1450 +FLANNEL_IPMASQ=false +``` + +At this point, we have etcd running on the Kubernetes master, and flannel / docker running on Kubernetes nodes. Next steps are for testing cross-host container communication which will confirm that docker and flannel are configured properly. + +Issue the following commands on any 2 nodes: + +```shell +# docker run -it fedora:latest bash +bash-4.3# +``` + +This will place you inside the container. Install iproute and iputils packages to install ip and ping utilities. Due to a [bug](https://bugzilla.redhat.com/show_bug.cgi?id=1142311), it is required to modify capabilities of ping binary to work around "Operation not permitted" error. + +```shell +bash-4.3# yum -y install iproute iputils +bash-4.3# setcap cap_net_raw-ep /usr/bin/ping +``` + +Now note the IP address on the first node: + +```shell +bash-4.3# ip -4 a l eth0 | grep inet + inet 18.16.29.4/24 scope global eth0 +``` + +And also note the IP address on the other node: + +```shell +bash-4.3# ip a l eth0 | grep inet + inet 18.16.90.4/24 scope global eth0 +``` +Now ping from the first node to the other node: + +```shell +bash-4.3# ping 18.16.90.4 +PING 18.16.90.4 (18.16.90.4) 56(84) bytes of data. +64 bytes from 18.16.90.4: icmp_seq=1 ttl=62 time=0.275 ms +64 bytes from 18.16.90.4: icmp_seq=2 ttl=62 time=0.372 ms +``` + +Now Kubernetes multi-node cluster is set up with overlay networking set up by flannel. + +## Support Level + + +IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level +-------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- +Bare-metal | custom | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/flannel_multi_node_cluster) | | Community ([@aveshagarwal](https://github.com/aveshagarwal)) +libvirt | custom | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/flannel_multi_node_cluster) | | Community ([@aveshagarwal](https://github.com/aveshagarwal)) +KVM | custom | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/flannel_multi_node_cluster) | | Community ([@aveshagarwal](https://github.com/aveshagarwal)) + + + +For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. + diff --git a/docs/user-guide/connecting-to-applications-port-forward.md b/docs/user-guide/connecting-to-applications-port-forward.md index 742730229f..5876d2ab48 100644 --- a/docs/user-guide/connecting-to-applications-port-forward.md +++ b/docs/user-guide/connecting-to-applications-port-forward.md @@ -1,50 +1,50 @@ ---- -assignees: -- caesarxuchao -- mikedanese - ---- - -kubectl port-forward forwards connections to a local port to a port on a pod. Its man page is available [here](/docs/user-guide/kubectl/kubectl_port-forward). Compared to [kubectl proxy](/docs/user-guide/accessing-the-cluster/#using-kubectl-proxy), `kubectl port-forward` is more generic as it can forward TCP traffic while `kubectl proxy` can only forward HTTP traffic. This guide demonstrates how to use `kubectl port-forward` to connect to a Redis database, which may be useful for database debugging. - -## Creating a Redis master - -```shell -$ kubectl create -f examples/redis/redis-master.yaml -pods/redis-master -``` - -wait until the Redis master pod is Running and Ready, - -```shell -$ kubectl get pods -NAME READY STATUS RESTARTS AGE -redis-master 2/2 Running 0 41s -``` - -## Connecting to the Redis master[a] - -The Redis master is listening on port 6379, to verify this, - -```shell{% raw %} -$ kubectl get pods redis-master --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}' -6379{% endraw %} -``` - -then we forward the port 6379 on the local workstation to the port 6379 of pod redis-master, - -```shell -$ kubectl port-forward redis-master 6379:6379 -I0710 14:43:38.274550 3655 portforward.go:225] Forwarding from 127.0.0.1:6379 -> 6379 -I0710 14:43:38.274797 3655 portforward.go:225] Forwarding from [::1]:6379 -> 6379 -``` - -To verify the connection is successful, we run a redis-cli on the local workstation, - -```shell -$ redis-cli -127.0.0.1:6379> ping -PONG -``` - -Now one can debug the database from the local workstation. +--- +assignees: +- caesarxuchao +- mikedanese + +--- + +kubectl port-forward forwards connections to a local port to a port on a pod. Its man page is available [here](/docs/user-guide/kubectl/kubectl_port-forward). Compared to [kubectl proxy](/docs/user-guide/accessing-the-cluster/#using-kubectl-proxy), `kubectl port-forward` is more generic as it can forward TCP traffic while `kubectl proxy` can only forward HTTP traffic. This guide demonstrates how to use `kubectl port-forward` to connect to a Redis database, which may be useful for database debugging. + +## Creating a Redis master + +```shell +$ kubectl create -f examples/redis/redis-master.yaml +pods/redis-master +``` + +wait until the Redis master pod is Running and Ready, + +```shell +$ kubectl get pods +NAME READY STATUS RESTARTS AGE +redis-master 2/2 Running 0 41s +``` + +## Connecting to the Redis master[a] + +The Redis master is listening on port 6379, to verify this, + +```shell{% raw %} +$ kubectl get pods redis-master --template='{{(index (index .spec.containers 0).ports 0).containerPort}}{{"\n"}}' +6379{% endraw %} +``` + +then we forward the port 6379 on the local workstation to the port 6379 of pod redis-master, + +```shell +$ kubectl port-forward redis-master 6379:6379 +I0710 14:43:38.274550 3655 portforward.go:225] Forwarding from 127.0.0.1:6379 -> 6379 +I0710 14:43:38.274797 3655 portforward.go:225] Forwarding from [::1]:6379 -> 6379 +``` + +To verify the connection is successful, we run a redis-cli on the local workstation, + +```shell +$ redis-cli +127.0.0.1:6379> ping +PONG +``` + +Now one can debug the database from the local workstation. diff --git a/docs/user-guide/connecting-to-applications-proxy.md b/docs/user-guide/connecting-to-applications-proxy.md index 4e9867a339..5404d2e769 100644 --- a/docs/user-guide/connecting-to-applications-proxy.md +++ b/docs/user-guide/connecting-to-applications-proxy.md @@ -1,32 +1,32 @@ ---- -assignees: -- caesarxuchao -- lavalamp - ---- - -You have seen the [basics](/docs/user-guide/accessing-the-cluster) about `kubectl proxy` and `apiserver proxy`. This guide shows how to use them together to access a service([kube-ui](/docs/user-guide/ui)) running on the Kubernetes cluster from your workstation. - - -## Getting the apiserver proxy URL of kube-ui - -kube-ui is deployed as a cluster add-on. To find its apiserver proxy URL, - -```shell -$ kubectl cluster-info | grep "KubeUI" -KubeUI is running at https://173.255.119.104/api/v1/proxy/namespaces/kube-system/services/kube-ui -``` - -if this command does not find the URL, try the steps [here](/docs/user-guide/ui/#accessing-the-ui). - - -## Connecting to the kube-ui service from your local workstation - -The above proxy URL is an access to the kube-ui service provided by the apiserver. To access it, you still need to authenticate to the apiserver. `kubectl proxy` can handle the authentication. - -```shell -$ kubectl proxy --port=8001 -Starting to serve on localhost:8001 -``` - +--- +assignees: +- caesarxuchao +- lavalamp + +--- + +You have seen the [basics](/docs/user-guide/accessing-the-cluster) about `kubectl proxy` and `apiserver proxy`. This guide shows how to use them together to access a service([kube-ui](/docs/user-guide/ui)) running on the Kubernetes cluster from your workstation. + + +## Getting the apiserver proxy URL of kube-ui + +kube-ui is deployed as a cluster add-on. To find its apiserver proxy URL, + +```shell +$ kubectl cluster-info | grep "KubeUI" +KubeUI is running at https://173.255.119.104/api/v1/proxy/namespaces/kube-system/services/kube-ui +``` + +if this command does not find the URL, try the steps [here](/docs/user-guide/ui/#accessing-the-ui). + + +## Connecting to the kube-ui service from your local workstation + +The above proxy URL is an access to the kube-ui service provided by the apiserver. To access it, you still need to authenticate to the apiserver. `kubectl proxy` can handle the authentication. + +```shell +$ kubectl proxy --port=8001 +Starting to serve on localhost:8001 +``` + Now you can access the kube-ui service on your local workstation at [http://localhost:8001/api/v1/proxy/namespaces/kube-system/services/kube-ui](http://localhost:8001/api/v1/proxy/namespaces/kube-system/services/kube-ui) \ No newline at end of file diff --git a/docs/user-guide/getting-into-containers.md b/docs/user-guide/getting-into-containers.md index 25f0f5a3e4..f45da7b0eb 100644 --- a/docs/user-guide/getting-into-containers.md +++ b/docs/user-guide/getting-into-containers.md @@ -1,74 +1,74 @@ ---- -assignees: -- caesarxuchao -- mikedanese - ---- - -Developers can use `kubectl exec` to run commands in a container. This guide demonstrates two use cases. - -## Using kubectl exec to check the environment variables of a container - -Kubernetes exposes [services](/docs/user-guide/services/#environment-variables) through environment variables. It is convenient to check these environment variables using `kubectl exec`. - -We first create a pod and a service, - -```shell -$ kubectl create -f examples/guestbook/redis-master-controller.yaml -$ kubectl create -f examples/guestbook/redis-master-service.yaml -``` -wait until the pod is Running and Ready, - -```shell -$ kubectl get pod -NAME READY REASON RESTARTS AGE -redis-master-ft9ex 1/1 Running 0 12s -``` - -then we can check the environment variables of the pod, - -```shell -$ kubectl exec redis-master-ft9ex env -... -REDIS_MASTER_SERVICE_PORT=6379 -REDIS_MASTER_SERVICE_HOST=10.0.0.219 -... -``` - -We can use these environment variables in applications to find the service. - - -## Using kubectl exec to check the mounted volumes - -It is convenient to use `kubectl exec` to check if the volumes are mounted as expected. -We first create a Pod with a volume mounted at /data/redis, - -```shell -kubectl create -f docs/user-guide/walkthrough/pod-redis.yaml -``` - -wait until the pod is Running and Ready, - -```shell -$ kubectl get pods -NAME READY REASON RESTARTS AGE -storage 1/1 Running 0 1m -``` - -we then use `kubectl exec` to verify that the volume is mounted at /data/redis, - -```shell -$ kubectl exec storage ls /data -redis -``` - -## Using kubectl exec to open a bash terminal in a pod - -After all, open a terminal in a pod is the most direct way to introspect the pod. Assuming the pod/storage is still running, run - -```shell -$ kubectl exec -ti storage -- bash -root@storage:/data# -``` - +--- +assignees: +- caesarxuchao +- mikedanese + +--- + +Developers can use `kubectl exec` to run commands in a container. This guide demonstrates two use cases. + +## Using kubectl exec to check the environment variables of a container + +Kubernetes exposes [services](/docs/user-guide/services/#environment-variables) through environment variables. It is convenient to check these environment variables using `kubectl exec`. + +We first create a pod and a service, + +```shell +$ kubectl create -f examples/guestbook/redis-master-controller.yaml +$ kubectl create -f examples/guestbook/redis-master-service.yaml +``` +wait until the pod is Running and Ready, + +```shell +$ kubectl get pod +NAME READY REASON RESTARTS AGE +redis-master-ft9ex 1/1 Running 0 12s +``` + +then we can check the environment variables of the pod, + +```shell +$ kubectl exec redis-master-ft9ex env +... +REDIS_MASTER_SERVICE_PORT=6379 +REDIS_MASTER_SERVICE_HOST=10.0.0.219 +... +``` + +We can use these environment variables in applications to find the service. + + +## Using kubectl exec to check the mounted volumes + +It is convenient to use `kubectl exec` to check if the volumes are mounted as expected. +We first create a Pod with a volume mounted at /data/redis, + +```shell +kubectl create -f docs/user-guide/walkthrough/pod-redis.yaml +``` + +wait until the pod is Running and Ready, + +```shell +$ kubectl get pods +NAME READY REASON RESTARTS AGE +storage 1/1 Running 0 1m +``` + +we then use `kubectl exec` to verify that the volume is mounted at /data/redis, + +```shell +$ kubectl exec storage ls /data +redis +``` + +## Using kubectl exec to open a bash terminal in a pod + +After all, open a terminal in a pod is the most direct way to introspect the pod. Assuming the pod/storage is still running, run + +```shell +$ kubectl exec -ti storage -- bash +root@storage:/data# +``` + This gets you a terminal. \ No newline at end of file diff --git a/docs/user-guide/logging.md b/docs/user-guide/logging.md index 54f9e77e61..d329016c7b 100644 --- a/docs/user-guide/logging.md +++ b/docs/user-guide/logging.md @@ -1,80 +1,80 @@ ---- -assignees: -- mikedanese - ---- - -This page is designed to help you use logs to troubleshoot issues with your Kubernetes solution. - -## Logging by Kubernetes Components - -Kubernetes components, such as kubelet and apiserver, use the [glog](https://godoc.org/github.com/golang/glog) logging library. Developer conventions for logging severity are described in [docs/devel/logging.md](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/logging.md). - -## Examining the logs of running containers - -The logs of a running container may be fetched using the command `kubectl logs`. For example, given -this pod specification [counter-pod.yaml](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/examples/blog-logging/counter-pod.yaml), which has a container which writes out some text to standard -output every second. (You can find different pod specifications [here](https://github.com/kubernetes/kubernetes.github.io/tree/{{page.docsbranch}}/docs/user-guide/logging-demo/).) - -{% include code.html language="yaml" file="counter-pod.yaml" k8slink="/examples/blog-logging/counter-pod.yaml" %} - -we can run the pod: - -```shell -$ kubectl create -f ./counter-pod.yaml -pods/counter -``` - -and then fetch the logs: - -```shell -$ kubectl logs counter -0: Tue Jun 2 21:37:31 UTC 2015 -1: Tue Jun 2 21:37:32 UTC 2015 -2: Tue Jun 2 21:37:33 UTC 2015 -3: Tue Jun 2 21:37:34 UTC 2015 -4: Tue Jun 2 21:37:35 UTC 2015 -5: Tue Jun 2 21:37:36 UTC 2015 -... -``` - -If a pod has more than one container then you need to specify which container's log files should -be fetched e.g. - -```shell -$ kubectl logs kube-dns-v3-7r1l9 etcd -2015/06/23 00:43:10 etcdserver: start to snapshot (applied: 30003, lastsnap: 20002) -2015/06/23 00:43:10 etcdserver: compacted log at index 30003 -2015/06/23 00:43:10 etcdserver: saved snapshot at index 30003 -2015/06/23 02:05:42 etcdserver: start to snapshot (applied: 40004, lastsnap: 30003) -2015/06/23 02:05:42 etcdserver: compacted log at index 40004 -2015/06/23 02:05:42 etcdserver: saved snapshot at index 40004 -2015/06/23 03:28:31 etcdserver: start to snapshot (applied: 50005, lastsnap: 40004) -2015/06/23 03:28:31 etcdserver: compacted log at index 50005 -2015/06/23 03:28:31 etcdserver: saved snapshot at index 50005 -2015/06/23 03:28:56 filePurge: successfully removed file default.etcd/member/wal/0000000000000000-0000000000000000.wal -2015/06/23 04:51:03 etcdserver: start to snapshot (applied: 60006, lastsnap: 50005) -2015/06/23 04:51:03 etcdserver: compacted log at index 60006 -2015/06/23 04:51:03 etcdserver: saved snapshot at index 60006 -... -``` - -## Cluster level logging to Google Cloud Logging - -The getting started guide [Cluster Level Logging to Google Cloud Logging](/docs/getting-started-guides/logging) -explains how container logs are ingested into [Google Cloud Logging](https://cloud.google.com/logging/docs/) -and shows how to query the ingested logs. - -## Cluster level logging with Elasticsearch and Kibana - -The getting started guide [Cluster Level Logging with Elasticsearch and Kibana](/docs/getting-started-guides/logging-elasticsearch) -describes how to ingest cluster level logs into Elasticsearch and view them using Kibana. - -## Ingesting Application Log Files - -Cluster level logging only collects the standard output and standard error output of the applications -running in containers. The guide [Collecting log files from within containers with Fluentd and sending them to the Google Cloud Logging service](https://github.com/kubernetes/contrib/blob/master/logging/fluentd-sidecar-gcp/README.md) explains how the log files of applications can also be ingested into Google Cloud logging. - -## Known issues - +--- +assignees: +- mikedanese + +--- + +This page is designed to help you use logs to troubleshoot issues with your Kubernetes solution. + +## Logging by Kubernetes Components + +Kubernetes components, such as kubelet and apiserver, use the [glog](https://godoc.org/github.com/golang/glog) logging library. Developer conventions for logging severity are described in [docs/devel/logging.md](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/docs/devel/logging.md). + +## Examining the logs of running containers + +The logs of a running container may be fetched using the command `kubectl logs`. For example, given +this pod specification [counter-pod.yaml](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/examples/blog-logging/counter-pod.yaml), which has a container which writes out some text to standard +output every second. (You can find different pod specifications [here](https://github.com/kubernetes/kubernetes.github.io/tree/{{page.docsbranch}}/docs/user-guide/logging-demo/).) + +{% include code.html language="yaml" file="counter-pod.yaml" k8slink="/examples/blog-logging/counter-pod.yaml" %} + +we can run the pod: + +```shell +$ kubectl create -f ./counter-pod.yaml +pods/counter +``` + +and then fetch the logs: + +```shell +$ kubectl logs counter +0: Tue Jun 2 21:37:31 UTC 2015 +1: Tue Jun 2 21:37:32 UTC 2015 +2: Tue Jun 2 21:37:33 UTC 2015 +3: Tue Jun 2 21:37:34 UTC 2015 +4: Tue Jun 2 21:37:35 UTC 2015 +5: Tue Jun 2 21:37:36 UTC 2015 +... +``` + +If a pod has more than one container then you need to specify which container's log files should +be fetched e.g. + +```shell +$ kubectl logs kube-dns-v3-7r1l9 etcd +2015/06/23 00:43:10 etcdserver: start to snapshot (applied: 30003, lastsnap: 20002) +2015/06/23 00:43:10 etcdserver: compacted log at index 30003 +2015/06/23 00:43:10 etcdserver: saved snapshot at index 30003 +2015/06/23 02:05:42 etcdserver: start to snapshot (applied: 40004, lastsnap: 30003) +2015/06/23 02:05:42 etcdserver: compacted log at index 40004 +2015/06/23 02:05:42 etcdserver: saved snapshot at index 40004 +2015/06/23 03:28:31 etcdserver: start to snapshot (applied: 50005, lastsnap: 40004) +2015/06/23 03:28:31 etcdserver: compacted log at index 50005 +2015/06/23 03:28:31 etcdserver: saved snapshot at index 50005 +2015/06/23 03:28:56 filePurge: successfully removed file default.etcd/member/wal/0000000000000000-0000000000000000.wal +2015/06/23 04:51:03 etcdserver: start to snapshot (applied: 60006, lastsnap: 50005) +2015/06/23 04:51:03 etcdserver: compacted log at index 60006 +2015/06/23 04:51:03 etcdserver: saved snapshot at index 60006 +... +``` + +## Cluster level logging to Google Cloud Logging + +The getting started guide [Cluster Level Logging to Google Cloud Logging](/docs/getting-started-guides/logging) +explains how container logs are ingested into [Google Cloud Logging](https://cloud.google.com/logging/docs/) +and shows how to query the ingested logs. + +## Cluster level logging with Elasticsearch and Kibana + +The getting started guide [Cluster Level Logging with Elasticsearch and Kibana](/docs/getting-started-guides/logging-elasticsearch) +describes how to ingest cluster level logs into Elasticsearch and view them using Kibana. + +## Ingesting Application Log Files + +Cluster level logging only collects the standard output and standard error output of the applications +running in containers. The guide [Collecting log files from within containers with Fluentd and sending them to the Google Cloud Logging service](https://github.com/kubernetes/contrib/blob/master/logging/fluentd-sidecar-gcp/README.md) explains how the log files of applications can also be ingested into Google Cloud logging. + +## Known issues + Kubernetes does log rotation for Kubernetes components and docker containers. The command `kubectl logs` currently only read the latest logs, not all historical ones. \ No newline at end of file From c42b866ad2f043cf478bce677def1d32d6eb688b Mon Sep 17 00:00:00 2001 From: adieu Date: Thu, 1 Sep 2016 22:32:29 +0800 Subject: [PATCH 002/120] Minor style tweaks. --- docs/admin/out-of-resource.md | 6 +++--- docs/admin/resourcequota/index.md | 4 ++-- docs/getting-started-guides/docker-multinode.md | 2 +- docs/user-guide/connecting-applications.md | 2 +- docs/user-guide/monitoring.md | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/admin/out-of-resource.md b/docs/admin/out-of-resource.md index 480e074c42..8af7114ed6 100644 --- a/docs/admin/out-of-resource.md +++ b/docs/admin/out-of-resource.md @@ -29,7 +29,7 @@ table below. The value of each signal is described in the description column ba summary API. | Eviction Signal | Description | -|------------------|---------------------------------------------------------------------------------| +|----------------------------|-----------------------------------------------------------------------| | `memory.available` | `memory.available` := `node.status.capacity[memory]` - `node.stats.memory.workingSet` | | `nodefs.available` | `nodefs.available` := `node.stats.fs.available` | | `nodefs.inodesFree` | `nodefs.inodesFree` := `node.stats.fs.inodesFree` | @@ -128,7 +128,7 @@ reflects the node is under pressure. The following node conditions are defined that correspond to the specified eviction signal. | Node Condition | Eviction Signal | Description | -|----------------|------------------|------------------------------------------------------------------| +|-------------------------|-------------------------------|--------------------------------------------| | `MemoryPressure` | `memory.available` | Available memory on the node has satisfied an eviction threshold | | `DiskPressure` | `nodefs.available`, `nodefs.inodesFree`, `imagefs.available`, or `imagefs.inodesFree` | Available disk space and inodes on either the node's root filesytem or image filesystem has satisfied an eviction threshold | @@ -270,7 +270,7 @@ the node depends on the [oom_killer](https://lwn.net/Articles/391222/) to respon The `kubelet` sets a `oom_score_adj` value for each container based on the quality of service for the pod. | Quality of Service | oom_score_adj | -| ----------------- | ------------- | +|----------------------------|-----------------------------------------------------------------------| | `Guaranteed` | -998 | | `BestEffort` | 1000 | | `Burstable` | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) | diff --git a/docs/admin/resourcequota/index.md b/docs/admin/resourcequota/index.md index bda5120121..ff76942702 100644 --- a/docs/admin/resourcequota/index.md +++ b/docs/admin/resourcequota/index.md @@ -58,7 +58,7 @@ that can be requested in a given namespace. The following resource types are supported: | Resource Name | Description | -| ------------ | ----------- | +| --------------------- | ----------------------------------------------------------- | | `cpu` | Across all pods in a non-terminal state, the sum of CPU requests cannot exceed this value. | | `limits.cpu` | Across all pods in a non-terminal state, the sum of CPU limits cannot exceed this value. | | `limits.memory` | Across all pods in a non-terminal state, the sum of memory limits cannot exceed this value. | @@ -73,7 +73,7 @@ The number of objects of a given type can be restricted. The following types are supported: | Resource Name | Description | -| ------------ | ----------- | +| ------------------------------- | ------------------------------------------------- | | `configmaps` | The total number of config maps that can exist in the namespace. | | `persistentvolumeclaims` | The total number of [persistent volume claims](/docs/user-guide/persistent-volumes/#persistentvolumeclaims) that can exist in the namespace. | | `pods` | The total number of pods in a non-terminal state that can exist in the namespace. A pod is in a terminal state if `status.phase in (Failed, Succeeded)` is true. | diff --git a/docs/getting-started-guides/docker-multinode.md b/docs/getting-started-guides/docker-multinode.md index 14e475ee10..5ac0b3413a 100644 --- a/docs/getting-started-guides/docker-multinode.md +++ b/docs/getting-started-guides/docker-multinode.md @@ -16,7 +16,7 @@ and a _worker_ node which receives work from the master. You can repeat the proc times to create larger clusters. Here's a diagram of what the final result will look like: -![Kubernetes on Docker](https://github.com/kubernetes/kubernetes/blob/master/docs/getting-started-guides/k8s-docker.png) +![Kubernetes on Docker](/images/docs/k8s-docker.png) ### Bootstrap Docker diff --git a/docs/user-guide/connecting-applications.md b/docs/user-guide/connecting-applications.md index 4f0b804a4e..f75187d6c6 100644 --- a/docs/user-guide/connecting-applications.md +++ b/docs/user-guide/connecting-applications.md @@ -9,7 +9,7 @@ assignees: * TOC {:toc} -# The Kubernetes model for connecting containers +## The Kubernetes model for connecting containers Now that you have a continuously running, replicated application you can expose it on a network. Before discussing the Kubernetes approach to networking, it is worthwhile to contrast it with the "normal" way networking works with Docker. diff --git a/docs/user-guide/monitoring.md b/docs/user-guide/monitoring.md index 6125291421..0c5f673708 100644 --- a/docs/user-guide/monitoring.md +++ b/docs/user-guide/monitoring.md @@ -6,7 +6,7 @@ assignees: Understanding how an application behaves when deployed is crucial to scaling the application and providing a reliable service. In a Kubernetes cluster, application performance can be examined at many different levels: containers, [pods](/docs/user-guide/pods), [services](/docs/user-guide/services), and whole clusters. As part of Kubernetes we want to provide users with detailed resource usage information about their running applications at all these levels. This will give users deep insights into how their applications are performing and where possible application bottlenecks may be found. In comes [Heapster](https://github.com/kubernetes/heapster), a project meant to provide a base monitoring platform on Kubernetes. -### Overview +## Overview Heapster is a cluster-wide aggregator of monitoring and event data. It currently supports Kubernetes natively and works on all Kubernetes setups. Heapster runs as a pod in the cluster, similar to how any Kubernetes application would run. The Heapster pod discovers all nodes in the cluster and queries usage information from the nodes' [Kubelet](https://releases.k8s.io/{{page.githubbranch}}/DESIGN.md#kubelet)s, the on-machine Kubernetes agent. The Kubelet itself fetches the data from [cAdvisor](https://github.com/google/cadvisor). Heapster groups the information by pod along with the relevant labels. This data is then pushed to a configurable backend for storage and visualization. Currently supported backends include [InfluxDB](http://influxdb.com/) (with [Grafana](http://grafana.org/) for visualization), [Google Cloud Monitoring](https://cloud.google.com/monitoring/) and many others described in more details [here](https://github.com/kubernetes/heapster/blob/master/docs/sink-configuration.md). The overall architecture of the service can be seen below: From 660376ccd9d34ce9e2acbd050c7a87d7706642d4 Mon Sep 17 00:00:00 2001 From: Cole Mickens Date: Mon, 26 Sep 2016 17:15:38 -0700 Subject: [PATCH 003/120] azure: update links, owners, metadata --- _data/guides.yml | 4 ++-- docs/getting-started-guides/azure.md | 12 ++++-------- docs/getting-started-guides/index.md | 4 ++-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/_data/guides.yml b/_data/guides.yml index 7c41285d0e..ab622a0284 100644 --- a/_data/guides.yml +++ b/_data/guides.yml @@ -163,10 +163,10 @@ toc: path: /docs/getting-started-guides/gce/ - title: Running Kubernetes on AWS EC2 path: /docs/getting-started-guides/aws/ + - title: Running Kubernetes on Azure + path: /docs/getting-started-guides/azure/ - title: Running Kubernetes on Azure (Weave-based) path: /docs/getting-started-guides/coreos/azure/ - - title: Running Kubernetes on Azure (Flannel-based) - path: /docs/getting-started-guides/azure/ - title: Running Kubernetes on CenturyLink Cloud path: /docs/getting-started-guides/clc/ - title: Running Kubernetes on IBM SoftLayer diff --git a/docs/getting-started-guides/azure.md b/docs/getting-started-guides/azure.md index a6f29ef030..40652e3172 100644 --- a/docs/getting-started-guides/azure.md +++ b/docs/getting-started-guides/azure.md @@ -5,12 +5,8 @@ assignees: --- -* TOC -{:toc} - - -## Overview - The recommended approach for deploying a Kubernetes 1.4 cluster on Azure is the -[`kubernetes-anywhere`](https://github.com/kubernetes/kubernetes-anywhere) project. You will want to take a look at the -[Azure Getting Started Guide](https://github.com/kubernetes/kubernetes-anywhere/blob/master/phase1/azure/README.md). \ No newline at end of file +[`kubernetes-anywhere`](https://github.com/kubernetes/kubernetes-anywhere) project. + +You will want to take a look at the +[Azure Getting Started Guide](https://github.com/kubernetes/kubernetes-anywhere/blob/master/phase1/azure/README.md). diff --git a/docs/getting-started-guides/index.md b/docs/getting-started-guides/index.md index ec5eb98759..de7c06bd82 100644 --- a/docs/getting-started-guides/index.md +++ b/docs/getting-started-guides/index.md @@ -48,8 +48,8 @@ few commands, and have active community support. - [GCE](/docs/getting-started-guides/gce) - [AWS](/docs/getting-started-guides/aws) +- [Azure](/docs/getting-started-guides/azure/) - [Azure](/docs/getting-started-guides/coreos/azure/) (Weave-based, contributed by WeaveWorks employees) -- [Azure](/docs/getting-started-guides/azure/) (Flannel-based, contributed by Microsoft employee) - [CenturyLink Cloud](/docs/getting-started-guides/clc) - [IBM SoftLayer](https://github.com/patrocinio/kubernetes-softlayer) @@ -122,7 +122,7 @@ Stackpoint.io | | multi-support | multi-support | [d AppsCode.com | Saltstack | Debian | multi-support | [docs](https://appscode.com/products/cloud-deployment/) | | Commercial GCE | Saltstack | Debian | GCE | [docs](/docs/getting-started-guides/gce) | ['œ“][1] | Project Azure | CoreOS | CoreOS | Weave | [docs](/docs/getting-started-guides/coreos/azure/) | | Community ([@errordeveloper](https://github.com/errordeveloper), [@squillace](https://github.com/squillace), [@chanezon](https://github.com/chanezon), [@crossorigin](https://github.com/crossorigin)) -Azure | CoreOS | CoreOS | flannel | [docs](/docs/getting-started-guides/azure) | | Community ([@colemickens](https://github.com/colemickens)) +Azure | Ignition | Ubuntu | Azure | [docs](/docs/getting-started-guides/azure) | | Community (Microsoft: [@brendandburns](https://github.com/brendandburns), [@colemickens](https://github.com/colemickens)) Docker Single Node | custom | N/A | local | [docs](/docs/getting-started-guides/docker) | | Project ([@brendandburns](https://github.com/brendandburns)) Docker Multi Node | custom | N/A | flannel | [docs](/docs/getting-started-guides/docker-multinode) | | Project ([@brendandburns](https://github.com/brendandburns)) Bare-metal | Ansible | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/fedora_ansible_config) | | Project From fa44441f680014f96bc0c054102509c4ac1a45cc Mon Sep 17 00:00:00 2001 From: Mike Spreitzer Date: Sun, 25 Sep 2016 15:55:49 -0700 Subject: [PATCH 004/120] Noted HTTP syntax restriction on bearer tokens Noted that every bearer token, in any of the four authentication strategies that use bearer tokens, appears in an HTTP header value without additional quotation/encoding (beyond that supported by HTTP). Included a fully concrete example. Wrote this down once, where the issue first arises, and referenced it from the other relevant strategies. This constraint was elicited in #sig-auth discussion on Sep 21, and not previously stated explicitly and in a way that clearly applied to all four kinds of bearer token --- leaving the reader to wonder if some other encoding is expected. --- docs/admin/authentication.md | 35 ++++++++++++++++++++++------------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/docs/admin/authentication.md b/docs/admin/authentication.md index c3c5e52c77..0be8b50db8 100644 --- a/docs/admin/authentication.md +++ b/docs/admin/authentication.md @@ -66,8 +66,7 @@ See [APPENDIX](#appendix) for how to generate a client cert. ### Static Token File -Token file is enabled by passing the `--token-auth-file=SOMEFILE` option to the -API server. Currently, tokens last indefinitely, and the token list cannot be +The API server reads bearer tokens from a file when given the `--token-auth-file=SOMEFILE` option on the command line. Currently, tokens last indefinitely, and the token list cannot be changed without restarting API server. The token file format is implemented in `plugin/pkg/auth/authenticator/token/tokenfile/...` @@ -78,8 +77,19 @@ optional group names. Note, if you have more than one group the column must be d token,user,uid,"group1,group2,group3" ``` -When using token authentication from an http client the API server expects an `Authorization` -header with a value of `Bearer SOMETOKEN`. +#### Putting a Bearer Token in a Request + +When using bearer token authentication from an http client, the API +server expects an `Authorization` header with a value of `Bearer +THETOKEN`. The bearer token must be a character sequence that can be +put in an HTTP header value using no more than the encoding and +quoting facilities of HTTP. For example: if the bearer token is +`31ada4fd-adec-460c-809a-9e56ceb75269` then it would appear in an HTTP +header as shown below. + +```http +Authentication: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269 +``` ### Static Password File @@ -171,7 +181,8 @@ type: kubernetes.io/service-account-token Note: values are base64 encoded because secrets are always base64 encoded. The signed JWT can be used as a bearer token to authenticate as the given service -account. Normally these secrets are mounted into pods for in-cluster access to +account. See [above](#putting-a-bearer-token-in-a-request) for how the token is included +in a request. Normally these secrets are mounted into pods for in-cluster access to the API server, but can be used from outside the cluster as well. Service accounts authenticate with the username `system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)`, @@ -192,11 +203,8 @@ email, signed by the server. To identify the user, the authenticator uses the `id_token` (not the `access_token`) from the OAuth2 [token response](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse) -as a bearer token. - -``` -Authentication: Bearer (id_token) -``` +as a bearer token. See [above](#putting-a-bearer-token-in-a-request) for how the token +is included in a request. To enable the plugin, pass the following required flags: @@ -272,10 +280,11 @@ contexts: name: webhook ``` -When a client attempts to authenticate with the API server using a bearer token, -using the `Authorization: Bearer (TOKEN)` HTTP header the authentication webhook +When a client attempts to authenticate with the API server using a bearer token +as discussed [above](#putting-a-bearer-token-in-a-request), +the authentication webhook queries the remote service with a review object containing the token. Kubernetes -will not challenge request that lack such a header. +will not challenge a request that lacks such a header. Note that webhook API objects are subject to the same [versioning compatibility rules](/docs/api/) as other Kubernetes API objects. Implementers should be aware of looser From 777e234970d65d51e658e4b3d6031fc95b9328a3 Mon Sep 17 00:00:00 2001 From: Jimmy Cuadra Date: Tue, 27 Sep 2016 17:43:34 -0700 Subject: [PATCH 005/120] Explain how to define group memberships with client cert authentication. --- docs/admin/authentication.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/admin/authentication.md b/docs/admin/authentication.md index c3c5e52c77..2a7cad52bf 100644 --- a/docs/admin/authentication.md +++ b/docs/admin/authentication.md @@ -60,7 +60,17 @@ Client certificate authentication is enabled by passing the `--client-ca-file=SO option to API server. The referenced file must contain one or more certificates authorities to use to validate client certificates presented to the API server. If a client certificate is presented and verified, the common name of the subject is used as the user name for the -request. +request. As of Kubernetes 1.4, client certificates can also indicate a user's group memberships +using the certificate's organization fields. To include multiple group memberships for a user, +include multiple organization fields in the certificate. + +For example, using the `openssl` command line tool to generate a certificate signing request: + +``` bash +openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app2" +``` + +This would create a CSR for the username "jbeda", belonging to two groups, "app1" and "app2". See [APPENDIX](#appendix) for how to generate a client cert. From 19e65e224a2fb9e31dc8aa078e4aecaf30ff1d79 Mon Sep 17 00:00:00 2001 From: Jimmy Cuadra Date: Tue, 27 Sep 2016 21:30:08 -0700 Subject: [PATCH 006/120] Document subresources in RBAC. --- docs/admin/authorization.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/docs/admin/authorization.md b/docs/admin/authorization.md index 1e7b180773..0c8508a1ec 100644 --- a/docs/admin/authorization.md +++ b/docs/admin/authorization.md @@ -323,6 +323,32 @@ roleRef: apiVersion: rbac.authorization.k8s.io/v1alpha1 ``` +### Referring to Resources + +Most resources are represented by a string representation of their name, such as "pods", just as it +appears in the URL for the relevant API endpoint. However, some Kubernetes APIs involve a +"subresource" such as the logs for a pod. The URL for the pods logs endpoint is: + +``` +GET /api/v1/namespaces/{namespace}/pods/{name}/log +``` + +In this case, "pods" is the namespaced resource, and "log" is a subresource of pods. To represent +this in an RBAC role, use a slash to delimit the resource and subresource names. To allow a subject +to read both pods and pod logs, you would write: + +```yaml +kind: Role +apiVersion: rbac.authorization.k8s.io/v1alpha1 +metadata: + namespace: default + name: pod-and-pod-logs-reader +rules: + - apiGroups: [""] + resources: ["pods", "pods/log"] + verbs: ["get", "list"] +``` + ### Referring to Subjects RoleBindings and ClusterRoleBindings bind "subjects" to "roles". @@ -351,6 +377,7 @@ to groups with the `system:` prefix. Only the `subjects` section of a RoleBinding object shown in the following examples. For a user called `alice@example.com`, specify + ```yaml subjects: - kind: User @@ -358,6 +385,7 @@ subjects: ``` For a group called `frontend-admins`, specify: + ```yaml subjects: - kind: Group @@ -365,6 +393,7 @@ subjects: ``` For the default service account in the kube-system namespace: + ```yaml subjects: - kind: ServiceAccount @@ -373,6 +402,7 @@ subjects: ``` For all service accounts in the `qa` namespace: + ```yaml subjects: - kind: Group @@ -380,6 +410,7 @@ subjects: ``` For all service accounts everywhere: + ```yaml subjects: - kind: Group From aa9dfba7db14ec676f1550e4c367381f8e1ee1d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Naveiras?= Date: Wed, 28 Sep 2016 00:07:12 +0100 Subject: [PATCH 007/120] Used master branch to link files from the repo Implements #1269 --- _config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 5094499bfe..1a7fefdb6d 100644 --- a/_config.yml +++ b/_config.yml @@ -18,7 +18,7 @@ defaults: values: version: "v1.3" githubbranch: "master" - docsbranch: "release-1.3" + docsbranch: "master" - scope: path: "docs" From 5b4286ff3483b9fe1891be00bdc48b8b955af08a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?V=C3=ADt=20List=C3=ADk?= Date: Wed, 28 Sep 2016 14:12:08 +0200 Subject: [PATCH 008/120] fixed path to worker startup script --- docs/getting-started-guides/docker-multinode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started-guides/docker-multinode.md b/docs/getting-started-guides/docker-multinode.md index 14e475ee10..6d59cf591e 100644 --- a/docs/getting-started-guides/docker-multinode.md +++ b/docs/getting-started-guides/docker-multinode.md @@ -86,7 +86,7 @@ Clone the `kube-deploy` repo, and run `worker.sh` on the worker machine _with ro ```shell $ git clone https://github.com/kubernetes/kube-deploy -$ cd docker-multinode +$ cd kube-deploy/docker-multinode $ export MASTER_IP=${SOME_IP} $ ./worker.sh ``` From 65878b15e25ffd1aeacf4692ffc4b09dac6072d0 Mon Sep 17 00:00:00 2001 From: deads2k Date: Wed, 28 Sep 2016 09:29:57 -0400 Subject: [PATCH 009/120] update docs to point to new incubator --- docs/getting-started-guides/mesos/index.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/getting-started-guides/mesos/index.md b/docs/getting-started-guides/mesos/index.md index bec65b64fd..2d909145a3 100644 --- a/docs/getting-started-guides/mesos/index.md +++ b/docs/getting-started-guides/mesos/index.md @@ -47,9 +47,8 @@ ssh jclouds@${ip_address_of_master_node} Build Kubernetes-Mesos. ```shell -git clone https://github.com/kubernetes/kubernetes -cd kubernetes -export KUBERNETES_CONTRIB=mesos +git clone https://github.com/kubernetes-incubator/kube-mesos-framework +cd kube-mesos-framework make ``` From 2ff8dbf02416bb36589a58b6ac44bc2e0b12f90f Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Wed, 28 Sep 2016 14:46:40 -0700 Subject: [PATCH 010/120] Fix kubectl 404 1. Update script to: a) Rename kubectl.md to index.md b) Remove "See Also" section from kubectl subcommands md files 2. Update the _date/reference.yml link to kubectl --- _data/reference.yml | 2 +- update-imported-docs.sh | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/_data/reference.yml b/_data/reference.yml index 3cdd91de6e..ae6e38b363 100644 --- a/_data/reference.yml +++ b/_data/reference.yml @@ -63,7 +63,7 @@ toc: - title: kubectl Commands section: - title: kubectl - path: /docs/user-guide/kubectl/kubectl/ + path: /docs/user-guide/kubectl/ - title: kubectl annotate path: /docs/user-guide/kubectl/kubectl_annotate/ - title: kubectl api-versions diff --git a/update-imported-docs.sh b/update-imported-docs.sh index 2b9203e168..5c2674cf6c 100755 --- a/update-imported-docs.sh +++ b/update-imported-docs.sh @@ -102,6 +102,13 @@ cd docs/user-guide/kubectl find . -name '*.md' -type f -exec sed -i -e '//,//d' {} \; find . -name '*.md' -type f -exec sed -i -e '//,//d' {} \; + # Rename kubectl.md to index.md + mv kubectl.md index.md + # Strip the "See Also" links. + # These links in raw .md files are relative to current file location, but the website see them as relative to current url instead, and will return 404. + find . -name 'kubectl*.md' -type f -exec sed -i -e '/### SEE ALSO/d' {} \; + find . -name 'kubectl*.md' -type f -exec sed -i -e '/\* \[kubectl/d' {} \; + # Add the expected headers to md files find . -name '*.md' -type f -exec sed -i -e '1 i\ ---' {} \; From 28a0bcb9691897180070c4cb99ecc573a41a9e1c Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Wed, 28 Sep 2016 14:48:26 -0700 Subject: [PATCH 011/120] Run the script to fix kubectl 404 issue --- docs/user-guide/kubectl/{kubectl.md => index.md} | 0 docs/user-guide/kubectl/kubectl_annotate.md | 2 -- docs/user-guide/kubectl/kubectl_api-versions.md | 2 -- docs/user-guide/kubectl/kubectl_apply.md | 2 -- docs/user-guide/kubectl/kubectl_attach.md | 2 -- docs/user-guide/kubectl/kubectl_autoscale.md | 2 -- docs/user-guide/kubectl/kubectl_cluster-info.md | 3 --- .../kubectl/kubectl_cluster-info_dump.md | 2 -- docs/user-guide/kubectl/kubectl_completion.md | 2 -- docs/user-guide/kubectl/kubectl_config.md | 14 -------------- .../kubectl/kubectl_config_current-context.md | 2 -- .../kubectl/kubectl_config_delete-cluster.md | 2 -- .../kubectl/kubectl_config_delete-context.md | 2 -- .../kubectl/kubectl_config_get-clusters.md | 2 -- .../kubectl/kubectl_config_get-contexts.md | 2 -- .../kubectl/kubectl_config_set-cluster.md | 2 -- .../kubectl/kubectl_config_set-context.md | 2 -- .../kubectl/kubectl_config_set-credentials.md | 2 -- docs/user-guide/kubectl/kubectl_config_set.md | 2 -- docs/user-guide/kubectl/kubectl_config_unset.md | 2 -- .../kubectl/kubectl_config_use-context.md | 2 -- docs/user-guide/kubectl/kubectl_config_view.md | 2 -- docs/user-guide/kubectl/kubectl_convert.md | 2 -- docs/user-guide/kubectl/kubectl_cordon.md | 2 -- docs/user-guide/kubectl/kubectl_create.md | 9 --------- .../user-guide/kubectl/kubectl_create_configmap.md | 2 -- .../kubectl/kubectl_create_deployment.md | 2 -- .../user-guide/kubectl/kubectl_create_namespace.md | 2 -- docs/user-guide/kubectl/kubectl_create_quota.md | 2 -- docs/user-guide/kubectl/kubectl_create_secret.md | 5 ----- .../kubectl_create_secret_docker-registry.md | 2 -- .../kubectl/kubectl_create_secret_generic.md | 2 -- .../kubectl/kubectl_create_secret_tls.md | 2 -- docs/user-guide/kubectl/kubectl_create_service.md | 5 ----- .../kubectl/kubectl_create_service_clusterip.md | 2 -- .../kubectl/kubectl_create_service_loadbalancer.md | 2 -- .../kubectl/kubectl_create_service_nodeport.md | 2 -- .../kubectl/kubectl_create_serviceaccount.md | 2 -- docs/user-guide/kubectl/kubectl_delete.md | 2 -- docs/user-guide/kubectl/kubectl_describe.md | 2 -- docs/user-guide/kubectl/kubectl_drain.md | 2 -- docs/user-guide/kubectl/kubectl_edit.md | 2 -- docs/user-guide/kubectl/kubectl_exec.md | 2 -- docs/user-guide/kubectl/kubectl_explain.md | 2 -- docs/user-guide/kubectl/kubectl_expose.md | 2 -- docs/user-guide/kubectl/kubectl_get.md | 2 -- docs/user-guide/kubectl/kubectl_label.md | 2 -- docs/user-guide/kubectl/kubectl_logs.md | 2 -- docs/user-guide/kubectl/kubectl_namespace.md | 2 -- docs/user-guide/kubectl/kubectl_options.md | 2 -- docs/user-guide/kubectl/kubectl_patch.md | 2 -- docs/user-guide/kubectl/kubectl_port-forward.md | 2 -- docs/user-guide/kubectl/kubectl_proxy.md | 2 -- docs/user-guide/kubectl/kubectl_replace.md | 2 -- docs/user-guide/kubectl/kubectl_rolling-update.md | 2 -- docs/user-guide/kubectl/kubectl_rollout.md | 7 ------- docs/user-guide/kubectl/kubectl_rollout_history.md | 2 -- docs/user-guide/kubectl/kubectl_rollout_pause.md | 2 -- docs/user-guide/kubectl/kubectl_rollout_resume.md | 2 -- docs/user-guide/kubectl/kubectl_rollout_status.md | 2 -- docs/user-guide/kubectl/kubectl_rollout_undo.md | 2 -- docs/user-guide/kubectl/kubectl_run.md | 2 -- docs/user-guide/kubectl/kubectl_scale.md | 2 -- docs/user-guide/kubectl/kubectl_set.md | 3 --- docs/user-guide/kubectl/kubectl_set_image.md | 2 -- docs/user-guide/kubectl/kubectl_stop.md | 2 -- docs/user-guide/kubectl/kubectl_taint.md | 2 -- docs/user-guide/kubectl/kubectl_top.md | 4 ---- docs/user-guide/kubectl/kubectl_top_node.md | 2 -- docs/user-guide/kubectl/kubectl_top_pod.md | 2 -- docs/user-guide/kubectl/kubectl_uncordon.md | 2 -- docs/user-guide/kubectl/kubectl_version.md | 2 -- 72 files changed, 176 deletions(-) rename docs/user-guide/kubectl/{kubectl.md => index.md} (100%) diff --git a/docs/user-guide/kubectl/kubectl.md b/docs/user-guide/kubectl/index.md similarity index 100% rename from docs/user-guide/kubectl/kubectl.md rename to docs/user-guide/kubectl/index.md diff --git a/docs/user-guide/kubectl/kubectl_annotate.md b/docs/user-guide/kubectl/kubectl_annotate.md index 2111379a6f..0ac1443b61 100644 --- a/docs/user-guide/kubectl/kubectl_annotate.md +++ b/docs/user-guide/kubectl/kubectl_annotate.md @@ -98,9 +98,7 @@ kubectl annotate pods foo description- --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_api-versions.md b/docs/user-guide/kubectl/kubectl_api-versions.md index c5c9e1fe59..ddde2267d0 100644 --- a/docs/user-guide/kubectl/kubectl_api-versions.md +++ b/docs/user-guide/kubectl/kubectl_api-versions.md @@ -41,9 +41,7 @@ kubectl api-versions --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_apply.md b/docs/user-guide/kubectl/kubectl_apply.md index 899383c0d5..eac7846e6e 100644 --- a/docs/user-guide/kubectl/kubectl_apply.md +++ b/docs/user-guide/kubectl/kubectl_apply.md @@ -70,9 +70,7 @@ cat pod.json | kubectl apply -f - --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_attach.md b/docs/user-guide/kubectl/kubectl_attach.md index 860f7ece8d..1d1cbcb7f4 100644 --- a/docs/user-guide/kubectl/kubectl_attach.md +++ b/docs/user-guide/kubectl/kubectl_attach.md @@ -64,9 +64,7 @@ kubectl attach 123456-7890 -c ruby-container -i -t --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_autoscale.md b/docs/user-guide/kubectl/kubectl_autoscale.md index 120356c5e4..05d5bf143d 100644 --- a/docs/user-guide/kubectl/kubectl_autoscale.md +++ b/docs/user-guide/kubectl/kubectl_autoscale.md @@ -78,9 +78,7 @@ kubectl autoscale rc foo --max=5 --cpu-percent=80 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_cluster-info.md b/docs/user-guide/kubectl/kubectl_cluster-info.md index 2789f751d4..b3a1480dab 100644 --- a/docs/user-guide/kubectl/kubectl_cluster-info.md +++ b/docs/user-guide/kubectl/kubectl_cluster-info.md @@ -48,10 +48,7 @@ kubectl cluster-info --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -* [kubectl cluster-info dump](kubectl_cluster-info_dump.md) - Dump lots of relevant info for debugging and diagnosis ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_cluster-info_dump.md b/docs/user-guide/kubectl/kubectl_cluster-info_dump.md index 0116d85bab..c13257c390 100644 --- a/docs/user-guide/kubectl/kubectl_cluster-info_dump.md +++ b/docs/user-guide/kubectl/kubectl_cluster-info_dump.md @@ -73,9 +73,7 @@ kubectl cluster-info dump --namespaces default,kube-system --output-directory=/p --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl cluster-info](kubectl_cluster-info.md) - Display cluster info ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_completion.md b/docs/user-guide/kubectl/kubectl_completion.md index b73b02f368..f69aacb619 100644 --- a/docs/user-guide/kubectl/kubectl_completion.md +++ b/docs/user-guide/kubectl/kubectl_completion.md @@ -66,9 +66,7 @@ $ source <(kubectl completion zsh) --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config.md b/docs/user-guide/kubectl/kubectl_config.md index 542820f12d..354464e7d4 100644 --- a/docs/user-guide/kubectl/kubectl_config.md +++ b/docs/user-guide/kubectl/kubectl_config.md @@ -52,21 +52,7 @@ kubectl config SUBCOMMAND --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -* [kubectl config current-context](kubectl_config_current-context.md) - Displays the current-context -* [kubectl config delete-cluster](kubectl_config_delete-cluster.md) - Delete the specified cluster from the kubeconfig -* [kubectl config delete-context](kubectl_config_delete-context.md) - Delete the specified context from the kubeconfig -* [kubectl config get-clusters](kubectl_config_get-clusters.md) - Display clusters defined in the kubeconfig -* [kubectl config get-contexts](kubectl_config_get-contexts.md) - Describe one or many contexts -* [kubectl config set](kubectl_config_set.md) - Sets an individual value in a kubeconfig file -* [kubectl config set-cluster](kubectl_config_set-cluster.md) - Sets a cluster entry in kubeconfig -* [kubectl config set-context](kubectl_config_set-context.md) - Sets a context entry in kubeconfig -* [kubectl config set-credentials](kubectl_config_set-credentials.md) - Sets a user entry in kubeconfig -* [kubectl config unset](kubectl_config_unset.md) - Unsets an individual value in a kubeconfig file -* [kubectl config use-context](kubectl_config_use-context.md) - Sets the current-context in a kubeconfig file -* [kubectl config view](kubectl_config_view.md) - Display merged kubeconfig settings or a specified kubeconfig file ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_current-context.md b/docs/user-guide/kubectl/kubectl_config_current-context.md index 0ef7c0023d..73c7cb5366 100644 --- a/docs/user-guide/kubectl/kubectl_config_current-context.md +++ b/docs/user-guide/kubectl/kubectl_config_current-context.md @@ -50,9 +50,7 @@ kubectl config current-context --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_delete-cluster.md b/docs/user-guide/kubectl/kubectl_config_delete-cluster.md index 0ac6b97716..698c72c1a2 100644 --- a/docs/user-guide/kubectl/kubectl_config_delete-cluster.md +++ b/docs/user-guide/kubectl/kubectl_config_delete-cluster.md @@ -41,9 +41,7 @@ kubectl config delete-cluster NAME --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_delete-context.md b/docs/user-guide/kubectl/kubectl_config_delete-context.md index 1249ff0ba3..e58ac663c3 100644 --- a/docs/user-guide/kubectl/kubectl_config_delete-context.md +++ b/docs/user-guide/kubectl/kubectl_config_delete-context.md @@ -41,9 +41,7 @@ kubectl config delete-context NAME --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_get-clusters.md b/docs/user-guide/kubectl/kubectl_config_get-clusters.md index e9e963bbd2..6e5494aac2 100644 --- a/docs/user-guide/kubectl/kubectl_config_get-clusters.md +++ b/docs/user-guide/kubectl/kubectl_config_get-clusters.md @@ -41,9 +41,7 @@ kubectl config get-clusters --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_get-contexts.md b/docs/user-guide/kubectl/kubectl_config_get-contexts.md index ade72ec623..b1ad750ddc 100644 --- a/docs/user-guide/kubectl/kubectl_config_get-contexts.md +++ b/docs/user-guide/kubectl/kubectl_config_get-contexts.md @@ -58,9 +58,7 @@ kubectl config get-contexts my-context --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_set-cluster.md b/docs/user-guide/kubectl/kubectl_config_set-cluster.md index e880ea0db6..165dae4878 100644 --- a/docs/user-guide/kubectl/kubectl_config_set-cluster.md +++ b/docs/user-guide/kubectl/kubectl_config_set-cluster.md @@ -64,9 +64,7 @@ kubectl config set-cluster e2e --insecure-skip-tls-verify=true --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_set-context.md b/docs/user-guide/kubectl/kubectl_config_set-context.md index b6ba8a3437..325516d461 100644 --- a/docs/user-guide/kubectl/kubectl_config_set-context.md +++ b/docs/user-guide/kubectl/kubectl_config_set-context.md @@ -56,9 +56,7 @@ kubectl config set-context gce --user=cluster-admin --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_set-credentials.md b/docs/user-guide/kubectl/kubectl_config_set-credentials.md index 8a462134e8..6c81890be8 100644 --- a/docs/user-guide/kubectl/kubectl_config_set-credentials.md +++ b/docs/user-guide/kubectl/kubectl_config_set-credentials.md @@ -87,9 +87,7 @@ kubectl config set-credentials cluster-admin --auth-provider=oidc --auth-provide --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_set.md b/docs/user-guide/kubectl/kubectl_config_set.md index 0ab8e35c1b..ace136ef20 100644 --- a/docs/user-guide/kubectl/kubectl_config_set.md +++ b/docs/user-guide/kubectl/kubectl_config_set.md @@ -50,9 +50,7 @@ kubectl config set PROPERTY_NAME PROPERTY_VALUE --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_unset.md b/docs/user-guide/kubectl/kubectl_config_unset.md index 7004076385..8b2cd98164 100644 --- a/docs/user-guide/kubectl/kubectl_config_unset.md +++ b/docs/user-guide/kubectl/kubectl_config_unset.md @@ -43,9 +43,7 @@ kubectl config unset PROPERTY_NAME --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_use-context.md b/docs/user-guide/kubectl/kubectl_config_use-context.md index b04ea867bb..a551a6640b 100644 --- a/docs/user-guide/kubectl/kubectl_config_use-context.md +++ b/docs/user-guide/kubectl/kubectl_config_use-context.md @@ -41,9 +41,7 @@ kubectl config use-context CONTEXT_NAME --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_config_view.md b/docs/user-guide/kubectl/kubectl_config_view.md index 0cc9854458..529c4871da 100644 --- a/docs/user-guide/kubectl/kubectl_config_view.md +++ b/docs/user-guide/kubectl/kubectl_config_view.md @@ -71,9 +71,7 @@ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}' --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl config](kubectl_config.md) - Modify kubeconfig files ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_convert.md b/docs/user-guide/kubectl/kubectl_convert.md index 9809914863..354e681297 100644 --- a/docs/user-guide/kubectl/kubectl_convert.md +++ b/docs/user-guide/kubectl/kubectl_convert.md @@ -85,9 +85,7 @@ kubectl convert -f . | kubectl create -f - --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_cordon.md b/docs/user-guide/kubectl/kubectl_cordon.md index 102e8726bf..bc945d5d79 100644 --- a/docs/user-guide/kubectl/kubectl_cordon.md +++ b/docs/user-guide/kubectl/kubectl_cordon.md @@ -52,9 +52,7 @@ kubectl cordon foo --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create.md b/docs/user-guide/kubectl/kubectl_create.md index 1294ddcaa0..c47c3fc72a 100644 --- a/docs/user-guide/kubectl/kubectl_create.md +++ b/docs/user-guide/kubectl/kubectl_create.md @@ -68,16 +68,7 @@ cat pod.json | kubectl create -f - --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -* [kubectl create configmap](kubectl_create_configmap.md) - Create a configmap from a local file, directory or literal value -* [kubectl create deployment](kubectl_create_deployment.md) - Create a deployment with the specified name. -* [kubectl create namespace](kubectl_create_namespace.md) - Create a namespace with the specified name -* [kubectl create quota](kubectl_create_quota.md) - Create a quota with the specified name. -* [kubectl create secret](kubectl_create_secret.md) - Create a secret using specified subcommand -* [kubectl create service](kubectl_create_service.md) - Create a service using specified subcommand. -* [kubectl create serviceaccount](kubectl_create_serviceaccount.md) - Create a service account with the specified name ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_configmap.md b/docs/user-guide/kubectl/kubectl_create_configmap.md index 5641512ef0..190db2f567 100644 --- a/docs/user-guide/kubectl/kubectl_create_configmap.md +++ b/docs/user-guide/kubectl/kubectl_create_configmap.md @@ -85,9 +85,7 @@ kubectl create configmap my-config --from-literal=key1=config1 --from-literal=ke --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create](kubectl_create.md) - Create a resource by filename or stdin ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_deployment.md b/docs/user-guide/kubectl/kubectl_create_deployment.md index bfca422af9..88627ff03b 100644 --- a/docs/user-guide/kubectl/kubectl_create_deployment.md +++ b/docs/user-guide/kubectl/kubectl_create_deployment.md @@ -68,9 +68,7 @@ kubectl create deployment my-dep --image=busybox --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create](kubectl_create.md) - Create a resource by filename or stdin ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_namespace.md b/docs/user-guide/kubectl/kubectl_create_namespace.md index ea8dec22a2..8c4181f50c 100644 --- a/docs/user-guide/kubectl/kubectl_create_namespace.md +++ b/docs/user-guide/kubectl/kubectl_create_namespace.md @@ -67,9 +67,7 @@ kubectl create namespace my-namespace --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create](kubectl_create.md) - Create a resource by filename or stdin ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_quota.md b/docs/user-guide/kubectl/kubectl_create_quota.md index afbd66e572..843ed6b194 100644 --- a/docs/user-guide/kubectl/kubectl_create_quota.md +++ b/docs/user-guide/kubectl/kubectl_create_quota.md @@ -71,9 +71,7 @@ kubectl create quota NAME [--hard=key1=value1,key2=value2] [--scopes=Scope1,Scop --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create](kubectl_create.md) - Create a resource by filename or stdin ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_secret.md b/docs/user-guide/kubectl/kubectl_create_secret.md index 10dcd20d29..ce60df1bb4 100644 --- a/docs/user-guide/kubectl/kubectl_create_secret.md +++ b/docs/user-guide/kubectl/kubectl_create_secret.md @@ -41,12 +41,7 @@ kubectl create secret --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create](kubectl_create.md) - Create a resource by filename or stdin -* [kubectl create secret docker-registry](kubectl_create_secret_docker-registry.md) - Create a secret for use with a Docker registry -* [kubectl create secret generic](kubectl_create_secret_generic.md) - Create a secret from a local file, directory or literal value -* [kubectl create secret tls](kubectl_create_secret_tls.md) - Create a TLS secret ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md b/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md index c357816dea..3be76dbfa5 100644 --- a/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md +++ b/docs/user-guide/kubectl/kubectl_create_secret_docker-registry.md @@ -83,9 +83,7 @@ kubectl create secret docker-registry my-secret --docker-server=DOCKER_REGISTRY_ --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create secret](kubectl_create_secret.md) - Create a secret using specified subcommand ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_secret_generic.md b/docs/user-guide/kubectl/kubectl_create_secret_generic.md index 7fb7660038..5d9bccfdbb 100644 --- a/docs/user-guide/kubectl/kubectl_create_secret_generic.md +++ b/docs/user-guide/kubectl/kubectl_create_secret_generic.md @@ -86,9 +86,7 @@ kubectl create secret generic my-secret --from-literal=key1=supersecret --from-l --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create secret](kubectl_create_secret.md) - Create a secret using specified subcommand ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_secret_tls.md b/docs/user-guide/kubectl/kubectl_create_secret_tls.md index 4d64f3f38d..9fb1050d58 100644 --- a/docs/user-guide/kubectl/kubectl_create_secret_tls.md +++ b/docs/user-guide/kubectl/kubectl_create_secret_tls.md @@ -71,9 +71,7 @@ kubectl create secret tls tls-secret --cert=path/to/tls.cert --key=path/to/tls.k --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create secret](kubectl_create_secret.md) - Create a secret using specified subcommand ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_service.md b/docs/user-guide/kubectl/kubectl_create_service.md index ab115fba40..deece74de9 100644 --- a/docs/user-guide/kubectl/kubectl_create_service.md +++ b/docs/user-guide/kubectl/kubectl_create_service.md @@ -41,12 +41,7 @@ kubectl create service --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create](kubectl_create.md) - Create a resource by filename or stdin -* [kubectl create service clusterip](kubectl_create_service_clusterip.md) - Create a clusterIP service. -* [kubectl create service loadbalancer](kubectl_create_service_loadbalancer.md) - Create a LoadBalancer service. -* [kubectl create service nodeport](kubectl_create_service_nodeport.md) - Create a NodePort service. ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_service_clusterip.md b/docs/user-guide/kubectl/kubectl_create_service_clusterip.md index 81837bba97..05258fc991 100644 --- a/docs/user-guide/kubectl/kubectl_create_service_clusterip.md +++ b/docs/user-guide/kubectl/kubectl_create_service_clusterip.md @@ -72,9 +72,7 @@ kubectl create service clusterip my-cs --clusterip="None" --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create service](kubectl_create_service.md) - Create a service using specified subcommand. ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_service_loadbalancer.md b/docs/user-guide/kubectl/kubectl_create_service_loadbalancer.md index a12a8a68e1..8d3d22098a 100644 --- a/docs/user-guide/kubectl/kubectl_create_service_loadbalancer.md +++ b/docs/user-guide/kubectl/kubectl_create_service_loadbalancer.md @@ -68,9 +68,7 @@ kubectl create service loadbalancer my-lbs --tcp=5678:8080 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create service](kubectl_create_service.md) - Create a service using specified subcommand. ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_service_nodeport.md b/docs/user-guide/kubectl/kubectl_create_service_nodeport.md index 3cc3927812..e95c16b207 100644 --- a/docs/user-guide/kubectl/kubectl_create_service_nodeport.md +++ b/docs/user-guide/kubectl/kubectl_create_service_nodeport.md @@ -68,9 +68,7 @@ kubectl create service nodeport my-ns --tcp=5678:8080 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create service](kubectl_create_service.md) - Create a service using specified subcommand. ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_create_serviceaccount.md b/docs/user-guide/kubectl/kubectl_create_serviceaccount.md index 3005fefe2d..96092c3cb4 100644 --- a/docs/user-guide/kubectl/kubectl_create_serviceaccount.md +++ b/docs/user-guide/kubectl/kubectl_create_serviceaccount.md @@ -68,9 +68,7 @@ $ kubectl create serviceaccount my-service-account --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl create](kubectl_create.md) - Create a resource by filename or stdin ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_delete.md b/docs/user-guide/kubectl/kubectl_delete.md index af5d21dac0..5e8c303714 100644 --- a/docs/user-guide/kubectl/kubectl_delete.md +++ b/docs/user-guide/kubectl/kubectl_delete.md @@ -92,9 +92,7 @@ kubectl delete pods --all --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_describe.md b/docs/user-guide/kubectl/kubectl_describe.md index 550018f9ea..ff3c804c95 100644 --- a/docs/user-guide/kubectl/kubectl_describe.md +++ b/docs/user-guide/kubectl/kubectl_describe.md @@ -111,9 +111,7 @@ kubectl describe pods frontend --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_drain.md b/docs/user-guide/kubectl/kubectl_drain.md index ec6ab838a7..248ad68285 100644 --- a/docs/user-guide/kubectl/kubectl_drain.md +++ b/docs/user-guide/kubectl/kubectl_drain.md @@ -79,9 +79,7 @@ $ kubectl drain foo --grace-period=900 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_edit.md b/docs/user-guide/kubectl/kubectl_edit.md index 3e0b3f53df..61d18ca825 100644 --- a/docs/user-guide/kubectl/kubectl_edit.md +++ b/docs/user-guide/kubectl/kubectl_edit.md @@ -89,9 +89,7 @@ kubectl edit svc/docker-registry --output-version=v1 -o json --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_exec.md b/docs/user-guide/kubectl/kubectl_exec.md index f8140491b8..188ffd9e62 100644 --- a/docs/user-guide/kubectl/kubectl_exec.md +++ b/docs/user-guide/kubectl/kubectl_exec.md @@ -65,9 +65,7 @@ kubectl exec 123456-7890 -c ruby-container -i -t -- bash -il --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_explain.md b/docs/user-guide/kubectl/kubectl_explain.md index f4d65ee7cd..c919415944 100644 --- a/docs/user-guide/kubectl/kubectl_explain.md +++ b/docs/user-guide/kubectl/kubectl_explain.md @@ -87,9 +87,7 @@ kubectl explain pods.spec.containers --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_expose.md b/docs/user-guide/kubectl/kubectl_expose.md index d94504cfa2..d699ea2a63 100644 --- a/docs/user-guide/kubectl/kubectl_expose.md +++ b/docs/user-guide/kubectl/kubectl_expose.md @@ -110,9 +110,7 @@ kubectl expose deployment nginx --port=80 --target-port=8000 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_get.md b/docs/user-guide/kubectl/kubectl_get.md index beebab3c5d..99f2c25802 100644 --- a/docs/user-guide/kubectl/kubectl_get.md +++ b/docs/user-guide/kubectl/kubectl_get.md @@ -127,9 +127,7 @@ kubectl get rc/web service/frontend pods/web-pod-13je7 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_label.md b/docs/user-guide/kubectl/kubectl_label.md index 589dce3bac..519111b41a 100644 --- a/docs/user-guide/kubectl/kubectl_label.md +++ b/docs/user-guide/kubectl/kubectl_label.md @@ -91,9 +91,7 @@ kubectl label pods foo bar- --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_logs.md b/docs/user-guide/kubectl/kubectl_logs.md index 8e1acc293d..5436ab7f08 100644 --- a/docs/user-guide/kubectl/kubectl_logs.md +++ b/docs/user-guide/kubectl/kubectl_logs.md @@ -75,9 +75,7 @@ kubectl logs --since=1h nginx --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_namespace.md b/docs/user-guide/kubectl/kubectl_namespace.md index 608a0581f8..3af680938c 100644 --- a/docs/user-guide/kubectl/kubectl_namespace.md +++ b/docs/user-guide/kubectl/kubectl_namespace.md @@ -41,9 +41,7 @@ kubectl namespace [namespace] --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_options.md b/docs/user-guide/kubectl/kubectl_options.md index 014faf6010..060fc472f8 100644 --- a/docs/user-guide/kubectl/kubectl_options.md +++ b/docs/user-guide/kubectl/kubectl_options.md @@ -41,9 +41,7 @@ kubectl options --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_patch.md b/docs/user-guide/kubectl/kubectl_patch.md index dcccf49be5..c695889060 100644 --- a/docs/user-guide/kubectl/kubectl_patch.md +++ b/docs/user-guide/kubectl/kubectl_patch.md @@ -83,9 +83,7 @@ kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/ --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_port-forward.md b/docs/user-guide/kubectl/kubectl_port-forward.md index c8783efaa0..c23318f172 100644 --- a/docs/user-guide/kubectl/kubectl_port-forward.md +++ b/docs/user-guide/kubectl/kubectl_port-forward.md @@ -64,9 +64,7 @@ kubectl port-forward mypod 0:5000 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_proxy.md b/docs/user-guide/kubectl/kubectl_proxy.md index 7ebae29472..0e0abf0ee6 100644 --- a/docs/user-guide/kubectl/kubectl_proxy.md +++ b/docs/user-guide/kubectl/kubectl_proxy.md @@ -89,9 +89,7 @@ kubectl proxy --api-prefix=/k8s-api --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_replace.md b/docs/user-guide/kubectl/kubectl_replace.md index 04abefd976..61942a00fd 100644 --- a/docs/user-guide/kubectl/kubectl_replace.md +++ b/docs/user-guide/kubectl/kubectl_replace.md @@ -82,9 +82,7 @@ kubectl replace --force -f ./pod.json --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_rolling-update.md b/docs/user-guide/kubectl/kubectl_rolling-update.md index d6fa42992e..f4c35789a2 100644 --- a/docs/user-guide/kubectl/kubectl_rolling-update.md +++ b/docs/user-guide/kubectl/kubectl_rolling-update.md @@ -93,9 +93,7 @@ kubectl rolling-update frontend-v1 frontend-v2 --rollback --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_rollout.md b/docs/user-guide/kubectl/kubectl_rollout.md index 1117ae844b..49d13e8f8f 100644 --- a/docs/user-guide/kubectl/kubectl_rollout.md +++ b/docs/user-guide/kubectl/kubectl_rollout.md @@ -50,14 +50,7 @@ kubectl rollout undo deployment/abc --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -* [kubectl rollout history](kubectl_rollout_history.md) - View rollout history -* [kubectl rollout pause](kubectl_rollout_pause.md) - Mark the provided resource as paused -* [kubectl rollout resume](kubectl_rollout_resume.md) - Resume a paused resource -* [kubectl rollout status](kubectl_rollout_status.md) - Watch rollout status until it's done -* [kubectl rollout undo](kubectl_rollout_undo.md) - Undo a previous rollout ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_rollout_history.md b/docs/user-guide/kubectl/kubectl_rollout_history.md index 2884cafd13..db82c4a24d 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_history.md +++ b/docs/user-guide/kubectl/kubectl_rollout_history.md @@ -61,9 +61,7 @@ kubectl rollout history deployment/abc --revision=3 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl rollout](kubectl_rollout.md) - Manage a deployment rollout ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_rollout_pause.md b/docs/user-guide/kubectl/kubectl_rollout_pause.md index 3387e0a06b..0636160072 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_pause.md +++ b/docs/user-guide/kubectl/kubectl_rollout_pause.md @@ -63,9 +63,7 @@ kubectl rollout pause deployment/nginx --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl rollout](kubectl_rollout.md) - Manage a deployment rollout ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_rollout_resume.md b/docs/user-guide/kubectl/kubectl_rollout_resume.md index 02ac6476b7..3954ec033c 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_resume.md +++ b/docs/user-guide/kubectl/kubectl_rollout_resume.md @@ -61,9 +61,7 @@ kubectl rollout resume deployment/nginx --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl rollout](kubectl_rollout.md) - Manage a deployment rollout ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_rollout_status.md b/docs/user-guide/kubectl/kubectl_rollout_status.md index 2d63fc960f..5730266e30 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_status.md +++ b/docs/user-guide/kubectl/kubectl_rollout_status.md @@ -57,9 +57,7 @@ kubectl rollout status deployment/nginx --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl rollout](kubectl_rollout.md) - Manage a deployment rollout ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_rollout_undo.md b/docs/user-guide/kubectl/kubectl_rollout_undo.md index 886162f8ab..1f758bd68d 100644 --- a/docs/user-guide/kubectl/kubectl_rollout_undo.md +++ b/docs/user-guide/kubectl/kubectl_rollout_undo.md @@ -61,9 +61,7 @@ kubectl rollout undo deployment/abc --to-revision=3 --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl rollout](kubectl_rollout.md) - Manage a deployment rollout ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_run.md b/docs/user-guide/kubectl/kubectl_run.md index eea1dcfb80..a62adb32a1 100644 --- a/docs/user-guide/kubectl/kubectl_run.md +++ b/docs/user-guide/kubectl/kubectl_run.md @@ -120,9 +120,7 @@ kubectl run pi --schedule="0/5 * * * ?" --image=perl --restart=OnFailure -- perl --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_scale.md b/docs/user-guide/kubectl/kubectl_scale.md index 5f6be05bef..bf781d2ee6 100644 --- a/docs/user-guide/kubectl/kubectl_scale.md +++ b/docs/user-guide/kubectl/kubectl_scale.md @@ -81,9 +81,7 @@ kubectl scale --replicas=3 job/cron --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_set.md b/docs/user-guide/kubectl/kubectl_set.md index 25091604c3..7968396c09 100644 --- a/docs/user-guide/kubectl/kubectl_set.md +++ b/docs/user-guide/kubectl/kubectl_set.md @@ -44,10 +44,7 @@ kubectl set SUBCOMMAND --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -* [kubectl set image](kubectl_set_image.md) - Update image of a pod template ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_set_image.md b/docs/user-guide/kubectl/kubectl_set_image.md index 58e50e8ecd..2797c4b83b 100644 --- a/docs/user-guide/kubectl/kubectl_set_image.md +++ b/docs/user-guide/kubectl/kubectl_set_image.md @@ -80,9 +80,7 @@ kubectl set image -f path/to/file.yaml nginx=nginx:1.9.1 --local -o yaml --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl set](kubectl_set.md) - Set specific features on objects ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_stop.md b/docs/user-guide/kubectl/kubectl_stop.md index f01281ca18..f46e281c7c 100644 --- a/docs/user-guide/kubectl/kubectl_stop.md +++ b/docs/user-guide/kubectl/kubectl_stop.md @@ -76,9 +76,7 @@ $ kubectl stop -f path/to/resources --vmodule=: comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 24-Nov-2015 diff --git a/docs/user-guide/kubectl/kubectl_taint.md b/docs/user-guide/kubectl/kubectl_taint.md index 075c5ff252..0f0abbf69f 100644 --- a/docs/user-guide/kubectl/kubectl_taint.md +++ b/docs/user-guide/kubectl/kubectl_taint.md @@ -81,9 +81,7 @@ kubectl taint nodes foo dedicated- --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_top.md b/docs/user-guide/kubectl/kubectl_top.md index 9864b15425..392240410b 100644 --- a/docs/user-guide/kubectl/kubectl_top.md +++ b/docs/user-guide/kubectl/kubectl_top.md @@ -44,11 +44,7 @@ kubectl top --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager -* [kubectl top node](kubectl_top_node.md) - Display Resource (CPU/Memory/Storage) usage of nodes -* [kubectl top pod](kubectl_top_pod.md) - Display Resource (CPU/Memory/Storage) usage of pods ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_top_node.md b/docs/user-guide/kubectl/kubectl_top_node.md index 2639e4c0a3..724c2ab3f5 100644 --- a/docs/user-guide/kubectl/kubectl_top_node.md +++ b/docs/user-guide/kubectl/kubectl_top_node.md @@ -61,9 +61,7 @@ kubectl top node NODE_NAME --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl top](kubectl_top.md) - Display Resource (CPU/Memory/Storage) usage ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_top_pod.md b/docs/user-guide/kubectl/kubectl_top_pod.md index 9adcad5c33..2c45fbe07c 100644 --- a/docs/user-guide/kubectl/kubectl_top_pod.md +++ b/docs/user-guide/kubectl/kubectl_top_pod.md @@ -72,9 +72,7 @@ kubectl top pod -l name=myLabel --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl top](kubectl_top.md) - Display Resource (CPU/Memory/Storage) usage ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_uncordon.md b/docs/user-guide/kubectl/kubectl_uncordon.md index 107666f946..ef142c72c2 100644 --- a/docs/user-guide/kubectl/kubectl_uncordon.md +++ b/docs/user-guide/kubectl/kubectl_uncordon.md @@ -52,9 +52,7 @@ $ kubectl uncordon foo --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 diff --git a/docs/user-guide/kubectl/kubectl_version.md b/docs/user-guide/kubectl/kubectl_version.md index 10065476a7..9abc0c2856 100644 --- a/docs/user-guide/kubectl/kubectl_version.md +++ b/docs/user-guide/kubectl/kubectl_version.md @@ -47,9 +47,7 @@ kubectl version --vmodule value comma-separated list of pattern=N settings for file-filtered logging ``` -### SEE ALSO -* [kubectl](../kubectl.md) - kubectl controls the Kubernetes cluster manager ###### Auto generated by spf13/cobra on 2-Sep-2016 From 8aa10a6fdacb872b15aea0b1189b6a2cb977e5f7 Mon Sep 17 00:00:00 2001 From: Brandon Philips Date: Fri, 16 Sep 2016 18:25:50 -0700 Subject: [PATCH 012/120] admin: dns: merge from the build dir Try and clean this mess up where the build dir has user facing docs and move them here. Ref: https://github.com/kubernetes/kubernetes/pull/32931 --- docs/admin/dns.md | 189 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 178 insertions(+), 11 deletions(-) diff --git a/docs/admin/dns.md b/docs/admin/dns.md index a85f2338ce..9470a6c7c7 100644 --- a/docs/admin/dns.md +++ b/docs/admin/dns.md @@ -9,10 +9,14 @@ assignees: ## Introduction As of Kubernetes 1.3, DNS is a built-in service launched automatically using the addon manager [cluster add-on](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/README.md). -A DNS Pod and Service will be scheduled on the cluster, and the kubelets will be -configured to tell individual containers to use the DNS Service's IP to resolve DNS names. -Every Service defined in the cluster (including the DNS server itself) will be +Kubernetes DNS schedules a DNS Pod and Service on the cluster, and configures +the kubelets to tell individual containers to use the DNS Service's IP to +resolve DNS names. + +## What things get DNS names? + +Every Service defined in the cluster (including the DNS server itself) is assigned a DNS name. By default, a client Pod's DNS search list will include the Pod's own namespace and the cluster's default domain. This is best illustrated by example: @@ -22,17 +26,161 @@ in namespace `bar` can look up this service by simply doing a DNS query for `foo`. A Pod running in namespace `quux` can look up this service by doing a DNS query for `foo.bar`. -The Kubernetes cluster DNS server (based off the [SkyDNS](https://github.com/skynetservices/skydns) library) -supports forward lookups (A records), service lookups (SRV records) and reverse IP address lookups (PTR records). +## Supported DNS schema +The following sections detail the supported record types and layout that is +supported. Any other layout or names or queries that happen to work are +considered implementation details and are subject to change without warning. -## How it Works +### Services -The running Kubernetes DNS pod holds 3 containers - kubedns, dnsmasq and a health check called healthz. -The kubedns process watches the Kubernetes master for changes in Services and Endpoints, and maintains -in-memory lookup structures to service DNS requests. The dnsmasq container adds DNS caching to improve -performance. The healthz container provides a single health check endpoint while performing dual healthchecks -(for dnsmasq and kubedns). +#### A records + +"Normal" (not headless) Services are assigned a DNS A record for a name of the +form `my-svc.my-namespace.svc.cluster.local`. This resolves to the cluster IP +of the Service. + +"Headless" (without a cluster IP) Services are also assigned a DNS A record for +a name of the form `my-svc.my-namespace.svc.cluster.local`. Unlike normal +Services, this resolves to the set of IPs of the pods selected by the Service. +Clients are expected to consume the set or else use standard round-robin +selection from the set. + +### SRV records + +SRV Records are created for named ports that are part of normal or Headless +Services. +For each named port, the SRV record would have the form +`_my-port-name._my-port-protocol.my-svc.my-namespace.svc.cluster.local`. +For a regular service, this resolves to the port number and the CNAME: +`my-svc.my-namespace.svc.cluster.local`. +For a headless service, this resolves to multiple answers, one for each pod +that is backing the service, and contains the port number and a CNAME of the pod +of the form `auto-generated-name.my-svc.my-namespace.svc.cluster.local`. + +### Backwards compatibility + +Previous versions of kube-dns made names of the for +`my-svc.my-namespace.cluster.local` (the 'svc' level was added later). This +is no longer supported. + +### Pods + +#### A Records + +When enabled, pods are assigned a DNS A record in the form of `pod-ip-address.my-namespace.pod.cluster.local`. + +For example, a pod with ip `1.2.3.4` in the namespace `default` with a dns name of `cluster.local` would have an entry: `1-2-3-4.default.pod.cluster.local`. + +#### A Records and hostname based on Pod's hostname and subdomain fields + +Currently when a pod is created, its hostname is the Pod's `metadata.name` value. + +With v1.2, users can specify a Pod annotation, `pod.beta.kubernetes.io/hostname`, to specify what the Pod's hostname should be. +The Pod annotation, if specified, takes precendence over the Pod's name, to be the hostname of the pod. +For example, given a Pod with annotation `pod.beta.kubernetes.io/hostname: my-pod-name`, the Pod will have its hostname set to "my-pod-name". + +With v1.3, the PodSpec has a `hostname` field, which can be used to specify the Pod's hostname. This field value takes precedence over the +`pod.beta.kubernetes.io/hostname` annotation value. + +v1.2 introduces a beta feature where the user can specify a Pod annotation, `pod.beta.kubernetes.io/subdomain`, to specify the Pod's subdomain. +The final domain will be "...svc.". +For example, a Pod with the hostname annotation set to "foo", and the subdomain annotation set to "bar", in namespace "my-namespace", will have the FQDN "foo.bar.my-namespace.svc.cluster.local" + +With v1.3, the PodSpec has a `subdomain` field, which can be used to specify the Pod's subdomain. This field value takes precedence over the +`pod.beta.kubernetes.io/subdomain` annotation value. + +Example: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: busybox + namespace: default +spec: + hostname: busybox-1 + subdomain: default + containers: + - image: busybox + command: + - sleep + - "3600" + name: busybox +``` + +If there exists a headless service in the same namespace as the pod and with the same name as the subdomain, the cluster's KubeDNS Server also returns an A record for the Pod's fully qualified hostname. +Given a Pod with the hostname set to "foo" and the subdomain set to "bar", and a headless Service named "bar" in the same namespace, the pod will see it's own FQDN as "foo.bar.my-namespace.svc.cluster.local". DNS serves an A record at that name, pointing to the Pod's IP. + +With v1.2, the Endpoints object also has a new annotation `endpoints.beta.kubernetes.io/hostnames-map`. Its value is the json representation of map[string(IP)][endpoints.HostRecord], for example: '{"10.245.1.6":{HostName: "my-webserver"}}'. +If the Endpoints are for a headless service, an A record is created with the format ...svc. +For the example json, if endpoints are for a headless service named "bar", and one of the endpoints has IP "10.245.1.6", an A is created with the name "my-webserver.bar.my-namespace.svc.cluster.local" and the A record lookup would return "10.245.1.6". +This endpoints annotation generally does not need to be specified by end-users, but can used by the internal service controller to deliver the aforementioned feature. + +With v1.3, The Endpoints object can specify the `hostname` for any endpoint, along with its IP. The hostname field takes precedence over the hostname value +that might have been specified via the `endpoints.beta.kubernetes.io/hostnames-map` annotation. + +With v1.3, the following annotations are deprecated: `pod.beta.kubernetes.io/hostname`, `pod.beta.kubernetes.io/subdomain`, `endpoints.beta.kubernetes.io/hostnames-map` + +## How do I test if it is working? + +### Create a simple Pod to use as a test environment. + +Create a file named busybox.yaml with the +following contents: + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: busybox + namespace: default +spec: + containers: + - image: busybox + command: + - sleep + - "3600" + imagePullPolicy: IfNotPresent + name: busybox + restartPolicy: Always +``` + +Then create a pod using this file: + +``` +kubectl create -f busybox.yaml +``` + +### Wait for this pod to go into the running state. + +You can get its status with: +``` +kubectl get pods busybox +``` + +You should see: +``` +NAME READY STATUS RESTARTS AGE +busybox 1/1 Running 0 +``` + +### Validate DNS works +Once that pod is running, you can exec nslookup in that environment: +``` +kubectl exec busybox -- nslookup kubernetes.default +``` + +You should see something like: +``` +Server: 10.0.0.10 +Address 1: 10.0.0.10 + +Name: kubernetes.default +Address 1: 10.0.0.1 +``` + +If you see that, DNS is working correctly. ## Kubernetes Federation (Multiple Zone support) @@ -44,6 +192,25 @@ the lookup of federated services (which span multiple Kubernetes clusters). See the [Cluster Federation Administrators' Guide](/docs/admin/federation) for more details on Cluster Federation and multi-site support. +## How it Works + +The running Kubernetes DNS pod holds 3 containers - kubedns, dnsmasq and a health check called healthz. +The kubedns process watches the Kubernetes master for changes in Services and Endpoints, and maintains +in-memory lookup structures to service DNS requests. The dnsmasq container adds DNS caching to improve +performance. The healthz container provides a single health check endpoint while performing dual healthchecks +(for dnsmasq and kubedns). + +The DNS pod is exposed as a Kubernetes Service with a static IP. Once assigned the +kubelet passes DNS configured using the `--cluster-dns=10.0.0.10` flag to each +container. + +DNS names also need domains. The local domain is configurable, in the kubelet using +the flag `--cluster-domain=` + +The Kubernetes cluster DNS server (based off the [SkyDNS](https://github.com/skynetservices/skydns) library) +supports forward lookups (A records), service lookups (SRV records) and reverse IP address lookups (PTR records). + + ## References - [Docs for the DNS cluster addon](http://releases.k8s.io/{{page.githubbranch}}/build/kube-dns/README.md) From 8cdebc0d66707784a5031376f14366622d1ae4c0 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Wed, 28 Sep 2016 16:02:30 -0700 Subject: [PATCH 013/120] Revise tutorial to use NodePort instead of externa IP address. --- _data/tutorials.yml | 2 +- .../expose-external-ip-address-service.md | 106 +++++++++--------- 2 files changed, 56 insertions(+), 52 deletions(-) diff --git a/_data/tutorials.yml b/_data/tutorials.yml index b49283a702..9e3b79c8a2 100644 --- a/_data/tutorials.yml +++ b/_data/tutorials.yml @@ -56,5 +56,5 @@ toc: section: - title: Running a Stateless Application Using a 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/ diff --git a/docs/tutorials/stateless-application/expose-external-ip-address-service.md b/docs/tutorials/stateless-application/expose-external-ip-address-service.md index 65e13dd904..71112c6666 100644 --- a/docs/tutorials/stateless-application/expose-external-ip-address-service.md +++ b/docs/tutorials/stateless-application/expose-external-ip-address-service.md @@ -4,9 +4,8 @@ {% capture overview %} This page shows how to create a Kubernetes Service object that external -clients can use to access an application running in a cluster. The -Service exposes a stable IP address and provides load balancing for -an application that has two running instances. +clients can use to access an application running in a cluster. The Service +provides load balancing for an application that has two running instances. {% endcapture %} @@ -28,7 +27,7 @@ an application that has two running instances. {% capture objectives %} * 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. {% endcapture %} @@ -55,63 +54,68 @@ an application that has two running instances. kubectl get 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 describe replicasets hello-world - -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 + kubectl get replicasets + kubectl describe replicasets 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 ``, 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 8080/TCP 40s - -1. Use your service to access the Hello World application: - - curl :8080 - - where `` 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 - The output displays the IP address of your Minikube node and the NodePort - value for your service. Enter this command to access the Hello World - application: + The output is similar to this: - curl : + Name: example-service + Namespace: default + Labels: run=load-balancer-example + Selector: run=load-balancer-example + Type: NodePort + IP: 10.32.0.16 + Port: 8080/TCP + NodePort: 31496/TCP + Endpoints: 10.200.1.4:8080,10.200.2.5:8080 + Session Affinity: None + No events. - where `` us the IP address of your Minikube node, - and `` is the NodePort value for your service. + Make a note of the NodePort value for the service. For example, + 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://: + + where `` us the public IP address of your node, + and `` is the NodePort value for your service. + + The response to a successful request is a hello message: + + Hello Kubernetes! ### Using a service configuration file From f0ea23d16c023607cc0391501f203b861244792d Mon Sep 17 00:00:00 2001 From: callermann Date: Wed, 28 Sep 2016 20:40:02 -0400 Subject: [PATCH 014/120] Update docker-multinode.md Modified cd command on line 89 (Adding a worker node) to reflect proper path. --- docs/getting-started-guides/docker-multinode.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started-guides/docker-multinode.md b/docs/getting-started-guides/docker-multinode.md index 14e475ee10..6d59cf591e 100644 --- a/docs/getting-started-guides/docker-multinode.md +++ b/docs/getting-started-guides/docker-multinode.md @@ -86,7 +86,7 @@ Clone the `kube-deploy` repo, and run `worker.sh` on the worker machine _with ro ```shell $ git clone https://github.com/kubernetes/kube-deploy -$ cd docker-multinode +$ cd kube-deploy/docker-multinode $ export MASTER_IP=${SOME_IP} $ ./worker.sh ``` From c38f1f63e499d7abd0d0ba6661f814c0b0f1f4ac Mon Sep 17 00:00:00 2001 From: Piyush Madan Date: Thu, 29 Sep 2016 01:23:06 -0400 Subject: [PATCH 015/120] minor edit - removed ` in one of the cmds --- docs/getting-started-guides/libvirt-coreos.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started-guides/libvirt-coreos.md b/docs/getting-started-guides/libvirt-coreos.md index f752a13aee..86b0707092 100644 --- a/docs/getting-started-guides/libvirt-coreos.md +++ b/docs/getting-started-guides/libvirt-coreos.md @@ -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: ```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: From 3965d87cecbddd0630ad200518edd61a91b069e7 Mon Sep 17 00:00:00 2001 From: Ian Lewis Date: Thu, 29 Sep 2016 17:34:39 +0900 Subject: [PATCH 016/120] Created new ThirdPartyResource Glossary page. 1. Created a new page for the ThirdPartyResource object. 2. Added a link for the new page to the Glossary menu. --- _data/reference.yml | 2 + docs/user-guide/thirdpartyresources.md | 118 +++++++++++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 docs/user-guide/thirdpartyresources.md diff --git a/_data/reference.yml b/_data/reference.yml index 3cdd91de6e..e82f3df031 100644 --- a/_data/reference.yml +++ b/_data/reference.yml @@ -230,6 +230,8 @@ toc: path: /docs/user-guide/services/ - title: Service Accounts path: /docs/user-guide/service-accounts/ + - title: Third Party Resources + path: /docs/user-guide/thirdpartyresources/ - title: Volumes path: /docs/user-guide/volumes/ diff --git a/docs/user-guide/thirdpartyresources.md b/docs/user-guide/thirdpartyresources.md new file mode 100644 index 0000000000..d8f2bc5ba9 --- /dev/null +++ b/docs/user-guide/thirdpartyresources.md @@ -0,0 +1,118 @@ +--- +assignees: +- IanLewis + +--- + +* TOC +{:toc} + +## What is ThirdPartyResource? + +Kubernetes comes with many built-in API objects. However, there are often times when you might need to extend Kubernetes with their own API objects in order to do custom automation. + +`ThirdPartyResource` objects are a way to extend the Kubernetes API with a new API object type. The new API object type will be given an API endpoint URL and support CRUD operations, and watch API. You can then create custom objects using this API endpoint. You can think of `ThirdPartyResources` as being much like the schema for a database table. Once you have created the table, you can then start storing rows in the table. Once created, `ThirdPartyResources` can act as the data model behind custom controllers or automation programs. + +## Structure of a ThirdPartyResource + +Each `ThirdPartyResource` has the following: + + * `metadata` - Standard Kubernetes object metadata. + * `kind` - The kind of the resources described by this third party resource. + * `description` - A free text description of the resource. + * `versions` - A list of the versions of the resource. + +The `kind` for a `ThirdPartyResource` takes the form `.`. You are expected to provide a unique kind and domain name in order to avoid conflicts with other `ThirdPartyResource` objects. Kind names will be converted to CamelCase when creating instances of the `ThirdPartyResource`. Hypens in the `kind` are assumed to be word breaks. For instance the kind `camel-case` would be converted to `CamelCase` but `camelcase` would be converted to `Camelcase`. + +Other fields on the `ThirdPartyResource` are treated as custom data fields. These fields can hold arbitrary JSON data and have any structure. + +You can view the full documentation about `ThirdPartyResources` using the `explain` command in kubectl. + +``` +$ kubectl explain thirdpartyresource +``` + +## Creating a ThirdPartyResource + +When you user create a new `ThirdPartyResource`, the Kubernetes API Server reacts by creating a new, namespaced RESTful resource path. For now, non-namespaced objects are not supported. As with existing built-in objects, deleting a namespace deletes all custom objects in that namespace. `ThirdPartyResources` themselves are non-namespaced and are available to all namespaces. + +For example, if a save the following `ThirdPartyResource` to `resource.yaml`: + +```yaml +apiVersion: extensions/v1beta1 +kind: ThirdPartyResource +metadata: + name: cron-tab.stable.example.com +description: "A specification of a Pod to run on a cron style schedule" +versions: +- name: v1 +``` + +And create it: + +```shell +$ kubectl create -f resource.yaml +thirdpartyresource "cron-tab.stable.example.com" created +``` + +Then a new RESTful API endpoint is created at: + +`/apis/stable.example.com/v1/namespaces//crontabs/...` + +This endpoint URL can then be used to create and manage custom objects. + +## Creating Custom Objects + +After the `ThirdPartyResource` object has been created you can create custom objects. Custom objects can contain custom fields. These fields can contain arbitrary JSON. +In the following example, a `cronSpec` and `image` custom fields are set to the custom `CronTab` object. If you save the following YAML to `my-crontab.yaml`: + +```yaml +apiVersion: "stable.example.com/v1" +kind: CronTab +metadata: + name: my-new-cron-object +cronSpec: "* * * * /5" +image: my-awesome-cron-image +``` + +and create it: + +```shell +$ kubectl create -f my-crontab.yaml +crontab "my-new-cron-object" created +``` + +You can then manage our `CronTab` objects using kubectl. Note that resource names are not case-sensitive when using kubectl: + +```shell +$ kubectl get crontab +NAME LABELS DATA +my-new-cron-object {"apiVersion":"stable.example.com/v1","cronSpec":"... +``` + +You can also view the raw JSON data. Here you can see that it contains the custom `cronSpec` and `image` fields from the yaml you used to create it: + +```yaml +$ kubectl get crontab -o json +{ + "kind": "List", + "apiVersion": "v1", + "metadata": {}, + "items": [ + { + "apiVersion": "stable.example.com/v1", + "cronSpec": "* * * * /5", + "image": "my-awesome-cron-image", + "kind": "CronTab", + "metadata": { + "creationTimestamp": "2016-09-29T04:59:00Z", + "name": "my-new-cron-object", + "namespace": "default", + "resourceVersion": "12601503", + "selfLink": "/apis/stable.example.com/v1/namespaces/default/crontabs/my-new-cron-object", + "uid": "6f65e7a3-8601-11e6-a23e-42010af0000c" + } + } + ] +} +``` From 55017a1f27cd40d0683e9b6d5c3a501a6c6e9a16 Mon Sep 17 00:00:00 2001 From: Michail Kargakis Date: Wed, 28 Sep 2016 23:32:39 +0200 Subject: [PATCH 017/120] Fix note for paused deployments --- docs/user-guide/deployments.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/user-guide/deployments.md b/docs/user-guide/deployments.md index 1fae4ddd7d..d160cce1e7 100644 --- a/docs/user-guide/deployments.md +++ b/docs/user-guide/deployments.md @@ -451,7 +451,8 @@ nginx-deployment-2035384211 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 From 2b2d8dc0bc4d568ad1ad1be8e9834c2e73d7d1e6 Mon Sep 17 00:00:00 2001 From: Tobias Bradtke Date: Thu, 29 Sep 2016 12:23:37 +0200 Subject: [PATCH 018/120] Fix urls --- docs/user-guide/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/index.md b/docs/user-guide/index.md index 44dd71f41e..70bcb5be6d 100644 --- a/docs/user-guide/index.md +++ b/docs/user-guide/index.md @@ -89,5 +89,5 @@ Pods and containers * [Images and registries](/docs/user-guide/images/) * [Migrating from docker-cli to kubectl](/docs/user-guide/docker-cli-to-kubectl/) * [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/) - * [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/) + * [Assign pods to selected nodes](/docs/user-guide/node-selection/) + * [Perform a rolling update on a running group of pods](/docs/user-guide/update-demo/) From eac7ea8f7ecdc5545f0c26aab36dc3fb4e8b1be4 Mon Sep 17 00:00:00 2001 From: Jeff Mendoza Date: Thu, 29 Sep 2016 13:40:12 -0700 Subject: [PATCH 019/120] Remove body template from Create Issue button. We now have a deafult issue template in github, so the one inserted by the Create Issue button is no longer needed. --- _layouts/docwithnav.html | 1 - 1 file changed, 1 deletion(-) diff --git a/_layouts/docwithnav.html b/_layouts/docwithnav.html index 16b1235bf5..2432c5b795 100755 --- a/_layouts/docwithnav.html +++ b/_layouts/docwithnav.html @@ -48,7 +48,6 @@ (function(d,c,j){if(!document.getElementById(j)){var pd=d.createElement(c),s;pd.id=j;pd.src=('https:'==document.location.protocol)?'https://polldaddy.com/js/rating/rating.js':'http://i0.poll.fm/js/rating/rating.js';s=document.getElementsByTagName(c)[0];s.parentNode.insertBefore(pd,s);}}(document,'script','pd-rating-js')); Create Issue Edit This Page {% endif %} From 53933e173803c03ac5665aecea2fd044c1288b5f Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 29 Sep 2016 13:43:54 -0700 Subject: [PATCH 020/120] Create task page: Assigning Pods to Nodes. --- _data/tasks.yml | 4 + .../administer-cluster/assign-pods-nodes.md | 87 +++++++++++++++++++ docs/tasks/administer-cluster/pod.yaml | 13 +++ docs/tasks/index.md | 3 + docs/tutorials/index.md | 2 +- 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 docs/tasks/administer-cluster/assign-pods-nodes.md create mode 100644 docs/tasks/administer-cluster/pod.yaml diff --git a/_data/tasks.yml b/_data/tasks.yml index 1019671e66..86209a52aa 100644 --- a/_data/tasks.yml +++ b/_data/tasks.yml @@ -10,4 +10,8 @@ toc: section: - title: Using an HTTP Proxy to Access the Kubernetes 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/ diff --git a/docs/tasks/administer-cluster/assign-pods-nodes.md b/docs/tasks/administer-cluster/assign-pods-nodes.md new file mode 100644 index 0000000000..894aeddf7d --- /dev/null +++ b/docs/tasks/administer-cluster/assign-pods-nodes.md @@ -0,0 +1,87 @@ +--- +--- + +{% capture overview %} +This page shows how to use an HTTP proxy to access the Kubernetes API. +{% 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 disktype=ssd + + where is the name of your chosen node. + +1. Verify that your chosen node has a `disktype=ssd` label: + + kubectl get nodes --showlabels + + + 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 %} diff --git a/docs/tasks/administer-cluster/pod.yaml b/docs/tasks/administer-cluster/pod.yaml new file mode 100644 index 0000000000..134ddae2aa --- /dev/null +++ b/docs/tasks/administer-cluster/pod.yaml @@ -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 diff --git a/docs/tasks/index.md b/docs/tasks/index.md index b8fa301fa3..dcd9120e1b 100644 --- a/docs/tasks/index.md +++ b/docs/tasks/index.md @@ -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) +#### Administering a Cluster + +* [Assigning Pods to Nodes](/docs/tasks/administer-cluster/assign-pods-nodes/) ### What's next diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index db1b224364..23400521e7 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -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/) -* [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 From 1a379cd812057d86cea674fedd163946fc934d5b Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 29 Sep 2016 13:52:05 -0700 Subject: [PATCH 021/120] Fix page title. --- docs/tasks/administer-cluster/assign-pods-nodes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/tasks/administer-cluster/assign-pods-nodes.md b/docs/tasks/administer-cluster/assign-pods-nodes.md index 894aeddf7d..4ceb5b0c6b 100644 --- a/docs/tasks/administer-cluster/assign-pods-nodes.md +++ b/docs/tasks/administer-cluster/assign-pods-nodes.md @@ -2,7 +2,8 @@ --- {% capture overview %} -This page shows how to use an HTTP proxy to access the Kubernetes API. +This page shows how to assign a Kubernetes Pod to a particualr node in a +Kubernetes cluster. {% endcapture %} {% capture prerequisites %} From dbbe11e3d36b755e1a37b45792d30f27785f9385 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 29 Sep 2016 15:02:35 -0700 Subject: [PATCH 022/120] Change --showlabels to --show-labels. --- docs/tasks/administer-cluster/assign-pods-nodes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tasks/administer-cluster/assign-pods-nodes.md b/docs/tasks/administer-cluster/assign-pods-nodes.md index 4ceb5b0c6b..1d27c09107 100644 --- a/docs/tasks/administer-cluster/assign-pods-nodes.md +++ b/docs/tasks/administer-cluster/assign-pods-nodes.md @@ -42,7 +42,7 @@ Kubernetes cluster. 1. Verify that your chosen node has a `disktype=ssd` label: - kubectl get nodes --showlabels + kubectl get nodes --show-labels The output is similar to this: From 6377930f5ff3538ab5b1ca197fae8be5636ca74c Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 29 Sep 2016 15:10:49 -0700 Subject: [PATCH 023/120] Fix typo. --- docs/tasks/administer-cluster/assign-pods-nodes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tasks/administer-cluster/assign-pods-nodes.md b/docs/tasks/administer-cluster/assign-pods-nodes.md index 1d27c09107..ddeca0b7f7 100644 --- a/docs/tasks/administer-cluster/assign-pods-nodes.md +++ b/docs/tasks/administer-cluster/assign-pods-nodes.md @@ -2,7 +2,7 @@ --- {% capture overview %} -This page shows how to assign a Kubernetes Pod to a particualr node in a +This page shows how to assign a Kubernetes Pod to a particular node in a Kubernetes cluster. {% endcapture %} From dfc9bd1e5fa504eeba2a06b9a13556bf69baace2 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 29 Sep 2016 20:05:30 -0700 Subject: [PATCH 024/120] Put back ticks around placeholder. --- docs/tasks/administer-cluster/assign-pods-nodes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tasks/administer-cluster/assign-pods-nodes.md b/docs/tasks/administer-cluster/assign-pods-nodes.md index ddeca0b7f7..e966f23e28 100644 --- a/docs/tasks/administer-cluster/assign-pods-nodes.md +++ b/docs/tasks/administer-cluster/assign-pods-nodes.md @@ -38,7 +38,7 @@ Kubernetes cluster. kubectl label nodes disktype=ssd - where is the name of your chosen node. + where `` is the name of your chosen node. 1. Verify that your chosen node has a `disktype=ssd` label: From 95e92ad5476d64e09cd1affeb80befeeb7cc2687 Mon Sep 17 00:00:00 2001 From: Jerzy Szczepkowski Date: Fri, 30 Sep 2016 11:06:51 +0200 Subject: [PATCH 025/120] Updated hpa config file to the latest API version. Updated hpa config file to the latest API version. --- .../horizontal-pod-autoscaling/hpa-php-apache.yaml | 9 ++++----- .../user-guide/horizontal-pod-autoscaling/walkthrough.md | 9 ++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/docs/user-guide/horizontal-pod-autoscaling/hpa-php-apache.yaml b/docs/user-guide/horizontal-pod-autoscaling/hpa-php-apache.yaml index 72d402743d..7ccdcabafd 100644 --- a/docs/user-guide/horizontal-pod-autoscaling/hpa-php-apache.yaml +++ b/docs/user-guide/horizontal-pod-autoscaling/hpa-php-apache.yaml @@ -1,14 +1,13 @@ -apiVersion: extensions/v1beta1 +apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: php-apache namespace: default spec: - scaleRef: + scaleTargetRef: + apiVersion: extensions/v1beta1 kind: Deployment name: php-apache - subresource: scale minReplicas: 1 maxReplicas: 10 - cpuUtilization: - targetPercentage: 50 + targetCPUUtilizationPercentage: 50 diff --git a/docs/user-guide/horizontal-pod-autoscaling/walkthrough.md b/docs/user-guide/horizontal-pod-autoscaling/walkthrough.md index d445b854e4..0f288352a0 100644 --- a/docs/user-guide/horizontal-pod-autoscaling/walkthrough.md +++ b/docs/user-guide/horizontal-pod-autoscaling/walkthrough.md @@ -127,20 +127,19 @@ Here CPU utilization dropped to 0, and so HPA autoscaled the number of replicas Instead of using `kubectl autoscale` command we can use the [hpa-php-apache.yaml](/docs/user-guide/horizontal-pod-autoscaling/hpa-php-apache.yaml) file, which looks like this: ```yaml -apiVersion: extensions/v1beta1 +apiVersion: autoscaling/v1 kind: HorizontalPodAutoscaler metadata: name: php-apache namespace: default spec: - scaleRef: + scaleTargetRef: + apiVersion: extensions/v1beta1 kind: Deployment name: php-apache - subresource: scale minReplicas: 1 maxReplicas: 10 - cpuUtilization: - targetPercentage: 50 + targetCPUUtilizationPercentage: 50 ``` We will create the autoscaler by executing the following command: From b316d1acb38e3ceac782b676dc45db0642e7ae80 Mon Sep 17 00:00:00 2001 From: Cyril Jouve Date: Fri, 30 Sep 2016 17:16:34 +0200 Subject: [PATCH 026/120] update resources available for kubeclt get --- docs/user-guide/kubectl-overview.md | 43 +++++++++++++++++------------ 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index b0a6c5cc5a..57d670bb89 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -85,25 +85,34 @@ The following table includes a list of all the supported resource types and thei Resource type | Abbreviated alias -------------------- | -------------------- -`componentstatuses` | `cs` -`daemonsets` | `ds` -`deployments` | -`events` | `ev` -`endpoints` | `ep` -`horizontalpodautoscalers` | `hpa` -`ingresses` | `ing` +`clusters` | +`componentstatuses` |`cs` +`configmaps` |`cm` +`daemonsets` |`ds` +`deployments` |`deploy` +`endpoints` |`ep` +`events` |`ev` +`horizontalpodautoscalers` |`hpa` +`ingresses` |`ing` `jobs` | -`limitranges` | `limits` -`nodes` | `no` -`namespaces` | `ns` -`pods` | `po` -`persistentvolumes` | `pv` -`persistentvolumeclaims` | `pvc` -`resourcequotas` | `quota` -`replicationcontrollers` | `rc` +`limitranges` |`limits` +`namespaces` |`ns` +`networkpolicies` | +`nodes` |`no` +`persistentvolumeclaims` |`pvc` +`persistentvolumes` |`pv` +`pods` |`po` +`podsecuritypolicies` |`psp` +`podtemplates` | +`replicasets` |`rs` +`replicationcontrollers` |`rc` +`resourcequotas` |`quota` +`scheduledjobs` | `secrets` | -`serviceaccounts` | -`services` | `svc` +`serviceaccounts` |`sa` +`services` |`svc` +`storageclasses` | +`thirdpartyresources` | ## Output options From a6c95792335ba50de05e5d64264134d8cbc7da6f Mon Sep 17 00:00:00 2001 From: scotty Date: Fri, 30 Sep 2016 10:21:03 -0700 Subject: [PATCH 027/120] partners --- _includes/case-study-styles.html | 76 ++++++++++++++++---------------- _sass/_base.sass | 3 +- _sass/_desktop.sass | 2 +- case-studies/index.html | 2 +- case-studies/pearson.html | 2 +- case-studies/wikimedia.html | 2 +- js/script.js | 3 +- partners/index.html | 60 +++++++++++++++++++++++++ 8 files changed, 106 insertions(+), 44 deletions(-) create mode 100644 partners/index.html diff --git a/_includes/case-study-styles.html b/_includes/case-study-styles.html index 7914ef76ac..48058bd27b 100644 --- a/_includes/case-study-styles.html +++ b/_includes/case-study-styles.html @@ -3,40 +3,40 @@ margin-top: 1em !important; } - #caseStudies p { + .gridPage p { color: rgb(26,26,26) !important; margin-left: 0 !important; padding-left: 0 !important; font-weight: 300 !important; } - #caseStudies #mainContent { + .gridPage #mainContent { padding: 0; } - #caseStudies #mainContent .content { + .gridPage #mainContent .content { padding-top: 0; } - #caseStudies main { + .gridPage main { max-width: 1100px !important; } - #caseStudies .content { + .gridPage .content { position: relative; margin: 0 auto 50px; max-width: 90%; } - #caseStudies .content p { + .gridPage .content p { line-height: 24px !important; } - #caseStudies .content h3 { + .gridPage .content h3 { padding: 0 !important; } - #caseStudies #hero h5 { + .gridPage #hero h5 { padding-left: 20px; margin: 0; } @@ -67,7 +67,7 @@ left: 0; } - #caseStudies #mainContent .content .case-study p { + .gridPage #mainContent .content .case-study p { font-family: "Roboto", sans-serif; font-size: 16px; padding: 0; @@ -77,13 +77,13 @@ font-style: italic; } - #caseStudies #video { + .gridPage #video { background: #f9f9f9; height: auto; /*height: 340px;*/ } - #caseStudies #video main { + .gridPage #video main { position: relative; max-width: 900px !important; height: 100%; @@ -93,19 +93,19 @@ padding: 50px 20px; } - #caseStudies #video main > div { + .gridPage #video main > div { width: 50%; } - #caseStudies #video main #zulilyLogo { + .gridPage #video main #zulilyLogo { width: 100px; } - #caseStudies #video main img { + .gridPage #video main img { max-width: 100%; } - #caseStudies #video h3 { + .gridPage #video h3 { font-size: 32px; font-weight: 300; line-height: 38px; @@ -113,57 +113,57 @@ margin: 0 0 1em 0; } - #caseStudies #video p { + .gridPage #video p { margin: 0; } - #caseStudies #video p.attrib { + .gridPage #video p.attrib { margin-bottom: 20px; } - #caseStudies #video button > h6 { + .gridPage #video button > h6 { font-size: 18px; font-weight: 500; margin: 1em 0; color: #326de6; } - #caseStudies #users { + .gridPage #users { padding: 50px; } - #caseStudies #users main { + .gridPage #users main { max-width: 1150px !important; } - #caseStudies #users main h3 { + .gridPage #users main h3 { padding-left: 20px; margin-bottom: 20px; } - #caseStudies #usersGrid { + .gridPage #usersGrid { position: relative; display: flex; flex-wrap: wrap; justify-content: center; } - #caseStudies #usersGrid a { + .gridPage #usersGrid a { display: inline-block; margin: 5px; } - #caseStudies #usersGrid a img { + .gridPage #usersGrid a img { box-shadow: 1px 1px 2px transparent; transition: box-shadow 0.25s; } - #caseStudies #usersGrid a img:hover { + .gridPage #usersGrid a img:hover { box-shadow: 1px 1px 2px #cccccc; } - #caseStudies #usersGrid a:last-child img, - #caseStudies #usersGrid a:last-child img:hover { + .gridPage #usersGrid a:last-child img, + .gridPage #usersGrid a:last-child img:hover { box-shadow: 1px 1px 2px transparent; } @@ -173,12 +173,12 @@ box-shadow: 1px 2px 2px #dddddd; } - #caseStudies .feature { + .gridPage .feature { position: relative; padding: 20px 0 20px 242px; } - #caseStudies .feature img { + .gridPage .feature img { position: absolute; top: 20px; left: 0; @@ -225,7 +225,7 @@ margin-bottom: 0.5em; } - #caseStudies .feature p.quote { + .gridPage .feature p.quote { font-size: 20px; line-height: 28px !important; } @@ -250,20 +250,20 @@ } @media screen and (max-width: 900px){ - #caseStudies #video main { + .gridPage #video main { flex-direction: column; align-items: center; } - #caseStudies #video main > div { + .gridPage #video main > div { width: 400px; } - #caseStudies #video main > div + div { + .gridPage #video main > div + div { margin-top: 30px; } - #caseStudies #video h3 { + .gridPage #video h3 { max-width: 100%; } } @@ -282,12 +282,12 @@ transform: translateX(-50%); } - #caseStudies .feature { + .gridPage .feature { margin-top: 50px; padding: 180px 0 0; } - #caseStudies .feature img { + .gridPage .feature img { top: 0; left: 50%; transform: translateX(-50%); @@ -295,12 +295,12 @@ } @media screen and (max-width: 480px){ - #caseStudies #hero { + .gridPage #hero { padding-right: 20px; padding-left: 20px; } - #caseStudies #video main > div { + .gridPage #video main > div { width: 80%; min-width: 280px; } diff --git a/_sass/_base.sass b/_sass/_base.sass index 91d47a6b48..a8ac4b47c4 100644 --- a/_sass/_base.sass +++ b/_sass/_base.sass @@ -1131,7 +1131,7 @@ $feature-box-div-margin-bottom: 40px // Community -#community, #caseStudies +#community, .gridPage &.open-nav, &.flip-nav .logo background-image: url(/images/nav_logo2.svg) @@ -1340,3 +1340,4 @@ $feature-box-div-margin-bottom: 40px // // // +// \ No newline at end of file diff --git a/_sass/_desktop.sass b/_sass/_desktop.sass index 7faddf913c..033e998ba0 100644 --- a/_sass/_desktop.sass +++ b/_sass/_desktop.sass @@ -270,7 +270,7 @@ $video-section-height: 550px - #community, #caseStudies + #community, .gridPage #hero text-align: left diff --git a/case-studies/index.html b/case-studies/index.html index 8b0ffea42c..4b92adb805 100644 --- a/case-studies/index.html +++ b/case-studies/index.html @@ -3,7 +3,7 @@ title: Case Studies --- - + {% include head-header.html %}
diff --git a/case-studies/pearson.html b/case-studies/pearson.html index 8625707f11..bf871789b9 100644 --- a/case-studies/pearson.html +++ b/case-studies/pearson.html @@ -3,7 +3,7 @@ title: Pearson Case Study --- - + {% include head-header.html %}
diff --git a/case-studies/wikimedia.html b/case-studies/wikimedia.html index c725ca7683..00eb47e3e0 100644 --- a/case-studies/wikimedia.html +++ b/case-studies/wikimedia.html @@ -3,7 +3,7 @@ title: Wikimedia Case Study --- - + {% include head-header.html %}
diff --git a/js/script.js b/js/script.js index 99574e7f83..22eff0a1b4 100755 --- a/js/script.js +++ b/js/script.js @@ -135,8 +135,9 @@ var kub = (function () { // case 'caseStudies': bodyHeight = windowHeight; break; - + case 'caseStudies': + case 'partners': bodyHeight = windowHeight * 2; break; diff --git a/partners/index.html b/partners/index.html new file mode 100644 index 0000000000..c47f0998a7 --- /dev/null +++ b/partners/index.html @@ -0,0 +1,60 @@ +--- +title: Partners +--- + + + +{% include head-header.html %} + +
+

Kubernetes Partners

+
Growing the Kubernetes ecosystem.
+ +
+ +
+
+
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.
+

ISV Partners

+
+ + + + + + + + + + + + + + + + + + + + +
+
+
+ + +{% include footer.html %} +{% include case-study-styles.html %} + + + From 5eff46b03577eb4f1d6fe6b2da1dc760acbb67e4 Mon Sep 17 00:00:00 2001 From: "Tim St. Clair" Date: Fri, 30 Sep 2016 11:13:07 -0700 Subject: [PATCH 028/120] Fix links to AppArmor policy references --- docs/admin/apparmor/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/admin/apparmor/index.md b/docs/admin/apparmor/index.md index 395aba1989..9730c07953 100644 --- a/docs/admin/apparmor/index.md +++ b/docs/admin/apparmor/index.md @@ -349,8 +349,8 @@ logs or through `journalctl`. More information is provided in Additional resources: -- http://wiki.apparmor.net/index.php/QuickProfileLanguage -- http://wiki.apparmor.net/index.php/ProfileLanguage +- [Quick guide to the AppArmor profile language](http://wiki.apparmor.net/index.php/QuickProfileLanguage) +- [AppArmor core policy reference](http://wiki.apparmor.net/index.php/ProfileLanguage) ## API Reference From 5d80dec66e1c82883ed2c2bd6df7c2da4bc24567 Mon Sep 17 00:00:00 2001 From: Chao Xu Date: Sun, 2 Oct 2016 22:11:04 -0700 Subject: [PATCH 029/120] fix newlines --- docs/user-guide/garbage-collection.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/user-guide/garbage-collection.md b/docs/user-guide/garbage-collection.md index bae6ed442f..2dc8e0c36a 100644 --- a/docs/user-guide/garbage-collection.md +++ b/docs/user-guide/garbage-collection.md @@ -32,5 +32,7 @@ Synchronous garbage collection will be supported in 1.5 (tracking [issue](https: If you specify `deleteOptions.orphanDependents=true`, or leave it blank, then the GC will first reset the `ownerReferences` in the dependents, then delete the owner. Note that the deletion of the owner object is asynchronous, that is, a 200 OK response will be sent by the API server before the owner object gets deleted. ### Other references + [Design Doc](https://github.com/kubernetes/kubernetes/blob/master/docs/proposals/garbage-collection.md) + [Known issues](https://github.com/kubernetes/kubernetes/issues/26120) From a163701fc43497368d61e54364995654220aa20b Mon Sep 17 00:00:00 2001 From: Simen Bekkhus Date: Mon, 3 Oct 2016 10:51:38 +0200 Subject: [PATCH 030/120] Update rolling-updates.md --- docs/user-guide/rolling-updates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/rolling-updates.md b/docs/user-guide/rolling-updates.md index 63d3622c89..c9ba5d3d27 100644 --- a/docs/user-guide/rolling-updates.md +++ b/docs/user-guide/rolling-updates.md @@ -12,7 +12,7 @@ assignees: To update a service without an outage, `kubectl` supports what is called ['rolling update'](/docs/user-guide/kubectl/kubectl_rolling-update), which updates one pod at a time, rather than taking down the entire service at the same time. See the [rolling update design document](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/design/simple-rolling-update.md) and the [example of rolling update](/docs/user-guide/update-demo/) for more information. Note that `kubectl rolling-update` only supports Replication Controllers. However, if you deploy applications with Replication Controllers, -consider switching them to [Deployments](/docs/user-guide/deployments/). A Deployments is a higher-level controller that automates rolling updates +consider switching them to [Deployments](/docs/user-guide/deployments/). A Deployment is a higher-level controller that automates rolling updates of applications declaratively, and therefore is recommended. If you still want to keep your Replication Controllers and use `kubectl rolling-update`, keep reading: A rolling update applies changes to the configuration of pods being managed by From 485fb3e788572cf39da58d85a86a08bdfc057bc8 Mon Sep 17 00:00:00 2001 From: Jonathan Boulle Date: Mon, 3 Oct 2016 20:27:18 +0200 Subject: [PATCH 031/120] docs/pods: update reference to pets Now that PetSets are implemented we can link there. --- docs/user-guide/pods/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/user-guide/pods/index.md b/docs/user-guide/pods/index.md index 4c16b66074..b5de192d83 100644 --- a/docs/user-guide/pods/index.md +++ b/docs/user-guide/pods/index.md @@ -150,7 +150,9 @@ Pod is exposed as a primitive in order to facilitate: * clean composition of Kubelet-level functionality with cluster-level functionality — Kubelet is effectively the "pod controller" * high-availability applications, which will expect pods to be replaced in advance of their termination and certainly in advance of deletion, such as in the case of planned evictions, image prefetching, or live pod migration [#3949](http://issue.k8s.io/3949) -The current best practice for pets is to create a replication controller with `replicas` equal to `1` and a corresponding service. If you find this cumbersome, please comment on [issue #260](http://issue.k8s.io/260). +There is new first-class support for pet-like pods with the [PetSet](/docs/user-guide/petset/) feature (currently in alpha). +For prior versions of Kubernetes, best practice for pets is to create a replication controller with `replicas` equal to `1` and a corresponding service. + ## Termination of Pods From c848bf0487da82d80e63e5d5a5f7c3ee6c5650b2 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 4 Oct 2016 11:55:33 +0100 Subject: [PATCH 032/120] Demo app is now in different namespace Change instructions to show use of 'sock-shop' namespace rather than default. --- docs/getting-started-guides/kubeadm.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index 6852438004..86de0652c2 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -182,9 +182,9 @@ To learn more about the sample microservices app, see the [GitHub README](https: You can then find out the port that the [NodePort feature of services](/docs/user-guide/services/) allocated for the front-end service by running: - # kubectl describe svc front-end + # kubectl describe svc front-end -n sock-shop Name: front-end - Namespace: default + Namespace: sock-shop Labels: name=front-end Selector: name=front-end Type: NodePort @@ -194,7 +194,7 @@ You can then find out the port that the [NodePort feature of services](/docs/use Endpoints: Session Affinity: None -It takes several minutes to download and start all the containers, watch the output of `kubectl get pods` to see when they're all up and running. +It takes several minutes to download and start all the containers, watch the output of `kubectl get pods -n sock-shop` to see when they're all up and running. Then go to the IP address of your cluster's master node in your browser, and specify the given port. So for example, `http://:`. From bdb7016f41e1466d8c813c8d7f62d1d632113716 Mon Sep 17 00:00:00 2001 From: Jeff Peeler Date: Tue, 4 Oct 2016 16:37:24 -0400 Subject: [PATCH 033/120] Fix incorrect wording with secrets 1) The example given in the section "Using Secrets as Environment Variables" incorrectly stated the secret was using a volume. 2) The commands used to produce secrets in the section "Use-Case: Pods with prod / test credentials" has been modified such that the literal used matches the text for what expected files should be on the filesystem (changed user to username). --- docs/user-guide/secrets/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/secrets/index.md b/docs/user-guide/secrets/index.md index ab8eb9388e..4da56a3cca 100644 --- a/docs/user-guide/secrets/index.md +++ b/docs/user-guide/secrets/index.md @@ -377,7 +377,7 @@ To use a secret in an environment variable in a pod: 1. Modify your Pod definition in each container that you wish to consume the value of a secret key to add an environment variable for each secret key you wish to consume. The environment variable that consumes the secret key should populate the secret's name and key in `env[x].valueFrom.secretKeyRef`. 1. Modify your image and/or command line so that the program looks for values in the specified environment variables -This is an example of a pod that mounts a secret in a volume: +This is an example of a pod that uses secrets from environment variables: ```yaml apiVersion: v1 @@ -543,9 +543,9 @@ credentials. Make the secrets: ```shell -$ kubectl create secret generic prod-db-secret --from-literal=user=produser --from-literal=password=Y4nys7f11 +$ kubectl create secret generic prod-db-secret --from-literal=username=produser --from-literal=password=Y4nys7f11 secret "prod-db-secret" created -$ kubectl create secret generic test-db-secret --from-literal=user=testuser --from-literal=password=iluvtests +$ kubectl create secret generic test-db-secret --from-literal=username=testuser --from-literal=password=iluvtests secret "test-db-secret" created ``` From bdb0eabcbc44e6d62cbc5e5ebec3e8857a28cc4a Mon Sep 17 00:00:00 2001 From: joshrosso Date: Wed, 5 Oct 2016 02:12:29 +0000 Subject: [PATCH 034/120] Correct case used in CoreOS hyperlink in getting-started-guides Minor typo fix to ensure 'CoreOS' case is correct and consistent throughout getting-started-guides. --- docs/getting-started-guides/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started-guides/index.md b/docs/getting-started-guides/index.md index ec5eb98759..9c9a8279bf 100644 --- a/docs/getting-started-guides/index.md +++ b/docs/getting-started-guides/index.md @@ -70,7 +70,7 @@ writing a new solution](https://github.com/kubernetes/kubernetes/tree/{{page.git These solutions are combinations of cloud provider and OS not covered by the above solutions. -- [AWS + coreos](/docs/getting-started-guides/coreos) +- [AWS + CoreOS](/docs/getting-started-guides/coreos) - [GCE + CoreOS](/docs/getting-started-guides/coreos) - [AWS + Ubuntu](/docs/getting-started-guides/juju) - [Joyent + Ubuntu](/docs/getting-started-guides/juju) From ba6747a284c8c6b207505fb7365fca55d8384f9b Mon Sep 17 00:00:00 2001 From: Cyril Jouve Date: Wed, 5 Oct 2016 18:54:58 +0200 Subject: [PATCH 035/120] remove scheduledjobs (alpha) --- docs/user-guide/kubectl-overview.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index 57d670bb89..367aaba102 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -107,7 +107,6 @@ Resource type | Abbreviated alias `replicasets` |`rs` `replicationcontrollers` |`rc` `resourcequotas` |`quota` -`scheduledjobs` | `secrets` | `serviceaccounts` |`sa` `services` |`svc` From 19e61ec1d66d07a8a9a3efbfe85923365ffb57a0 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Wed, 28 Sep 2016 17:19:08 -0400 Subject: [PATCH 036/120] Describe anonymous access, system:authenticated group --- docs/admin/authentication.md | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/docs/admin/authentication.md b/docs/admin/authentication.md index 0be8b50db8..a6281d1936 100644 --- a/docs/admin/authentication.md +++ b/docs/admin/authentication.md @@ -25,10 +25,11 @@ manually through API calls. Service accounts are tied to a set of credentials stored as `Secrets`, which are mounted into pods allowing in cluster processes to talk to the Kubernetes API. -All API requests are tied to either a normal user or a service account. This -means every process inside or outside the cluster, from a human user typing -`kubectl` on a workstation, to `kubelets` on nodes, to members of the control -plane, must authenticate when making requests to the the API server. +API requests are tied to either a normal user or a service account, or are treated +as anonymous requests. This means every process inside or outside the cluster, from +a human user typing `kubectl` on a workstation, to `kubelets` on nodes, to members +of the control plane, must authenticate when making requests to the the API server, +or be treated as an anonymous user. ## Authentication strategies @@ -54,6 +55,8 @@ When multiple are enabled, the first authenticator module to successfully authenticate the request short-circuits evaluation. The API server does not guarantee the order authenticators run in. +The `system:authenticated` group is included in the list of groups for all authenticated users. + ### X509 Client Certs Client certificate authentication is enabled by passing the `--client-ca-file=SOMEFILE` @@ -363,6 +366,22 @@ Please refer to the [discussion](https://github.com/kubernetes/kubernetes/pull/1 [blueprint](https://github.com/kubernetes/kubernetes/issues/11626) and [proposed changes](https://github.com/kubernetes/kubernetes/pull/25536) for more details. +## Anonymous requests + +Anonymous access is enabled by default, and can be disabled by passing `--anonymous-auth=false` +option to the API server during startup. + +When enabled, requests that are not rejected by other configured authentication methods are +treated as anonymous requests, and given a username of `system:anonymous` and a group of +`system:unauthenticated`. + +For example, on a server with token authentication configured, and anonymous access enabled, +a request providing an invalid bearer token would receive a `401 Unauthorized` error. +A request providing no bearer token would be treated as an anonymous request. + +If you rely on authentication alone to authorize access, either change to use an +authorization mode other than `AlwaysAllow`, or set `--anonymous-auth=false`. + ## Plugin Development We plan for the Kubernetes API server to issue tokens after the user has been From a1d122f85b61bfb98214dcbb024576c67e65d626 Mon Sep 17 00:00:00 2001 From: Theotime Leveque Date: Wed, 5 Oct 2016 15:37:47 -0400 Subject: [PATCH 037/120] Fix kubectl 404 --- docs/user-guide/accessing-the-cluster.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/accessing-the-cluster.md b/docs/user-guide/accessing-the-cluster.md index c42adb4c6e..6f78ab5293 100644 --- a/docs/user-guide/accessing-the-cluster.md +++ b/docs/user-guide/accessing-the-cluster.md @@ -27,7 +27,7 @@ $ kubectl config view ``` Many of the [examples](https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/examples/) provide an introduction to using -kubectl and complete documentation is found in the [kubectl manual](/docs/user-guide/kubectl/kubectl). +kubectl and complete documentation is found in the [kubectl manual](/docs/user-guide/kubectl/index). ### Directly accessing the REST API From 2f634cb8a604598914a0a3e607ba8e0f11f28eac Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Mon, 29 Aug 2016 11:11:31 -0700 Subject: [PATCH 038/120] Add docs for 3rd-party tools --- docs/user-guide/third-party-tools.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 docs/user-guide/third-party-tools.md diff --git a/docs/user-guide/third-party-tools.md b/docs/user-guide/third-party-tools.md new file mode 100644 index 0000000000..dd54a94181 --- /dev/null +++ b/docs/user-guide/third-party-tools.md @@ -0,0 +1,27 @@ +--- +assignees: +- janetkuo + +--- + +* TOC +{:toc} + +## Helm + +[Kubernetes Helm](https://github.com/kubernetes/helm) is a tool for managing packages of pre-configured +Kubernetes resources, aka Kubernetes charts. + +Use Helm to: + +* Find and use popular software packaged as Kubernetes charts +* Share your own applications as Kubernetes charts +* Create reproducible builds of your Kubernetes applications +* Intelligently manage your Kubernetes manifest files +* Manage releases of Helm packages + +## Kompose + +[`kompose`](https://github.com/skippbox/kompose) is a tool to help users familiar with `docker-compose` +move to Kubernetes. It takes a Docker Compose file and translates it into Kubernetes objects. `kompose` +is a convenient tool to go from local Docker development to managing your application with Kubernetes. From bfc93d17796185adf5623948d76a74f2a1cc18c3 Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Tue, 27 Sep 2016 16:06:18 -0700 Subject: [PATCH 039/120] Add Tools top nav and move 3rd party doc under it --- _data/globals.yml | 1 + _data/tools.yml | 6 ++++++ _layouts/docwithnav.html | 1 + docs/tools/index.md | 9 +++++++++ docs/{user-guide => tools}/third-party-tools.md | 0 5 files changed, 17 insertions(+) create mode 100644 _data/tools.yml create mode 100644 docs/tools/index.md rename docs/{user-guide => tools}/third-party-tools.md (100%) diff --git a/_data/globals.yml b/_data/globals.yml index c83dae26dd..73978ea750 100644 --- a/_data/globals.yml +++ b/_data/globals.yml @@ -4,5 +4,6 @@ tocs: - tasks - concepts - reference +- tools - samples - support diff --git a/_data/tools.yml b/_data/tools.yml new file mode 100644 index 0000000000..a6c03cdf6f --- /dev/null +++ b/_data/tools.yml @@ -0,0 +1,6 @@ +bigheader: "Tools" +toc: +- title: Tools + path: /docs/tools/ +- title: Third-Party Tools + path: /docs/tools/third-party-tools/ diff --git a/_layouts/docwithnav.html b/_layouts/docwithnav.html index 2432c5b795..c2f74c1bb4 100755 --- a/_layouts/docwithnav.html +++ b/_layouts/docwithnav.html @@ -16,6 +16,7 @@
  • TASKS
  • CONCEPTS
  • REFERENCE
  • +
  • TOOLS
  • SAMPLES
  • SUPPORT
  • diff --git a/docs/tools/index.md b/docs/tools/index.md new file mode 100644 index 0000000000..9f4e57ec76 --- /dev/null +++ b/docs/tools/index.md @@ -0,0 +1,9 @@ +--- +--- + +The Tools section of the Kubernetes documentation is a work in progress + +#### Third-Party Tools + +* [Recommended third-party tools, including Helm and Kompose](/docs/tasks/third-party-tools) + diff --git a/docs/user-guide/third-party-tools.md b/docs/tools/third-party-tools.md similarity index 100% rename from docs/user-guide/third-party-tools.md rename to docs/tools/third-party-tools.md From e44f4a2d5c26e0998e9ab42e86b33f9561df0efc Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Wed, 5 Oct 2016 14:24:14 -0700 Subject: [PATCH 040/120] Remove third-party page and make one page for all tools --- _data/tools.yml | 2 -- docs/tools/index.md | 37 ++++++++++++++++++++++++++++++--- docs/tools/third-party-tools.md | 27 ------------------------ 3 files changed, 34 insertions(+), 32 deletions(-) delete mode 100644 docs/tools/third-party-tools.md diff --git a/_data/tools.yml b/_data/tools.yml index a6c03cdf6f..8993e091bb 100644 --- a/_data/tools.yml +++ b/_data/tools.yml @@ -2,5 +2,3 @@ bigheader: "Tools" toc: - title: Tools path: /docs/tools/ -- title: Third-Party Tools - path: /docs/tools/third-party-tools/ diff --git a/docs/tools/index.md b/docs/tools/index.md index 9f4e57ec76..31d5fe985e 100644 --- a/docs/tools/index.md +++ b/docs/tools/index.md @@ -1,9 +1,40 @@ --- +assignees: +- janetkuo + --- -The Tools section of the Kubernetes documentation is a work in progress +* TOC +{:toc} -#### Third-Party Tools +## Native Tools -* [Recommended third-party tools, including Helm and Kompose](/docs/tasks/third-party-tools) +### Kubectl +[`kubectl`](docs/user-guide/kubectl/) is the command line tool for Kubernetes. It controls the Kubernetes cluster manager. + +### Dashboard + +[Dashboard](docs/user-guide/ui/), the web-based user interface of Kubernetes, allows you to deploy containerized applications +to a Kubernetes cluster, troubleshoot them, and manage the cluster and its resources itself. + +## Third-Party Tools + +### Helm + +[Kubernetes Helm](https://github.com/kubernetes/helm) is a tool for managing packages of pre-configured +Kubernetes resources, aka Kubernetes charts. + +Use Helm to: + +* Find and use popular software packaged as Kubernetes charts +* Share your own applications as Kubernetes charts +* Create reproducible builds of your Kubernetes applications +* Intelligently manage your Kubernetes manifest files +* Manage releases of Helm packages + +### Kompose + +[`kompose`](https://github.com/skippbox/kompose) is a tool to help users familiar with `docker-compose` +move to Kubernetes. It takes a Docker Compose file and translates it into Kubernetes objects. `kompose` +is a convenient tool to go from local Docker development to managing your application with Kubernetes. diff --git a/docs/tools/third-party-tools.md b/docs/tools/third-party-tools.md deleted file mode 100644 index dd54a94181..0000000000 --- a/docs/tools/third-party-tools.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -assignees: -- janetkuo - ---- - -* TOC -{:toc} - -## Helm - -[Kubernetes Helm](https://github.com/kubernetes/helm) is a tool for managing packages of pre-configured -Kubernetes resources, aka Kubernetes charts. - -Use Helm to: - -* Find and use popular software packaged as Kubernetes charts -* Share your own applications as Kubernetes charts -* Create reproducible builds of your Kubernetes applications -* Intelligently manage your Kubernetes manifest files -* Manage releases of Helm packages - -## Kompose - -[`kompose`](https://github.com/skippbox/kompose) is a tool to help users familiar with `docker-compose` -move to Kubernetes. It takes a Docker Compose file and translates it into Kubernetes objects. `kompose` -is a convenient tool to go from local Docker development to managing your application with Kubernetes. From fb84c95af60f015318555bdcea7f1c213862cc9f Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Tue, 4 Oct 2016 19:17:14 -0700 Subject: [PATCH 041/120] Change name to Kubernetes Basics. Compress introduction to each step. --- _data/tutorials.yml | 38 +++++------- .../getting-started/create-cluster.html | 47 --------------- .../tutorials/getting-started/deploy-app.html | 52 ----------------- .../getting-started/explore-app.html | 53 ----------------- .../tutorials/getting-started/expose-app.html | 54 ------------------ docs/tutorials/getting-started/scale-app.html | 52 ----------------- .../tutorials/getting-started/update-app.html | 54 ------------------ .../cluster-interactive.html | 10 +--- .../cluster-intro.html | 22 +++---- .../deploy-interactive.html | 9 +-- .../deploy-intro.html | 21 +++---- .../explore-interactive.html | 9 +-- .../explore-intro.html | 27 ++++----- .../expose-interactive.html | 10 +--- .../expose-intro.html | 25 ++++---- .../index.html | 14 ++--- .../public/css/styles.css | 0 .../public/images/badge-01.svg | 0 .../public/images/badge-02.svg | 0 .../public/images/badge-03.svg | 0 .../public/images/badge-04.svg | 0 .../public/images/badge-05.svg | 0 .../public/images/badge-06.svg | 0 .../public/images/badge-07.svg | 0 .../public/images/badge-08.svg | 0 .../public/images/badge-09.svg | 0 .../public/images/badge-1.png | Bin .../public/images/dislike.svg | 0 .../public/images/like.svg | 0 .../public/images/logo.png | Bin .../public/images/logo.svg | 0 .../public/images/logo_2.svg | 0 .../public/images/logo_mobile.png | Bin .../public/images/module_01.svg | 0 .../public/images/module_01_cluster.svg | 0 .../public/images/module_02.svg | 0 .../public/images/module_02_first_app.svg | 0 .../public/images/module_03.svg | 0 .../public/images/module_03_nodes.svg | 0 .../public/images/module_03_pods.svg | 0 .../public/images/module_04.svg | 0 .../public/images/module_04_labels.svg | 0 .../public/images/module_04_services.svg | 0 .../public/images/module_05.svg | 0 .../public/images/module_05_scaling1.svg | 0 .../public/images/module_05_scaling2.svg | 0 .../public/images/module_06.svg | 0 .../images/module_06_rollingupdates1.svg | 0 .../images/module_06_rollingupdates2.svg | 0 .../images/module_06_rollingupdates3.svg | 0 .../images/module_06_rollingupdates4.svg | 0 .../public/images/nav_point.png | Bin .../public/images/nav_point.svg | 0 .../public/images/nav_point_active.png | Bin .../public/images/nav_point_active.svg | 0 .../public/images/nav_point_sub.svg | 0 .../public/images/quiz_false.png | Bin .../public/images/quiz_true.png | Bin .../public/images/twitter.png | Bin .../scale-interactive.html | 10 +--- .../scale-intro.html | 23 ++++---- .../update-interactive.html | 8 +-- .../update-intro.html | 27 ++++----- 63 files changed, 108 insertions(+), 457 deletions(-) delete mode 100644 docs/tutorials/getting-started/create-cluster.html delete mode 100644 docs/tutorials/getting-started/deploy-app.html delete mode 100644 docs/tutorials/getting-started/explore-app.html delete mode 100644 docs/tutorials/getting-started/expose-app.html delete mode 100644 docs/tutorials/getting-started/scale-app.html delete mode 100644 docs/tutorials/getting-started/update-app.html rename docs/tutorials/{getting-started => kubernetes-basics}/cluster-interactive.html (60%) rename docs/tutorials/{getting-started => kubernetes-basics}/cluster-intro.html (87%) rename docs/tutorials/{getting-started => kubernetes-basics}/deploy-interactive.html (61%) rename docs/tutorials/{getting-started => kubernetes-basics}/deploy-intro.html (85%) rename docs/tutorials/{getting-started => kubernetes-basics}/explore-interactive.html (61%) rename docs/tutorials/{getting-started => kubernetes-basics}/explore-intro.html (82%) rename docs/tutorials/{getting-started => kubernetes-basics}/expose-interactive.html (61%) rename docs/tutorials/{getting-started => kubernetes-basics}/expose-intro.html (86%) rename docs/tutorials/{getting-started => kubernetes-basics}/index.html (75%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/css/styles.css (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-01.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-02.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-03.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-04.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-05.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-06.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-07.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-08.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-09.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/badge-1.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/dislike.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/like.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/logo.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/logo.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/logo_2.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/logo_mobile.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_01.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_01_cluster.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_02.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_02_first_app.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_03.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_03_nodes.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_03_pods.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_04.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_04_labels.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_04_services.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_05.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_05_scaling1.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_05_scaling2.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_06.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_06_rollingupdates1.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_06_rollingupdates2.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_06_rollingupdates3.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/module_06_rollingupdates4.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/nav_point.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/nav_point.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/nav_point_active.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/nav_point_active.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/nav_point_sub.svg (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/quiz_false.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/quiz_true.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/public/images/twitter.png (100%) rename docs/tutorials/{getting-started => kubernetes-basics}/scale-interactive.html (62%) rename docs/tutorials/{getting-started => kubernetes-basics}/scale-intro.html (83%) rename docs/tutorials/{getting-started => kubernetes-basics}/update-interactive.html (68%) rename docs/tutorials/{getting-started => kubernetes-basics}/update-intro.html (81%) diff --git a/_data/tutorials.yml b/_data/tutorials.yml index 9e3b79c8a2..465b0575d8 100644 --- a/_data/tutorials.yml +++ b/_data/tutorials.yml @@ -2,56 +2,44 @@ bigheader: "Tutorials" toc: - title: Tutorials path: /docs/tutorials/ -- title: Getting Started +- title: Kubernetes Basics section: - title: 1. Create a Cluster section: - - title: Creating a Cluster - path: /docs/tutorials/getting-started/create-cluster/ - title: Using Minikube to Create a Cluster - path: /docs/tutorials/getting-started/cluster-intro/ + path: /docs/tutorials/kubernetes-basics/cluster-intro/ - title: Interactive Tutorial - Creating a Cluster - path: /docs/tutorials/getting-started/cluster-interactive/ + path: /docs/tutorials/kubernetes-basics/cluster-interactive/ - title: 2. Deploy an App section: - - title: Deploying an App - path: /docs/tutorials/getting-started/deploy-app/ - title: Using kubectl to Create a Deployment - path: /docs/tutorials/getting-started/deploy-intro/ + path: /docs/tutorials/kubernetes-basics/deploy-intro/ - title: Interactive Tutorial - Deploying an App - path: /docs/tutorials/getting-started/deploy-interactive/ + path: /docs/tutorials/kubernetes-basics/deploy-interactive/ - title: 3. Explore Your App section: - - title: Exploring Your App - path: /docs/tutorials/getting-started/explore-app/ - title: Viewing Pods and Nodes - path: /docs/tutorials/getting-started/explore-intro/ + path: /docs/tutorials/kubernetes-basics/explore-intro/ - title: Interactive Tutorial - Exploring Your App - path: /docs/tutorials/getting-started/explore-interactive/ + path: /docs/tutorials/kubernetes-basics/explore-interactive/ - title: 4. Expose Your App Publicly section: - - title: Exposing Your App Publicly - path: /docs/tutorials/getting-started/expose-app/ - title: Using a Service to Expose Your App - path: /docs/tutorials/getting-started/expose-intro/ + path: /docs/tutorials/kubernetes-basics/expose-intro/ - title: Interactive Tutorial - Exposing Your App - path: /docs/tutorials/getting-started/expose-interactive/ + path: /docs/tutorials/kubernetes-basics/expose-interactive/ - title: 5. Scale Your App section: - - title: Scaling Your App - path: /docs/tutorials/getting-started/scale-app/ - title: Running Multiple Instances of Your App - path: /docs/tutorials/getting-started/scale-intro/ + path: /docs/tutorials/kubernetes-basics/scale-intro/ - title: Interactive Tutorial - Scaling Your App - path: /docs/tutorials/getting-started/scale-interactive/ + path: /docs/tutorials/kubernetes-basics/scale-interactive/ - title: 6. Update Your App section: - - title: Updating Your App - path: /docs/tutorials/getting-started/update-app/ - title: Performing a Rolling Update - path: /docs/tutorials/getting-started/update-intro/ + path: /docs/tutorials/kubernetes-basics/update-intro/ - title: Interactive Tutorial - Updating Your App - path: /docs/tutorials/getting-started/update-interactive/ + path: /docs/tutorials/kubernetes-basics/update-interactive/ - title: Stateless Applications section: - title: Running a Stateless Application Using a Deployment diff --git a/docs/tutorials/getting-started/create-cluster.html b/docs/tutorials/getting-started/create-cluster.html deleted file mode 100644 index 42c22f90e8..0000000000 --- a/docs/tutorials/getting-started/create-cluster.html +++ /dev/null @@ -1,47 +0,0 @@ ---- ---- - - - - - - - - - -
    - -
    - -
    -
    -

    Module overview

    -
      -
    • learn what a Kubernetes cluster is
    • -
    • learn what minikube is
    • -
    • start a Kubernetes cluster using an online terminal
    • -
    -

    -
    -
    -
    -

    What you need to know first

    -

    - Before you do this tutorial, you should be familiar with Linux containers. -

    -
    -
    -
    - - - -
    - -
    - - - diff --git a/docs/tutorials/getting-started/deploy-app.html b/docs/tutorials/getting-started/deploy-app.html deleted file mode 100644 index e60081b601..0000000000 --- a/docs/tutorials/getting-started/deploy-app.html +++ /dev/null @@ -1,52 +0,0 @@ ---- ---- - - - - - - - - - -
    - -
    - -
    -
    - Back -
    -
    - -
    -
    -

    Module overview

    -
      -
    • Learn about application Deployments
    • -
    • Deploy your first app on Kubernetes with Kubectl
    • -
    -

    -
    -
    -
    -

    What you need to know first

    -

    - How to start a Kubernetes cluster with minikube
    -

    -
    -
    -
    - - - -
    - -
    - - - diff --git a/docs/tutorials/getting-started/explore-app.html b/docs/tutorials/getting-started/explore-app.html deleted file mode 100644 index bc18696e81..0000000000 --- a/docs/tutorials/getting-started/explore-app.html +++ /dev/null @@ -1,53 +0,0 @@ ---- ---- - - - - - - - - - -
    - -
    - -
    -
    - Back -
    -
    - -
    -
    -

    Module overview

    -
      -
    • Learn about Kubernetes Pods
    • -
    • Learn about Kubernetes Nodes
    • -
    • Troubleshoot deployed applications
    • -
    -

    -
    -
    -
    -

    What you need to know first

    -

    - What are Deployments
    - How to deploy applications on Kubernetes -

    -
    -
    -
    - - -
    - -
    - - - diff --git a/docs/tutorials/getting-started/expose-app.html b/docs/tutorials/getting-started/expose-app.html deleted file mode 100644 index 04e8300b91..0000000000 --- a/docs/tutorials/getting-started/expose-app.html +++ /dev/null @@ -1,54 +0,0 @@ ---- ---- - - - - - - - - - -
    - -
    - -
    -
    - Back -
    -
    - -
    -
    -

    Module overview

    -
      -
    • Services
    • -
    • Learn about Kubernetes Labels
    • -
    • Exposing applications outside Kubernetes
    • -
    -

    -
    -
    -
    -

    What you need to know first

    -

    - How to deploy apps on Kubernetes
    - How to troubleshoot applications with Kubectl -

    -
    -
    -
    - - - -
    - -
    - - - diff --git a/docs/tutorials/getting-started/scale-app.html b/docs/tutorials/getting-started/scale-app.html deleted file mode 100644 index 4996dd3cd4..0000000000 --- a/docs/tutorials/getting-started/scale-app.html +++ /dev/null @@ -1,52 +0,0 @@ ---- ---- - - - - - - - - - -
    - -
    - -
    -
    - Back -
    -
    - -
    -
    -

    Module overview

    -
      -
    • Scaling an app with Kubectl
    • -
    -

    -
    -
    -
    -

    What you need to know first

    -

    - What are Deployments
    - What are Services -

    -
    -
    -
    - - - -
    - -
    - - - diff --git a/docs/tutorials/getting-started/update-app.html b/docs/tutorials/getting-started/update-app.html deleted file mode 100644 index 6ce6600d0e..0000000000 --- a/docs/tutorials/getting-started/update-app.html +++ /dev/null @@ -1,54 +0,0 @@ ---- ---- - - - - - - - - - -
    - -
    - -
    -
    - Back -
    -
    - -
    -
    -

    Module overview

    -
      -
    • Performing Rolling Updates with Kubectl
    • -
    -

    -
    -
    -
    -

    What you need to know first

    -

    - What are Deployments
    - What is Scaling -

    -
    -
    -
    - - - -
    - - - -
    - - - diff --git a/docs/tutorials/getting-started/cluster-interactive.html b/docs/tutorials/kubernetes-basics/cluster-interactive.html similarity index 60% rename from docs/tutorials/getting-started/cluster-interactive.html rename to docs/tutorials/kubernetes-basics/cluster-interactive.html index 8f74bab8b5..8b07b331c7 100644 --- a/docs/tutorials/getting-started/cluster-interactive.html +++ b/docs/tutorials/kubernetes-basics/cluster-interactive.html @@ -7,19 +7,13 @@ - +
    -
    -
    - Back -
    -
    -
    To interact with the Terminal, please use the desktop/tablet version @@ -28,7 +22,7 @@
    diff --git a/docs/tutorials/getting-started/cluster-intro.html b/docs/tutorials/kubernetes-basics/cluster-intro.html similarity index 87% rename from docs/tutorials/getting-started/cluster-intro.html rename to docs/tutorials/kubernetes-basics/cluster-intro.html index a3dafff437..b5886827a0 100644 --- a/docs/tutorials/getting-started/cluster-intro.html +++ b/docs/tutorials/kubernetes-basics/cluster-intro.html @@ -7,23 +7,25 @@ - +
    -
    - Back + +
    +

    Objectives

    +
      +
    • Learn what a Kubernetes cluster is.
    • +
    • Learn what Minikube is.
    • +
    • Start a Kubernetes cluster using an online terminal.
    • +
    -
    -
    -
    - -
    +

    Kubernetes Clusters

    Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit. The abstractions in Kubernetes allow you to deploy containerized applications to a cluster without tying them specifically to individual machines. To make use of this new model of deployment, applications need to be packaged in a way that decouples them from individual hosts: they need to be containerized. Containerized applications are more flexible and available than in past deployment models, where applications were installed directly onto specific machines as packages deeply integrated into the host. Kubernetes automates the distribution and scheduling of application containers across a cluster in a more efficient way. Kubernetes is an open-source platform and is production-ready.

    @@ -60,7 +62,7 @@
    -

    +


    @@ -92,7 +94,7 @@ diff --git a/docs/tutorials/getting-started/deploy-interactive.html b/docs/tutorials/kubernetes-basics/deploy-interactive.html similarity index 61% rename from docs/tutorials/getting-started/deploy-interactive.html rename to docs/tutorials/kubernetes-basics/deploy-interactive.html index 6525b21c4c..73d7e9dfc3 100644 --- a/docs/tutorials/getting-started/deploy-interactive.html +++ b/docs/tutorials/kubernetes-basics/deploy-interactive.html @@ -7,18 +7,13 @@ - +
    -
    -
    - Back -
    -

    @@ -31,7 +26,7 @@
    diff --git a/docs/tutorials/getting-started/deploy-intro.html b/docs/tutorials/kubernetes-basics/deploy-intro.html similarity index 85% rename from docs/tutorials/getting-started/deploy-intro.html rename to docs/tutorials/kubernetes-basics/deploy-intro.html index cd72f424b8..9fafe6012e 100644 --- a/docs/tutorials/getting-started/deploy-intro.html +++ b/docs/tutorials/kubernetes-basics/deploy-intro.html @@ -7,23 +7,24 @@ - +
    -
    - Back + +
    +

    Objectives

    +
      +
    • Learn about application Deployments.
    • +
    • Deploy your first app on Kubernetes with kubectl.
    • +
    -
    -
    -
    - -
    +

    Kubernetes Deployments

    Once you have a running Kubernetes cluster, you can deploy your containerized applications on top of it. To do so, you create a Kubernetes Deployment. The Deployment is responsible for creating and updating instances of your application. Once you've created a Deployment, the Kubernetes master schedules the application instances that the Deployment creates onto individual Nodes in the cluster.

    @@ -59,7 +60,7 @@
    -

    +


    @@ -94,7 +95,7 @@ diff --git a/docs/tutorials/getting-started/explore-interactive.html b/docs/tutorials/kubernetes-basics/explore-interactive.html similarity index 61% rename from docs/tutorials/getting-started/explore-interactive.html rename to docs/tutorials/kubernetes-basics/explore-interactive.html index 5b82635398..9b16d4bca4 100644 --- a/docs/tutorials/getting-started/explore-interactive.html +++ b/docs/tutorials/kubernetes-basics/explore-interactive.html @@ -7,18 +7,13 @@ - +
    -
    -
    - Back -
    -

    @@ -31,7 +26,7 @@
    diff --git a/docs/tutorials/getting-started/explore-intro.html b/docs/tutorials/kubernetes-basics/explore-intro.html similarity index 82% rename from docs/tutorials/getting-started/explore-intro.html rename to docs/tutorials/kubernetes-basics/explore-intro.html index df9cd7c305..4789838827 100644 --- a/docs/tutorials/getting-started/explore-intro.html +++ b/docs/tutorials/kubernetes-basics/explore-intro.html @@ -7,7 +7,7 @@ - +
    @@ -15,18 +15,19 @@
    -
    - Back + +
    +

    Objectives

    +
      +
    • Learn about Kubernetes Pods.
    • +
    • Learn about Kubernetes Nodes.
    • +
    • Troubleshoot deployed applications.
    • +
    -
    -
    -
    - -
    -

    Pods

    -

    When you created a Deployment in Module 2, Kubernetes created a Pod to host your application instance. A Pod is Kubernetes abstraction that represents a group of one or more application containers (such as Docker or rkt), and some shared resources for those containers. Those resources include:

    +

    Kubernetes Pods

    +

    When you created a Deployment in Module 2, Kubernetes created a Pod to host your application instance. A Pod is Kubernetes abstraction that represents a group of one or more application containers (such as Docker or rkt), and some shared resources for those containers. Those resources include:

    • Shared storage, as Volumes
    • Networking, as a unique cluster IP address
    • @@ -63,7 +64,7 @@
      -

      +


      @@ -97,7 +98,7 @@
      -

      +


      @@ -128,7 +129,7 @@ diff --git a/docs/tutorials/getting-started/expose-interactive.html b/docs/tutorials/kubernetes-basics/expose-interactive.html similarity index 61% rename from docs/tutorials/getting-started/expose-interactive.html rename to docs/tutorials/kubernetes-basics/expose-interactive.html index 04d3bc3f53..3288807588 100644 --- a/docs/tutorials/getting-started/expose-interactive.html +++ b/docs/tutorials/kubernetes-basics/expose-interactive.html @@ -7,19 +7,13 @@ - +
      -
      -
      - Back -
      -
      -
      To interact with the Terminal, please use the desktop/tablet version @@ -29,7 +23,7 @@
      diff --git a/docs/tutorials/getting-started/expose-intro.html b/docs/tutorials/kubernetes-basics/expose-intro.html similarity index 86% rename from docs/tutorials/getting-started/expose-intro.html rename to docs/tutorials/kubernetes-basics/expose-intro.html index 2178a7dd25..81c1981bf4 100644 --- a/docs/tutorials/getting-started/expose-intro.html +++ b/docs/tutorials/kubernetes-basics/expose-intro.html @@ -7,23 +7,26 @@ - +
      -
      - Back + +
      +

      Objectives

      +
        +
      • Learn about Kubernetes Services.
      • +
      • Learn about Kubernetes Labels.
      • +
      • Expose an application outside Kubernetes.
      • +
      -
      -
      -
      - -
      +

      Kubernetes Services

      +

      While Pods do have their own unique IP across the cluster, those IP’s are not exposed outside Kubernetes. Taking into account that over time Pods may be terminated, deleted or replaced by other Pods, we need a way to let other Pods and applications automatically discover each other. Kubernetes addresses this by grouping Pods in Services. A Kubernetes Service is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.

      This abstraction will allow us to expose Pods to traffic originating from outside the cluster. Services have their own unique cluster-private IP address and expose a port to receive traffic. If you choose to expose the service outside the cluster, the options are:

      @@ -58,7 +61,7 @@
      -

      +


      @@ -106,7 +109,7 @@
      -

      +


      @@ -122,7 +125,7 @@
      diff --git a/docs/tutorials/getting-started/index.html b/docs/tutorials/kubernetes-basics/index.html similarity index 75% rename from docs/tutorials/getting-started/index.html rename to docs/tutorials/kubernetes-basics/index.html index 932bd79363..0f6a435626 100644 --- a/docs/tutorials/getting-started/index.html +++ b/docs/tutorials/kubernetes-basics/index.html @@ -34,7 +34,7 @@
      - + @@ -42,7 +42,7 @@
      - + @@ -50,7 +50,7 @@
      - + @@ -58,7 +58,7 @@
      - + @@ -66,7 +66,7 @@
      - + @@ -74,7 +74,7 @@
      - + @@ -85,7 +85,7 @@ diff --git a/docs/tutorials/getting-started/public/css/styles.css b/docs/tutorials/kubernetes-basics/public/css/styles.css similarity index 100% rename from docs/tutorials/getting-started/public/css/styles.css rename to docs/tutorials/kubernetes-basics/public/css/styles.css diff --git a/docs/tutorials/getting-started/public/images/badge-01.svg b/docs/tutorials/kubernetes-basics/public/images/badge-01.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-01.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-01.svg diff --git a/docs/tutorials/getting-started/public/images/badge-02.svg b/docs/tutorials/kubernetes-basics/public/images/badge-02.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-02.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-02.svg diff --git a/docs/tutorials/getting-started/public/images/badge-03.svg b/docs/tutorials/kubernetes-basics/public/images/badge-03.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-03.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-03.svg diff --git a/docs/tutorials/getting-started/public/images/badge-04.svg b/docs/tutorials/kubernetes-basics/public/images/badge-04.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-04.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-04.svg diff --git a/docs/tutorials/getting-started/public/images/badge-05.svg b/docs/tutorials/kubernetes-basics/public/images/badge-05.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-05.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-05.svg diff --git a/docs/tutorials/getting-started/public/images/badge-06.svg b/docs/tutorials/kubernetes-basics/public/images/badge-06.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-06.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-06.svg diff --git a/docs/tutorials/getting-started/public/images/badge-07.svg b/docs/tutorials/kubernetes-basics/public/images/badge-07.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-07.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-07.svg diff --git a/docs/tutorials/getting-started/public/images/badge-08.svg b/docs/tutorials/kubernetes-basics/public/images/badge-08.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-08.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-08.svg diff --git a/docs/tutorials/getting-started/public/images/badge-09.svg b/docs/tutorials/kubernetes-basics/public/images/badge-09.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-09.svg rename to docs/tutorials/kubernetes-basics/public/images/badge-09.svg diff --git a/docs/tutorials/getting-started/public/images/badge-1.png b/docs/tutorials/kubernetes-basics/public/images/badge-1.png similarity index 100% rename from docs/tutorials/getting-started/public/images/badge-1.png rename to docs/tutorials/kubernetes-basics/public/images/badge-1.png diff --git a/docs/tutorials/getting-started/public/images/dislike.svg b/docs/tutorials/kubernetes-basics/public/images/dislike.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/dislike.svg rename to docs/tutorials/kubernetes-basics/public/images/dislike.svg diff --git a/docs/tutorials/getting-started/public/images/like.svg b/docs/tutorials/kubernetes-basics/public/images/like.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/like.svg rename to docs/tutorials/kubernetes-basics/public/images/like.svg diff --git a/docs/tutorials/getting-started/public/images/logo.png b/docs/tutorials/kubernetes-basics/public/images/logo.png similarity index 100% rename from docs/tutorials/getting-started/public/images/logo.png rename to docs/tutorials/kubernetes-basics/public/images/logo.png diff --git a/docs/tutorials/getting-started/public/images/logo.svg b/docs/tutorials/kubernetes-basics/public/images/logo.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/logo.svg rename to docs/tutorials/kubernetes-basics/public/images/logo.svg diff --git a/docs/tutorials/getting-started/public/images/logo_2.svg b/docs/tutorials/kubernetes-basics/public/images/logo_2.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/logo_2.svg rename to docs/tutorials/kubernetes-basics/public/images/logo_2.svg diff --git a/docs/tutorials/getting-started/public/images/logo_mobile.png b/docs/tutorials/kubernetes-basics/public/images/logo_mobile.png similarity index 100% rename from docs/tutorials/getting-started/public/images/logo_mobile.png rename to docs/tutorials/kubernetes-basics/public/images/logo_mobile.png diff --git a/docs/tutorials/getting-started/public/images/module_01.svg b/docs/tutorials/kubernetes-basics/public/images/module_01.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_01.svg rename to docs/tutorials/kubernetes-basics/public/images/module_01.svg diff --git a/docs/tutorials/getting-started/public/images/module_01_cluster.svg b/docs/tutorials/kubernetes-basics/public/images/module_01_cluster.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_01_cluster.svg rename to docs/tutorials/kubernetes-basics/public/images/module_01_cluster.svg diff --git a/docs/tutorials/getting-started/public/images/module_02.svg b/docs/tutorials/kubernetes-basics/public/images/module_02.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_02.svg rename to docs/tutorials/kubernetes-basics/public/images/module_02.svg diff --git a/docs/tutorials/getting-started/public/images/module_02_first_app.svg b/docs/tutorials/kubernetes-basics/public/images/module_02_first_app.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_02_first_app.svg rename to docs/tutorials/kubernetes-basics/public/images/module_02_first_app.svg diff --git a/docs/tutorials/getting-started/public/images/module_03.svg b/docs/tutorials/kubernetes-basics/public/images/module_03.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_03.svg rename to docs/tutorials/kubernetes-basics/public/images/module_03.svg diff --git a/docs/tutorials/getting-started/public/images/module_03_nodes.svg b/docs/tutorials/kubernetes-basics/public/images/module_03_nodes.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_03_nodes.svg rename to docs/tutorials/kubernetes-basics/public/images/module_03_nodes.svg diff --git a/docs/tutorials/getting-started/public/images/module_03_pods.svg b/docs/tutorials/kubernetes-basics/public/images/module_03_pods.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_03_pods.svg rename to docs/tutorials/kubernetes-basics/public/images/module_03_pods.svg diff --git a/docs/tutorials/getting-started/public/images/module_04.svg b/docs/tutorials/kubernetes-basics/public/images/module_04.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_04.svg rename to docs/tutorials/kubernetes-basics/public/images/module_04.svg diff --git a/docs/tutorials/getting-started/public/images/module_04_labels.svg b/docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_04_labels.svg rename to docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg diff --git a/docs/tutorials/getting-started/public/images/module_04_services.svg b/docs/tutorials/kubernetes-basics/public/images/module_04_services.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_04_services.svg rename to docs/tutorials/kubernetes-basics/public/images/module_04_services.svg diff --git a/docs/tutorials/getting-started/public/images/module_05.svg b/docs/tutorials/kubernetes-basics/public/images/module_05.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_05.svg rename to docs/tutorials/kubernetes-basics/public/images/module_05.svg diff --git a/docs/tutorials/getting-started/public/images/module_05_scaling1.svg b/docs/tutorials/kubernetes-basics/public/images/module_05_scaling1.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_05_scaling1.svg rename to docs/tutorials/kubernetes-basics/public/images/module_05_scaling1.svg diff --git a/docs/tutorials/getting-started/public/images/module_05_scaling2.svg b/docs/tutorials/kubernetes-basics/public/images/module_05_scaling2.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_05_scaling2.svg rename to docs/tutorials/kubernetes-basics/public/images/module_05_scaling2.svg diff --git a/docs/tutorials/getting-started/public/images/module_06.svg b/docs/tutorials/kubernetes-basics/public/images/module_06.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_06.svg rename to docs/tutorials/kubernetes-basics/public/images/module_06.svg diff --git a/docs/tutorials/getting-started/public/images/module_06_rollingupdates1.svg b/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates1.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_06_rollingupdates1.svg rename to docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates1.svg diff --git a/docs/tutorials/getting-started/public/images/module_06_rollingupdates2.svg b/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates2.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_06_rollingupdates2.svg rename to docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates2.svg diff --git a/docs/tutorials/getting-started/public/images/module_06_rollingupdates3.svg b/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates3.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_06_rollingupdates3.svg rename to docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates3.svg diff --git a/docs/tutorials/getting-started/public/images/module_06_rollingupdates4.svg b/docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates4.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/module_06_rollingupdates4.svg rename to docs/tutorials/kubernetes-basics/public/images/module_06_rollingupdates4.svg diff --git a/docs/tutorials/getting-started/public/images/nav_point.png b/docs/tutorials/kubernetes-basics/public/images/nav_point.png similarity index 100% rename from docs/tutorials/getting-started/public/images/nav_point.png rename to docs/tutorials/kubernetes-basics/public/images/nav_point.png diff --git a/docs/tutorials/getting-started/public/images/nav_point.svg b/docs/tutorials/kubernetes-basics/public/images/nav_point.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/nav_point.svg rename to docs/tutorials/kubernetes-basics/public/images/nav_point.svg diff --git a/docs/tutorials/getting-started/public/images/nav_point_active.png b/docs/tutorials/kubernetes-basics/public/images/nav_point_active.png similarity index 100% rename from docs/tutorials/getting-started/public/images/nav_point_active.png rename to docs/tutorials/kubernetes-basics/public/images/nav_point_active.png diff --git a/docs/tutorials/getting-started/public/images/nav_point_active.svg b/docs/tutorials/kubernetes-basics/public/images/nav_point_active.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/nav_point_active.svg rename to docs/tutorials/kubernetes-basics/public/images/nav_point_active.svg diff --git a/docs/tutorials/getting-started/public/images/nav_point_sub.svg b/docs/tutorials/kubernetes-basics/public/images/nav_point_sub.svg similarity index 100% rename from docs/tutorials/getting-started/public/images/nav_point_sub.svg rename to docs/tutorials/kubernetes-basics/public/images/nav_point_sub.svg diff --git a/docs/tutorials/getting-started/public/images/quiz_false.png b/docs/tutorials/kubernetes-basics/public/images/quiz_false.png similarity index 100% rename from docs/tutorials/getting-started/public/images/quiz_false.png rename to docs/tutorials/kubernetes-basics/public/images/quiz_false.png diff --git a/docs/tutorials/getting-started/public/images/quiz_true.png b/docs/tutorials/kubernetes-basics/public/images/quiz_true.png similarity index 100% rename from docs/tutorials/getting-started/public/images/quiz_true.png rename to docs/tutorials/kubernetes-basics/public/images/quiz_true.png diff --git a/docs/tutorials/getting-started/public/images/twitter.png b/docs/tutorials/kubernetes-basics/public/images/twitter.png similarity index 100% rename from docs/tutorials/getting-started/public/images/twitter.png rename to docs/tutorials/kubernetes-basics/public/images/twitter.png diff --git a/docs/tutorials/getting-started/scale-interactive.html b/docs/tutorials/kubernetes-basics/scale-interactive.html similarity index 62% rename from docs/tutorials/getting-started/scale-interactive.html rename to docs/tutorials/kubernetes-basics/scale-interactive.html index 9ab0d10557..d41b6cb36b 100644 --- a/docs/tutorials/getting-started/scale-interactive.html +++ b/docs/tutorials/kubernetes-basics/scale-interactive.html @@ -7,19 +7,13 @@ - +
      -
      -
      - Back -
      -
      -
      To interact with the Terminal, please use the desktop/tablet version @@ -29,7 +23,7 @@
      diff --git a/docs/tutorials/getting-started/scale-intro.html b/docs/tutorials/kubernetes-basics/scale-intro.html similarity index 83% rename from docs/tutorials/getting-started/scale-intro.html rename to docs/tutorials/kubernetes-basics/scale-intro.html index b06e574c7e..b4b5d47c91 100644 --- a/docs/tutorials/getting-started/scale-intro.html +++ b/docs/tutorials/kubernetes-basics/scale-intro.html @@ -7,23 +7,24 @@ - +
      -
      - Back + +
      +

      Objectives

      +
        +
      • Scale an app using kubectl.
      • +
      -
      -
      -
      - -
      +

      Scaling an application

      +

      In the previous modules we created a Deployment, and then exposed it publicly via a Service . The Deployment created only one Pod for running our application. When traffic increases, we will need to scale the application to keep up with user demand.

      Scaling is accomplished by changing the number of replicas in a Deployment

      @@ -59,11 +60,11 @@ @@ -106,7 +107,7 @@ diff --git a/docs/tutorials/getting-started/update-interactive.html b/docs/tutorials/kubernetes-basics/update-interactive.html similarity index 68% rename from docs/tutorials/getting-started/update-interactive.html rename to docs/tutorials/kubernetes-basics/update-interactive.html index 5b399f06dc..a1399aeadb 100644 --- a/docs/tutorials/getting-started/update-interactive.html +++ b/docs/tutorials/kubernetes-basics/update-interactive.html @@ -7,19 +7,13 @@ - +
      -
      -
      - Back -
      -
      -
      To interact with the Terminal, please use the desktop/tablet version diff --git a/docs/tutorials/getting-started/update-intro.html b/docs/tutorials/kubernetes-basics/update-intro.html similarity index 81% rename from docs/tutorials/getting-started/update-intro.html rename to docs/tutorials/kubernetes-basics/update-intro.html index c6f65cfa58..b7867f3b1f 100644 --- a/docs/tutorials/getting-started/update-intro.html +++ b/docs/tutorials/kubernetes-basics/update-intro.html @@ -7,23 +7,24 @@ - +
      -
      - Back + +
      +

      Objectives

      +
        +
      • Perform a rolling update using kubectl.
      • +
      -
      -
      -
      - -
      +

      Updating an application

      +

      Users expect applications to be available all the time and developers are expected to deploy new versions of them several times a day. In Kubernetes this is done with rolling updates. Rolling updates allows Deployments to occur with zero downtime by incrementally updating Pods instances with new ones. The new Pods will be scheduled on Nodes with available resources.

      In the previous module we scaled our application to run multiple instances. This is a requirement for performing updates without affecting application availability. By default, the maximum number of Pods that can be unavailable during the update and the maximum number of new Pods that can be created, is one. Both options can be configured to either numbers or percentages (of Pods). @@ -61,19 +62,19 @@

      @@ -121,7 +122,7 @@ From beebb7d429744e4fa2dca7f4505177865e7b8a9c Mon Sep 17 00:00:00 2001 From: Janet Kuo Date: Wed, 5 Oct 2016 18:01:52 -0700 Subject: [PATCH 042/120] Fix 404 in tools --- docs/tools/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tools/index.md b/docs/tools/index.md index 31d5fe985e..37cc5bc54b 100644 --- a/docs/tools/index.md +++ b/docs/tools/index.md @@ -11,11 +11,11 @@ assignees: ### Kubectl -[`kubectl`](docs/user-guide/kubectl/) is the command line tool for Kubernetes. It controls the Kubernetes cluster manager. +[`kubectl`](/docs/user-guide/kubectl/) is the command line tool for Kubernetes. It controls the Kubernetes cluster manager. ### Dashboard -[Dashboard](docs/user-guide/ui/), the web-based user interface of Kubernetes, allows you to deploy containerized applications +[Dashboard](/docs/user-guide/ui/), the web-based user interface of Kubernetes, allows you to deploy containerized applications to a Kubernetes cluster, troubleshoot them, and manage the cluster and its resources itself. ## Third-Party Tools From e857d466cbea3a02a452179901cb1bbe8b0688b0 Mon Sep 17 00:00:00 2001 From: Anirudh Ramanathan Date: Wed, 5 Oct 2016 18:44:15 -0700 Subject: [PATCH 043/120] Add example for pod using emptyDir --- docs/user-guide/volumes.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/user-guide/volumes.md b/docs/user-guide/volumes.md index e33bd3e018..463a34aeae 100644 --- a/docs/user-guide/volumes.md +++ b/docs/user-guide/volumes.md @@ -108,6 +108,25 @@ While tmpfs is very fast, be aware that unlike disks, tmpfs is cleared on machine reboot and any files you write will count against your container's memory limit. +#### Example pod + +```yaml +apiVersion: v1 +kind: Pod +metadata: + name: test-pd +spec: + containers: + - image: gcr.io/google_containers/test-webserver + name: test-container + volumeMounts: + - mountPath: /cache + name: cache-volume + volumes: + - name: cache-volume + emptyDir: {} +``` + ### hostPath A `hostPath` volume mounts a file or directory from the host node's filesystem From deae72a03e7dca6e4a969055eff2d7b1778c8b49 Mon Sep 17 00:00:00 2001 From: Maciej Szulik Date: Fri, 23 Sep 2016 14:57:08 +0200 Subject: [PATCH 044/120] Add generators section in kubectl conventions --- docs/user-guide/kubectl-conventions.md | 46 +++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/kubectl-conventions.md b/docs/user-guide/kubectl-conventions.md index f4398362da..a22973f16f 100644 --- a/docs/user-guide/kubectl-conventions.md +++ b/docs/user-guide/kubectl-conventions.md @@ -8,11 +8,11 @@ assignees: * TOC {:toc} -## Using `kubectl` in Reusable Scripts +## Using `kubectl` in Reusable Scripts If you need stable output in a script, you should: -* Request one of the machine-oriented output forms, such as `-o name`, `-o json`, `-o yaml`, `-o go-template`, or `-o jsonpath` +* Request one of the machine-oriented output forms, such as `-o name`, `-o json`, `-o yaml`, `-o go-template`, or `-o jsonpath` * Specify `--output-version`, since those output forms (other than `-o name`) output the resource using a particular API version * Specify `--generator` to pin to a specific behavior forever, if using generator-based commands (such as `kubectl run` or `kubectl expose`) * Don't rely on context, preferences, or other implicit state @@ -27,8 +27,46 @@ In order for `kubectl run` to satisfy infrastructure as code: * If the image is lightly parameterized, capture the parameters in a checked-in script, or at least use `--record`, to annotate the created objects with the command line. * If the image is heavily parameterized, definitely check in the script. * If features are needed that are not expressible via `kubectl run` flags, switch to configuration files checked into source control. -* Pin to a specific generator version, such as `kubectl run --generator=deployment/v1beta1` +* Pin to a specific [generator](#generators) version, such as `kubectl run --generator=deployment/v1beta1` + +#### Generators + +`kubectl run` allows you to generate the following resources (using `--generator` flag): + +* Pod - use `run-pod/v1`. +* Replication controller - use `run/v1`. +* Deployment - use `deployment/v1beta1`. +* Job (using `extension/v1beta1` endpoint) - use `job/v1beta1`. +* Job - use `job/v1`. +* ScheduledJob - use `scheduledjob/v2alpha1`. + +Additionally, if you didn't specify a generator flag, other flags will suggest using +a specific generator. Below table shows which flags force using specific generators, +depending on your cluster version: + +| Generated Resource | Cluster v1.4 | Cluster v1.3 | Cluster v1.2 | Cluster v1.1 and eariler | +|:----------------------:|-----------------------|-----------------------|--------------------------------------------|--------------------------------------------| +| Pod | `--restart=Never` | `--restart=Never` | `--generator=run-pod/v1` | `--restart=OnFailure` OR `--restart=Never` | +| Replication Controller | `--generator=run/v1` | `--generator=run/v1` | `--generator=run/v1` | `--restart=Always` | +| Deployment | `--restart=Always` | `--restart=Always` | `--restart=Always` | N/A | +| Job | `--restart=OnFailure` | `--restart=OnFailure` | `--restart=OnFailure` OR `--restart=Never` | N/A | +| Scheduled Job | `--schedule=` | N/A | N/A | N/A | + +Note that these flags will use a default generator only when you have not specified +any flag. This also means that combining `--generator` with other flags won't +change the generator you specified. For example, in a 1.4 cluster, if you specify +`--restart=Always`, a Deployment will be created; if you specify `--restart=Always` +and `--generator=run/v1`, a Replication Controller will be created instead. +This becomes handy if you want to pin to a specific behavior with the generator, +even when the defaulted generator is changed in the future. + +Finally, the order in which flags set the generator is: schedule flag has the highest +priority, then restart policy and finally the generator itself. + +If in doubt about the final resource being created, you can always use `--dry-run` +flag, which will provide the object to be submitted to the cluster. + ### `kubectl apply` -* To use `kubectl apply` to update resources, always create resources initially with `kubectl apply` or with `--save-config`. See [managing resources with kubectl apply](/docs/user-guide/managing-deployments/#kubectl-apply) for the reason behind it. +* To use `kubectl apply` to update resources, always create resources initially with `kubectl apply` or with `--save-config`. See [managing resources with kubectl apply](/docs/user-guide/managing-deployments/#kubectl-apply) for the reason behind it. From 1a17ab377231582ed0b3aa0a0d6f6008a133cf23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Ole=C5=9B?= Date: Thu, 6 Oct 2016 11:40:40 +0200 Subject: [PATCH 045/120] Update kubectl address It fixes kubernetes/kubernetes#33864 --- docs/user-guide/kubectl-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index 367aaba102..81f171a445 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -5,7 +5,7 @@ assignees: --- -Use this overview of the `kubectl` command line interface to help you start running commands against Kubernetes clusters. This overview quickly covers `kubectl` syntax, describes the command operations, and provides common examples. For details about each command, including all the supported flags and subcommands, see the [kubectl](/docs/user-guide/kubectl/kubectl) reference documentation. +Use this overview of the `kubectl` command line interface to help you start running commands against Kubernetes clusters. This overview quickly covers `kubectl` syntax, describes the command operations, and provides common examples. For details about each command, including all the supported flags and subcommands, see the [kubectl](/docs/user-guide/kubectl) reference documentation. TODO: Auto-generate this file to ensure it's always in sync with any `kubectl` changes, see [#14177](http://pr.k8s.io/14177). From 8d5a4c0838e4b15ed641b1722c0a3c99e2c59394 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Ole=C5=9B?= Date: Thu, 6 Oct 2016 12:00:39 +0200 Subject: [PATCH 046/120] Fix kubectl get documentation - fix list of valid resource types - fix showing template It was fainling with following error message: Liquid Warning: Liquid syntax error (line 68): [:dot, "."] is not a valid expression in "{{.status.phase}}" in docs/user-guide/kubectl/kubectl_get.md --- docs/user-guide/kubectl/kubectl_get.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/user-guide/kubectl/kubectl_get.md b/docs/user-guide/kubectl/kubectl_get.md index 99f2c25802..9a6f7fc228 100644 --- a/docs/user-guide/kubectl/kubectl_get.md +++ b/docs/user-guide/kubectl/kubectl_get.md @@ -12,6 +12,7 @@ Display one or many resources Display one or many resources. Valid resource types include: + * clusters (valid only for federation apiservers) * componentstatuses (aka 'cs') * configmaps (aka 'cm') @@ -68,7 +69,9 @@ kubectl get -o json pod web-pod-13je7 kubectl get -f pod.yaml -o json # Return only the phase value of the specified pod. +{% raw %} kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}} +{% endraw %} # List all replication controllers and services together in ps output format. kubectl get rc,services From a0e672e50a78a35ec30123dc386f992a255d797b Mon Sep 17 00:00:00 2001 From: Devin Donnelly Date: Thu, 6 Oct 2016 14:27:26 -0700 Subject: [PATCH 047/120] Updated README.md with information on Netlify staging and removed outdated information on versioned doc branches. --- README.md | 30 ++++++++++++++---------------- 1 file changed, 14 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index a468c1f947..ad6c85778b 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,22 @@ Welcome! We are very pleased you want to contribute to the documentation and/or You can 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. -## Staging the site on GitHub Pages +## Automatic Staging for Pull Requests -If you want to see your changes staged without having to install anything locally, remove the CNAME file in this directory and -change the name of the fork to be: +When you create a pull request (either against master or the upcoming release), your changes are staged in a custom subdomain on Netlify so that you can see your changes in rendered form before the PR is merged. You can use this to verify that everything is correct before the PR gets merged. To view your changes: - YOUR_GITHUB_USERNAME.github.io +- Scroll down to the PR's list of Automated Checks +- Click "Show All Checks" +- Look for "deploy/netlify"; you'll see "Deploy Preview Ready!" if staging was successful +- Click "Details" to bring up the staged site and navigate to your changes -Then make your changes. +## Release Branch Staging -When you visit [http://YOUR_GITHUB_USERNAME.github.io](http://YOUR_GITHUB_USERNAME.github.io) you should see a special-to-you version of the site that contains the changes you just made. +The Kubernetes site maintains staged versions at a subdomain provided by Netlify. Every PR for the Kubernetes site, either against the master branch or the upcoming release branch, is staged automatically. + +The staging site for the next upcoming Kubernetes release is here: [http://kubernetes-io-vnext-staging.netlify.com/](http://kubernetes-io-vnext-staging.netlify.com/) + +The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. ## Staging the site locally (using Docker) @@ -64,7 +70,6 @@ Make any changes you want. Then, to see your changes locally: Your copy of the site will then be viewable at: [http://localhost:4000](http://localhost:4000) (or wherever Jekyll tells you). - ## GitHub help If you're a bit rusty with git/GitHub, you might want to read @@ -137,20 +142,13 @@ That, of course, will send users to: ## Branch structure -The current version of the website is served out of the `master` branch. +The current version of the website is served out of the `master` branch. To make changes to the live docs, such as bug fixes, broken links, typos, etc, **target your pull request to the master branch**. -All versions of the site that relate to past and future versions will be named after their Kubernetes release number. For example, [the old branch for the 1.1 docs is called `release-1.1`](https://github.com/kubernetes/kubernetes.github.io/tree/release-1.1). +The `release-1.x` branches store changes for **upcoming releases of Kubernetes**. For example, the `release-1.5` branch has changes for the upcoming 1.5 release. These changes target branches (and *not* master) to avoid publishing documentation updates prior to the release for which they're relevant. If you have a change for an upcoming release of Kubernetes, **target your pull request to the appropriate release branch**. Changes in the "docsv2" branch (where we are testing a revamp of the docs) are automatically staged here: http://k8sdocs.github.io/docs/tutorials/ -Changes in the "release-1.1" branch (for k8s v1.1 docs) are automatically staged here: -http://kubernetes-v1-1.github.io/ - -Changes in the "release-1.3" branch (for k8s v1.3 docs) are automatically staged here: -http://kubernetes-v1-3.github.io/ - -Editing of these branches will kick off a build using Travis CI that auto-updates these URLs; you can monitor the build progress at [https://travis-ci.org/kubernetes/kubernetes.github.io](https://travis-ci.org/kubernetes/kubernetes.github.io). ## Config yaml guidelines From 616f99b7165602a671d101fcdfc623ca9cdba275 Mon Sep 17 00:00:00 2001 From: Devin Donnelly Date: Thu, 6 Oct 2016 16:46:59 -0700 Subject: [PATCH 048/120] Modifies the overview for the Kubernetes Basics tutorial to make it more useful. Adds a link to the Overview from the left-hand TOC. Links to the Kubernetes Basics Tutorial from the Tutorials landing page. --- _data/tutorials.yml | 2 ++ docs/tutorials/index.md | 4 ++++ docs/tutorials/kubernetes-basics/index.html | 18 +++++++++++++----- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/_data/tutorials.yml b/_data/tutorials.yml index 465b0575d8..e312523bcd 100644 --- a/_data/tutorials.yml +++ b/_data/tutorials.yml @@ -4,6 +4,8 @@ toc: path: /docs/tutorials/ - title: Kubernetes Basics section: + - title: Overview + path: /docs/tutorials/kubernetes-basics/ - title: 1. Create a Cluster section: - title: Using Minikube to Create a Cluster diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index 23400521e7..03ae95fe36 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -3,6 +3,10 @@ The Tutorials section of the Kubernetes documentation is a work in progress. +#### Kubernetes Basics + +* [Kubernetes Basics](/docs/tutorials/kubernetes-basics/) is an in-depth interactive tutorial that helps you understand the Kubernetes system and try out some basic Kubernetes features. + #### Stateless Applications * [Running a Stateless Application Using a Deployment](/docs/tutorials/stateless-application/run-stateless-application-deployment/) diff --git a/docs/tutorials/kubernetes-basics/index.html b/docs/tutorials/kubernetes-basics/index.html index 0f6a435626..971a3fba19 100644 --- a/docs/tutorials/kubernetes-basics/index.html +++ b/docs/tutorials/kubernetes-basics/index.html @@ -15,8 +15,16 @@
      -

      Getting Started with Kubernetes

      -

      By the end of this tutorial you will understand what Kubernetes does. You will also learn how to deploy, scale, update and debug containerized applications on a Kubernetes cluster using an interactive online terminal.

      +

      Kubernetes Basics

      +

      This tutorial provides a walkthrough of the basics of the Kubernetes cluster orchestration system. Each module contains some background information on major Kubernetes features and concepts, and includes an interactive online tutorial. These interactive tutorials let you manage a simple cluster and its containerized applications for yourself.

      +

      Using the interactive tutorials, you can learn to:

      +
        +
      • Deploy a containerized application on a cluster
      • +
      • Scale the deployment
      • +
      • Update the containerized application with a new software version
      • +
      • Debug the containerized application
      • +
      +

      The tutorials use Katacoda to run a virtual terminal in your web browser that runs Minikube, a small-scale local deployment of Kubernetes that can run anywhere. There's no need to install any software or configure anything; each interactive tutorial runs directly out of your web browser itself.

      @@ -24,13 +32,13 @@
      -

      Why Kubernetes?

      -

      Today users expect applications to be available 24/7, while developers expect to deploy new versions of those applications several times a day. The way we build software is moving in this direction, enabling applications to be released and updated in an easy and fast way without downtime. We also need to be able to scale application in line with the user demand and we expect them to make intelligent use of the available resources. Kubernetes is a platform designed to meet those requirements, using the experience accumulated by Google in this area, combined with best-of-breed ideas from the community.

      +

      What can Kubernetes do for you?

      +

      With modern web services, users expect applications to be available 24/7, and developers expect to deploy new versions of those applications several times a day. Containzerization helps package software to serve these goals, enabling applications to be released and updated in an easy and fast way without downtime. Kubernetes helps you make sure those containerized applications run where and when you want, and helps them find the resources and tools they need to work. Kubernetes is a production-ready, open source platform designed with the Google's accumulated experience in container orchestration, combined with best-of-breed ideas from the community.

      -

      Getting Started Modules

      +

      Kubernetes Basics Modules

      From 65b71767e19cacd2c5e2e0fa173fb21afd4c1ccb Mon Sep 17 00:00:00 2001 From: Devin Donnelly Date: Thu, 6 Oct 2016 16:53:49 -0700 Subject: [PATCH 049/120] Fixes broken links to each module. --- docs/tutorials/kubernetes-basics/index.html | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/tutorials/kubernetes-basics/index.html b/docs/tutorials/kubernetes-basics/index.html index 971a3fba19..723639552b 100644 --- a/docs/tutorials/kubernetes-basics/index.html +++ b/docs/tutorials/kubernetes-basics/index.html @@ -42,7 +42,7 @@
      - + @@ -50,7 +50,7 @@
      - + @@ -58,7 +58,7 @@
      - + @@ -66,7 +66,7 @@
      - + @@ -74,7 +74,7 @@
      - + @@ -82,7 +82,7 @@
      - + From 482760d6d6ab0c8f849b5b34b445fed57e84c682 Mon Sep 17 00:00:00 2001 From: Devin Donnelly Date: Thu, 6 Oct 2016 16:59:17 -0700 Subject: [PATCH 050/120] Replaces links to HelloNode with links to Kubernetes Basics. --- docs/index.md | 6 +++--- index.html | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/index.md b/docs/index.md index 5e29c42dcb..38f3400167 100644 --- a/docs/index.md +++ b/docs/index.md @@ -77,9 +77,9 @@ h2, h3, h4 { Read the Overview
      -

      Hello World on Google Container Engine

      -

      In this quickstart, we’ll be creating a Kubernetes instance that stands up a simple “Hello World” app using Node.js. In just a few minutes you'll go from zero to deployed Kubernetes app on Google Container Engine (GKE), a hosted service from Google.

      - Get Started on GKE +

      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

      diff --git a/index.html b/index.html index 3c940304ba..cf01ad2e92 100644 --- a/index.html +++ b/index.html @@ -14,7 +14,7 @@ title: Production-Grade Container Orchestration

      Production-Grade Container Orchestration

      Automated container deployment, scaling, and management
      - Try Our Hello World + Try Our Interactive Tutorials
      From a58de7ff5fb507d3b2bcf8ccecb458107e647c41 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 6 Oct 2016 17:42:07 -0700 Subject: [PATCH 051/120] Experiment with redirect_from. --- docs/tutorials/kubernetes-basics/cluster-intro.html | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tutorials/kubernetes-basics/cluster-intro.html b/docs/tutorials/kubernetes-basics/cluster-intro.html index b5886827a0..890c9c387e 100644 --- a/docs/tutorials/kubernetes-basics/cluster-intro.html +++ b/docs/tutorials/kubernetes-basics/cluster-intro.html @@ -1,4 +1,5 @@ --- +redirect_from: "/docs/tutorials/getting-started/create-cluster/" --- From 30a8b4724f49578c5402d0257a3dbde2ed56dc43 Mon Sep 17 00:00:00 2001 From: Mike Spreitzer Date: Sun, 25 Sep 2016 15:33:10 -0700 Subject: [PATCH 052/120] Clarified the apiGroup identified by empty string Noted this where the relevance of api group is introduced, and corrected the reference to what the empty string means ("core" api group, which is the terminology used in the page that introduces api group, rather than the old text "default"). --- docs/admin/authorization.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/admin/authorization.md b/docs/admin/authorization.md index 0c8508a1ec..a72a855cb2 100644 --- a/docs/admin/authorization.md +++ b/docs/admin/authorization.md @@ -53,7 +53,7 @@ A request has the following attributes that can be considered for authorization: - what resource is being accessed (for resource requests only) - what subresource is being accessed (for resource requests only) - the namespace of the object being accessed (for namespaced resource requests only) - - the API group being accessed (for resource requests only) + - the API group being accessed (for resource requests only); an empty string designates the [core API group](../api.md#api-groups) The request verb for a resource API endpoint can be determined by the HTTP verb used and whether or not the request acts on an individual resource or a collection of resources: @@ -231,7 +231,7 @@ metadata: namespace: default name: pod-reader rules: - - apiGroups: [""] # The API group "" indicates the default API Group. + - apiGroups: [""] # The API group "" indicates the core API Group. resources: ["pods"] verbs: ["get", "watch", "list"] nonResourceURLs: [] @@ -632,4 +632,4 @@ subjectaccessreview "" created ``` This is useful for debugging access problems, in that you can use this resource -to determine what access an authorizer is granting. \ No newline at end of file +to determine what access an authorizer is granting. From cd709f29aa71ea32e2ece3d1412261bd5bb05c1f Mon Sep 17 00:00:00 2001 From: Pablo Guerrero Date: Fri, 7 Oct 2016 08:47:24 +0200 Subject: [PATCH 053/120] Minor corrections --- docs/user-guide/petset.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/user-guide/petset.md b/docs/user-guide/petset.md index 6063062df6..c3a2085a97 100644 --- a/docs/user-guide/petset.md +++ b/docs/user-guide/petset.md @@ -17,7 +17,7 @@ Throughout this doc you will see a few terms that are sometimes used interchange * Persistent Volume Claim (PVC): A request for storage, typically a [persistent volume](/docs/user-guide/persistent-volumes/walkthrough/). * Host name: The hostname attached to the UTS namespace of the pod, i.e the output of `hostname` in the pod. * DNS/Domain name: A *cluster local* domain name resolvable using standard methods (eg: [gethostbyname](http://linux.die.net/man/3/gethostbyname)). -* Ordinality: the proprety of being "ordinal", or occupying a position in a sequence. +* Ordinality: the property of being "ordinal", or occupying a position in a sequence. * Pet: a single member of a PetSet; more generally, a stateful application. * Peer: a process running a server, capable of communicating with other such processes. @@ -29,7 +29,7 @@ This doc assumes familiarity with the following Kubernetes concepts: * [Cluster DNS](/docs/admin/dns/) * [Headless Services](/docs/user-guide/services/#headless-services) * [Persistent Volumes](/docs/user-guide/volumes/) -* [Dynamic volume provisioning](http://releases.k8s.io/{{page.githubbranch}}/examples/experimental/persistent-volume-provisioning/README.md) +* [Persistent Volume Provisioning](http://releases.k8s.io/{{page.githubbranch}}/examples/experimental/persistent-volume-provisioning/README.md) You need a working Kubernetes cluster at version >= 1.3, with a healthy DNS [cluster addon](http://releases.k8s.io/{{page.githubbranch}}/cluster/addons/README.md) at version >= 15. You cannot use PetSet on a hosted Kubernetes provider that has disabled `alpha` resources. @@ -85,7 +85,7 @@ Before you start deploying applications as PetSets, there are a few limitations * PetSet is an *alpha* resource, not available in any Kubernetes release prior to 1.3. * As with all alpha/beta resources, it can be disabled through the `--runtime-config` option passed to the apiserver, and in fact most likely will be disabled on hosted offerings of Kubernetes. * The only updatable field on a PetSet is `replicas` -* The storage for a given pet must either be provisioned by a [dynamic storage provisioner](http://releases.k8s.io/{{page.githubbranch}}/examples/experimental/persistent-volume-provisioning/README.md) based on the requested `storage class`, or pre-provisioned by an admin. Note that dynamic volume provisioning is also currently in alpha. +* The storage for a given pet must either be provisioned by a [persistent volume provisioner](http://releases.k8s.io/{{page.githubbranch}}/examples/experimental/persistent-volume-provisioning/README.md) based on the requested `storage class`, or pre-provisioned by an admin. Note that persistent volume provisioning is also currently in alpha. * Deleting and/or scaling a PetSet down will *not* delete the volumes associated with the PetSet. This is done to ensure safety first, your data is more valuable than an auto purge of all related PetSet resources. **Deleting the Persistent Volume Claims will result in a deletion of the associated volumes**. * All PetSets currently require a "governing service", or a Service responsible for the network identity of the pets. The user is responsible for this Service. * Updating an existing PetSet is currently a manual process, meaning you either need to deploy a new PetSet with the new image version, or orphan Pets one by one, update their image, and join them back to the cluster. @@ -392,7 +392,8 @@ $ grace=$(kubectl get po web-0 --template '{{.spec.terminationGracePeriodSeconds $ kubectl delete petset,po -l app=nginx $ sleep $grace $ kubectl delete pvc -l app=nginx -{% endraw %}``` +{% endraw %} +``` ## Troubleshooting From 30af17a161097f0b3a8991248306f22444850598 Mon Sep 17 00:00:00 2001 From: kcluster Date: Thu, 6 Oct 2016 20:19:34 +1100 Subject: [PATCH 054/120] Add link to KCluster.io --- docs/getting-started-guides/index.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/getting-started-guides/index.md b/docs/getting-started-guides/index.md index ac02bd726a..a728980e50 100644 --- a/docs/getting-started-guides/index.md +++ b/docs/getting-started-guides/index.md @@ -41,6 +41,8 @@ clusters. [AppsCode.com](https://appscode.com/products/cloud-deployment/) provides managed Kubernetes clusters for various public clouds (including AWS and Google Cloud Platform). +[KCluster.io](https://kcluster.io) provides highly available and scalable managed Kubernetes clusters for AWS. + ### Turn-key Cloud Solutions These solutions allow you to create Kubernetes clusters on a range of Cloud IaaS providers with only a @@ -120,6 +122,7 @@ IaaS Provider | Config. Mgmt | OS | Networking | Docs GKE | | | GCE | [docs](https://cloud.google.com/container-engine) | ['œ“][3] | Commercial Stackpoint.io | | multi-support | multi-support | [docs](http://www.stackpointcloud.com) | | Commercial AppsCode.com | Saltstack | Debian | multi-support | [docs](https://appscode.com/products/cloud-deployment/) | | Commercial +KCluster.io | | multi-support | multi-support | [docs](https://kcluster.io) | | Commercial GCE | Saltstack | Debian | GCE | [docs](/docs/getting-started-guides/gce) | ['œ“][1] | Project Azure | CoreOS | CoreOS | Weave | [docs](/docs/getting-started-guides/coreos/azure/) | | Community ([@errordeveloper](https://github.com/errordeveloper), [@squillace](https://github.com/squillace), [@chanezon](https://github.com/chanezon), [@crossorigin](https://github.com/crossorigin)) Azure | Ignition | Ubuntu | Azure | [docs](/docs/getting-started-guides/azure) | | Community (Microsoft: [@brendandburns](https://github.com/brendandburns), [@colemickens](https://github.com/colemickens)) From 2c14d7fcb04e1f631316f1305f6a3213020baa2e Mon Sep 17 00:00:00 2001 From: Steve Perry Date: Fri, 7 Oct 2016 14:13:42 -0700 Subject: [PATCH 055/120] Redirection experiment 2. (#1411) --- _config.yml | 4 ++++ docs/tutorials/kubernetes-basics/cluster-intro.html | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/_config.yml b/_config.yml index 1a7fefdb6d..7ace374fca 100644 --- a/_config.yml +++ b/_config.yml @@ -27,3 +27,7 @@ defaults: showedit: true permalink: pretty + +gems: + - jekyll-redirect-from + diff --git a/docs/tutorials/kubernetes-basics/cluster-intro.html b/docs/tutorials/kubernetes-basics/cluster-intro.html index 890c9c387e..423dc61783 100644 --- a/docs/tutorials/kubernetes-basics/cluster-intro.html +++ b/docs/tutorials/kubernetes-basics/cluster-intro.html @@ -1,5 +1,7 @@ --- -redirect_from: "/docs/tutorials/getting-started/create-cluster/" +redirect_from: + - /docs/tutorials/getting-started/create-cluster/ + - /docs/tutorials/getting-started/create-cluster.html --- From ee5b5eea3980d67220055c2248ff400864bc6ee6 Mon Sep 17 00:00:00 2001 From: Anirudh Ramanathan Date: Sat, 8 Oct 2016 13:43:19 -0700 Subject: [PATCH 056/120] Point init containers to documentation The proposal doesn't reflect reality. --- docs/user-guide/petset/bootstrapping/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/petset/bootstrapping/index.md b/docs/user-guide/petset/bootstrapping/index.md index e9b04fc135..03ba721edc 100644 --- a/docs/user-guide/petset/bootstrapping/index.md +++ b/docs/user-guide/petset/bootstrapping/index.md @@ -8,7 +8,7 @@ This purpose of this guide is to help you become familiar with the runtime initialization of [Pet Sets](/docs/user-guide/petset). This guide assumes the same prerequisites, and uses the same terminology as the [Pet Set user document](/docs/user-guide/petset). -The most common way to initialize the runtime in a containerized environment, is through a custom [entrypoint](https://docs.docker.com/engine/reference/builder/#entrypoint). While this is not necessarily bad, making your application pid 1, and treating containers as processes in general is good for a few reasons outside the scope of this document. Doing so allows you to run docker images from third-party vendors without modification. We will not be writing custom entrypoints for this example, but using a feature called [init containers](http://releases.k8s.io/{{page.githubbranch}}/docs/proposals/container-init.md), to explain 2 common patterns that come up deploying Pet Sets. +The most common way to initialize the runtime in a containerized environment, is through a custom [entrypoint](https://docs.docker.com/engine/reference/builder/#entrypoint). While this is not necessarily bad, making your application pid 1, and treating containers as processes in general is good for a few reasons outside the scope of this document. Doing so allows you to run docker images from third-party vendors without modification. We will not be writing custom entrypoints for this example, but using a feature called [init containers](http://kubernetes.io/docs/user-guide/production-pods/#handling-initialization), to explain 2 common patterns that come up deploying Pet Sets. 1. Transferring state across Pet restart, so that a future Pet is initialized with the computations of its past incarnation 2. Initializing the runtime environment of a Pet based on existing conditions, like a list of currently healthy peers From 63f9993bb0b21fcf232e114aea1a38aff6da55dd Mon Sep 17 00:00:00 2001 From: Anirudh Ramanathan Date: Sat, 8 Oct 2016 13:46:38 -0700 Subject: [PATCH 057/120] Init containers are in beta in 1.4 --- docs/user-guide/production-pods.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/production-pods.md b/docs/user-guide/production-pods.md index efd1c43e43..501f908875 100644 --- a/docs/user-guide/production-pods.md +++ b/docs/user-guide/production-pods.md @@ -194,13 +194,13 @@ Applications often need a set of initialization steps prior to performing their * Registering the pod into a central database, or fetching remote configuration from that database * Downloading application dependencies, seed data, or preconfiguring disk -Kubernetes now includes an alpha feature known as **init containers**, which are one or more containers in a pod that get a chance to run and initialize shared volumes prior to the other application containers starting. 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 (exits with a non-zero exit code) on a `RestartNever` pod the pod will fail - otherwise it will be restarted until it succeeds or the user deletes the pod. +Kubernetes now includes a beta feature known as **init containers**, which are one or more containers in a pod that get a chance to run and initialize shared volumes prior to the other application containers starting. 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 (exits with a non-zero exit code) on a `RestartNever` pod the pod will fail - otherwise it will be restarted until it succeeds or the user deletes the pod. -Since init containers are an alpha feature, they are specified by setting the `pod.alpha.kubernetes.io/init-containers` annotation on a pod (or replica set, deployment, daemon set, pet set, or job). The value of the annotation must be a string containing a JSON array of container definitions: +Since init containers are a beta feature, they are specified by setting the `pod.beta.kubernetes.io/init-containers` annotation on a pod (or replica set, deployment, daemon set, pet set, or job). The value of the annotation must be a string containing a JSON array of container definitions: {% include code.html language="yaml" file="nginx-init-containers.yaml" ghlink="/docs/user-guide/nginx-init-containers.yaml" %} -The status of the init containers is returned as another annotation - `pod.alpha.kubernetes.io/init-container-statuses` -- as an array of the container statuses (similar to the `status.containerStatuses` field). +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 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. From 58ae316dfed5f6eeddebaebdc19f842ff268ad60 Mon Sep 17 00:00:00 2001 From: anatoly techtonik Date: Sun, 9 Oct 2016 16:42:13 +0300 Subject: [PATCH 058/120] Update kubectl-overview.md Broken link --- docs/user-guide/kubectl-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index 81f171a445..b86009d69a 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -281,4 +281,4 @@ $ kubectl logs -f ## Next steps -Start using the [kubectl](/docs/user-guide/kubectl/kubectl) commands. +Start using the [kubectl](/docs/user-guide/kubectl) commands. From 252d8b8c41e0a07ae292450ce880a77416bc6daf Mon Sep 17 00:00:00 2001 From: Fede Diaz Date: Sun, 9 Oct 2016 17:46:04 +0200 Subject: [PATCH 059/120] Update centos_manual_config.md Added flannel configuration. Now more than one worker is available. Tested on Centos7 minimal install --- .../centos/centos_manual_config.md | 73 +++++++++++++++---- 1 file changed, 57 insertions(+), 16 deletions(-) diff --git a/docs/getting-started-guides/centos/centos_manual_config.md b/docs/getting-started-guides/centos/centos_manual_config.md index f794f485a4..40325c8985 100644 --- a/docs/getting-started-guides/centos/centos_manual_config.md +++ b/docs/getting-started-guides/centos/centos_manual_config.md @@ -10,15 +10,15 @@ assignees: ## Prerequisites -You need two machines with CentOS installed on them. +You need a machine acting as master and as many CentOS 7 hosts as you would like, that act as cluster nodes. ## Starting a cluster This is a getting started guide for CentOS. It is a manual configuration so you understand all the underlying packages / services / ports, etc... -This guide will only get ONE node working. Multiple nodes requires a functional [networking configuration](/docs/admin/networking) done outside of kubernetes. Although the additional Kubernetes configuration requirements should be obvious. +The Kubernetes package provides a few services: kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy. These services are managed by systemd and the configuration resides in a central location: /etc/kubernetes. We will break the services up between the hosts. The first host, centos-master, will be the Kubernetes master. This host will run the kube-apiserver, kube-controller-manager and kube-scheduler. In addition, the master will also run _etcd_. The remaining hosts, centos-minion-n will be the nodes and run kubelet, proxy, cadvisor and docker. -The Kubernetes package provides a few services: kube-apiserver, kube-scheduler, kube-controller-manager, kubelet, kube-proxy. These services are managed by systemd and the configuration resides in a central location: /etc/kubernetes. We will break the services up between the hosts. The first host, centos-master, will be the Kubernetes master. This host will run the kube-apiserver, kube-controller-manager, and kube-scheduler. In addition, the master will also run _etcd_. The remaining host, centos-minion will be the node and run kubelet, proxy, cadvisor and docker. +All of then run flanneld as networking overlay. **System Information:** @@ -28,12 +28,14 @@ Please replace host IP with your environment. ```conf centos-master = 192.168.121.9 -centos-minion = 192.168.121.65 +centos-minion-1 = 192.168.121.65 +centos-minion-2 = 192.168.121.66 +centos-minion-3 = 192.168.121.67 ``` **Prepare the hosts:** -* Create a /etc/yum.repos.d/virt7-docker-common-release.repo on all hosts - centos-{master,minion} with following information. +* Create a /etc/yum.repos.d/virt7-docker-common-release.repo on all hosts - centos-{master,minion-n} with following information. ```conf [virt7-docker-common-release] @@ -42,17 +44,19 @@ baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/ gpgcheck=0 ``` -* Install Kubernetes and etcd on all hosts - centos-{master,minion}. This will also pull in docker and cadvisor. +* Install Kubernetes, etcd and flannel on all hosts - centos-{master,minion-n}. This will also pull in docker and cadvisor. ```shell -yum -y install --enablerepo=virt7-docker-common-release kubernetes etcd +yum -y install --enablerepo=virt7-docker-common-release kubernetes etcd flannel ``` * Add master and node to /etc/hosts on all machines (not needed if hostnames already in DNS) ```shell echo "192.168.121.9 centos-master -192.168.121.65 centos-minion" >> /etc/hosts +192.168.121.65 centos-minion-1 +192.168.121.66 centos-minion-2 +192.168.121.67 centos-minion-3" >> /etc/hosts ``` * Edit /etc/kubernetes/config which will be the same on all hosts to contain: @@ -74,7 +78,7 @@ KUBE_ALLOW_PRIV="--allow-privileged=false" KUBE_MASTER="--master=http://centos-master:8080" ``` -* Disable the firewall on both the master and node, as docker does not play well with other firewall rule managers +* Disable the firewall on the master and all the nodes, as docker does not play well with other firewall rule managers ```shell systemctl disable iptables-services firewalld @@ -114,17 +118,38 @@ KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16" KUBE_API_ARGS="" ``` +* Configure ETCD to hold the network overlay configuration on master: + +```shell +$ etcdctl mkdir /kube-centos/network +$ etcdclt mk /kube-centos/network/config "{ \"Network\": \"172.40.0.0/16\", \"SubnetLen\": 24, \"Backend\": { \"Type\": \"vxlan\" } }" +``` + +* Configure flannel to overlay Docker network in /etc/sysconfig/flanneld on the master (also in the nodes as we'll see): + +```shell +# etcd url location. Point this to the server where etcd runs +FLANNEL_ETCD="http://centos-master:2379" + +# etcd config key. This is the configuration key that flannel queries +# For address range assignment +FLANNEL_ETCD_KEY="/kube-centos/network" + +# Any additional options that you want to pass +FLANNEL_OPTIONS="" +``` + * Start the appropriate services on master: ```shell -for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler; do +for SERVICES in etcd kube-apiserver kube-controller-manager kube-scheduler flanneld; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES done ``` -**Configure the Kubernetes services on the node.** +**Configure the Kubernetes services on the nodes.** ***We need to configure the kubelet and start the kubelet and proxy*** @@ -138,7 +163,7 @@ KUBELET_ADDRESS="--address=0.0.0.0" KUBELET_PORT="--port=10250" # You may leave this blank to use the actual hostname -KUBELET_HOSTNAME="--hostname-override=centos-minion" +KUBELET_HOSTNAME="--hostname-override=centos-minion-n" # Check the node number! # Location of the api-server KUBELET_API_SERVER="--api-servers=http://centos-master:8080" @@ -147,10 +172,24 @@ KUBELET_API_SERVER="--api-servers=http://centos-master:8080" KUBELET_ARGS="" ``` -* Start the appropriate services on node (centos-minion). +* Configure flannel to overlay Docker network in /etc/sysconfig/flanneld (in all the nodes) ```shell -for SERVICES in kube-proxy kubelet docker; do +# etcd url location. Point this to the server where etcd runs +FLANNEL_ETCD="http://centos-master:2379" + +# etcd config key. This is the configuration key that flannel queries +# For address range assignment +FLANNEL_ETCD_KEY="/kube-centos/network" + +# Any additional options that you want to pass +FLANNEL_OPTIONS="" +``` + +* Start the appropriate services on node (centos-minion-n). + +```shell +for SERVICES in kube-proxy kubelet flanneld docker; do systemctl restart $SERVICES systemctl enable $SERVICES systemctl status $SERVICES @@ -164,7 +203,9 @@ done ```shell $ kubectl get nodes NAME LABELS STATUS -centos-minion Ready +centos-minion-1 Ready +centos-minion-2 Ready +centos-minion-3 Ready ``` **The cluster should be running! Launch a test pod.** @@ -176,7 +217,7 @@ You should have a functional cluster, check out [101](/docs/user-guide/walkthrou IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | Support Level -------------------- | ------------ | ------ | ---------- | --------------------------------------------- | ---------| ---------------------------- -Bare-metal | custom | CentOS | _none_ | [docs](/docs/getting-started-guides/centos/centos_manual_config) | | Community ([@coolsvap](https://github.com/coolsvap)) +Bare-metal | custom | CentOS | flannel | [docs](/docs/getting-started-guides/centos/centos_manual_config) | | Community ([@coolsvap](https://github.com/coolsvap)) For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart. From f727a572b8d06aef9e15217b66acc564aba95702 Mon Sep 17 00:00:00 2001 From: Fede Diaz Date: Sun, 9 Oct 2016 17:52:25 +0200 Subject: [PATCH 060/120] Update centos_manual_config.md Warning about flannel network --- docs/getting-started-guides/centos/centos_manual_config.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/getting-started-guides/centos/centos_manual_config.md b/docs/getting-started-guides/centos/centos_manual_config.md index 40325c8985..1f1c3ff1dc 100644 --- a/docs/getting-started-guides/centos/centos_manual_config.md +++ b/docs/getting-started-guides/centos/centos_manual_config.md @@ -119,6 +119,7 @@ KUBE_API_ARGS="" ``` * Configure ETCD to hold the network overlay configuration on master: +**Warning** This network must be unused in your network infrastructure! `172.40.0.0/16` is free in our network. ```shell $ etcdctl mkdir /kube-centos/network From 7143b1e7820df2e2e6760212f5943bb7b9eb366d Mon Sep 17 00:00:00 2001 From: anatoly techtonik Date: Sun, 9 Oct 2016 19:14:02 +0300 Subject: [PATCH 061/120] More broken links --- docs/user-guide/kubectl-overview.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index b86009d69a..bb587a9f91 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -77,7 +77,7 @@ Operation | Syntax | Description `stop` | `kubectl stop` | Deprecated: Instead, see `kubectl delete`. `version` | `kubectl version [--client] [flags]` | Display the Kubernetes version running on the client and server. -Remember: For more about command operations, see the [kubectl](/docs/user-guide/kubectl/kubectl) reference documentation. +Remember: For more about command operations, see the [kubectl](/docs/user-guide/kubectl) reference documentation. ## Resource types @@ -115,7 +115,7 @@ Resource type | Abbreviated alias ## Output options -Use the following sections for information about how you can format or sort the output of certain commands. For details about which commands support the various output options, see the [kubectl](/docs/user-guide/kubectl/kubectl) reference documentation. +Use the following sections for information about how you can format or sort the output of certain commands. For details about which commands support the various output options, see the [kubectl](/docs/user-guide/kubectl) reference documentation. ### Formatting output @@ -146,7 +146,7 @@ In this example, the following command outputs the details for a single pod as a `$ kubectl get pod web-pod-13je7 -o=yaml` -Remember: See the [kubectl](/docs/user-guide/kubectl/kubectl) reference documentation for details about which output format is supported by each command. +Remember: See the [kubectl](/docs/user-guide/kubectl) reference documentation for details about which output format is supported by each command. #### Custom columns From 12f5e30309ea31aba99b980a73bdd646d97f475b Mon Sep 17 00:00:00 2001 From: Mike Spreitzer Date: Sun, 25 Sep 2016 15:24:59 -0700 Subject: [PATCH 062/120] Removed confusing remark about authorizers determining groups The old text said that the authorizer is expected to determine group memberships when the authenticator does not. This not true. It is allowed, but not expected --- and none of the standard authorizers do it. I tried composing a brief correct statement about this, but the reviews were mainly aghast that internal details of some non-standard authorizers were being injected into the discussion of authentictors. I decided that the better part of valor is simply to delete the whole topic from here. Besides, it is a conclusion that any reader would normally draw --- since there is no statement forbidding it (nor indeed any indication that there might be a reason to forbid it), any reader would naturally conclude that an authorizer is free to derive additional intermediate information of any sort and in any way it likes. --- docs/admin/accessing-the-api.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/admin/accessing-the-api.md b/docs/admin/accessing-the-api.md index 6569ac93f8..cb3f3d4ce4 100644 --- a/docs/admin/accessing-the-api.md +++ b/docs/admin/accessing-the-api.md @@ -52,8 +52,8 @@ On GCE, Client Certificates, Password, Plain Tokens, and JWT Tokens are all enab If the request cannot be authenticated, it is rejected with HTTP status code 401. Otherwise, the user is authenticated as a specific `username`, and the user name is available to subsequent steps to use in their decisions. Some authenticators -may also provide the group memberships of the user, while other authenticators -do not (and expect the authorizer to determine these). +also provide the group memberships of the user, while other authenticators +do not. While Kubernetes uses "usernames" for access control decisions and in request logging, it does not have a `user` object nor does it store usernames or other information about From a3821df026f855c83c236c2274752f426501fb86 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Thu, 6 Oct 2016 12:05:28 +0100 Subject: [PATCH 063/120] Ensure namespace is created first in microservices-demo Avoid 'namespaces "sock-shop" not found' messages when users try the demo --- docs/getting-started-guides/kubeadm.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index 86de0652c2..e5e60c83ef 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -178,7 +178,7 @@ As an example, install a sample microservices application, a socks shop, to put To learn more about the sample microservices app, see the [GitHub README](https://github.com/microservices-demo/microservices-demo). # git clone https://github.com/microservices-demo/microservices-demo - # kubectl apply -f microservices-demo/deploy/kubernetes/manifests + # kubectl apply -f microservices-demo/deploy/kubernetes/manifests/sock-shop-ns.yml -f microservices-demo/deploy/kubernetes/manifests You can then find out the port that the [NodePort feature of services](/docs/user-guide/services/) allocated for the front-end service by running: From 65e894123928653fc95b3605d94648586132c317 Mon Sep 17 00:00:00 2001 From: James Munnelly Date: Mon, 26 Sep 2016 21:41:24 +0100 Subject: [PATCH 064/120] Add kubeadm reference docs --- docs/getting-started-guides/kubeadm.md | 1 + docs/user-guide/kubeadm-reference.md | 143 +++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 docs/user-guide/kubeadm-reference.md diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index e5e60c83ef..32b91ccdb9 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -211,6 +211,7 @@ See the [list of add-ons](/docs/admin/addons/) to explore other add-ons, includi * Learn more about [Kubernetes concepts and kubectl in Kubernetes 101](/docs/user-guide/walkthrough/). * Install Kubernetes with [a cloud provider configurations](/docs/getting-started-guides/) to add Load Balancer and Persistent Volume support. +* Learn about `kubeadm`'s advanced usage on the [advanced reference doc](/docs/user-guide/kubeadm-reference/) ## Cleanup diff --git a/docs/user-guide/kubeadm-reference.md b/docs/user-guide/kubeadm-reference.md new file mode 100644 index 0000000000..49ba3663e6 --- /dev/null +++ b/docs/user-guide/kubeadm-reference.md @@ -0,0 +1,143 @@ +# kubeadm reference + +This document provides information on how to use kubeadm's advanced options. + +Running kubeadm init bootstraps a Kubernetes cluster. This consists of the +following steps: + +1. kubeadm generates a token that additional nodes can use to register themselves +with the master in future. + +1. kubeadm generates a self-signed CA using openssl to provision identities +for each node in the cluster, and for the API server to secure communication +with clients. + +1. Outputting a kubeconfig file for the kubelet to use to connect to the API server, +as well as an additional kubeconfig file for administration. + +1. kubeadm generates Kubernetes resource manifests for the API server, controller manager +and scheduler, and placing them in `/etc/kubernetes/manifests`. The kubelet watches +this directory for static resources to create on startup. These are the core +components of Kubernetes, and once they are up and running we can use `kubectl` +to set up/manage any additional components. + +1. kubeadm installs any add-on components, such as DNS or discovery, via the API server. + +## Usage + +Fields that support multiple values do so either with comma separation, or by specifying +the flag multiple times. + +### `kubeadm init` + +It is usually sufficient to run `kubeadm init` without any flags, +but in some cases you might like to override the default behaviour. +Here we specify all the flags that can be used to customise the Kubernetes +installation. + +- `--api-advertise-addresses` (multiple values are allowed) +- `--api-external-dns-names` (multiple values are allowed) + +By default, `kubeadm init` automatically detects IP addresses and uses +these to generate certificates for the API server. This uses the IP address +of the default network interface. If you would like to access the API server +through a different IP address, or through a hostname, you can override these +defaults with `--api-advertise-addresses` and `--api-external-dns-names`. +For example, to generate certificates that verify the API server at addresses +`10.100.245.1` and `100.123.121.1`, you could use +`--api-advertise-addresses=10.100.245.1,100.123.121.1`. To allow it to be accessed +with a hostname, `--api-external-dns-names=kubernetes.example.com,kube.example.com` +Specifying `--api-advertise-addresses` disables auto detection of IP addresses. + +- `--cloud-provider` + +Currently, `kubeadm init` does not provide autodetection of cloud provider. +This means that load balancing and persistent volumes are not supported out +of the box. You can specify a cloud provider using `--cloud-provider`. +Valid values are the ones supported by `controller-manager`, namely `"aws"`, +`"azure"`, `"cloudstack"`, `"gce"`, `"mesos"`, `"openstack"`, `"ovirt"`, +`"rackspace"`, `"vsphere"`. In order to provide additional configuration for +the cloud provider, you should create a `/etc/kubernetes/cloud-config.json` +file manually, before running `kubeadm init`. `kubeadm` automatically +picks those settings up and ensures other nodes are configured correctly. +You must also set the `--cloud-provider` and `--cloud-config` parameters +yourself by editing the `/etc/systemd/system/kubelet.service.d/10-kubeadm.conf` +file appropriately. + +- `--external-etcd-cafile` etcd certificate authority file +- `--external-etcd-endpoints` (multiple values are allowed) +- `--external-etcd-certfile` etcd client certificate file +- `--external-etcd-keyfile` etcd client key file + +By default, `kubeadm` deploys a single node etcd cluster on the master +to store Kubernetes state. This means that any failure on the master node +requires you to rebuild your cluster from scratch. Currently `kubeadm init` +does not support automatic deployment of a highly available etcd cluster. +If you would like to use your own etcd cluster, you can override this +behaviour with `--external-etcd-endpoints`. `kubeadm` supports etcd client +authentication using the `--external-etcd-cafile`, `--external-etcd-certfile` +and `--external-etcd-keyfile` flags. + +- `--pod-network-cidr` + +By default, `kubeadm init` does not set node CIDR's for pods and allows you to +bring your own networking configuration through a CNI compatible network +controller addon such as [Weave Net](https://github.com/weaveworks/weave-kube), +[Calico](https://github.com/projectcalico/calico-containers/tree/master/docs/cni/kubernetes/manifests/kubeadm) +or [Canal](https://github.com/tigera/canal/tree/master/k8s-install/kubeadm). +If you are using a compatible cloud provider or flannel, you can specify a +subnet to use for each pod on the cluster with the `--pod-network-cidr` flag. +This should be a minimum of a /16 so that kubeadm is able to assign /24 subnets +to each node in the cluster. + +- `--service-cidr` (default '10.12.0.0/12') + +You can use the `--service-cidr` flag to override the subnet Kubernetes uses to +assign pods IP addresses. If you do, you will also need to update the +`/etc/systemd/system/kubelet.service.d/10-kubeadm.conf` file to reflect this change +else DNS will not function correctly. + +- `--service-dns-domain` (default 'cluster.local') + +By default, `kubeadm init` deploys a cluster that assigns services with DNS names +`..svc.cluster.local`. You can use the `--service-dns-domain` +to change the DNS name suffix. Again, you will need to update the +`/etc/systemd/system/kubelet.service.d/10-kubeadm.conf` file accordingly else DNS will +not function correctly. + +- `--token` + +By default, `kubeadm init` automatically generates the token used to initialise +each new node. If you would like to manually specify this token, you can use the +`--token` flag. The token must be of the format '<6 character string>.<16 character string>'. + +- `--use-kubernetes-version` (default 'v1.4.1') the kubernetes version to initialise + +`kubeadm` was originally built for Kubernetes version **v1.4.0**, older versions are not +supported. With this flag you can try any future version, e.g. **v1.5.0-beta.1** +whenever it comes out (check [releases page](https://github.com/kubernetes/kubernetes/releases) +for a full list of available versions). + +### `kubeadm join` + +`kubeadm join` has one mandatory flag, the token used to secure cluster bootstrap, +and one mandatory argument, the master IP address. + +Here's an example on how to use it: + +`kubeadm join --token=the_secret_token 192.168.1.1` + +- `--token=` + +By default, when `kubeadm init` runs, a token is generated and revealed in the output. +That's the token you should use here. + +## Troubleshooting + +* Some users on RHEL/CentOS 7 have reported issues with traffic being routed incorrectly due to iptables being bypassed. You should ensure `net.bridge.bridge-nf-call-iptables` is set to 1 in your sysctl config, eg. + +``` +# cat /etc/sysctl.d/k8s.conf +net.bridge.bridge-nf-call-ip6tables = 1 +net.bridge.bridge-nf-call-iptables = 1 +``` From ced57785dfa3ec1ebc6e3eee4114c1ecd95c075d Mon Sep 17 00:00:00 2001 From: Robert Ross Date: Mon, 10 Oct 2016 19:39:14 -0400 Subject: [PATCH 065/120] Fix code fencing for DNS validation example --- docs/admin/dns.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/admin/dns.md b/docs/admin/dns.md index 9470a6c7c7..cc132201aa 100644 --- a/docs/admin/dns.md +++ b/docs/admin/dns.md @@ -166,12 +166,15 @@ busybox 1/1 Running 0 ``` ### Validate DNS works + Once that pod is running, you can exec nslookup in that environment: + ``` kubectl exec busybox -- nslookup kubernetes.default ``` You should see something like: + ``` Server: 10.0.0.10 Address 1: 10.0.0.10 From 23d77196631642e67a8d73c15fa7da1fdd5c7939 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lucas=20K=C3=A4ldstr=C3=B6m?= Date: Tue, 11 Oct 2016 09:01:12 +0300 Subject: [PATCH 066/120] Move kubeadm reference, add a navigation link to it and assignees --- _data/guides.yml | 2 ++ .../kubeadm-reference.md => admin/kubeadm.md} | 9 ++++++++- docs/getting-started-guides/kubeadm.md | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) rename docs/{user-guide/kubeadm-reference.md => admin/kubeadm.md} (99%) diff --git a/_data/guides.yml b/_data/guides.yml index ab622a0284..40d47b08d6 100644 --- a/_data/guides.yml +++ b/_data/guides.yml @@ -252,6 +252,8 @@ toc: path: /docs/admin/ - title: Cluster Management Guide path: /docs/admin/cluster-management/ + - title: kubeadm reference + path: /docs/admin/kubeadm/ - title: Installing Addons path: /docs/admin/addons/ - title: Sharing a Cluster with Namespaces diff --git a/docs/user-guide/kubeadm-reference.md b/docs/admin/kubeadm.md similarity index 99% rename from docs/user-guide/kubeadm-reference.md rename to docs/admin/kubeadm.md index 49ba3663e6..57a21528c2 100644 --- a/docs/user-guide/kubeadm-reference.md +++ b/docs/admin/kubeadm.md @@ -1,4 +1,11 @@ -# kubeadm reference +--- +assignees: +- mikedanese +- luxas +- errordeveloper + +--- + This document provides information on how to use kubeadm's advanced options. diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index 32b91ccdb9..34e3ea7656 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -211,7 +211,7 @@ See the [list of add-ons](/docs/admin/addons/) to explore other add-ons, includi * Learn more about [Kubernetes concepts and kubectl in Kubernetes 101](/docs/user-guide/walkthrough/). * Install Kubernetes with [a cloud provider configurations](/docs/getting-started-guides/) to add Load Balancer and Persistent Volume support. -* Learn about `kubeadm`'s advanced usage on the [advanced reference doc](/docs/user-guide/kubeadm-reference/) +* Learn about `kubeadm`'s advanced usage on the [advanced reference doc](/docs/admin/kubeadm/) ## Cleanup From 75a3e77452891485f532593dca099bf36e4db5f6 Mon Sep 17 00:00:00 2001 From: Ilya Dmitrichenko Date: Tue, 11 Oct 2016 20:49:58 +0100 Subject: [PATCH 067/120] Note about workaround for https://github.com/kubernetes/kubernetes/issues/34566 --- docs/getting-started-guides/kubeadm.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index 34e3ea7656..d5232ad16c 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -254,3 +254,9 @@ Please note: `kubeadm` is a work in progress and these limitations will be addre 1. There is not yet an easy way to generate a `kubeconfig` file which can be used to authenticate to the cluster remotely with `kubectl` on, for example, your workstation. Workaround: copy the kubelet's `kubeconfig` from the master: use `scp root@:/etc/kubernetes/admin.conf .` and then e.g. `kubectl --kubeconfig ./admin.conf get nodes` from your workstation. + +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. + Workaround: Modify `/etc/hosts`, take a look at this [`Vagrantfile`][ubuntu-vagrantfile] for how you this can be achieved. + +[ubuntu-vagrantfile]: https://github.com/errordeveloper/k8s-playground/blob/22dd39dfc06111235620e6c4404a96ae146f26fd/Vagrantfile#L11), From 791000cbe4f771b4c48e7bb330db52ac3e1ff0c1 Mon Sep 17 00:00:00 2001 From: Steve Perry Date: Tue, 11 Oct 2016 14:36:18 -0700 Subject: [PATCH 068/120] Add replica count to tutorial. (#1434) --- .../deployment-scale.yaml | 16 +++++++++++++ .../run-stateless-application-deployment.md | 24 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 docs/tutorials/stateless-application/deployment-scale.yaml diff --git a/docs/tutorials/stateless-application/deployment-scale.yaml b/docs/tutorials/stateless-application/deployment-scale.yaml new file mode 100644 index 0000000000..2968b88360 --- /dev/null +++ b/docs/tutorials/stateless-application/deployment-scale.yaml @@ -0,0 +1,16 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: nginx-deployment +spec: + replicas: 4 + template: + metadata: + labels: + app: nginx + spec: + containers: + - name: nginx + image: nginx:1.8 # Update the version of nginx from 1.7.9 to 1.8 + ports: + - containerPort: 80 diff --git a/docs/tutorials/stateless-application/run-stateless-application-deployment.md b/docs/tutorials/stateless-application/run-stateless-application-deployment.md index 70aeb925c2..20a7aff243 100644 --- a/docs/tutorials/stateless-application/run-stateless-application-deployment.md +++ b/docs/tutorials/stateless-application/run-stateless-application-deployment.md @@ -94,6 +94,30 @@ specifies that the deployment should be updated to use nginx 1.8. kubectl get pods -l app=nginx +### Scaling the application by increasing the replica count + +You can increase the number of pods in your Deployment by applying a new YAML +file. This YAML file sets `replicas` to 4, which specifies that the Deployment +should have four pods: + +{% include code.html language="yaml" file="deployment-scale.yaml" ghlink="/docs/tutorials/stateless-application/deployment-scale.yaml" %} + +1. Apply the new YAML file: + + kubectl apply -f $REPO/docs/tutorials/stateless-application/deployment-scale.yaml + +1. Verify that the Deployment has four pods: + + kubectl get pods + + The output is similar to this: + + NAME READY STATUS RESTARTS AGE + nginx-deployment-148880595-4zdqq 1/1 Running 0 25s + nginx-deployment-148880595-6zgi1 1/1 Running 0 25s + nginx-deployment-148880595-fxcez 1/1 Running 0 2m + nginx-deployment-148880595-rwovn 1/1 Running 0 2m + ### Deleting a deployment Delete the deployment by name: From 5b8d8332fce581a08bf8aeabed67605ea011e4c2 Mon Sep 17 00:00:00 2001 From: Antoine Pelisse Date: Fri, 7 Oct 2016 12:41:56 -0700 Subject: [PATCH 069/120] Points to documentation about running privileged containers --- docs/user-guide/volumes.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/user-guide/volumes.md b/docs/user-guide/volumes.md index e33bd3e018..a7e0b3c2ba 100644 --- a/docs/user-guide/volumes.md +++ b/docs/user-guide/volumes.md @@ -126,9 +126,10 @@ Watch out when using this type of volume, because: behave differently on different nodes due to different files on the nodes * when Kubernetes adds resource-aware scheduling, as is planned, it will not be able to account for resources used by a `hostPath` -* the directories created on the underlying hosts are only writable by root, you either need - to run your process as root in a privileged container or modify the file permissions on - the host to be able to write to a `hostPath` volume +* the directories created on the underlying hosts are only writable by root. You + either need to run your process as root in a + [privileged container](/docs/user-guide/security-context) or modify the file + permissions on the host to be able to write to a `hostPath` volume #### Example pod From a250e18e2f3d91848ff07f5fad4c25677e2d8a80 Mon Sep 17 00:00:00 2001 From: Steel Brain Date: Wed, 12 Oct 2016 05:44:51 +0530 Subject: [PATCH 070/120] :bug: Fix broken JSON format --- docs/user-guide/secrets/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/secrets/index.md b/docs/user-guide/secrets/index.md index 4da56a3cca..f9931bfbf5 100644 --- a/docs/user-guide/secrets/index.md +++ b/docs/user-guide/secrets/index.md @@ -284,7 +284,7 @@ For example, you can specify a default mode like this: "image": "redis", "volumeMounts": [{ "name": "foo", - "mountPath": "/etc/foo", + "mountPath": "/etc/foo" }] }], "volumes": [{ @@ -322,7 +322,7 @@ permission for different files like this: "image": "redis", "volumeMounts": [{ "name": "foo", - "mountPath": "/etc/foo", + "mountPath": "/etc/foo" }] }], "volumes": [{ From 4d5d29567da6c2e71505a993c9ff1f63db0eaa85 Mon Sep 17 00:00:00 2001 From: Ilya Dmitrichenko Date: Tue, 11 Oct 2016 07:51:54 +0100 Subject: [PATCH 071/120] Cosmetic tweaks to main kubeadm doc - clean-up the reset script - remove details tag --- docs/getting-started-guides/kubeadm.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index d5232ad16c..f4f4c15211 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -45,7 +45,7 @@ For each host in turn: * 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: - # curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - + # curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add - # cat < /etc/apt/sources.list.d/kubernetes.list deb http://apt.kubernetes.io/ kubernetes-xenial main EOF @@ -218,15 +218,17 @@ See the [list of add-ons](/docs/admin/addons/) to explore other add-ons, includi * To uninstall the socks shop, run `kubectl delete -f microservices-demo/deploy/kubernetes/manifests` on the master. -* To undo what `kubeadm` did, simply delete the machines you created for this tutorial, or run the script below and then uninstall the packages. -
      -
      systemctl stop kubelet;
      -  docker rm -f $(docker ps -q); mount | grep "/var/lib/kubelet/*" | awk '{print $3}' | xargs umount 1>/dev/null 2>/dev/null;
      -  rm -rf /var/lib/kubelet /etc/kubernetes /var/lib/etcd /etc/cni;
      -  ip link set cbr0 down; ip link del cbr0;
      -  ip link set cni0 down; ip link del cni0;
      -  systemctl start kubelet
      -
      +* 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. + +
      + 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`. + ## Feedback From 3c94a1880ebf8125f63f549eee7635729285f250 Mon Sep 17 00:00:00 2001 From: Andrew Shu Date: Wed, 12 Oct 2016 09:16:24 -0700 Subject: [PATCH 072/120] Tutorial: Fix broken links on Basics Overview page --- docs/tutorials/kubernetes-basics/index.html | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/docs/tutorials/kubernetes-basics/index.html b/docs/tutorials/kubernetes-basics/index.html index 723639552b..d678461e41 100644 --- a/docs/tutorials/kubernetes-basics/index.html +++ b/docs/tutorials/kubernetes-basics/index.html @@ -42,49 +42,49 @@
      @@ -93,7 +93,7 @@ From cbb4d33b3edc8d2c889ad85618495db87a4ade28 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Wed, 12 Oct 2016 14:17:27 -0700 Subject: [PATCH 073/120] fix 404 redirect Signed-off-by: Jess Frazelle --- 404.md | 63 ++----------------------------------------------- js/redirects.js | 60 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+), 61 deletions(-) create mode 100644 js/redirects.js diff --git a/404.md b/404.md index bf053c1e3b..e644c19ed2 100644 --- a/404.md +++ b/404.md @@ -3,66 +3,7 @@ layout: docwithnav title: 404 Error! permalink: /404.html --- - + + Sorry, this page was not found. :( diff --git a/js/redirects.js b/js/redirects.js new file mode 100644 index 0000000000..dc3cbb56ed --- /dev/null +++ b/js/redirects.js @@ -0,0 +1,60 @@ +$( document ).ready(function() { + var oldURLs=["/README.md","/README.html",".html",".md","/v1.1/","/v1.0/"]; + var fwdDirs=["examples/","cluster/","docs/devel","docs/design"]; + var doRedirect = false; + var notHere = false; + var forwardingURL=window.location.href; + + var redirects = [{ + "from": "third_party/swagger-ui", + "to": "http://kubernetes.io/kubernetes/third_party/swagger-ui/" + }, + { + "from": "resource-quota", + "to": "http://kubernetes.io/docs/admin/resourcequota/" + }, + { + "from": "horizontal-pod-autoscaler", + "to": "http://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/" + }, + { + "from": "docs/roadmap", + "to": "https://github.com/kubernetes/kubernetes/milestones/" + }, + { + "from": "api-ref/", + "to": "https://github.com/kubernetes/kubernetes/milestones/" + }, + { + "from": "docs/user-guide/overview", + "to": "http://kubernetes.io/docs/whatisk8s/" + }]; + + for (i=0;i -1){ + notHere = true; + window.location.replace(redirects[i].to); + } + } + + for (i=0;i -1){ + var urlPieces = forwardingURL.split(fwdDirs[i]); + var newURL = "https://github.com/kubernetes/kubernetes/tree/{{page.githubbranch}}/" + fwdDirs[i] + urlPieces[1]; + notHere = true; + window.location.replace(newURL); + } + } + if (!notHere) { + for (i=0;i -1 && + forwardingURL.indexOf("404.html") < 0){ + doRedirect=true; + forwardingURL=forwardingURL.replace(oldURLs[i],"/"); + } + } + if (doRedirect){ + window.location.replace(forwardingURL); + }; + } +}); From 55076d553b5b7a6e6128aa5ebf6dcbe3c3320d11 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Wed, 12 Oct 2016 15:27:21 -0700 Subject: [PATCH 074/120] exclude sitemap, css and 404 from sitemap Signed-off-by: Jess Frazelle --- 404.md | 1 + robots.txt | 2 ++ sitemap.xml | 6 +++--- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/404.md b/404.md index e644c19ed2..3d32e81bcf 100644 --- a/404.md +++ b/404.md @@ -2,6 +2,7 @@ layout: docwithnav title: 404 Error! permalink: /404.html +no_canonical: true --- diff --git a/robots.txt b/robots.txt index 187d7c94bb..9bb39d8dbd 100644 --- a/robots.txt +++ b/robots.txt @@ -3,5 +3,7 @@ User-agent: * Disallow: /legacy/ Disallow: /v1.0/ Disallow: /v1.1/ +Disallow: /404/ +Disallow: 404.html SITEMAP: http://kubernetes.io/sitemap.xml diff --git a/sitemap.xml b/sitemap.xml index a965f4a570..ff1dd0d398 100644 --- a/sitemap.xml +++ b/sitemap.xml @@ -11,8 +11,8 @@ http://kubernetes.io/ {{ site.time | date_to_xmlschema }} -{% for page in site.pages %} +{% for page in site.pages %}{% if page.url != "/404.html" and page.url != "/sitemap.xml" and page.url != "/css/styles.css" %} http://kubernetes.io{{ page.url }} {% if page.date %}{{ page.date | date_to_xmlschema }}{% else %}{{ site.time | date_to_xmlschema }}{% endif %} -{% endfor %} - \ No newline at end of file +{% endif %}{% endfor %} + From d061e531931117d587a822334b02c804d7ad0e98 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Wed, 12 Oct 2016 13:43:39 -0700 Subject: [PATCH 075/120] dont set canonical tag for 404 page Signed-off-by: Jess Frazelle --- 404.md | 1 + _includes/head-header.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/404.md b/404.md index e644c19ed2..3d32e81bcf 100644 --- a/404.md +++ b/404.md @@ -2,6 +2,7 @@ layout: docwithnav title: 404 Error! permalink: /404.html +no_canonical: true --- diff --git a/_includes/head-header.html b/_includes/head-header.html index 12de81d975..0405f3699c 100644 --- a/_includes/head-header.html +++ b/_includes/head-header.html @@ -2,7 +2,7 @@ - + {% if !page.no_canonical %}{% endif %} From 8f41a65a40e6c0dcf8cc3b89699059dd00617269 Mon Sep 17 00:00:00 2001 From: Pablo Guerrero Date: Thu, 13 Oct 2016 14:43:48 +0200 Subject: [PATCH 076/120] Update index.md --- docs/admin/limitrange/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/limitrange/index.md b/docs/admin/limitrange/index.md index 74c0957f23..0336264bc3 100644 --- a/docs/admin/limitrange/index.md +++ b/docs/admin/limitrange/index.md @@ -8,7 +8,7 @@ assignees: By default, pods run with unbounded CPU and memory limits. This means that any pod in the system will be able to consume as much CPU and memory on the node that executes the pod. -Users may want to impose restrictions on the amount of resource a single pod in the system may consume +Users may want to impose restrictions on the amount of resources a single pod in the system may consume for a variety of reasons. For example: From 81634ad38d733bf94312a0d2c696aadc3d86f7ea Mon Sep 17 00:00:00 2001 From: Jon Cope Date: Tue, 11 Oct 2016 15:45:42 -0500 Subject: [PATCH 077/120] Added optional prereq to authorize API calls --- docs/getting-started-guides/gce.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/getting-started-guides/gce.md b/docs/getting-started-guides/gce.md index 22b1679a50..778795c3db 100644 --- a/docs/getting-started-guides/gce.md +++ b/docs/getting-started-guides/gce.md @@ -25,7 +25,8 @@ If you want to use custom binaries or pure open source Kubernetes, please contin 1. Install `gcloud` as necessary. `gcloud` can be installed as a part of the [Google Cloud SDK](https://cloud.google.com/sdk/). 1. Enable the [Compute Engine Instance Group Manager API](https://developers.google.com/console/help/new/#activatingapis) in the [Google Cloud developers console](https://console.developers.google.com). 1. Make sure that gcloud is set to use the Google Cloud Platform project you want. You can check the current project using `gcloud config list project` and change it via `gcloud config set project `. -1. Make sure you have credentials for GCloud by running ` gcloud auth login`. +1. Make sure you have credentials for GCloud by running `gcloud auth login`. +1. (Optional) In order to make API calls against GCE, you must also run `gcloud auth application-default login`. 1. Make sure you can start up a GCE VM from the command line. At least make sure you can do the [Create an instance](https://cloud.google.com/compute/docs/instances/#startinstancegcloud) part of the GCE Quickstart. 1. Make sure you can ssh into the VM without interactive prompts. See the [Log in to the instance](https://cloud.google.com/compute/docs/instances/#sshing) part of the GCE Quickstart. @@ -245,5 +246,3 @@ For support level information on all solutions, see the [Table of solutions](/do Please see the [Kubernetes docs](/docs/) for more details on administering and using a Kubernetes cluster. - - From 0ce841df60214855e3cef7ef20b20b5ae012ab69 Mon Sep 17 00:00:00 2001 From: bobsky Date: Thu, 13 Oct 2016 13:23:31 -0700 Subject: [PATCH 078/120] Update federated-ingress.md minor correction, feature is in alpha not beta. --- docs/user-guide/federation/federated-ingress.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/federation/federated-ingress.md b/docs/user-guide/federation/federated-ingress.md index 42e5ad536d..87965a3fc7 100644 --- a/docs/user-guide/federation/federated-ingress.md +++ b/docs/user-guide/federation/federated-ingress.md @@ -18,7 +18,7 @@ automatically checks the health of the pods comprising the service, and avoids sending requests to unresponsive or slow pods (or entire unresponsive clusters). -Federated Ingress is released as a beta feature, and supports Google Cloud (GKE, +Federated Ingress is released as an alpha feature, and supports Google Cloud Platform (GKE, GCE and hybrid scenarios involving both) in Kubernetes v1.4. Work is under way to support other cloud providers such as AWS, and other hybrid cloud scenarios (e.g. services spanning private on-premise as well as public cloud Kubernetes From 5d60ea4488d566d374c90ce3e11bb6fb080145ec Mon Sep 17 00:00:00 2001 From: seperry53test Date: Fri, 14 Oct 2016 11:38:58 -0700 Subject: [PATCH 079/120] Update page-templates.md (#1465) --- docs/contribute/page-templates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/contribute/page-templates.md b/docs/contribute/page-templates.md index da77bfc38e..d70077e246 100644 --- a/docs/contribute/page-templates.md +++ b/docs/contribute/page-templates.md @@ -12,7 +12,7 @@
    • Concept
    -

    The page templates are in the _includes/templates directory of the kubernetes.github.io repository. +

    The page templates are in the _includes/templates directory of the kubernetes.github.io repository.

    Task template

    From bf18da533dff4970ad66693ece6369ebc5f26575 Mon Sep 17 00:00:00 2001 From: Mike Spreitzer Date: Sat, 15 Oct 2016 00:42:43 -0400 Subject: [PATCH 080/120] Documented FLANNEL_BACKEND and ADMISSION_CONTROL in cluster/ubuntu doc --- docs/getting-started-guides/ubuntu.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/getting-started-guides/ubuntu.md b/docs/getting-started-guides/ubuntu.md index 3018bd026e..56ef9d9515 100644 --- a/docs/getting-started-guides/ubuntu.md +++ b/docs/getting-started-guides/ubuntu.md @@ -116,7 +116,13 @@ that conflicts with your own private network range. The `FLANNEL_NET` variable defines the IP range used for flannel overlay network, should not conflict with above `SERVICE_CLUSTER_IP_RANGE`. You can optionally provide additional Flannel network configuration -through `FLANNEL_OTHER_NET_CONFIG`, as explained in `cluster/ubuntu/config-default.sh`. +through `FLANNEL_BACKEND` and `FLANNEL_OTHER_NET_CONFIG`, as explained in `cluster/ubuntu/config-default.sh`. + +The default setting for `ADMISSION_CONTROL` is right for the latest +release of Kubernetes, but if you choose an earlier release then you +might want a different setting. See +[the admisson control doc](http://kubernetes.io/docs/admin/admission-controllers/#is-there-a-recommended-set-of-plug-ins-to-use) +for the recommended settings for various releases. **Note:** When deploying, master needs to be connected to the Internet to download the necessary files. If your machines are located in a private network that need proxy setting to connect the Internet, From 93d5887c4b0e509849dc8602e6dfeac231a67d02 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Fri, 14 Oct 2016 17:45:21 -0700 Subject: [PATCH 081/120] Write new material about how to contribute to the Kubernetes docs. --- README.md | 81 ++------------- _config.yml | 3 + _data/support.yml | 6 ++ docs/contribute/create-pull-request.md | 94 ++++++++++++++++++ docs/contribute/page-templates.md | 2 +- .../contribute/stage-documentation-changes.md | 98 +++++++++++++++++++ docs/contribute/write-new-topic.md | 83 ++++++++++++++++ docs/index.md | 2 +- .../http-proxy-access-api.md | 90 ----------------- editdocs.md | 42 -------- 10 files changed, 295 insertions(+), 206 deletions(-) create mode 100644 docs/contribute/create-pull-request.md create mode 100644 docs/contribute/stage-documentation-changes.md create mode 100644 docs/contribute/write-new-topic.md delete mode 100644 docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md delete mode 100644 editdocs.md diff --git a/README.md b/README.md index a468c1f947..de5c7c2df3 100644 --- a/README.md +++ b/README.md @@ -4,66 +4,20 @@ Welcome! We are very pleased you want to contribute to the documentation and/or You can 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. -## Staging the site on GitHub Pages +For more information about contributing to the Kubernetes documentation, see: -If you want to see your changes staged without having to install anything locally, remove the CNAME file in this directory and -change the name of the fork to be: +* [Creating a Documentation Pull Request](/docs/contribute/create-pull-request/) +* [Writing a New Topic](/docs/contribute/write-new-topic/) +* [Staging Your Documentation Changes](/docs/contribute/stage-documentation-changes/) +* [Using Page Templates](/docs/contribute/page-templates/) - YOUR_GITHUB_USERNAME.github.io +## Release Branch Staging -Then make your changes. +The Kubernetes site maintains staged versions at a subdomain provided by Netlify. Every PR for the Kubernetes site, either against the master branch or the upcoming release branch, is staged automatically. -When you visit [http://YOUR_GITHUB_USERNAME.github.io](http://YOUR_GITHUB_USERNAME.github.io) you should see a special-to-you version of the site that contains the changes you just made. - -## Staging the site locally (using Docker) - -Don't like installing stuff? Download and run a local staging server with a single `docker run` command. - - git clone https://github.com/kubernetes/kubernetes.github.io.git - cd kubernetes.github.io - docker run -ti --rm -v "$PWD":/k8sdocs -p 4000:4000 gcr.io/google-samples/k8sdocs:1.0 - -Then visit [http://localhost:4000](http://localhost:4000) to see our site. Any changes you make on your local machine will be automatically staged. - -If you're interested you can view [the Dockerfile for this image](https://github.com/kubernetes/kubernetes.github.io/blob/master/staging-container/Dockerfile). - -## Staging the site locally (from scratch setup) - -The below commands to setup your environment for running GitHub pages locally. Then, any edits you make will be viewable -on a lightweight webserver that runs on your local machine. - -This will typically be the fastest way (by far) to iterate on docs changes and see them staged, once you get this set up, but it does involve several install steps that take awhile to complete, and makes system-wide modifications. - -Install Ruby 2.2 or higher. If you're on Linux, run these commands: - - apt-get install software-properties-common - apt-add-repository ppa:brightbox/ruby-ng - apt-get install ruby2.2 - apt-get install ruby2.2-dev - -* If you're on a Mac, follow [these instructions](https://gorails.com/setup/osx/). -* If you're on a Windows machine you can use the [Ruby Installer](http://rubyinstaller.org/downloads/). During the installation make sure to check the option for *Add Ruby executables to your PATH*. - -The remainder of the steps should work the same across operating systems. - -To confirm you've installed Ruby correctly, at the command prompt run `gem --version` and you should get a response with your version number. Likewise you can confirm you have Git installed properly by running `git --version`, which will respond with your version of Git. - -Install the GitHub Pages package, which includes Jekyll: - - gem install github-pages - -Clone our site: - - git clone https://github.com/kubernetes/kubernetes.github.io.git - -Make any changes you want. Then, to see your changes locally: - - cd kubernetes.github.io - jekyll serve - -Your copy of the site will then be viewable at: [http://localhost:4000](http://localhost:4000) -(or wherever Jekyll tells you). +The staging site for the next upcoming Kubernetes release is here: [http://kubernetes-io-vnext-staging.netlify.com/](http://kubernetes-io-vnext-staging.netlify.com/) +The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. ## GitHub help @@ -135,23 +89,6 @@ That, of course, will send users to: (Or whatever Kubernetes release that docs branch is associated with.) -## Branch structure - -The current version of the website is served out of the `master` branch. - -All versions of the site that relate to past and future versions will be named after their Kubernetes release number. For example, [the old branch for the 1.1 docs is called `release-1.1`](https://github.com/kubernetes/kubernetes.github.io/tree/release-1.1). - -Changes in the "docsv2" branch (where we are testing a revamp of the docs) are automatically staged here: -http://k8sdocs.github.io/docs/tutorials/ - -Changes in the "release-1.1" branch (for k8s v1.1 docs) are automatically staged here: -http://kubernetes-v1-1.github.io/ - -Changes in the "release-1.3" branch (for k8s v1.3 docs) are automatically staged here: -http://kubernetes-v1-3.github.io/ - -Editing of these branches will kick off a build using Travis CI that auto-updates these URLs; you can monitor the build progress at [https://travis-ci.org/kubernetes/kubernetes.github.io](https://travis-ci.org/kubernetes/kubernetes.github.io). - ## Config yaml guidelines Guidelines for config yamls that are included in the site docs. These diff --git a/_config.yml b/_config.yml index 5094499bfe..4c398d8d57 100644 --- a/_config.yml +++ b/_config.yml @@ -27,3 +27,6 @@ defaults: showedit: true permalink: pretty + +gems: + - jekyll-redirect-from diff --git a/_data/support.yml b/_data/support.yml index d287f0ecaa..e280c827d7 100644 --- a/_data/support.yml +++ b/_data/support.yml @@ -6,6 +6,12 @@ toc: - title: Contributing to the Kubernetes Docs section: + - title: Creating a Documentation Pull Request + path: /docs/contribute/create-pull-request/ + - title: Writing a New Topic + path: /docs/contribute/write-new-topic/ + - title: Staging Your Documentation Changes + path: /docs/contribute/stage-documentation-changes/ - title: Using Page Templates path: /docs/contribute/page-templates/ diff --git a/docs/contribute/create-pull-request.md b/docs/contribute/create-pull-request.md new file mode 100644 index 0000000000..833b4abf08 --- /dev/null +++ b/docs/contribute/create-pull-request.md @@ -0,0 +1,94 @@ +--- +redirect_from: + - /editdocs/ +--- + +{% capture overview %} + +To contribute to the Kubernetes documentation, create a pull request against the +[kubernetes/kubernetes.github.io](https://github.com/kubernetes/kubernetes.github.io){: target="_blank"} +repository. This page shows how to create a pull request. + +{% endcapture %} + +{% capture prerequisites %} + +1. Create a [GitHub account](https://github.com){: target="_blank"}. + +1. Sign the +[Google Contributor License Agreement](https://cla.developers.google.com/about/google-individual){: target="_blank"}. + +1. Sign the +[Linux Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf){: target="_blank"}. + +{% endcapture %} + +{% capture steps %} + +### Creating a fork of the Kubernetes documentation repository + +1. Go to the +[kubernetes/kubernetes.github.io](https://github.com/kubernetes/kubernetes.github.io){: target="_blank"} +repository. + +1. In the upper-right corner, click **Fork**. This creates a copy of the +Kubernetes documentation repository in your GitHub account. The copy +is called a *fork*. + +### Making your changes + +1. In your GitHub account, in your fork of the Kubernetes docs, create +a new branch to use for your contribution. + +1. In your new branch, make your changes and commit them. If you want to +[write a new topic](/docs/contribute/write-new-topic/), +choose the +[page type](/docs/contribute/page-templates/) +that is the best fit for your content. + +### Submitting a pull request to the master branch + +If you want your change to be published in the released version Kubernetes docs, +create a pull request against the master branch of the Kubernetes +documentation repository. + +1. In your GitHub account, in your new branch, create a pull request +against the master branch of the kubernetes/kubernetes.github.io +repository. This opens a page that shows the status of your pull request. + +1. Click **Show all checks**. Wait for the **deploy/netlify** check to complete. +To the right of **deploy/netlify**, click **Details**. This opens a staging +site where you can verify that your changes have rendered correctly. + +1. During the next few days, check your pull request for reviewer comments. +If needed, revise your pull request by committing changes to your +new branch in your fork. + +### Submitting a pull request to the <vnext> branch + +If your documentation change should not be released until the next release of +the Kubernetes product, create a pull request against the <vnext> branch +of the Kubernetes documentation repository. The <vnext> branch has the +form `release-`, for example release-1.5. + +1. In your GitHub account, in your new branch, create a pull request +against the <vnext> branch of the kubernetes/kubernetes.github.io +repository. This opens a page that shows the status of your pull request. + +1. Click **Show all checks**. Wait for the **deploy/netlify** check to complete. +To the right of **deploy/netlify**, click **Details**. This opens a staging +site where you can verify that your changes have rendered correctly. + +1. During the next few days, check your pull request for reviewer comments. +If needed, revise your pull request by committing changes to your +new branch in your fork. + +{% 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). +{% endcapture %} + +{% include templates/task.md %} diff --git a/docs/contribute/page-templates.md b/docs/contribute/page-templates.md index da77bfc38e..62c4039d6a 100644 --- a/docs/contribute/page-templates.md +++ b/docs/contribute/page-templates.md @@ -71,7 +71,7 @@ Here's an interesting thing to know about the steps you just did.

    Here's an example of a published topic that uses the task template:

    -

    Using an HTTP Proxy to Access Applications in a Cluster

    +

    Using an HTTP Proxy to Access the Kubernetes API

    Tutorial template

    diff --git a/docs/contribute/stage-documentation-changes.md b/docs/contribute/stage-documentation-changes.md new file mode 100644 index 0000000000..8c01d92158 --- /dev/null +++ b/docs/contribute/stage-documentation-changes.md @@ -0,0 +1,98 @@ +--- +--- + +{% capture overview %} +This page shows how to stage content that you want to contribute +to the Kubernetes documentation. +{% endcapture %} + +{% capture prerequisites %} +Create a fork of the Kubernetes documentation repository as described in +[Creating a Documentation Pull Request](/docs/contribute/create-pull-request/). +{% endcapture %} + +{% capture steps %} + +### Staging from your GitHub account + +GitHub provides staging of content in your master branch. Note that you +might not want to merge your changes into your master branch. If that is +the case, choose another option for staging your content. + +1. In your GitHub account, in your fork, merge your changes into +the master branch. + +1. Change the name of your repository to `.github.io`, where +`` is the username of your GitHub account. + +1. Delete the `CNAME` file. + +1. View your staged content at this URL: + + https://.github.io + +### Staging a pull request + +When you create pull request against the Kubernetes documentation +repository, you can see your changes on a staging server. + +1. In your GitHub account, in your new branch, submit a pull request to the +kubernetes/kubernetes.github.io repository. This opens a page that shows the +status of your pull request. + +1. Click **Show all checks**. Wait for the **deploy/netlify** check to complete. +To the right of **deploy/netlify**, click **Details**. This opens a staging +site where you see your changes. + +### Staging locally using Docker + +You can use the k8sdocs Docker image to run a local staging server. If you're +interested, you can view the +[Dockerfile](https://github.com/kubernetes/kubernetes.github.io/blob/master/staging-container/Dockerfile){: target="_blank"} +for this image. + +1. Install Docker if you don't already have it. + +1. Clone your fork to your local development machine. + +1. In the root of your cloned repository, enter this command to start a local +web server: + + docker run -ti --rm -v "$PWD":/k8sdocs -p 4000:4000 gcr.io/google-samples/k8sdocs:1.0 + +1. View your staged content at +[http://localhost:4000](http://localhost:4000){: target="_blank"}. + +### Staging locally without Docker + +1. [Install Ruby 2.2 or later](https://www.ruby-lang.org){: target="_blank"}. + +1. [Install RubyGems](https://rubygems.org){: target="_blank"}. + +1. Verify that Ruby and RubyGems are installed: + + gem --version + +1. Install the GitHub Pages package, which includes Jekyll: + + gem install github-pages + +1. Clone your fork to your local development machine. + +1. In the root of your cloned repository, enter this command to start a local +web server: + + jekyll serve + +1. View your staged content at +[http://localhost:4000](http://localhost:4000){: target="_blank"}. + +{% 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 [creating a pull request](/docs/contribute/create-pull-request/). +{% endcapture %} + +{% include templates/task.md %} diff --git a/docs/contribute/write-new-topic.md b/docs/contribute/write-new-topic.md new file mode 100644 index 0000000000..c34f3cfde1 --- /dev/null +++ b/docs/contribute/write-new-topic.md @@ -0,0 +1,83 @@ +--- +--- + +{% capture overview %} +This page shows how to create a new topic for the Kubernetes docs. +{% endcapture %} + +{% capture prerequisites %} +Create a fork of the Kubernetes documentation repository as described in +[Creating a Documentation Pull Request](/docs/contribute/create-pull-request/). +{% endcapture %} + +{% capture steps %} + +### Choosing a page type + +As you prepare to write a new topic, think about which of these page types +is the best fit for your content: + + + + + + + + + + + + + + + + + + +
    TaskA task page shows how to do a single thing, typically by giving a short sequence of steps. Task pages have minimal explanation, but often provide links to conceptual topics that provide related background and knowledge.
    TutorialA tutorial page shows how to accomplish a goal that is larger than a single task. Typically a tutorial page has several sections, each of which has a sequence of steps. For example, a tutorial might provide a walkthrough of a code sample that illustrates a certain feature of Kubernetes. Tutorials can include surface-level explanations, but should link to related concept topics for deep explanations.
    ConceptA concept page explains some aspect of Kubernetes. For example, a concept page might describe the Kubernetes Deployment object and explain the role it plays as an application is deployed, scaled, and updated. Typically, concept pages don't include sequences of steps, but instead provide links to tasks or tutorials.
    + +Each page type has a +[template](/docs/contribute/page-templates/) +that you can use as you write your topic. +Using templates helps ensure consistency among topics of a given type. + +### Choosing a title and filename + +Choose a title that has the keywords you want search engines to find. +Create a filename that uses the words in your title separated by hyphens. +For example, the topic with title +[Using an HTTP Proxy to Access the Kubernetes API](/docs/tasks/access-kubernetes-api/http-proxy-access-api/) +has filename `http-proxy-access-api.md`. You don't need to put +"kubernetes" in the filename, because "kubernetes" is already in the +URL for the topic, for example: + + http://kubernetes.io/docs/tasks/access-kubernetes-api/http-proxy-access-api/ + +### Choosing a directory + +Depending on your page type, put your new file in a subdirectory of one of these: + +* /docs/tasks/ +* /docs/tutorials/ +* /docs/concepts/ + +You can put your file in an existing subdirectory, or you can create a new +subdirectory. + +### Creating an entry in the table of contents + +Depending page type, create an entry in one of these files: + +* /_data/tasks.yaml +* /_data/tutorials.yaml +* /_data/concepts.yaml + +{% endcapture %} + +{% capture whatsnext %} +* 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/write-new-topic). +{% endcapture %} + +{% include templates/task.md %} diff --git a/docs/index.md b/docs/index.md index 5e29c42dcb..9499ae68a2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -117,7 +117,7 @@ h2, h3, h4 {

    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 + Write Docs for K8s

    Need Help?

    diff --git a/docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md b/docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md deleted file mode 100644 index 0c7ad2ca87..0000000000 --- a/docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md +++ /dev/null @@ -1,90 +0,0 @@ ---- ---- - -{% capture overview %} -This page shows how to use an HTTP proxy to access the Kubernetes API. -{% 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. - -* If you do not already have an application running in your cluster, start - a Hello world application by entering this command: - - kubectl run --image=gcr.io/google-samples/node-hello:1.0 --port=8080 - -{% endcapture %} - -{% capture steps %} - -### Using kubectl to start a proxy server - -This command starts a proxy to the Kubernetes API server: - - kubectl proxy --port=8080 - -### Exploring the Kubernetes API - -When the proxy server is running, you can explore the API using `curl`, `wget`, -or a browser. - -Get the API versions: - - curl http://localhost:8080/api/ - - { - "kind": "APIVersions", - "versions": [ - "v1" - ], - "serverAddressByClientCIDRs": [ - { - "clientCIDR": "0.0.0.0/0", - "serverAddress": "10.0.2.15:8443" - } - ] - } - -Get a list of pods: - - curl http://localhost:8080/api/v1/namespaces/default/pods - - { - "kind": "PodList", - "apiVersion": "v1", - "metadata": { - "selfLink": "/api/v1/namespaces/default/pods", - "resourceVersion": "33074" - }, - "items": [ - { - "metadata": { - "name": "kubernetes-bootcamp-2321272333-ix8pt", - "generateName": "kubernetes-bootcamp-2321272333-", - "namespace": "default", - "selfLink": "/api/v1/namespaces/default/pods/kubernetes-bootcamp-2321272333-ix8pt", - "uid": "ba21457c-6b1d-11e6-85f7-1ef9f1dab92b", - "resourceVersion": "33003", - "creationTimestamp": "2016-08-25T23:43:30Z", - "labels": { - "pod-template-hash": "2321272333", - "run": "kubernetes-bootcamp" - }, - ... - } - -{% endcapture %} - -{% capture whatsnext %} -Learn more about [kubectl proxy](/docs/user-guide/kubectl/kubectl_proxy). -{% endcapture %} - -{% include templates/task.md %} diff --git a/editdocs.md b/editdocs.md deleted file mode 100644 index 0291912aca..0000000000 --- a/editdocs.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -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.

    - -

    Browse this site's source code

    - -
    - - - -{% include_relative README.md %} From 74791339ec923803538b755abbbfea6f20b2c111 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Fri, 14 Oct 2016 17:45:21 -0700 Subject: [PATCH 082/120] Write new material about how to contribute to the Kubernetes docs. --- README.md | 81 ++------------- _config.yml | 3 + _data/support.yml | 6 ++ docs/contribute/create-pull-request.md | 94 ++++++++++++++++++ docs/contribute/page-templates.md | 2 +- .../contribute/stage-documentation-changes.md | 98 +++++++++++++++++++ docs/contribute/write-new-topic.md | 83 ++++++++++++++++ docs/index.md | 2 +- .../http-proxy-access-api.md | 90 ----------------- editdocs.md | 42 -------- 10 files changed, 295 insertions(+), 206 deletions(-) create mode 100644 docs/contribute/create-pull-request.md create mode 100644 docs/contribute/stage-documentation-changes.md create mode 100644 docs/contribute/write-new-topic.md delete mode 100644 docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md delete mode 100644 editdocs.md diff --git a/README.md b/README.md index a468c1f947..85111edba9 100644 --- a/README.md +++ b/README.md @@ -4,66 +4,20 @@ Welcome! We are very pleased you want to contribute to the documentation and/or You can 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. -## Staging the site on GitHub Pages +For more information about contributing to the Kubernetes documentation, see: -If you want to see your changes staged without having to install anything locally, remove the CNAME file in this directory and -change the name of the fork to be: +* [Creating a Documentation Pull Request](http://kubernetes.io/docs/contribute/create-pull-request/) +* [Writing a New Topic](http://kubernetes.io/docs/contribute/write-new-topic/) +* [Staging Your Documentation Changes](http://kubernetes.io/docs/contribute/stage-documentation-changes/) +* [Using Page Templates](http://kubernetes.io/docs/contribute/page-templates/) - YOUR_GITHUB_USERNAME.github.io +## Release Branch Staging -Then make your changes. +The Kubernetes site maintains staged versions at a subdomain provided by Netlify. Every PR for the Kubernetes site, either against the master branch or the upcoming release branch, is staged automatically. -When you visit [http://YOUR_GITHUB_USERNAME.github.io](http://YOUR_GITHUB_USERNAME.github.io) you should see a special-to-you version of the site that contains the changes you just made. - -## Staging the site locally (using Docker) - -Don't like installing stuff? Download and run a local staging server with a single `docker run` command. - - git clone https://github.com/kubernetes/kubernetes.github.io.git - cd kubernetes.github.io - docker run -ti --rm -v "$PWD":/k8sdocs -p 4000:4000 gcr.io/google-samples/k8sdocs:1.0 - -Then visit [http://localhost:4000](http://localhost:4000) to see our site. Any changes you make on your local machine will be automatically staged. - -If you're interested you can view [the Dockerfile for this image](https://github.com/kubernetes/kubernetes.github.io/blob/master/staging-container/Dockerfile). - -## Staging the site locally (from scratch setup) - -The below commands to setup your environment for running GitHub pages locally. Then, any edits you make will be viewable -on a lightweight webserver that runs on your local machine. - -This will typically be the fastest way (by far) to iterate on docs changes and see them staged, once you get this set up, but it does involve several install steps that take awhile to complete, and makes system-wide modifications. - -Install Ruby 2.2 or higher. If you're on Linux, run these commands: - - apt-get install software-properties-common - apt-add-repository ppa:brightbox/ruby-ng - apt-get install ruby2.2 - apt-get install ruby2.2-dev - -* If you're on a Mac, follow [these instructions](https://gorails.com/setup/osx/). -* If you're on a Windows machine you can use the [Ruby Installer](http://rubyinstaller.org/downloads/). During the installation make sure to check the option for *Add Ruby executables to your PATH*. - -The remainder of the steps should work the same across operating systems. - -To confirm you've installed Ruby correctly, at the command prompt run `gem --version` and you should get a response with your version number. Likewise you can confirm you have Git installed properly by running `git --version`, which will respond with your version of Git. - -Install the GitHub Pages package, which includes Jekyll: - - gem install github-pages - -Clone our site: - - git clone https://github.com/kubernetes/kubernetes.github.io.git - -Make any changes you want. Then, to see your changes locally: - - cd kubernetes.github.io - jekyll serve - -Your copy of the site will then be viewable at: [http://localhost:4000](http://localhost:4000) -(or wherever Jekyll tells you). +The staging site for the next upcoming Kubernetes release is here: [http://kubernetes-io-vnext-staging.netlify.com/](http://kubernetes-io-vnext-staging.netlify.com/) +The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. ## GitHub help @@ -135,23 +89,6 @@ That, of course, will send users to: (Or whatever Kubernetes release that docs branch is associated with.) -## Branch structure - -The current version of the website is served out of the `master` branch. - -All versions of the site that relate to past and future versions will be named after their Kubernetes release number. For example, [the old branch for the 1.1 docs is called `release-1.1`](https://github.com/kubernetes/kubernetes.github.io/tree/release-1.1). - -Changes in the "docsv2" branch (where we are testing a revamp of the docs) are automatically staged here: -http://k8sdocs.github.io/docs/tutorials/ - -Changes in the "release-1.1" branch (for k8s v1.1 docs) are automatically staged here: -http://kubernetes-v1-1.github.io/ - -Changes in the "release-1.3" branch (for k8s v1.3 docs) are automatically staged here: -http://kubernetes-v1-3.github.io/ - -Editing of these branches will kick off a build using Travis CI that auto-updates these URLs; you can monitor the build progress at [https://travis-ci.org/kubernetes/kubernetes.github.io](https://travis-ci.org/kubernetes/kubernetes.github.io). - ## Config yaml guidelines Guidelines for config yamls that are included in the site docs. These diff --git a/_config.yml b/_config.yml index 5094499bfe..4c398d8d57 100644 --- a/_config.yml +++ b/_config.yml @@ -27,3 +27,6 @@ defaults: showedit: true permalink: pretty + +gems: + - jekyll-redirect-from diff --git a/_data/support.yml b/_data/support.yml index d287f0ecaa..e280c827d7 100644 --- a/_data/support.yml +++ b/_data/support.yml @@ -6,6 +6,12 @@ toc: - title: Contributing to the Kubernetes Docs section: + - title: Creating a Documentation Pull Request + path: /docs/contribute/create-pull-request/ + - title: Writing a New Topic + path: /docs/contribute/write-new-topic/ + - title: Staging Your Documentation Changes + path: /docs/contribute/stage-documentation-changes/ - title: Using Page Templates path: /docs/contribute/page-templates/ diff --git a/docs/contribute/create-pull-request.md b/docs/contribute/create-pull-request.md new file mode 100644 index 0000000000..833b4abf08 --- /dev/null +++ b/docs/contribute/create-pull-request.md @@ -0,0 +1,94 @@ +--- +redirect_from: + - /editdocs/ +--- + +{% capture overview %} + +To contribute to the Kubernetes documentation, create a pull request against the +[kubernetes/kubernetes.github.io](https://github.com/kubernetes/kubernetes.github.io){: target="_blank"} +repository. This page shows how to create a pull request. + +{% endcapture %} + +{% capture prerequisites %} + +1. Create a [GitHub account](https://github.com){: target="_blank"}. + +1. Sign the +[Google Contributor License Agreement](https://cla.developers.google.com/about/google-individual){: target="_blank"}. + +1. Sign the +[Linux Contributor License Agreement](https://identity.linuxfoundation.org/projects/cncf){: target="_blank"}. + +{% endcapture %} + +{% capture steps %} + +### Creating a fork of the Kubernetes documentation repository + +1. Go to the +[kubernetes/kubernetes.github.io](https://github.com/kubernetes/kubernetes.github.io){: target="_blank"} +repository. + +1. In the upper-right corner, click **Fork**. This creates a copy of the +Kubernetes documentation repository in your GitHub account. The copy +is called a *fork*. + +### Making your changes + +1. In your GitHub account, in your fork of the Kubernetes docs, create +a new branch to use for your contribution. + +1. In your new branch, make your changes and commit them. If you want to +[write a new topic](/docs/contribute/write-new-topic/), +choose the +[page type](/docs/contribute/page-templates/) +that is the best fit for your content. + +### Submitting a pull request to the master branch + +If you want your change to be published in the released version Kubernetes docs, +create a pull request against the master branch of the Kubernetes +documentation repository. + +1. In your GitHub account, in your new branch, create a pull request +against the master branch of the kubernetes/kubernetes.github.io +repository. This opens a page that shows the status of your pull request. + +1. Click **Show all checks**. Wait for the **deploy/netlify** check to complete. +To the right of **deploy/netlify**, click **Details**. This opens a staging +site where you can verify that your changes have rendered correctly. + +1. During the next few days, check your pull request for reviewer comments. +If needed, revise your pull request by committing changes to your +new branch in your fork. + +### Submitting a pull request to the <vnext> branch + +If your documentation change should not be released until the next release of +the Kubernetes product, create a pull request against the <vnext> branch +of the Kubernetes documentation repository. The <vnext> branch has the +form `release-`, for example release-1.5. + +1. In your GitHub account, in your new branch, create a pull request +against the <vnext> branch of the kubernetes/kubernetes.github.io +repository. This opens a page that shows the status of your pull request. + +1. Click **Show all checks**. Wait for the **deploy/netlify** check to complete. +To the right of **deploy/netlify**, click **Details**. This opens a staging +site where you can verify that your changes have rendered correctly. + +1. During the next few days, check your pull request for reviewer comments. +If needed, revise your pull request by committing changes to your +new branch in your fork. + +{% 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). +{% endcapture %} + +{% include templates/task.md %} diff --git a/docs/contribute/page-templates.md b/docs/contribute/page-templates.md index da77bfc38e..62c4039d6a 100644 --- a/docs/contribute/page-templates.md +++ b/docs/contribute/page-templates.md @@ -71,7 +71,7 @@ Here's an interesting thing to know about the steps you just did.

    Here's an example of a published topic that uses the task template:

    -

    Using an HTTP Proxy to Access Applications in a Cluster

    +

    Using an HTTP Proxy to Access the Kubernetes API

    Tutorial template

    diff --git a/docs/contribute/stage-documentation-changes.md b/docs/contribute/stage-documentation-changes.md new file mode 100644 index 0000000000..8c01d92158 --- /dev/null +++ b/docs/contribute/stage-documentation-changes.md @@ -0,0 +1,98 @@ +--- +--- + +{% capture overview %} +This page shows how to stage content that you want to contribute +to the Kubernetes documentation. +{% endcapture %} + +{% capture prerequisites %} +Create a fork of the Kubernetes documentation repository as described in +[Creating a Documentation Pull Request](/docs/contribute/create-pull-request/). +{% endcapture %} + +{% capture steps %} + +### Staging from your GitHub account + +GitHub provides staging of content in your master branch. Note that you +might not want to merge your changes into your master branch. If that is +the case, choose another option for staging your content. + +1. In your GitHub account, in your fork, merge your changes into +the master branch. + +1. Change the name of your repository to `.github.io`, where +`` is the username of your GitHub account. + +1. Delete the `CNAME` file. + +1. View your staged content at this URL: + + https://.github.io + +### Staging a pull request + +When you create pull request against the Kubernetes documentation +repository, you can see your changes on a staging server. + +1. In your GitHub account, in your new branch, submit a pull request to the +kubernetes/kubernetes.github.io repository. This opens a page that shows the +status of your pull request. + +1. Click **Show all checks**. Wait for the **deploy/netlify** check to complete. +To the right of **deploy/netlify**, click **Details**. This opens a staging +site where you see your changes. + +### Staging locally using Docker + +You can use the k8sdocs Docker image to run a local staging server. If you're +interested, you can view the +[Dockerfile](https://github.com/kubernetes/kubernetes.github.io/blob/master/staging-container/Dockerfile){: target="_blank"} +for this image. + +1. Install Docker if you don't already have it. + +1. Clone your fork to your local development machine. + +1. In the root of your cloned repository, enter this command to start a local +web server: + + docker run -ti --rm -v "$PWD":/k8sdocs -p 4000:4000 gcr.io/google-samples/k8sdocs:1.0 + +1. View your staged content at +[http://localhost:4000](http://localhost:4000){: target="_blank"}. + +### Staging locally without Docker + +1. [Install Ruby 2.2 or later](https://www.ruby-lang.org){: target="_blank"}. + +1. [Install RubyGems](https://rubygems.org){: target="_blank"}. + +1. Verify that Ruby and RubyGems are installed: + + gem --version + +1. Install the GitHub Pages package, which includes Jekyll: + + gem install github-pages + +1. Clone your fork to your local development machine. + +1. In the root of your cloned repository, enter this command to start a local +web server: + + jekyll serve + +1. View your staged content at +[http://localhost:4000](http://localhost:4000){: target="_blank"}. + +{% 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 [creating a pull request](/docs/contribute/create-pull-request/). +{% endcapture %} + +{% include templates/task.md %} diff --git a/docs/contribute/write-new-topic.md b/docs/contribute/write-new-topic.md new file mode 100644 index 0000000000..c34f3cfde1 --- /dev/null +++ b/docs/contribute/write-new-topic.md @@ -0,0 +1,83 @@ +--- +--- + +{% capture overview %} +This page shows how to create a new topic for the Kubernetes docs. +{% endcapture %} + +{% capture prerequisites %} +Create a fork of the Kubernetes documentation repository as described in +[Creating a Documentation Pull Request](/docs/contribute/create-pull-request/). +{% endcapture %} + +{% capture steps %} + +### Choosing a page type + +As you prepare to write a new topic, think about which of these page types +is the best fit for your content: + + + + + + + + + + + + + + + + + + +
    TaskA task page shows how to do a single thing, typically by giving a short sequence of steps. Task pages have minimal explanation, but often provide links to conceptual topics that provide related background and knowledge.
    TutorialA tutorial page shows how to accomplish a goal that is larger than a single task. Typically a tutorial page has several sections, each of which has a sequence of steps. For example, a tutorial might provide a walkthrough of a code sample that illustrates a certain feature of Kubernetes. Tutorials can include surface-level explanations, but should link to related concept topics for deep explanations.
    ConceptA concept page explains some aspect of Kubernetes. For example, a concept page might describe the Kubernetes Deployment object and explain the role it plays as an application is deployed, scaled, and updated. Typically, concept pages don't include sequences of steps, but instead provide links to tasks or tutorials.
    + +Each page type has a +[template](/docs/contribute/page-templates/) +that you can use as you write your topic. +Using templates helps ensure consistency among topics of a given type. + +### Choosing a title and filename + +Choose a title that has the keywords you want search engines to find. +Create a filename that uses the words in your title separated by hyphens. +For example, the topic with title +[Using an HTTP Proxy to Access the Kubernetes API](/docs/tasks/access-kubernetes-api/http-proxy-access-api/) +has filename `http-proxy-access-api.md`. You don't need to put +"kubernetes" in the filename, because "kubernetes" is already in the +URL for the topic, for example: + + http://kubernetes.io/docs/tasks/access-kubernetes-api/http-proxy-access-api/ + +### Choosing a directory + +Depending on your page type, put your new file in a subdirectory of one of these: + +* /docs/tasks/ +* /docs/tutorials/ +* /docs/concepts/ + +You can put your file in an existing subdirectory, or you can create a new +subdirectory. + +### Creating an entry in the table of contents + +Depending page type, create an entry in one of these files: + +* /_data/tasks.yaml +* /_data/tutorials.yaml +* /_data/concepts.yaml + +{% endcapture %} + +{% capture whatsnext %} +* 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/write-new-topic). +{% endcapture %} + +{% include templates/task.md %} diff --git a/docs/index.md b/docs/index.md index 5e29c42dcb..9499ae68a2 100644 --- a/docs/index.md +++ b/docs/index.md @@ -117,7 +117,7 @@ h2, h3, h4 {

    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 + Write Docs for K8s

    Need Help?

    diff --git a/docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md b/docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md deleted file mode 100644 index 0c7ad2ca87..0000000000 --- a/docs/tasks/access-kubernetes-api/access-kubernetes-api/http-proxy-access-api.md +++ /dev/null @@ -1,90 +0,0 @@ ---- ---- - -{% capture overview %} -This page shows how to use an HTTP proxy to access the Kubernetes API. -{% 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. - -* If you do not already have an application running in your cluster, start - a Hello world application by entering this command: - - kubectl run --image=gcr.io/google-samples/node-hello:1.0 --port=8080 - -{% endcapture %} - -{% capture steps %} - -### Using kubectl to start a proxy server - -This command starts a proxy to the Kubernetes API server: - - kubectl proxy --port=8080 - -### Exploring the Kubernetes API - -When the proxy server is running, you can explore the API using `curl`, `wget`, -or a browser. - -Get the API versions: - - curl http://localhost:8080/api/ - - { - "kind": "APIVersions", - "versions": [ - "v1" - ], - "serverAddressByClientCIDRs": [ - { - "clientCIDR": "0.0.0.0/0", - "serverAddress": "10.0.2.15:8443" - } - ] - } - -Get a list of pods: - - curl http://localhost:8080/api/v1/namespaces/default/pods - - { - "kind": "PodList", - "apiVersion": "v1", - "metadata": { - "selfLink": "/api/v1/namespaces/default/pods", - "resourceVersion": "33074" - }, - "items": [ - { - "metadata": { - "name": "kubernetes-bootcamp-2321272333-ix8pt", - "generateName": "kubernetes-bootcamp-2321272333-", - "namespace": "default", - "selfLink": "/api/v1/namespaces/default/pods/kubernetes-bootcamp-2321272333-ix8pt", - "uid": "ba21457c-6b1d-11e6-85f7-1ef9f1dab92b", - "resourceVersion": "33003", - "creationTimestamp": "2016-08-25T23:43:30Z", - "labels": { - "pod-template-hash": "2321272333", - "run": "kubernetes-bootcamp" - }, - ... - } - -{% endcapture %} - -{% capture whatsnext %} -Learn more about [kubectl proxy](/docs/user-guide/kubectl/kubectl_proxy). -{% endcapture %} - -{% include templates/task.md %} diff --git a/editdocs.md b/editdocs.md deleted file mode 100644 index 0291912aca..0000000000 --- a/editdocs.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -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.

    - -

    Browse this site's source code

    - -
    - - - -{% include_relative README.md %} From fc10dd34b25abc44412c096cfe709538592deb47 Mon Sep 17 00:00:00 2001 From: Steve Perry Date: Sat, 15 Oct 2016 15:04:23 -0700 Subject: [PATCH 083/120] External address (#1432) * Write new tutorial: Exposing an External IP Address. * Update prerequisites. --- _data/tutorials.yml | 2 + docs/tutorials/index.md | 2 + .../expose-external-ip-address.md | 153 ++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 docs/tutorials/stateless-application/expose-external-ip-address.md diff --git a/_data/tutorials.yml b/_data/tutorials.yml index e312523bcd..01440b09d7 100644 --- a/_data/tutorials.yml +++ b/_data/tutorials.yml @@ -48,3 +48,5 @@ toc: path: /docs/tutorials/stateless-application/run-stateless-application-deployment/ - title: Using a Service to Access an Application in a Cluster path: /docs/tutorials/stateless-application/expose-external-ip-address-service/ + - title: Exposing an External IP Address to Access an Application in a Cluster + path: /docs/tutorials/stateless-application/expose-external-ip-address/ diff --git a/docs/tutorials/index.md b/docs/tutorials/index.md index 03ae95fe36..14530ca25e 100644 --- a/docs/tutorials/index.md +++ b/docs/tutorials/index.md @@ -13,6 +13,8 @@ The Tutorials section of the Kubernetes documentation is a work in progress. * [Using a Service to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address-service/) +* [Exposing an External IP Address to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address/) + ### What's next If you would like to write a tutorial, see diff --git a/docs/tutorials/stateless-application/expose-external-ip-address.md b/docs/tutorials/stateless-application/expose-external-ip-address.md new file mode 100644 index 0000000000..63aabb813d --- /dev/null +++ b/docs/tutorials/stateless-application/expose-external-ip-address.md @@ -0,0 +1,153 @@ +--- +--- + +{% capture overview %} + +This page shows how to create a Kubernetes Service object that exposees an +external IP address. + +{% endcapture %} + + +{% capture prerequisites %} + +* Install [kubectl](http://kubernetes.io/docs/user-guide/prereqs). + +* Use a cloud provider like Google Container Engine or Amazon Web Services to + create a Kubernetes cluster. This tutorial creates an + [external load balancer](/docs/user-guide/load-balancer/), + which requires a cloud provider. + +* Configure `kubectl` to communicate with your Kubernetes API server. For + instructions, see the documentation for your cloud provider. + +{% endcapture %} + + +{% capture objectives %} + +* Run five instances of a Hello World application. +* Create a Service object that exposes an external IP address. +* Use the Service object to access the running application. + +{% endcapture %} + + +{% capture lessoncontent %} + +### Creating a service for an application running in five pods + +1. Run a Hello World application in your cluster: + + kubectl run hello-world --replicas=5 --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0 --port=8080 + + The preceding command creates a + [Deployment](/docs/user-guide/deployments/) + object and an associated + [ReplicaSet](/docs/user-guide/replicasets/) + object. The ReplicaSet has five + [Pods](/docs/user-guide/pods/), + each of which runs the Hello World application. + +1. Display information about the Deployment: + + kubectl get deployments hello-world + kubectl describe deployments hello-world + +1. Display information about your ReplicaSet objects: + + kubectl get replicasets + kubectl describe replicasets + +1. Create a Service object that exposes the deployment: + + kubectl expose deployment hello-world --type=LoadBalancer --name=my-service + +1. Display information about the Service: + + kubectl get services my-service + + The output is similar to this: + + NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE + my-service 10.3.245.137 104.198.205.71 8080/TCP 54s + + Note: If the external IP address is shown as , wait for a minute + and enter the same command again. + +1. Display detailed information about the Service: + + kubectl describe services my-service + + The output is similar to this: + + Name: my-service + Namespace: default + Labels: run=load-balancer-example + Selector: run=load-balancer-example + Type: LoadBalancer + IP: 10.3.245.137 + LoadBalancer Ingress: 104.198.205.71 + Port: 8080/TCP + NodePort: 32377/TCP + Endpoints: 10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more... + Session Affinity: None + Events: + + Make a note of the external IP address exposed by your service. In this + example, the external IP address is 104.198.205.71. Also note + the value of Port. In this example, the port is 8080. + +1. In the preceding output, you can see that the service has several endpoints: + 10.0.0.6:8080,10.0.1.6:8080,10.0.1.7:8080 + 2 more. These are internal + addresses of the pods that are running the Hello World application. To + verify these are pod addresses, enter this command: + + kubectl get pods --output=wide + + The output is similar to this: + + NAME ... IP NODE + hello-world-2895499144-1jaz9 ... 10.0.1.6 gke-cluster-1-default-pool-e0b8d269-1afc + hello-world-2895499144-2e5uh ... 0.0.1.8 gke-cluster-1-default-pool-e0b8d269-1afc + hello-world-2895499144-9m4h1 ... 10.0.0.6 gke-cluster-1-default-pool-e0b8d269-5v7a + hello-world-2895499144-o4z13 ... 10.0.1.7 gke-cluster-1-default-pool-e0b8d269-1afc + hello-world-2895499144-segjf ... 10.0.2.5 gke-cluster-1-default-pool-e0b8d269-cpuc + +1. Use the external IP address to access the Hello World application: + + curl http://: + + where `` us the external IP address of your Service, + and `` is the value of `Port` in your Service description. + + The response to a successful request is a hello message: + + Hello Kubernetes! + +{% endcapture %} + + +{% capture cleanup %} + +To delete the Service, enter this command: + + kubectl delete services my-service + +To delete the Deployment, the ReplicaSet, and the Pods that are running +the Hello World application, enter this command: + + kubectl delete deployment hello-world + +{% endcapture %} + + +{% capture whatsnext %} + +Learn more about +[connecting applications with services](/docs/user-guide/connecting-applications/). +{% endcapture %} + +{% include templates/tutorial.md %} + + From f5934f521bf08f0f82f422a2b328a062a1559d5a Mon Sep 17 00:00:00 2001 From: chrislovecnm Date: Sat, 15 Oct 2016 20:44:10 -0600 Subject: [PATCH 084/120] updating kubectl overview with explain --- docs/user-guide/kubectl-overview.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index bb587a9f91..8c134d475a 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -55,14 +55,15 @@ Operation | Syntax | Description `api-versions` | `kubectl api-versions [flags]` | List the API versions that are available. `apply` | `kubectl apply -f FILENAME [flags]`| Apply a configuration change to a resource from a file or stdin. `attach` | `kubectl attach POD -c CONTAINER [-i] [-t] [flags]` | Attach to a running container either to view the output stream or interact with the container (stdin). -`autoscale` | `autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags]` | Automatically scale the set of pods that are managed by a replication controller. +`autoscale` | `kubectl autoscale (-f FILENAME | TYPE NAME | TYPE/NAME) [--min=MINPODS] --max=MAXPODS [--cpu-percent=CPU] [flags]` | Automatically scale the set of pods that are managed by a replication controller. `cluster-info` | `kubectl cluster-info [flags]` | Display endpoint information about the master and services in the cluster. `config` | `kubectl config SUBCOMMAND [flags]` | Modifies kubeconfig files. See the individual subcommands for details. `create` | `kubectl create -f FILENAME [flags]` | Create one or more resources from a file or stdin. `delete` | `kubectl delete (-f FILENAME | TYPE [NAME | /NAME | -l label | --all]) [flags]` | Delete resources either from a file, stdin, or specifying label selectors, names, resource selectors, or resources. `describe` | `kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags]` | Display the detailed state of one or more resources. `edit` | `kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags]` | Edit and update the definition of one or more resources on the server by using the default editor. -`exec` | `kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]` | Execute a command against a container in a pod. +`exec` | `kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]` | Execute a command against a container in a pod, +`explain | `kubectl explain [--include-extended-apis=true] [--recursive=false] [flags]` | Get documentation of various resources. For instance pods, nodes, services, etc. `expose` | `kubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [----external-ip=external-ip-of-service] [--type=type] [flags]` | Expose a replication controller, service, or pod as a new Kubernetes service. `get` | `kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags]` | List one or more resources. `label` | `kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]` | Add or update the labels of one or more resources. From 95e14cc5f7e3bcf8f2cd3efb144454e14cbea9cf Mon Sep 17 00:00:00 2001 From: chrislovecnm Date: Sat, 15 Oct 2016 20:46:20 -0600 Subject: [PATCH 085/120] fixing format --- docs/user-guide/kubectl-overview.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/kubectl-overview.md b/docs/user-guide/kubectl-overview.md index 8c134d475a..e805d48b35 100644 --- a/docs/user-guide/kubectl-overview.md +++ b/docs/user-guide/kubectl-overview.md @@ -63,7 +63,7 @@ Operation | Syntax | Description `describe` | `kubectl describe (-f FILENAME | TYPE [NAME_PREFIX | /NAME | -l label]) [flags]` | Display the detailed state of one or more resources. `edit` | `kubectl edit (-f FILENAME | TYPE NAME | TYPE/NAME) [flags]` | Edit and update the definition of one or more resources on the server by using the default editor. `exec` | `kubectl exec POD [-c CONTAINER] [-i] [-t] [flags] [-- COMMAND [args...]]` | Execute a command against a container in a pod, -`explain | `kubectl explain [--include-extended-apis=true] [--recursive=false] [flags]` | Get documentation of various resources. For instance pods, nodes, services, etc. +`explain` | `kubectl explain [--include-extended-apis=true] [--recursive=false] [flags]` | Get documentation of various resources. For instance pods, nodes, services, etc. `expose` | `kubectl expose (-f FILENAME | TYPE NAME | TYPE/NAME) [--port=port] [--protocol=TCP|UDP] [--target-port=number-or-name] [--name=name] [----external-ip=external-ip-of-service] [--type=type] [flags]` | Expose a replication controller, service, or pod as a new Kubernetes service. `get` | `kubectl get (-f FILENAME | TYPE [NAME | /NAME | -l label]) [--watch] [--sort-by=FIELD] [[-o | --output]=OUTPUT_FORMAT] [flags]` | List one or more resources. `label` | `kubectl label (-f FILENAME | TYPE NAME | TYPE/NAME) KEY_1=VAL_1 ... KEY_N=VAL_N [--overwrite] [--all] [--resource-version=version] [flags]` | Add or update the labels of one or more resources. From 4b506ea4982157210ba051bb24910b97aa5e0188 Mon Sep 17 00:00:00 2001 From: Sergei Orlov Date: Sun, 16 Oct 2016 12:47:04 +0300 Subject: [PATCH 086/120] Fix link to qos --- docs/user-guide/production-pods.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/production-pods.md b/docs/user-guide/production-pods.md index efd1c43e43..3835781402 100644 --- a/docs/user-guide/production-pods.md +++ b/docs/user-guide/production-pods.md @@ -169,7 +169,7 @@ If no resource requirements are specified, a nominal amount of resources is assu {% include code.html language="yaml" file="redis-resource-deployment.yaml" ghlink="/docs/user-guide/redis-resource-deployment.yaml" %} -The container will die due to OOM (out of memory) if it exceeds its specified limit, so specifying a value a little higher than expected generally improves reliability. By specifying request, pod is guaranteed to be able to use that much of resource when needed. See [Resource QoS](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/proposals/resource-qos.md) for the difference between resource limits and requests. +The container will die due to OOM (out of memory) if it exceeds its specified limit, so specifying a value a little higher than expected generally improves reliability. By specifying request, pod is guaranteed to be able to use that much of resource when needed. See [Resource QoS](https://github.com/kubernetes/kubernetes/blob/{{page.githubbranch}}/docs/design/resource-qos.md) for the difference between resource limits and requests. If you're not sure how much resources to request, you can first launch the application without specifying resources, and use [resource usage monitoring](/docs/user-guide/monitoring) to determine appropriate values. From 3ef9c7e526a77fbf28e8baa491569ea7cbd800d7 Mon Sep 17 00:00:00 2001 From: Kami Gerami Date: Sat, 15 Oct 2016 14:56:15 +0200 Subject: [PATCH 087/120] 34613 404 Not Found on links referring to /docs/user-guide/kubectl/kubectl/ Changed all links referring to kubectl from /docs/user-guide/kubectl/kubectl/ to /docs/user-guide/kubectl/ --- docs/admin/static-pods.md | 2 +- docs/user-guide/federation/replicasets.md | 2 +- docs/user-guide/federation/secrets.md | 2 +- docs/user-guide/prereqs.md | 2 +- docs/user-guide/replicasets.md | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/admin/static-pods.md b/docs/admin/static-pods.md index d1ad849b3a..531494fb04 100644 --- a/docs/admin/static-pods.md +++ b/docs/admin/static-pods.md @@ -88,7 +88,7 @@ static-web-my-node1 172.17.0.3 my-node1/192.168 Labels from the static pod are propagated into the mirror-pod and can be used as usual for filtering. -Notice we cannot delete the pod with the API server (e.g. via [`kubectl`](/docs/user-guide/kubectl/kubectl/) command), kubelet simply won't remove it. +Notice we cannot delete the pod with the API server (e.g. via [`kubectl`](/docs/user-guide/kubectl/) command), kubelet simply won't remove it. ```shell [joe@my-master ~] $ kubectl delete pod static-web-my-node1 diff --git a/docs/user-guide/federation/replicasets.md b/docs/user-guide/federation/replicasets.md index 805da57782..d0ceaa8bde 100644 --- a/docs/user-guide/federation/replicasets.md +++ b/docs/user-guide/federation/replicasets.md @@ -35,7 +35,7 @@ The API for Federated Replica Set is 100% compatible with the API for traditional Kubernetes Replica Set. You can create a replica set by sending a request to the federation apiserver. -You can do that using [kubectl](/docs/user-guide/kubectl/kubectl/) by running: +You can do that using [kubectl](/docs/user-guide/kubectl/) by running: ``` shell kubectl --context=federation-cluster create -f myrs.yaml diff --git a/docs/user-guide/federation/secrets.md b/docs/user-guide/federation/secrets.md index 7e7a27fc7a..763b53e98e 100644 --- a/docs/user-guide/federation/secrets.md +++ b/docs/user-guide/federation/secrets.md @@ -35,7 +35,7 @@ The API for Federated Secret is 100% compatible with the API for traditional Kubernetes Secret. You can create a secret by sending a request to the federation apiserver. -You can do that using [kubectl](/docs/user-guide/kubectl/kubectl/) by running: +You can do that using [kubectl](/docs/user-guide/kubectl/) by running: ``` shell kubectl --context=federation-cluster create -f mysecret.yaml diff --git a/docs/user-guide/prereqs.md b/docs/user-guide/prereqs.md index dfba1542af..e6b94baa62 100644 --- a/docs/user-guide/prereqs.md +++ b/docs/user-guide/prereqs.md @@ -5,7 +5,7 @@ assignees: --- -To deploy and manage applications on Kubernetes, you’ll use the Kubernetes command-line tool, [kubectl](/docs/user-guide/kubectl/kubectl/). It lets you inspect your cluster resources, create, delete, and update components, and much more. You will use it to look at your new cluster and bring up example apps. +To deploy and manage applications on Kubernetes, you’ll use the Kubernetes command-line tool, [kubectl](/docs/user-guide/kubectl/). It lets you inspect your cluster resources, create, delete, and update components, and much more. You will use it to look at your new cluster and bring up example apps. ## Installing kubectl diff --git a/docs/user-guide/replicasets.md b/docs/user-guide/replicasets.md index 27e9e3da88..d06be55328 100644 --- a/docs/user-guide/replicasets.md +++ b/docs/user-guide/replicasets.md @@ -18,7 +18,7 @@ the selector support. Replica Set supports the new set-based selector requiremen as described in the [labels user guide](/docs/user-guide/labels/#label-selectors) whereas a Replication Controller only supports equality-based selector requirements. -Most [`kubectl`](/docs/user-guide/kubectl/kubectl/) commands that support +Most [`kubectl`](/docs/user-guide/kubectl/) commands that support Replication Controllers also support Replica Sets. One exception is the [`rolling-update`](/docs/user-guide/kubectl/kubectl_rolling-update/) command. If you want the rolling update functionality please consider using Deployments From d76084a4b6ba317bf55049d799ec7fc5d157164d Mon Sep 17 00:00:00 2001 From: Victor Gama Date: Sun, 16 Oct 2016 15:40:28 -0200 Subject: [PATCH 088/120] Fix small typo This removes an extra "is a" from the documentation text --- docs/tutorials/kubernetes-basics/cluster-intro.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/kubernetes-basics/cluster-intro.html b/docs/tutorials/kubernetes-basics/cluster-intro.html index 423dc61783..009a8e3947 100644 --- a/docs/tutorials/kubernetes-basics/cluster-intro.html +++ b/docs/tutorials/kubernetes-basics/cluster-intro.html @@ -87,7 +87,7 @@ redirect_from:

    When you deploy applications on Kubernetes, you tell the master to start the application containers. The master schedules the containers to run on the cluster's nodes. The nodes communicate with the master using the Kubernetes API, which the master exposes. End users can also use the Kubernetes API directly to interact with the cluster.

    -

    A Kubernetes cluster can be deployed on either physical or virtual machines. To get started with Kubernetes development, you can use minikube. Minikube is a is a lightweight Kubernetes implementation that creates a VM on your local machine and deploys a simple cluster containing only one node. Minikube is available for Linux, Mac OS and Windows systems. The minikube CLI provides basic bootstrapping operations for working with your cluster, including start, stop, status, and delete. For this bootcamp, however, you'll use a provided online terminal with minikube pre-installed.

    +

    A Kubernetes cluster can be deployed on either physical or virtual machines. To get started with Kubernetes development, you can use minikube. Minikube is a lightweight Kubernetes implementation that creates a VM on your local machine and deploys a simple cluster containing only one node. Minikube is available for Linux, Mac OS and Windows systems. The minikube CLI provides basic bootstrapping operations for working with your cluster, including start, stop, status, and delete. For this bootcamp, however, you'll use a provided online terminal with minikube pre-installed.

    Now that you know what Kubernetes is, let’s go to the online tutorial and start our first cluster!

    From 3bc8013a280783e1704272ee15cf621b25a4415a Mon Sep 17 00:00:00 2001 From: Denis Poisson Date: Mon, 17 Oct 2016 11:43:55 +0200 Subject: [PATCH 089/120] Update to Pet Set link 'Pet Set' now links correctly to http://kubernetes.io/docs/user-guide/petset/ --- docs/user-guide/ui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/ui.md b/docs/user-guide/ui.md index 0efdb3fd1f..84e0adabc6 100644 --- a/docs/user-guide/ui.md +++ b/docs/user-guide/ui.md @@ -163,7 +163,7 @@ Workloads are categorized as follows: * [Daemon Sets](http://kubernetes.io/docs/admin/daemons/) which ensure that all or some of the nodes in your cluster run a copy of a Pod. * [Deployments](http://kubernetes.io/docs/user-guide/deployments/) which provide declarative updates for Pods and Replica Sets (the next-generation [Replication Controller](http://kubernetes.io/docs/user-guide/replication-controller/)) The Details page for a Deployment lists resource details, as well as new and old Replica Sets. The resource details also include information on the [RollingUpdate](http://kubernetes.io/docs/user-guide/rolling-updates/) strategy, if any. -* [Pet Sets](http://kubernetes.io/docs/user-guide/load-balancer/) (nominal Services, also known as load-balanced Services) for legacy application support. +* [Pet Sets](http://kubernetes.io/docs/user-guide/petset/) (nominal Services, also known as load-balanced Services) for legacy application support. * [Replica Sets](http://kubernetes.io/docs/user-guide/replicasets/) for using label selectors. * [Jobs](http://kubernetes.io/docs/user-guide/jobs/) for creating one or more Pods, ensuring that a specified number of them successfully terminate, and tracking the completions. * [Replication Controllers](http://kubernetes.io/docs/user-guide/replication-controller/) From 553718a31e178f2b263e13b50044086462afd9bc Mon Sep 17 00:00:00 2001 From: Ricky Pai Date: Tue, 11 Oct 2016 16:34:06 -0700 Subject: [PATCH 090/120] Change RDB typo to RBD I assume this is referring to `RBD (Ceph Block Device)` and not something else --- docs/user-guide/persistent-volumes/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-guide/persistent-volumes/index.md b/docs/user-guide/persistent-volumes/index.md index 5232f068cd..8c69a75379 100644 --- a/docs/user-guide/persistent-volumes/index.md +++ b/docs/user-guide/persistent-volumes/index.md @@ -150,7 +150,7 @@ In the CLI, the access modes are abbreviated to: | HostPath | x | - | - | | iSCSI | x | x | - | | NFS | x | x | x | -| RDB | x | x | - | +| RBD | x | x | - | | VsphereVolume | x | - | - | ### Class From 047974c924c4fbd6e762be1fbd05b11a770e3bd6 Mon Sep 17 00:00:00 2001 From: Chris Jones Date: Mon, 17 Oct 2016 15:13:44 -0600 Subject: [PATCH 091/120] Added more prequisites. --- docs/getting-started-guides/ubuntu.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/getting-started-guides/ubuntu.md b/docs/getting-started-guides/ubuntu.md index 56ef9d9515..e5a849d909 100644 --- a/docs/getting-started-guides/ubuntu.md +++ b/docs/getting-started-guides/ubuntu.md @@ -29,6 +29,7 @@ Internet to download the necessary files, while worker nodes do not. Ubuntu 15 which uses systemd instead of upstart. 4. Dependencies of this guide: etcd-2.2.1, flannel-0.5.5, k8s-1.2.0, may work with higher versions. 5. All the remote servers can be ssh logged in without a password by using key authentication. +6. The remote user on all machines is using /bin/bash as its login shell, and has sudo access. ## Starting a Cluster From 1480754235a31300b933887810443300d7bdeffd Mon Sep 17 00:00:00 2001 From: Feynman Liang Date: Mon, 17 Oct 2016 15:58:45 -0700 Subject: [PATCH 092/120] Correct typo in authorization header --- docs/admin/authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/admin/authentication.md b/docs/admin/authentication.md index 5664e8b266..6819677107 100644 --- a/docs/admin/authentication.md +++ b/docs/admin/authentication.md @@ -101,7 +101,7 @@ quoting facilities of HTTP. For example: if the bearer token is header as shown below. ```http -Authentication: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269 +Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269 ``` ### Static Password File From 827ae558ec269a57a65186edd81efb27ee1c4a9d Mon Sep 17 00:00:00 2001 From: Fede Diaz Date: Tue, 18 Oct 2016 08:13:10 +0200 Subject: [PATCH 093/120] Update centos_manual_config.md Request change done. Fixed errata in flannel network. --- docs/getting-started-guides/centos/centos_manual_config.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started-guides/centos/centos_manual_config.md b/docs/getting-started-guides/centos/centos_manual_config.md index 1f1c3ff1dc..75b7cccbf7 100644 --- a/docs/getting-started-guides/centos/centos_manual_config.md +++ b/docs/getting-started-guides/centos/centos_manual_config.md @@ -10,7 +10,7 @@ assignees: ## Prerequisites -You need a machine acting as master and as many CentOS 7 hosts as you would like, that act as cluster nodes. +To configure Kubernetes with CentOS, you'll need a machine to act as a master, and one or more CentOS 7 hosts to act as cluster nodes. ## Starting a cluster @@ -119,11 +119,11 @@ KUBE_API_ARGS="" ``` * Configure ETCD to hold the network overlay configuration on master: -**Warning** This network must be unused in your network infrastructure! `172.40.0.0/16` is free in our network. +**Warning** This network must be unused in your network infrastructure! `172.30.0.0/16` is free in our network. ```shell $ etcdctl mkdir /kube-centos/network -$ etcdclt mk /kube-centos/network/config "{ \"Network\": \"172.40.0.0/16\", \"SubnetLen\": 24, \"Backend\": { \"Type\": \"vxlan\" } }" +$ etcdclt mk /kube-centos/network/config "{ \"Network\": \"172.30.0.0/16\", \"SubnetLen\": 24, \"Backend\": { \"Type\": \"vxlan\" } }" ``` * Configure flannel to overlay Docker network in /etc/sysconfig/flanneld on the master (also in the nodes as we'll see): From 65f244993cff22d76561f8cc9839e3bbdb803182 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Tue, 18 Oct 2016 09:50:31 -0700 Subject: [PATCH 094/120] Revise the section on Branch Structure and Staging. --- README.md | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index a4d5092fdf..40f2b42a32 100644 --- a/README.md +++ b/README.md @@ -28,17 +28,20 @@ When you create a pull request (either against master or the upcoming release), - Look for "deploy/netlify"; you'll see "Deploy Preview Ready!" if staging was successful - Click "Details" to bring up the staged site and navigate to your changes -## Release Branch Staging +## Branch structure and staging -The Kubernetes site maintains staged versions at a subdomain provided by Netlify. Every PR for the Kubernetes site, either against the master branch or the upcoming release branch, is staged automatically. +The current version of the website is served out of the `master` branch. To make changes to the live docs, such as bug fixes, broken links, typos, etc, **target your pull request to the master branch** -The staging site for the next upcoming Kubernetes release is here: [http://kubernetes-io-vnext-staging.netlify.com/](http://kubernetes-io-vnext-staging.netlify.com/) +The `release-1.x` branch stores changes for **upcoming releases of Kubernetes**. For example, the `release-1.5` branch has changes for the 1.5 release. These changes target branches (and *not* master) to avoid publishing documentation updates prior to the release for which they're relevant. If you have a change for an upcoming release of Kubernetes, **target your pull request to the appropriate release branch**. -The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. +The staging site for the next upcoming Kubernetes release is here: [http://kubernetes-io-vnext-staging.netlify.com/](http://kubernetes-io-vnext-staging.netlify.com/). The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. + +When you create a pull request, either against the master branch or the upcoming release branch, your changes are staged automatically. +The Kubernetes site maintains staged versions at a subdomain provided by Netlify. ## Staging the site locally (using Docker) -Don't like installing stuff? Download and run a local staging server with a single `docker run` command. +Don't like installing stuff? Download and run a local staging server with a single `docker run` command. git clone https://github.com/kubernetes/kubernetes.github.io.git cd kubernetes.github.io @@ -62,7 +65,7 @@ Install Ruby 2.2 or higher. If you're on Linux, run these commands: apt-get install ruby2.2 apt-get install ruby2.2-dev -* If you're on a Mac, follow [these instructions](https://gorails.com/setup/osx/). +* If you're on a Mac, follow [these instructions](https://gorails.com/setup/osx/). * If you're on a Windows machine you can use the [Ruby Installer](http://rubyinstaller.org/downloads/). During the installation make sure to check the option for *Add Ruby executables to your PATH*. The remainder of the steps should work the same across operating systems. From ebbe5bbcc1a1a9331113a76c48fd39841349e3ea Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Tue, 18 Oct 2016 16:40:10 -0700 Subject: [PATCH 095/120] Additional updates to the Staging sections of the README. --- README.md | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/README.md b/README.md index 40f2b42a32..c03defb3f7 100644 --- a/README.md +++ b/README.md @@ -11,14 +11,6 @@ For more information about contributing to the Kubernetes documentation, see: * [Staging Your Documentation Changes](http://kubernetes.io/docs/contribute/stage-documentation-changes/) * [Using Page Templates](http://kubernetes.io/docs/contribute/page-templates/) -## Release Branch Staging - -The Kubernetes site maintains staged versions at a subdomain provided by Netlify. Every PR for the Kubernetes site, either against the master branch or the upcoming release branch, is staged automatically. - -The staging site for the next upcoming Kubernetes release is here: [http://kubernetes-io-vnext-staging.netlify.com/](http://kubernetes-io-vnext-staging.netlify.com/) - -The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. - ## Automatic Staging for Pull Requests When you create a pull request (either against master or the upcoming release), your changes are staged in a custom subdomain on Netlify so that you can see your changes in rendered form before the PR is merged. You can use this to verify that everything is correct before the PR gets merged. To view your changes: @@ -36,9 +28,6 @@ The `release-1.x` branch stores changes for **upcoming releases of Kubernetes**. The staging site for the next upcoming Kubernetes release is here: [http://kubernetes-io-vnext-staging.netlify.com/](http://kubernetes-io-vnext-staging.netlify.com/). The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. -When you create a pull request, either against the master branch or the upcoming release branch, your changes are staged automatically. -The Kubernetes site maintains staged versions at a subdomain provided by Netlify. - ## Staging the site locally (using Docker) Don't like installing stuff? Download and run a local staging server with a single `docker run` command. From e41f80c9a508d2c6f7f23e6ae42452fd65b0b906 Mon Sep 17 00:00:00 2001 From: Steve Perry Date: Tue, 18 Oct 2016 17:25:48 -0700 Subject: [PATCH 096/120] Update README.md --- README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/README.md b/README.md index c03defb3f7..381cd46567 100644 --- a/README.md +++ b/README.md @@ -77,11 +77,6 @@ Make any changes you want. Then, to see your changes locally: Your copy of the site will then be viewable at: [http://localhost:4000](http://localhost:4000) (or wherever Jekyll tells you). -======= - -The staging site reflects the current state of what's been merged in the release branch, or in other words, what the docs will look like for the next upcoming release. It's automatically updated as new PRs get merged. - ->>>>>>> contribution-guide-2 ## GitHub help If you're a bit rusty with git/GitHub, you might want to read From 68a0c5195b89281ae281cf7fb88c4fd2648b863b Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Tue, 18 Oct 2016 20:01:43 -0700 Subject: [PATCH 097/120] Write new task: Defining Environment Variables for a Container. --- _data/tasks.yml | 4 + _includes/task-tutorial-prereqs.md | 4 + .../define-environment-variable-container.md | 77 +++++++++++++++++++ .../tasks/configure-pod-container/envars.yaml | 13 ++++ 4 files changed, 98 insertions(+) create mode 100644 _includes/task-tutorial-prereqs.md create mode 100644 docs/tasks/configure-pod-container/define-environment-variable-container.md create mode 100644 docs/tasks/configure-pod-container/envars.yaml diff --git a/_data/tasks.yml b/_data/tasks.yml index 86209a52aa..91bbe1bcca 100644 --- a/_data/tasks.yml +++ b/_data/tasks.yml @@ -2,6 +2,10 @@ bigheader: "Tasks" toc: - title: Tasks path: /docs/tasks/ +- title: Configuring Pods and Containers + section: + - title: Defining Environment Variables for a Container + path: /docs/tasks/configure-pod-container/define-environment-variable-container/ - title: Accessing Applications in a Cluster section: - title: Using Port Forwarding to Access Applications in a Cluster diff --git a/_includes/task-tutorial-prereqs.md b/_includes/task-tutorial-prereqs.md new file mode 100644 index 0000000000..a9cf90d265 --- /dev/null +++ b/_includes/task-tutorial-prereqs.md @@ -0,0 +1,4 @@ +You need to have a Kubernetes cluster, and the kubectl command-line tool must +be configured to communicate with your cluster. If you do not already have a +cluster, you can create one by using +[Minikube](/docs/getting-started-guides/minikube). diff --git a/docs/tasks/configure-pod-container/define-environment-variable-container.md b/docs/tasks/configure-pod-container/define-environment-variable-container.md new file mode 100644 index 0000000000..2cba3c55f1 --- /dev/null +++ b/docs/tasks/configure-pod-container/define-environment-variable-container.md @@ -0,0 +1,77 @@ +--- +--- + +{% capture overview %} + +This page shows how to define environment variables when you run a container +in a Kubernetes Pod. + +{% endcapture %} + + +{% capture prerequisites %} + +{% include task-tutorial-prereqs.md %} + +{% endcapture %} + + +{% capture steps %} + +### Defining an environment variable for a container + +When you create a Pod, you can set environment variables for the containers +that run in the Pod. To set environment variables, include the `env` field in +the configuration file. + +In this exercise, you create a Pod that runs one container. The configuration +file for the Pod defines an environment variable with name `DEMO_GREETING` and +value `"Hello from the environment"`. Here is the configuration file for the +Pod: + +{% include code.html language="yaml" file="envars.yaml" ghlink="/docs/tasks/configure-pod-container/envars.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/configure-pod-container/envars.yaml + +1. List the running Pods: + + kubectl get pods + + The output is similar to this: + + NAME READY STATUS RESTARTS AGE + envar-demo 1/1 Running 0 9s + +1. Get a shell to the container running in your Pod: + + kubectl exec -it envar-demo -- /bin/bash + +1. In your shell, run the `printenv` command to list the environment variables. + + root@envar-demo:/# printenv + + The output is similar to this: + + NODE_VERSION=4.4.2 + EXAMPLE_SERVICE_PORT_8080_TCP_ADDR=10.3.245.237 + HOSTNAME=envar-demo + ... + DEMO_GREETING=Hello from the environment + +1. To exit the shell, enter `exit`. + +{% endcapture %} + +{% capture whatsnext %} + +* Learn more about [environment variables](/docs/user-guide/environment-guide/). +* Learn about [using secrets as environment variables](/docs/user-guide/secrets/#using-secrets-as-environment-variables). +* See [EnvVarSource](/docs/api-reference/v1/definitions/#_v1_envvarsource). + +{% endcapture %} + + +{% include templates/task.md %} diff --git a/docs/tasks/configure-pod-container/envars.yaml b/docs/tasks/configure-pod-container/envars.yaml new file mode 100644 index 0000000000..97b296ac52 --- /dev/null +++ b/docs/tasks/configure-pod-container/envars.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Pod +metadata: + name: envar-demo + labels: + purpose: demonstrate-envars +spec: + containers: + - name: envar-demo-container + image: gcr.io/google-samples/node-hello:1.0 + env: + - name: DEMO_GREETING + value: "Hello from the environment" From ff780984743807c4db523246ca2c141ffbc4a00b Mon Sep 17 00:00:00 2001 From: Sascha Brawer Date: Thu, 20 Oct 2016 07:50:07 -0700 Subject: [PATCH 098/120] Fix broken links in work queue user guide --- docs/user-guide/jobs/work-queue-1/index.md | 8 ++++---- docs/user-guide/jobs/work-queue-2/index.md | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/user-guide/jobs/work-queue-1/index.md b/docs/user-guide/jobs/work-queue-1/index.md index e579f4b295..9b0735b574 100644 --- a/docs/user-guide/jobs/work-queue-1/index.md +++ b/docs/user-guide/jobs/work-queue-1/index.md @@ -166,7 +166,7 @@ We will use the `amqp-consume` utility to read the message from the queue and run our actual program. Here is a very simple example program: -{% include code.html language="python" file="worker.py" ghlink="/docs/user-guide/job/work-queue-1/worker.py" %} +{% include code.html language="python" file="worker.py" ghlink="/docs/user-guide/jobs/work-queue-1/worker.py" %} Now, build an image. If you are working in the source tree, then change directory to `examples/job/work-queue-1`. @@ -204,7 +204,7 @@ Here is a job definition. You'll need to make a copy of the Job and edit the image to match the name you used, and call it `./job.yaml`. -{% include code.html language="yaml" file="job.yaml" ghlink="/docs/user-guide/job/work-queue-1/job.yaml" %} +{% include code.html language="yaml" file="job.yaml" ghlink="/docs/user-guide/jobs/work-queue-1/job.yaml" %} In this example, each pod works on one item from the queue and then exits. So, the completion count of the Job corresponds to the number of work items @@ -258,12 +258,12 @@ want to consider one of the other [job patterns](/docs/user-guide/jobs/#job-patt This approach creates a pod for every work item. If your work items only take a few seconds, though, creating a Pod for every work item may add a lot of overhead. Consider another -[example](/docs/user-guide/job/work-queue-2), that executes multiple work items per Pod. +[example](/docs/user-guide/jobs/work-queue-2/), that executes multiple work items per Pod. In this example, we used use the `amqp-consume` utility to read the message from the queue and run our actual program. This has the advantage that you do not need to modify your program to be aware of the queue. -A [different example](/docs/user-guide/job/work-queue-2), shows how to +A [different example](/docs/user-guide/jobs/work-queue-2/), shows how to communicate with the work queue using a client library. ## Caveats diff --git a/docs/user-guide/jobs/work-queue-2/index.md b/docs/user-guide/jobs/work-queue-2/index.md index 328ece5a64..fc31850c91 100644 --- a/docs/user-guide/jobs/work-queue-2/index.md +++ b/docs/user-guide/jobs/work-queue-2/index.md @@ -108,7 +108,7 @@ called rediswq.py ([Download](rediswq.py?raw=true)). The "worker" program in each Pod of the Job uses the work queue client library to get work. Here it is: -{% include code.html language="python" file="worker.py" ghlink="/docs/user-guide/job/work-queue-2/worker.py" %} +{% include code.html language="python" file="worker.py" ghlink="/docs/user-guide/jobs/work-queue-2/worker.py" %} If you are working from the source tree, change directory to the `examples/job/work-queue-2` directory. @@ -147,7 +147,7 @@ gcloud docker push gcr.io//job-wq-2 Here is the job definition: -{% include code.html language="yaml" file="job.yaml" ghlink="/docs/user-guide/job/work-queue-2/job.yaml" %} +{% include code.html language="yaml" file="job.yaml" ghlink="/docs/user-guide/jobs/work-queue-2/job.yaml" %} Be sure to edit the job template to change `gcr.io/myproject` to your own path. From 32f45fb417fb3bf0fc29e6792fa059206af7ecd3 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 20 Oct 2016 11:05:23 -0700 Subject: [PATCH 099/120] Write new task: Defining a Command and Arguments for a Container. --- _data/tasks.yml | 2 + .../configure-pod-container/commands.yaml | 12 ++++ .../define-command-argument-container.md | 69 +++++++++++++++++++ docs/tasks/index.md | 5 ++ 4 files changed, 88 insertions(+) create mode 100644 docs/tasks/configure-pod-container/commands.yaml create mode 100644 docs/tasks/configure-pod-container/define-command-argument-container.md diff --git a/_data/tasks.yml b/_data/tasks.yml index 91bbe1bcca..90c1f3b8b2 100644 --- a/_data/tasks.yml +++ b/_data/tasks.yml @@ -6,6 +6,8 @@ toc: section: - title: Defining Environment Variables for a Container path: /docs/tasks/configure-pod-container/define-environment-variable-container/ + - title: Defining a Command and Arguments for a Container + path: /docs/tasks/configure-pod-container/define-command-argument-container/ - title: Accessing Applications in a Cluster section: - title: Using Port Forwarding to Access Applications in a Cluster diff --git a/docs/tasks/configure-pod-container/commands.yaml b/docs/tasks/configure-pod-container/commands.yaml new file mode 100644 index 0000000000..8d58007db4 --- /dev/null +++ b/docs/tasks/configure-pod-container/commands.yaml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: Pod +metadata: + name: command-demo + labels: + purpose: demonstrate-command +spec: + containers: + - name: command-demo-container + image: debian + command: ["printenv"] + args: ["HOSTNAME", "KUBERNETES_PORT"] diff --git a/docs/tasks/configure-pod-container/define-command-argument-container.md b/docs/tasks/configure-pod-container/define-command-argument-container.md new file mode 100644 index 0000000000..bbff487674 --- /dev/null +++ b/docs/tasks/configure-pod-container/define-command-argument-container.md @@ -0,0 +1,69 @@ +--- +--- + +{% capture overview %} + +This page shows how to define commands and arguments when you run a container +in a Kubernetes Pod. + +{% endcapture %} + + +{% capture prerequisites %} + +{% include task-tutorial-prereqs.md %} + +{% endcapture %} + + +{% capture steps %} + +### Defining a command when you create a Pod + +When you create a Pod, you can specify a command and arguments for the +containers that run in the Pod. To specify a command, include the `command` +field in the configuration file. To specify arguments for the command, include +the `args` field in the configuration file. The command that you specify in the +configuration file overrides the usual entry point for the container. + +In this exercise, you create a Pod that runs one container. The configuration +file for the Pod defines a command and two arguments: + +{% include code.html language="yaml" file="commands.yaml" ghlink="/docs/tasks/configure-pod-container/commands.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/configure-pod-container/commands.yaml + +1. List the running Pods: + + kubectl get pods + + The output shows that the container that ran in the command-demo Pod has + completed. + +1. To see the output of the command that ran in the container, view the logs +from the Pod: + + kubectl logs command-demo + + The output shows the values of the HOSTNAME and KUBERNETES_PORT environment + variables: + + command-demo + tcp://10.3.240.1:443 + +{% endcapture %} + +{% capture whatsnext %} + +* Learn more about [containers and commands](/docs/user-guide/containers/). +* Learn more about [configuring containers](/docs/user-guide/configuring-containers/). +* Learn more about [running commands in a container](/docs/user-guide/getting-into-containers/). +* See [Container](/docs/api-reference/v1/definitions/#_v1_container). + +{% endcapture %} + + +{% include templates/task.md %} diff --git a/docs/tasks/index.md b/docs/tasks/index.md index dcd9120e1b..fc08a0469a 100644 --- a/docs/tasks/index.md +++ b/docs/tasks/index.md @@ -3,6 +3,11 @@ The Tasks section of the Kubernetes documentation is a work in progress +#### Configuring Pods and Containers + +* [Defining Environment Variables for a Container](/docs/tasks/configure-pod-container/define-environment-variable-container/) +* [Defining a Command and Arguments for a Container](/docs/tasks/configure-pod-container/define-command-argument-container/) + #### Accessing Applications in a Cluster * [Using Port Forwarding to Access Applications in a Cluster](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) From 7b330390e2f83b6c9671581e9b3971329879a361 Mon Sep 17 00:00:00 2001 From: Jess Frazelle Date: Thu, 20 Oct 2016 12:23:08 -0700 Subject: [PATCH 100/120] mungers: fix preformat balance Signed-off-by: Jess Frazelle --- docs/user-guide/networkpolicies.md | 6 ++++-- docs/user-guide/production-pods.md | 6 ++++-- docs/user-guide/walkthrough/index.md | 6 ++++-- docs/user-guide/walkthrough/k8s201.md | 6 ++++-- 4 files changed, 16 insertions(+), 8 deletions(-) diff --git a/docs/user-guide/networkpolicies.md b/docs/user-guide/networkpolicies.md index a45534ad96..d1fe76d7ba 100644 --- a/docs/user-guide/networkpolicies.md +++ b/docs/user-guide/networkpolicies.md @@ -44,9 +44,11 @@ metadata: To configure the annotation via `kubectl`: -```shell{% raw %} +```shell +{% raw %} kubectl annotate ns "net.beta.kubernetes.io/network-policy={\"ingress\": {\"isolation\": \"DefaultDeny\"}}" -{% endraw %}``` +{% endraw %} +``` See the [NetworkPolicy getting started guide](/docs/getting-started-guides/network-policy/walkthrough) for an example. diff --git a/docs/user-guide/production-pods.md b/docs/user-guide/production-pods.md index c345ada200..440ac4619a 100644 --- a/docs/user-guide/production-pods.md +++ b/docs/user-guide/production-pods.md @@ -226,7 +226,8 @@ Here is a toy example: The message is recorded along with the other state of the last (i.e., most recent) termination: -```shell{% raw %} +```shell +{% raw %} $ kubectl create -f ./pod-w-message.yaml pod "pod-w-message" created $ sleep 70 @@ -234,7 +235,8 @@ $ kubectl get pods/pod-w-message -o go-template="{{range .status.containerStatus Sleep expired $ kubectl get pods/pod-w-message -o go-template="{{range .status.containerStatuses}}{{.lastState.terminated.exitCode}}{{end}}" 0 -{% endraw %}``` +{% endraw %} +``` ## What's next? diff --git a/docs/user-guide/walkthrough/index.md b/docs/user-guide/walkthrough/index.md index 4cc23cb71e..4c095e1c05 100644 --- a/docs/user-guide/walkthrough/index.md +++ b/docs/user-guide/walkthrough/index.md @@ -59,12 +59,14 @@ On most providers, the pod IPs are not externally accessible. The easiest way to Provided the pod IP is accessible, you should be able to access its http endpoint with wget on port 80: -```shell{% raw %} +```shell +{% raw %} $ kubectl run busybox --image=busybox --restart=Never --tty -i --generator=run-pod/v1 --env "POD_IP=$(kubectl get pod nginx -o go-template='{{.status.podIP}}')" u@busybox$ wget -qO- http://$POD_IP # Run in the busybox container u@busybox$ exit # Exit the busybox container $ kubectl delete pod busybox # Clean up the pod we created with "kubectl run" -{% endraw %}``` +{% endraw %} +``` Delete the pod by name: diff --git a/docs/user-guide/walkthrough/k8s201.md b/docs/user-guide/walkthrough/k8s201.md index 2f1f62ad1f..782bfbe418 100644 --- a/docs/user-guide/walkthrough/k8s201.md +++ b/docs/user-guide/walkthrough/k8s201.md @@ -136,7 +136,8 @@ On most providers, the service IPs are not externally accessible. The easiest wa Provided the service IP is accessible, you should be able to access its http endpoint with wget on the exposed port: -```shell{% raw %} +```shell +{% raw %} $ export SERVICE_IP=$(kubectl get service nginx-service -o go-template='{{.spec.clusterIP}}') $ export SERVICE_PORT=$(kubectl get service nginx-service -o go-template='{{(index .spec.ports 0).port}}') $ echo "$SERVICE_IP:$SERVICE_PORT" @@ -144,7 +145,8 @@ $ kubectl run busybox --generator=run-pod/v1 --image=busybox --restart=Never -- u@busybox$ wget -qO- http://$SERVICE_IP:$SERVICE_PORT # Run in the busybox container u@busybox$ exit # Exit the busybox container $ kubectl delete pod busybox # Clean up the pod we created with "kubectl run" -{% endraw %}``` +{% endraw %} +``` To delete the service by name: From a4972014d7fe95dec1447df9ca178a2b66b4f26a Mon Sep 17 00:00:00 2001 From: scotty Date: Thu, 20 Oct 2016 16:19:21 -0700 Subject: [PATCH 101/120] new partners layout --- _includes/partner-script.js | 202 +++++++++++++++++++++++ _includes/partner-style.css | 94 +++++++++++ images/community_logos/distelli_logo.png | Bin 0 -> 3872 bytes partners/index.html | 45 ++--- 4 files changed, 307 insertions(+), 34 deletions(-) create mode 100644 _includes/partner-script.js create mode 100644 _includes/partner-style.css create mode 100644 images/community_logos/distelli_logo.png diff --git a/_includes/partner-script.js b/_includes/partner-script.js new file mode 100644 index 0000000000..851b109e61 --- /dev/null +++ b/_includes/partner-script.js @@ -0,0 +1,202 @@ +;(function () { + var partners = [ + { + type: 0, + name: 'CoreOS', + logo: 'core_os', + link: 'https://tectonic.com/', + blurb: 'Tectonic is the enterprise-ready Kubernetes product, by CoreOS. It adds key features to allow you to manage, update, and control clusters in production.' + }, + { + type: 0, + name: 'Deis', + logo: 'deis', + link: 'https://deis.com', + blurb: 'Deis the creators of Helm, Workflow, and Steward, helps developers and operators build, deploy, manage and scale their applications on top of Kubernetes.' + }, + { + type: 0, + name: 'Sysdig Cloud', + logo: 'sys_dig', + link: 'https://sysdig.com/blog/monitoring-kubernetes-with-sysdig-cloud/', + blurb: 'Container native monitoring with deep support for Kubernetes.' + }, + { + type: 0, + name: 'Puppet', + logo: 'puppet', + link: 'https://puppet.com/blog/managing-kubernetes-configuration-puppet', + blurb: 'The Puppet module for Kubernetes makes it easy to manage Pods, Replication Controllers, Services and more in Kubernetes, and to build domain-specific interfaces to one\'s Kubernetes configuration.' + }, + { + type: 0, + name: 'Citrix', + logo: 'citrix', + link: 'http://wercker.com/workflows/partners/kubernetes/', + blurb: 'Netscaler CPX gives app developers all the features they need to load balance their microservices and containerized apps with Kubernetes.' + }, + { + type: 0, + name: 'Wercker', + logo: 'wercker', + link: 'http://wercker.com/workflows/partners/kubernetes/', + blurb: 'Wercker automates your build, test and deploy pipelines for launching containers and triggering rolling updates on your Kubernetes cluster. ' + }, + { + type: 0, + name: 'Rancher', + logo: 'rancher', + link: 'http://rancher.com/kubernetes/', + blurb: 'Rancher is an open-source, production-ready container management platform that makes it easy to deploy and leverage Kubernetes in the enterprise.' + }, + { + type: 0, + name: 'Red Hat', + logo: 'redhat', + link: 'https://www.openshift.com/', + blurb: 'Leverage an enterprise Kubernetes platform to orchestrate complex, multi-container apps.' + }, + { + type: 0, + name: 'Intel', + logo: 'intel', + link: 'https://tectonic.com/press/intel-coreos-collaborate-on-openstack-with-kubernetes.html', + blurb: 'Powering the GIFEE (Google’s Infrastructure for Everyone Else), to run OpenStack deployments on Kubernetes.' + }, + { + type: 0, + name: 'ElasticKube', + logo: 'elastickube', + link: 'https://www.ctl.io/elastickube-kubernetes/', + blurb: 'Self-service container management for Kubernetes.' + }, + { + type: 0, + name: 'Platform9', + logo: 'platform9', + link: 'https://platform9.com/products/kubernetes/', + blurb: 'Platform9 is the open source-as-a-service company that takes all of the goodness of Kubernetes and delivers it as a managed service.' + }, + { + type: 0, + name: 'Datadog', + logo: 'datadog', + link: 'http://docs.datadoghq.com/integrations/kubernetes/', + blurb: 'Full-stack observability for dynamic infrastructure & applications. Includes precision alerting, analytics and deep Kubernetes integrations. ' + }, + { + type: 0, + name: 'AppFormix', + logo: 'appformix', + link: 'http://www.appformix.com/solutions/appformix-for-kubernetes/', + blurb: 'AppFormix is a cloud infrastructure performance optimization service helping enterprise operators streamline their cloud operations on any Kubernetes cloud. ' + }, + { + type: 0, + name: 'Crunchy', + logo: 'crunchy', + link: 'http://info.crunchydata.com/blog/advanced-crunchy-containers-for-postgresql', + blurb: 'Crunchy PostgreSQL Container Suite is a set of containers for managing PostgreSQL with DBA microservices leveraging Kubernetes and Helm.' + }, + { + type: 0, + name: 'Aqua', + logo: 'aqua', + link: 'http://blog.aquasec.com/security-best-practices-for-kubernetes-deployment', + blurb: 'Deep, automated security for your containers running on Kubernetes.' + }, + { + type: 0, + name: 'Canonical', + logo: 'canonical', + link: 'https://jujucharms.com/canonical-kubernetes/', + blurb: 'The Canonical Distribution of Kubernetes enables you to operate Kubernetes clusters on demand on any major public cloud and private infrastructure.' + }, + { + type: 0, + name: 'Distelli', + logo: 'distelli', + link: 'https://www.distelli.com/', + blurb: 'Pipelines from your source repositories to your Kubernetes Clusters on any cloud.' + }, + { + type: 0, + name: 'Nuage networks', + logo: 'nuagenetworks', + link: 'https://github.com/nuagenetworks/nuage-kubernetes', + blurb: 'The Nuage SDN platform provides policy-based networking between Kubernetes Pods and non-Kubernetes environments with visibility and security monitoring.' + }, + { + type: 1, + name: 'Apprenda', + logo: 'apprenda', + link: 'https://apprenda.com/kubernetes-support/', + blurb: 'Apprenda offers flexible and wide range of support plans for pure play Kubernetes on your choice of infrastructure, cloud provider and operating system.' + }, + { + type: 1, + name: 'Reactive Ops', + logo: 'reactive_ops', + link: 'https://www.reactiveops.com/kubernetes/', + blurb: 'ReactiveOps has written automation on best practices for infrastructure as code on GCP & AWS using Kubernetes, helping you build and maintain a world-class infrastructure at a fraction of the price of an internal hire.' + }, + { + type: 1, + name: 'Livewyer', + logo: 'livewyer', + link: 'https://livewyer.io/services/kubernetes-experts/', + blurb: 'Kubernetes experts that on-board applications and empower IT teams to get the most out of containerised technology.' + }, + { + type: 1, + name: 'Deis', + logo: 'deis', + link: 'https://deis.com/services/', + blurb: 'Deis provides professional services and 24x7 operational support for any Kubernetes cluster managed by our global cluster operations team.' + }, + { + type: 1, + name: 'Samsung SDS', + logo: 'samsung_sds', + link: 'http://www.samsungsdsa.com/cloud-infrastructure_kubernetes', + blurb: 'Samsung SDS’s Cloud Native Computing Team offers expert consulting across the range of technical aspects involved in building services targeted at a Kubernetes cluster.' + }, + { + type: 1, + name: 'Container Solutions', + logo: 'container_solutions', + link: 'http://container-solutions.com/resources/kubernetes/', + blurb: 'Container Solutions is a premium software consultancy that focuses on programmable infrastructure, offering our expertise in software development, strategy and operations to help you innovate at speed and scale.' + } + ] + + var isvContainer = document.getElementById('isvContainer') + var servContainer = document.getElementById('servContainer') + + partners.forEach(function (obj) { + var box = document.createElement('div') + box.className = 'partner-box' + + var img = document.createElement('img') + img.src = '/images/square-logos/' + obj.logo + '.png' + + var div = document.createElement('div') + + var p = document.createElement('p') + p.textContent = obj.blurb + + var link = document.createElement('a') + link.href = obj.link + link.target = '_blank' + link.textContent = 'Learn more' + + div.appendChild(p) + div.appendChild(link) + + box.appendChild(img) + box.appendChild(div) + + var container = obj.type ? servContainer : isvContainer + container.appendChild(box) + }) +})(); \ No newline at end of file diff --git a/_includes/partner-style.css b/_includes/partner-style.css new file mode 100644 index 0000000000..a8cc125992 --- /dev/null +++ b/_includes/partner-style.css @@ -0,0 +1,94 @@ +h5 { + font-size: 18px; + line-height: 1.5em; + margin-bottom: 2em; +} + +#usersGrid a { + display: inline-block; + background-color: #f9f9f9; +} + +#isvContainer, #servContainer { + position: relative; + width: 100%; + display: flex; + justify-content: space-between; + flex-wrap: wrap; +} + +#isvContainer { + margin-bottom: 80px; +} + +.partner-box { + position: relative; + width: 47%; + max-width: 48%; + min-width: 48%; + margin-bottom: 20px; + padding: 20px; + flex: 1; + display: flex; + justify-content: space-between; + align-items: flex-start; +} + +.partner-box img { + background-color: #f9f9f9; +} + +.partner-box > div { + margin-left: 30px; +} + +.partner-box a { + color: #3576E3; +} + +@media screen and (max-width: 1024px) { + .partner-box { + flex-direction: column; + justify-content: flex-start; + } + + .partner-box > div { + margin: 20px 0 0; + } +} + +@media screen and (max-width: 568px) { + #isvContainer, #servContainer { + justify-content: center; + } + + .partner-box { + flex-direction: column; + justify-content: flex-start; + width: 100%; + max-width: 100%; + min-width: 100%; + } + + .partner-box > div { + margin: 20px 0 0; + } +} + +@media screen and (max-width: 568px) { + #isvContainer, #servContainer { + justify-content: center; + } + + .partner-box { + flex-direction: column; + justify-content: flex-start; + width: 100%; + max-width: 100%; + min-width: 100%; + } + + .partner-box > div { + margin: 20px 0 0; + } +} diff --git a/images/community_logos/distelli_logo.png b/images/community_logos/distelli_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d31e1d4226f49c9f27d66650e0456a35f35131cd GIT binary patch literal 3872 zcmcJS`6CmKJ@5(tv)55q`8r*{?XT!krAIq?eYQbK%(ih>eX$H461J~f>-ldBm% zSSY-3&h6+(Yv`yzlU6`Rt(@*e&296XlX!Oi?*9y~@ldF+2Z!^7U%!P~O;H}rk%)1b zC#Y+~^E+&>Pak#pC$yBQ!`*$yb&5j9BCQnVHcO7QveAgJwJ>tnkwz)O%zY#y=ubur ze+uMAkGh~sI|11IqQ{Lb^4$j=(l`2+?%IXPvaIlvnu&@pUBplJHPJq%Jyla5$Ne0{ z`Ci9nEHy5r`saSmuA0}R)d_cyKoK!)=xTmZ4g29H(srkjCFzCwy -vBlS?=?zf= zrAr)g%U9rRW?h$fF$gVUF9d`kBIf0?IJ9{re-0%sM_b7y71=*DZktu1mu%u)tcf{YN!&dZ+a7N zUBZ=ItESUx|``W07-Ft3|<4)lqv5)nkpuoSj@#rfgI@Rryy}*igwWA9$Vz!SA z$|K7!AA@A+c|CUq7-N|sT9?^$n7iRMq=JmcJ_}+Co8nYseQKX9+ODqEfAE!q#-K@0 zwODSBPG$f6P3@P^nWZlIqd~{U_a`4Vo~5Gyn3(u9dg6kFrd7)rZCt@E!9~m{M(~lu zn1II;||+l6!OUVG%kFLlB0!A}3-czVltaPtSR{wA#}rt`e= z@_=azt;VJm>TBWzR0?6ip1<+T3}sH$*tUI68ZP9`4(M&#j3+0M45J5R@D6y@tAnbL zT9=!Gb>>Vg#Y*n8*YQbs+6T3lz2MoRw%I2?r)Iwz_u0<7{Ml!sdthRUWlJN<)K&L# z{OmDi-TaNWX76a$nMG)T#8{J>sID(!bO&#gYkD1cv3or$ zf8~`YJlHNEf+!Q%mNG( zjDmn8daoO3HxkBztw+o%KsNto;x+Lh*AI($92r^?4jezg1(N=pHZ*Sz4BHG;sdpKB``G9j zh{c{(sgvB$ZOSxCx$Wl1*Nj1`FC~kA3qMQGLBx?0p`eErOOM-vwQ_FzlL9qMspWhd z7jIXuWZtT`Kuk~S_oKositZ zs_O}#v4#j`Bk23D7jYi5sP^IcUUQ#f0mq*<_eB~WxrL3tys1+CwfF`~(x=Nf6m4r$ znPyXq4p~EbiMTkPw^TuqDEG4KyaQ(SjEtnLS4Q^5Aa|TuW(f(dYFscPW1x=O|81+CU&H4KtZT zQ;Ra0Z8HkZHV{4cul)RSIKvBOi>Kn~+0N2SmkbM-cGySZhTkB0D?enbR!qW`eD_j*u zqt_7vbLLj2)E1_%lU_4T{0#v=H~Z)|Zx!?kUSWGGTBZzQkRH4vC;nCDZ2CJtlgQ7O z(VoGWYRY&&p}`+z?UAGMz*Hx5Cmxs8)p}QwLjKwIwPVjI*!jJj#|+4NzlxD?5k1iR=e{HO6$&nJgHnfja5Aj7q z4B;E0KZj?MQnF#)KjRn&I-!@WUBxDKx|J<>pfOl2QA=5p(48ig-)k?Ps_i_NtRsZC zD8EpK_}{}c`xB5M*@4^002y>lbuDxNV^+?CCTsuDp0|N$eek7_rcszDO?%^hBej($ z;MjMCFth1yK9{+Mjk^18VSEaPJzx#2#IIBQ zUeSGW!?rC-hb#|{w!XFN`$F)e*->Pb-hXw)pulvs*42ZD6&~OxxkNvaN`J|TX0FMo zv&)5N#bW(CDW>R4O&hip_Z^}L^f$v${G@FwBgkp$B~+0b25)jV{1wh5VN#70*tLN4 z9P>k%R!9lY6NVmq&E_kW`3>gVI(s8%_h2J~7fg&Vlb0Mnx~!y?fTK`Fr&Mn?CBX!~ z5*}=w$026al?Y~&g+(V%rBt-F+ayt?B}<`6US?&mZIVD5eHr$WED?{X+8xaJ!y-Q>@7? zZ3~E3xv9GvQTn;@)ygY4pXjio+4&o3+P*B6YNo#!hpw+8^1>$!h+eZ#+?(E4EbvCF zWDrD5Wm*;XW;Qo3-adS`A(mWU+v`b=i1l71yR-)vceveV0#}^S?qV-H!(-5a<>?il zN)rP0qs^Zixa;ONQYj{sm!R>+r&NyRMo^2D;C=&|X*BQc{QU0>znD{{4o#HK;rH}H z9G=1kmXRc`=8o@{-8UCiiL@)rFDWjpSzau$vQ_87=Ogh2>;t4Vg(CbI8_njnX9T9r zuxktUwfZ}~)jpQjwdqL!e$49VR^HBBysk`B?%K;_=a&&ookmOBQQKT)l=Y#}aXjT`# zaFEYA@_)SAPe=y@u!wmrI2obMnNQgxgb(DN4Dpz_83x~A73+Yo%2-{7(>a?&J^9v! zq1#Ay(L!X?hHAo8U38^_+ZF~c=>?U2!`s}uk+p;BxmQ%WSZBnm5^6NSqP zh{9*ZImia(Ja#sqnGuOis)M_dr=VjiC&n$(?gq-eAeX*j07{VxyD0Q-;aQu(H_tlQpsMSy(dh+pyBWKM zyk`Mja-ak^GIT!MH4%PG@{c%UY^qOC&eVk}2VlXFJEWtJ)%p7|lqg;?BUGoDfa9_R zN~06WF#z(4viL>B+EMK4yj1Q`L#Y$gNtst+ zPO_eL(#v*=qyNzFnAjOL7wt;m6ZO;S4*g#`;6J-Ooj-K381eD-J>c#CXTA)^2Il%T IcVUVD2jIYa(*OVf literal 0 HcmV?d00001 diff --git a/partners/index.html b/partners/index.html index c47f0998a7..fd7ed3eeef 100644 --- a/partners/index.html +++ b/partners/index.html @@ -16,45 +16,22 @@ title: Partners
    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.

    ISV Partners

    -
    - - - - - - - - - - - - - - - - - - - - -
    +
    +

    Services Partners

    +
    - {% include footer.html %} {% include case-study-styles.html %} + + + + From 9b18efd3345496aa1e078a3c00b1b184ffec33a9 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Thu, 20 Oct 2016 16:36:00 -0700 Subject: [PATCH 102/120] Write new task: Defining a Command and Arguments for a Container 2 --- .../define-command-argument-container.md | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/docs/tasks/configure-pod-container/define-command-argument-container.md b/docs/tasks/configure-pod-container/define-command-argument-container.md index bbff487674..1e623d9b43 100644 --- a/docs/tasks/configure-pod-container/define-command-argument-container.md +++ b/docs/tasks/configure-pod-container/define-command-argument-container.md @@ -18,13 +18,19 @@ in a Kubernetes Pod. {% capture steps %} -### Defining a command when you create a Pod +### Defining a command and arguments when you create a Pod -When you create a Pod, you can specify a command and arguments for the -containers that run in the Pod. To specify a command, include the `command` -field in the configuration file. To specify arguments for the command, include -the `args` field in the configuration file. The command that you specify in the -configuration file overrides the usual entry point for the container. +When you create a Pod, you can define a command and arguments for the +containers that run in the Pod. To define a command, include the `command` +field in the configuration file. To define arguments for the command, include +the `args` field in the configuration file. The command and arguments that +you define cannot be changed after the Pod is created. + +The command and arguments that you define in the configuration file +override the default command and arguments provided by the container image. +If you define args, but do not define a command, the default command is used +with your new arguments. For more information, see +[Commands and Capabilities](/docs/user-guide/containers/). In this exercise, you create a Pod that runs one container. The configuration file for the Pod defines a command and two arguments: @@ -54,6 +60,24 @@ from the Pod: command-demo tcp://10.3.240.1:443 +### Using environment variables to define arguments + +In the preceding example, you defined the arguments directly by +providing strings. As an alternative to providing strings directly, +you can define arguments by using environment variables. + + env: + - name: MESSAGE + value: "hello world" + command: ["/bin/echo"] + args: ["$(MESSAGE)"] + +This means you can define an argument for a Pod using any of +the techniques available for defining environment variables, including +[ConfigMaps](/docs/user-guide/configmap/) +and +[Secrets](/docs/user-guide/secrets/). + {% endcapture %} {% capture whatsnext %} From 973b6c1e996268b61e28831143e4a3fa0c479ef4 Mon Sep 17 00:00:00 2001 From: scotty Date: Fri, 21 Oct 2016 08:37:47 -0700 Subject: [PATCH 103/120] square logos --- images/square-logos/appformix.png | Bin 0 -> 8598 bytes images/square-logos/apprenda.png | Bin 0 -> 5933 bytes images/square-logos/aqua.png | Bin 0 -> 8847 bytes images/square-logos/canonical.png | Bin 0 -> 12615 bytes images/square-logos/citrix.png | Bin 0 -> 7569 bytes images/square-logos/container_solutions.png | Bin 0 -> 10083 bytes images/square-logos/core_os.png | Bin 0 -> 9252 bytes images/square-logos/crunchy.png | Bin 0 -> 17123 bytes images/square-logos/datadog.png | Bin 0 -> 13224 bytes images/square-logos/deis.png | Bin 0 -> 3576 bytes images/square-logos/distelli.png | Bin 0 -> 3872 bytes images/square-logos/elastickube.png | Bin 0 -> 10550 bytes images/square-logos/intel.png | Bin 0 -> 7454 bytes images/square-logos/livewyer.png | Bin 0 -> 1993 bytes images/square-logos/nuagenetworks.png | Bin 0 -> 15060 bytes images/square-logos/platform9.png | Bin 0 -> 8286 bytes images/square-logos/puppet.png | Bin 0 -> 11473 bytes images/square-logos/rancher.png | Bin 0 -> 11733 bytes images/square-logos/reactive_ops.png | Bin 0 -> 4545 bytes images/square-logos/redhat.png | Bin 0 -> 9029 bytes images/square-logos/samsung_sds.png | Bin 0 -> 9446 bytes images/square-logos/sys_dig.png | Bin 0 -> 7002 bytes images/square-logos/wercker.png | Bin 0 -> 9583 bytes 23 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/square-logos/appformix.png create mode 100644 images/square-logos/apprenda.png create mode 100644 images/square-logos/aqua.png create mode 100644 images/square-logos/canonical.png create mode 100644 images/square-logos/citrix.png create mode 100644 images/square-logos/container_solutions.png create mode 100644 images/square-logos/core_os.png create mode 100644 images/square-logos/crunchy.png create mode 100644 images/square-logos/datadog.png create mode 100644 images/square-logos/deis.png create mode 100644 images/square-logos/distelli.png create mode 100644 images/square-logos/elastickube.png create mode 100644 images/square-logos/intel.png create mode 100644 images/square-logos/livewyer.png create mode 100644 images/square-logos/nuagenetworks.png create mode 100644 images/square-logos/platform9.png create mode 100644 images/square-logos/puppet.png create mode 100644 images/square-logos/rancher.png create mode 100644 images/square-logos/reactive_ops.png create mode 100644 images/square-logos/redhat.png create mode 100644 images/square-logos/samsung_sds.png create mode 100644 images/square-logos/sys_dig.png create mode 100644 images/square-logos/wercker.png diff --git a/images/square-logos/appformix.png b/images/square-logos/appformix.png new file mode 100644 index 0000000000000000000000000000000000000000..47ad7e9722712ada4d7e9e3bbf30e4fa45ac4734 GIT binary patch literal 8598 zcmch7hc{f``}GilX!Air^cp2f^jpbT?dp~=hlVobFOM8d)4gdh4)z{N9Bi>QO6G?fS zcm!>+k$Yiy4hgq`Bz>z) zIfS9%FlrAa7N3AaCN^q7gyDvM;uwVOsxyST6qpH=NII2WVX&QZ8AetOEV|1`PgNas z5L>*Klzvm7@PT|X!Cwu#J~Sulu`+qNRn;9tBlPCu|IKl^$bDp)4#lZo3{XB+;jI1H z7J1gYzrSy9-s{B2qjgSAt&Ce-EV6I&S(p|tlje?DN#-VteHZT}Lz{0HRzP!CjY5co zAD}};qm%K_ab&)mf#>A_i5^wzf8Rl%5~i1t%j+)am&Dg1y^6X@g*poCw|OwvO?P-! z{S{12O##9JLa6r$Ue2`s^+OEBeQfiiy)Z1yK$)V@p?Xpl6=k1-cXgWO$EwX+Xt8ra=h@eio%paMmzTyby%h^It42 z)JKzahf!IBUdwl?M@*h4tq;0VKv9yBvT$%{FUn-4 z)cpn1znhMkkr`(Ky-rG^vO*s3&b)au7WHqqt1 ztCY>%N6O6uO^U=&qqL*h)q;PoJY2RPh2jF`?* zUxW0T){j~J0=v(%<|0%89&%R;LkCuq+On~F9u0Dh`|C^BLCMlfSAekCS3RUX0*LG0t zXlh-(uR~P^f2~^Bo0y=P#Bj1GORzJSAOX3Z_~qG)jKO_<9|$#6XucMMPYCohV5q4? zMFXGTJ`@qc-`lD+DgO^hx*t;SCOU9*8fvU6%JY~qgUY<+N?bK#bZ$64AHkiwC~2Oc zRdb;Cn16V#IMJqeI~X~p92<9uqDfSs>1ftd=yNH?-j@pCc_sCY0> zFMu?)&mHj{?#4VW@Y2q_h=YcT=ROLKL9}Dtrm*}zJWp1qK1gQjV|aUvrYh6}py!X1 zsXgk3TIxzrzav;Rcb^6wVD6;K-^rO@DY{UUUMNn0qR#~eGhhYC_=Y}}&)6a?|9 ztH)H;bY0`QHycMc^US%!`{%E*Cyr4ZNAlmO_#ab>oIm(sYh-JhY{(bEEXe|fqxOPFP-Y@+0gio;Z1`GD-%2Cr6GT#M z_-gch0|^xXYkx=WJT*&R?Sa5MEDFpV@t2K2xQb{^m!CByYk7W$9l%1P(Tsk;|Llao zMVJw0;Q`D(;>aCrs(j{$@AkuQv$!(kM)v3HI1~h#IXFa%;kT7_UheGXu|67fV$pd( zB@m%nYkxLk53A9M7PFu4Woh4$Y~|09&obm1%g()8G1D3T#ry^cqC{nyDdo>Ap0-i) zG}Nj(R{9cwN%tJYO=d`coDhR8pY(Lqcc38u5B~TB%#So4D~&<}Y(|z}ReBwz&9qF# z@``cB!`Xv&f<<&h=uS=W0b=h&VUkojByMG~FO9m;>Lw;R7b%9PtBVQTC?ui7~~J0~I-&=BNlFbrQT2ljI{KROx^7_i5j zkC~NQKwuu*5hz3{s(MfN?CeZ_5M904Ss0t>oov@>%XW#SJ2{1Nad35y?*xM}jm>JC z{t6EQdm(ub;J}*L*jN}5`DXV!IwS%3OKn#OXI3N$NFzS|+x@1I$U#azI3vjIz|AWl z1J4+S|MM}%<{7ffll*p`P7R$OfyQLk9Oz(XGk2^39Y4It^NNY|WU-A2hV0&|3meho zc?{WN6MEc3{w|$c3Rgi*_Z`%?#Xtx0uaXbE`PXPYE)<*2z|<4JmOI|bc(^&fxt{~g z$Q|QP;m-RJ@2DQSZk{vr5u7sl3!{>i?dD1LurkWy+EaJDL^eKLRb4^-`XWO470fFI z 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/apprenda.png b/images/square-logos/apprenda.png new file mode 100644 index 0000000000000000000000000000000000000000..f2e52068b102f2829481af9bc06363f4bc4721e3 GIT binary patch literal 5933 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 U=uO~vHaNjkwP&hT%9dgO13@uY9RL6T literal 0 HcmV?d00001 diff --git a/images/square-logos/aqua.png b/images/square-logos/aqua.png new file mode 100644 index 0000000000000000000000000000000000000000..ae480d582acceb78220ce60c06c48e86679c23d8 GIT binary patch literal 8847 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 O2pOQFM2(nn$o~Ma-XN#| literal 0 HcmV?d00001 diff --git a/images/square-logos/citrix.png b/images/square-logos/citrix.png new file mode 100644 index 0000000000000000000000000000000000000000..76a5682209d41ec27991dcfd4fc6e99381210b75 GIT binary patch literal 7569 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/container_solutions.png b/images/square-logos/container_solutions.png new file mode 100644 index 0000000000000000000000000000000000000000..a386cf9ab2c5920e04434a2bde498db0a6ee94fb GIT binary patch literal 10083 zcmbt)Ra6x0_q7TF(%m2pLrQ~yv@q0A(hUO)odQx4g49q$4JEC_07JL*OLup7cYprx zzWd+B6F1LVXFX@1v-VkgN2seQ;9yc>zIycv2dF5g`R^?Fw~{f?{_SnuigT}C(Y*r7 zNo#v&9A$cC&?@-9tnfEIRQn>bJ;wj&4Iw$-8FK3#*HdY!P!qCBCP*nN2IRkPe=URc zT15tka>2k8&Q!>P%S`XFNa$c`Sl=h_rcswa0W1d9sAT=3d_B{2J;tM~xpo$gXTlo+c`!=MDHEIw zs1&TqT}{1ZZ4c?w5dI1Z-Iva?qGR!+ z6ORv}tFg7*)+^lPJwEgAa1XgYOrTKnG?FvKdB0KMNES+Mz8kd8 zkIvu!(BLM&dcyYk=1GFtXT`dgqf5H-}W~|5XgRbb}|S>Xjzas%~2@#6&Fr~?j0X;x))rd? z-KF}^&@7LaizC$WrYseM%rQ(3x!iga{U1GEFnXhelIbh`1eYun9SR^7;zwNua5SK|dTo;+`f75cMLlVPI*#vGXP3`(G&0z0wuAi!qql0-nXH)w)&0jUw)bwS&4Pc{g4yl=T z|FmavF73hid)%fh{RiZ)jnku@TaT41joygD${YBTzd;X^RY>4hm6X(7iVrC z9|c`J#QD(Ga4oJGNdpB@ug1tPVoYt*`Dkskk2`_-31md2^~BgZ@}0W5T-u3f6e)L_dA@hs%Nl$*?JoLf*C$6iXIXDz3fIEv z{Hy2@VeO3UzkdAHfXj=9@T^pa)t0uOX%s2RJaj|)$TvCr&T^yj{0t}R7zN`Jf@@2I zh|T)X-pAw#OkjeC+uTJ{)%3Zpe%lUDdii(XFJe25ehwnTe>v=w5dWJ00os2}L-it! zwFVU6@>@{1uf7f_uOHQQi*Gd`Yo*z@`>%jW^mRyW?z-K2Ywa7p!e6rFm!u>TZ&U0{ zFk#af)3&3qgb6xp|6YerjuWDcTU|7%FQ@8U*srC(k4{kzBrG=B|8zd4{?(2*pfcG} zAE>p^8x6R-ThnlAs7o&elnmqP8hr}5BXs&$^#de6-n&e{fcMU)pdVpjX&4#U5CFit zg59kTnE`OKiEzA9 zx!Z|8&d*!R)(dJc{SNZXV{~+vxg}op5u8P$>+-5Jl@2zq>mk7I&rod(_5| zf4!J3ncl@{D24W5t7PQT-K9R5{%yR))FH*`Pa^LDf|2!Ft5W71)CC$wp335aE>- ziJ$aLcV?dqx>(KSqH~`?G(*5%Ao<&lkb3p9#bSDE@$aA|a54LpqrNy0Z()~#Je7%S6dwW8L-e<^nY1Ij7gWrPb2v7*aTEB{9>K(;sX(>p7 z6zn6RkxU3v=k{syS1p@%k!!o`hpdf z0zCD*|4{I&eD~CFWx2O~4Kt0>`D3IQ+8g!o!FP%}f~FGNA0@WE3?UzpET)YR5)Q+0 z!8}S0ttLuCh-M*m;HIE9^;SW3cZWQ0L(IW9-jO+TJ1sN6*Sve4Sd!kKNU!+gSQCGb zu%DY+OMoA9G?E-*%0iFj!V2;%cg>1{^yek;SH0X~PPY^L6&vDNf(44Cgp z9EJ?*s@?Yb#k0L{MI_#WG|_&u4HbWmx-lBs-qmfV%$;5gVRn}eJU zY~Jh^uk=t2ob`GIsD%44ZH2Dw0*6)oxsMPO08(v1)DDn)>adn8xjZ+j}foOQDd@Bg8i+qDzyVbkpF+>csADioB zdQPq3uZZDDEMXm_r}0n&{zjI&O8*&#u5W4U8kz#ceob1yaXnT&p*Glq3h{cvAD zJ6FuzhqLH5C@w#G8{LOh4vNIvoAxVyn^JNX+zz4;1J7wn$pd1cnK**kjMA#yfJ zAcJCdOM zDx7TiwCV7q#F#1V9hPF>kIphr7%gUsqCP2wth54VK#>-%kdn);THV!V{P@9iT;f*u z4dt=#%|SQV^kXP}#VBV7DW`-H@_o<_5&| z@Y|Qd;kN8QEbuZ6L^g)0x@-Sj2aL87DTr2ZDvXKoBc6`I^vkp?_Ll>v$BRnWa`-te z_iMgnGyM=?f1F}yBB5kGm!4J&^5FF> zPyC|CbJY_4d0S17H<=)Tj`{Scls67vGA{{;lRDCAzqG<=PWDn|%x<@O#L8=WJ_)v8 zrC4Slv&fbI>y#x~4!ohK{Uolm3|m%`u}};78Jb=0C#&fri9$75#T9Z$TegvtQyJuL zar1%clEf%$AHX0Rv2DD^He1iuIsQ4(=G#E@d?R~=E=2Vc*u}&qEK4K&sZ(vr`t3YV zRpnGJJ=ff_&Bk;b2x6=DZd#b)VwXd#;SHN=W$9U5 zkOt>}H-PFBjVN2Eg(h~RBATJgu0zlpzUk_*moy>NSX%CXrS%?n1GY+W90E=mF`DY8 z60SY116@|x{NquCK>U!&=3I$xUDJtf#$NWv4Jf^viICf_XNvLdL6pI)ZNcq%7N0B$ zNe^$kSfELIdzh;JWHt5GUg%+A$bIXZ3$^|~iaJq!{h0JFf{#Zd-)5&J_J>wOjUppH z+ZEyUCh&R~`E~Lq{E|**Oro_WxVws~zy%pts}gKmqg`290_iDa*J+O3;vX~=w8gaz2tzfQQ*>YxjB}8zWDL_ ze2otcXRYl_BU6=@1Si3}SBQ_n)$x@?v?-ch%f6B4y}q{NB5iaF`Ilj>qnF+kvzl#7 zm=Ir+ch4UNri}Br(LrA)402A9#{r^V0`De`$!TNzmoGc=X#7ICk>Y1M^7}Nwso+K2 zD?6+X1&!DaZ;L_U^A4cKfxt(D8=7SSZuh5$UPZBjmt4=og4B$!Qxch6`va>!bX!(9 zS*=`}2W6Cno9!r!;xoGE)5_tsCehKTwPqi5X*lgq4RtpDeonS@0nunJd>l^SP2n}h zXOj~t4}m&#+?L`S{F0N>ah`J^fz<5GdRKxZ!Y0ScD{dsMaQ}-ltQZiM2kT|ra zs#BYqW@7LMJnRj&K!QNJR5?Gxq*0sePU-kWq9u+-XLW-IinVwT=0>5@9(gOn9^D^+ zvOo2h1iqr7)37Am7O(=OAHiT?Rr05PY#FBHYt9IezDJ$D&0%`M6vM7pxcTZKUgmfx zqSNLUEhjquI(YcM+eK6cuz{)_f08lJ)%@I(Jx;D#q^`1njSLUb*DevNXUH z5!!dDUe)HA#oI=Y=%%KJd7JCt%LQGgN>GRbr}Vd{?2Muv>xAQ>Wda;|Nh0+Tk7ZhaTnb%a_}- zJTd2c;m~-#7N!-crP%pMuZ)#pLHl&?m!}qL${JpIfe{l|0sC|=rxphSuNLji1z*f% zSnf}gIAqCfqOL$?3EVlUiTrelCb;8e?N2Gke$%%$&SxH{k zSCfb)o>xhpvHw*hu&wxqS^L?jKlIX(P9uUy=-OcF+uCXkI6rsJCs$?q)Ilkyg=yW~ zkXKs=WA*RPp=0TE4~IV4F^znc*nC-%p)7jVuMk&}y-Zz?Kp7uOT6)^le>N6?2RD zS{lAhvHdp4zsWu#62>2CtgE>DAow#Otm|pv)y2Sf=~IlRT^|ecE3*Fu>Qx+ zgor^*AY&Md@B;%Gn+{^S{g2Sw(9?6ebbd5LQX55}e!&`6Z7$bA0j$g(m{?;q)$^M~ zx2myE#@<#{dDuayC3D@vT25Ye_?$E@bDECA)x#kT@vBro8Og_&X!D_#$nsh4vUI_( zScvie=;-Qc^2y=G-(N?L>hk#pC54y2S@2pFsEL0o>0T&(NlQJW3rwY8V$l3ZNxG%d zdZ}EZHJfZeDoSjE& z-K%4c7jB}Yc)7alzG?!&{?m6eLdxSYSu2NK!!Zgh#osZ)Yf4${V2_4G16>av<+PN- zsIa;wb~s=3hKU98gNHC)aaD#g9Gvi3D*dM)YRZK*??fl_PMk<3V5@_UsaZu<##NiT zJ93&h@MWK*)Op~8U2pT&t>w=jhQZPFzaq8cnKHe7oIZ>ZmEjbzGoemJ)R~v^x$V4T za$?G`!#013o1QXMI+&FRh(ANJGD~&qWGu(8Rh8@afjKD2E0=6he#7U|=JnIrsocaT z3;Fi!_RzohWyJC2ZlhUZ7+(;jp_$%ihQ00&{@@#$ZlC?b3AUc)kirLjRP>E-UPp!3JTHuJ_HD z!9A}=c{3()pwuQM-ojKge|60UP0@xnEM4__WKr}p7N?qMfPxJnD()wZ^+xzHeY!uZ z(k028Y{AF}-mR6!?HxVaGGKZzhmJ6>rpDnRmk#r3a2?hO#Sz6vD%INe99q?1lIqF@ zHnkF}$O`rV_00l@J?G=^21=a;A*!IA4YdnsV>f_|9B_aal#t{z&t%MD#v_75e92{}C4MN%?;Erwf26x3MH; z+rIbrn~QhLsPOVXcwg5zTfIqqQ=)6H8TQj(V*Q0@P+umD{%x4KHqC^R`HWMs2)9~~ zceaTr0JRX3AxCBH)dr(4CZwtvpPf*_n)!=p<`c+F?Ls2Hyd+ zlKaeZ2A_DSx5xZ@U5$nyM>s}Jf1Laru=|5CTPA&2D{8uh2KpC21aKppy`dp zv!?KQug&7yf28!e^`DuD2ZcXu529*fphc0~hjEnJj+j$gXhJN=(a;}0-!1Wc`n%F{ z#~{SzY&j@Y?;cE4(5VIRJYiQ%vxSn+jh z+@+}HWvaGO#g;v_Fpa=_0STM7LIi0<6C=f%0)|-km6Qhf?w+qhnxCs~&LfkK9xq#F zE+V(e$O%pMslY2|1O{#Z$*mQwqSxzog6dC*gKvaV{}uBULR@a3jE~Qmv2LqG&c6gR z+g+Q>J-?)5Q!cnx(xiB1s)|3x&r~8MVh`%`A3>W9h)CnS%A@_uIT)l1TeZBE&hn5zaj(uH>@dfBnfGQ%&jx>q&@r#ZmiiGU~3m zQ3a=;qKlJ0E4H(~7m+a>-pteGK^L&$={uWB*Ks$nzw8rtHVWwrvE#A%u} z^$$E;K2Ynvys5BQN%Am`5ks$)UQ&cmCgg>@eO^6Sm__Es_^!BfIo@F_0Y>3N1BP?W zxiOJPaeU0sk_Kl5VX-FkT|39sNPg0Z>D2D8M)wK>;=bN-STi0jw{k%bU$5gv44S{W zla<{OKYUa0_IBp!>|_qOR1sE&BQu(iB(h3b;B@49q)*uSkl)b z_O8h_G!X6ExIDnfl0UN&G$o77p;)7Wgy))Ae=6f2gw|H$hFs*&{tGfkCbQ;Po)7}G z_>A0qs(oR3okI5W;~7-~3iFqrm_{Y6CJZY??SarDD6!A6UOa*&3QKpBH(v@6V~+9l zl6ZE^FgLH=Y9N7H6_R&c`0uX)1)Jd@nsxON{JNF{_W5%P_F5tm^{nR#?7sF^jpeVs zor_nC1eE8H&ru}P)mwM{Cng=t2Vy?!Qj+D*;l4h-Q&hLpiRcvUbJ5r--dk|_$J?cu zQ`6Y@tL|Qsc!jINt(W*Qkf`^M?OTgqSFj#;Cc|CYKK50sl z`R|H74jJ-nCF?q`ADJ$M9kI_-j*C~fWk+u0I;NDj9%%+#tP6f$m8?D5dI@l(dW$2f z#i#xIwDmyfOxIaFCC4J7d4-dP}$GV%$rS_XWu^>R*WiPp2HktIJbP zS~iprixsdPDE4V`pwCa!)~BMw#{nvcV*0N&LlEtzyKwf1{jf=ogc#IiW9N9I%1fdb z-B}!~_e=9h)56`IZ@G=WGPI|(&)KLRezQ`M=C0$VUMkYOcm2??)dV_QNI_hDvdO5G zArt^}9xsdyH6d2IbOUcRjSA}TuF-EVUgn3(9gVw(WloB!MB(W58+F{9r6gP#(^=?cxBrnC`)vj`-tD3&+;&*D7&R2f zn=UN&Bo~OjYHi8OZu7ZiJ83rKZ41z$QtG4uUAi5FEO~6JA`EAYz@~+&9nPny_;1F; zm{Jn_?(az+$8PXOllgB)!N&QT2}MmMfP$qZoU=v4r)r<2NU5 z5BP!q6e1_zBgm#^!tofU*gxIuNRUH+C4OxsYkxxv@5<$9o`u_R=|4$HpA6HL*`93U z*661vd64JKcF^=|&loLI2XyScIhu{X0?Z57*XJQcxaWPsSpx^PrA(F-8ExMPR=gj; z)Ku&jL%r9QlvzvXX~J2ZRHhA)(U8-|s+20vC5z(~_h=YoGz%0Gw&jT9Q6m^vqq6LB z3~?};?xo23nODA&t6y%S99aCCIvSoKywyPh5c4 z3e>ICM+P>VGn4U*Tr82H`y6;(pCuZHuoc|iPdpj5G{#G|)+b(P^yOysJ#d@$|1kDx zJ=e~*ahkNw1)Z+`_@0~r?8moK0oo+W+fQSEsRLsiFYqhg{2mJDG3^fiA{w4_m_i9=yJp*cVni$*`u=3gU}wp2ovHT~t6$SbuQsHkNO z5koieH)h@{9JXegr#|Kxoy&;wsn@ul!BPnOE8ugr%{_{#3xMf37)*DpZ)1a6Cr9)- z4BBC(4kIX8yj%rl@`lizZ(+@isC18UaXRE-s~mX8+bAzBG+G#x{G^>=bgLK}+Itc> zGz@zcTvo&hbRTB?cH)vI(bB2ykYd{K^qT#do4SxV8s-3N3!tL6?b8pSiT5>h6$GFl z3|9s{57K?kU4p!xZt3bA#rpL#^`Y3h^^lO1BeE`TtuU*DbF|jV3siZ9DNZ*kDkNU5 z6!!G3Z5zk{5=t=8t_|ObP0^c!S@Sl1a%CY@x3MD`n9SC8N1SDl`(UZK#5b`LoF;WmrTw~EkFH(9`E{c#f zq;gKK?J#AQ56_xhpY*FT{lqMDD$uRM(>oz~jM`GsK=~}OKu?^TW14NOSlSIxpkJJr zlYzY9bjFvT<)ofkE46vENMxp$XXB{a_OIBVw*HnC6V+<-qa+E_C8cRU?5SMMz2&p&*ai8UW3c$OYGSo{M` zVqDGgAuP=n?$Ey)raCYiX!U&~4?L{j@>3UKJm_Oj>bl}C5e>^66^f}F6F`miBCEd& zY!v-yVX2=5;5S0fEo+$pmo0phBL_hCo9SYpiYglz3~Z*4HbTR7+G#9nR96^L%3QL4 zG-yao{(Dr+&N3AZG45xtAlYet-8fVBoVyX8YBdSQ(M8x<{hNrdith1c;*i+v&~?*n zaW%vF)x`o)2QLS8$)EbDa*{$u^#3^SQ<~$Vn+EI1P0Bwe%BrH61=wc+gd_!J-)_18 z7U2$jj_JK!4{2(!bwt05?j}ONp9|PUmGm9)T)Yz_yJ%cE-dG1chaL!VZS94iEY>{H zoiv;ClVvUU8IMqhPL0wP7&W7C5EJNVZO07syyBxA zPgoHv53zxgdM|k4xoq5%I+WdwA*6Nc^1TO=zZw+)X8Tu~u}tb(f4t1P275j4(xo5< zFAggidOte|v`-dnCK-!T z_th3g(<1*VV2cm#PWo1XSJU-R!M1I8lol-|@~-pb{p#hlfQ_fn>C(=_+-#P)e&UxK zy#ij(_`b6>yqE556pGVm*NM31uLEw}CT*!fV|*ht6c&MjLGpJ3CoS75+{SIGRXVlq z-4vOJhqS9Z4-de!1ViWf4zBWL42;Oy&Wa7U&TVk@&cyOM7wS_UIJs`S-ol^N*im$v z$8Iy;zjw~pBXyLJ&JeELZsBlJ0Ml|ta+X1;46nlIMzA@n3l3Hd@ruAEd znu5!HC{0;!DgGt`&&I>5{;MMqvtd<9o65+~q5Wy%lQsu{ZmCn(SAik@#1b80O(Y5E zns}E-WU-<)0dm9Yfjni@oZWRo4(#m z9|}ba!J(l*J>86F0LWH=fw%xvvU1yB0LRmQFixox@WRMB!uSc?2-kef3k5t=ZSN#tA@b?KYIsO;X@nxj*2Wpfn0-AQW@bSL6@Xfa)hSS zE*dI7$5y23NAQoC282u=FAmD6wu5kKiIJ;CROm&}q6}C-jF7FMZl4k2l)@OmN@JXo4I)`+!qmtm4dG1Af zp_WqYQ$_{;@|~ISg$h3TOM9t|XXXb_w_fc%`VKtr2k013fd4~H^FU7<$RXKP3Dtg- zm7PjNI8l&)9^`J_kUce{dj%25M4t2icEjE`*Sba-mSde_YMJ>~itdN}ow@$;?qd=A zL3p6`=%C$sv}t=^swEL#fdcN(WYA$+g6rc!i5(?ezUF^7i2aZLvj6Y7S)>sf9C W+X#Su`#zyVPa? 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%0Am7+YAh%#@r|7cAlzt1SYCSpN z%}=Su1~QP~xs9O9zZNktjKl$oCfhr$`UMNKZy2HMrmJ*fQcxsdJBF%|>ZZ#C)2LGG z5Q4KLs@3C2_RC*^+$se+LZFE-GOx!J z1Dxf#PC811-sGH$F%^PT{kC*o^~SgBv07QXso|RKPm3SIQ_)t%;F(Pw~FnAIpz z=HTp>0Up){lx3E}%cQ z5ZmrU#-cA+Ni{z{rG`+)xX4HUI=aHvQdqKADt+*&D6#AswizBA8JWpXPj^PZ;kE8} zn{V0LaxOVK78c&f4Km5NO2@Z~%}N6!8$`4`oNz*pKozZ9{Lh<=l>iNvAY46b)Sq{9tX zmX05qsz0u-9a-DjzgB#!T#W)4t9~L23ur{Rve&#RrQ?{dce?WoJrDlX?NlTcpEmLF z@+t!RQrTz0VRVZsu!a}TRF>AKSkutZ!Yv@sAi}{^CfJjs<7;)4CvL>xTp zhD?e^z=6Q{!9(?W(~X7Z?Sp_((^Q^6{>Ipdn>Jxmv8txw1`$Z;So;H zdf?@Dt#-`$xob)9i%K~r_8InHSC<+Vx$> zZZU)*XPuuj1a5l>PO^u>9o<$0TMQ0)`?K_rg(?NrO_uVWG6P`s_A*xBS9(SaS9(Bv zFm5Yp+bNZc1jhaB7E3aOGm}4h$C&FXBh_3=V9*}|`j@a%<(+c)PbRDC5M>Y!oGQUb5hIGkLGf2HgDBB-^^o&&MQ_i&crW*WRWIl-y~#@Lc&VW^^A z(KJ%)F5&T}#4vP;l?$JE;N0e~8oQss*;}j-lTGtFhg_{W9FR%99-J<0!pq2F)2m9m zV#*yC zH28PEuC9s@RV9%YF`p|R3x}#MwlvZmS%xESo;Ly5l41KbtS)3^!|^LMk7uu$N;HyW zy>x%6s0Q|THJC~4cr^DFq`hvdJe=RP)qj6?Jy)))WxaNC9crsgDbnt;vRV>+=r1xF z?v!HRXeahXY=vJfO~K3ECL_S{M(Kz8L#f;A>@Cuv2l#AL=a}a^l(~}631vEjGxHH5 zqP&9bEm`#nZwCChPIfhnnceSxx13qB4!NNIy-3u=>j^yBdW^~+vj3JaPfD4cnEKF4C4=%6C=#sIH3){FPr&k*kB+U9*|0JTX#!sLsWeD_@ykez5cLyrXAQQX9BSjg0~hn-IR zTs#%ir}eZ20!=t4#5@{ctH5$g=?N`hLcqqM&1G SD=t-lba}e^xvXZ!; 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/deis.png b/images/square-logos/deis.png new file mode 100644 index 0000000000000000000000000000000000000000..278b8a44e084865dd87857246887686309e7a3c1 GIT binary patch literal 3576 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 -vBlS?=?zf= zrAr)g%U9rRW?h$fF$gVUF9d`kBIf0?IJ9{re-0%sM_b7y71=*DZktu1mu%u)tcf{YN!&dZ+a7N zUBZ=ItESUx|``W07-Ft3|<4)lqv5)nkpuoSj@#rfgI@Rryy}*igwWA9$Vz!SA z$|K7!AA@A+c|CUq7-N|sT9?^$n7iRMq=JmcJ_}+Co8nYseQKX9+ODqEfAE!q#-K@0 zwODSBPG$f6P3@P^nWZlIqd~{U_a`4Vo~5Gyn3(u9dg6kFrd7)rZCt@E!9~m{M(~lu zn1II;||+l6!OUVG%kFLlB0!A}3-czVltaPtSR{wA#}rt`e= z@_=azt;VJm>TBWzR0?6ip1<+T3}sH$*tUI68ZP9`4(M&#j3+0M45J5R@D6y@tAnbL zT9=!Gb>>Vg#Y*n8*YQbs+6T3lz2MoRw%I2?r)Iwz_u0<7{Ml!sdthRUWlJN<)K&L# z{OmDi-TaNWX76a$nMG)T#8{J>sID(!bO&#gYkD1cv3or$ zf8~`YJlHNEf+!Q%mNG( zjDmn8daoO3HxkBztw+o%KsNto;x+Lh*AI($92r^?4jezg1(N=pHZ*Sz4BHG;sdpKB``G9j zh{c{(sgvB$ZOSxCx$Wl1*Nj1`FC~kA3qMQGLBx?0p`eErOOM-vwQ_FzlL9qMspWhd z7jIXuWZtT`Kuk~S_oKositZ zs_O}#v4#j`Bk23D7jYi5sP^IcUUQ#f0mq*<_eB~WxrL3tys1+CwfF`~(x=Nf6m4r$ znPyXq4p~EbiMTkPw^TuqDEG4KyaQ(SjEtnLS4Q^5Aa|TuW(f(dYFscPW1x=O|81+CU&H4KtZT zQ;Ra0Z8HkZHV{4cul)RSIKvBOi>Kn~+0N2SmkbM-cGySZhTkB0D?enbR!qW`eD_j*u zqt_7vbLLj2)E1_%lU_4T{0#v=H~Z)|Zx!?kUSWGGTBZzQkRH4vC;nCDZ2CJtlgQ7O z(VoGWYRY&&p}`+z?UAGMz*Hx5Cmxs8)p}QwLjKwIwPVjI*!jJj#|+4NzlxD?5k1iR=e{HO6$&nJgHnfja5Aj7q z4B;E0KZj?MQnF#)KjRn&I-!@WUBxDKx|J<>pfOl2QA=5p(48ig-)k?Ps_i_NtRsZC zD8EpK_}{}c`xB5M*@4^002y>lbuDxNV^+?CCTsuDp0|N$eek7_rcszDO?%^hBej($ z;MjMCFth1yK9{+Mjk^18VSEaPJzx#2#IIBQ zUeSGW!?rC-hb#|{w!XFN`$F)e*->Pb-hXw)pulvs*42ZD6&~OxxkNvaN`J|TX0FMo zv&)5N#bW(CDW>R4O&hip_Z^}L^f$v${G@FwBgkp$B~+0b25)jV{1wh5VN#70*tLN4 z9P>k%R!9lY6NVmq&E_kW`3>gVI(s8%_h2J~7fg&Vlb0Mnx~!y?fTK`Fr&Mn?CBX!~ z5*}=w$026al?Y~&g+(V%rBt-F+ayt?B}<`6US?&mZIVD5eHr$WED?{X+8xaJ!y-Q>@7? zZ3~E3xv9GvQTn;@)ygY4pXjio+4&o3+P*B6YNo#!hpw+8^1>$!h+eZ#+?(E4EbvCF zWDrD5Wm*;XW;Qo3-adS`A(mWU+v`b=i1l71yR-)vceveV0#}^S?qV-H!(-5a<>?il zN)rP0qs^Zixa;ONQYj{sm!R>+r&NyRMo^2D;C=&|X*BQc{QU0>znD{{4o#HK;rH}H z9G=1kmXRc`=8o@{-8UCiiL@)rFDWjpSzau$vQ_87=Ogh2>;t4Vg(CbI8_njnX9T9r zuxktUwfZ}~)jpQjwdqL!e$49VR^HBBysk`B?%K;_=a&&ookmOBQQKT)l=Y#}aXjT`# zaFEYA@_)SAPe=y@u!wmrI2obMnNQgxgb(DN4Dpz_83x~A73+Yo%2-{7(>a?&J^9v! zq1#Ay(L!X?hHAo8U38^_+ZF~c=>?U2!`s}uk+p;BxmQ%WSZBnm5^6NSqP zh{9*ZImia(Ja#sqnGuOis)M_dr=VjiC&n$(?gq-eAeX*j07{VxyD0Q-;aQu(H_tlQpsMSy(dh+pyBWKM zyk`Mja-ak^GIT!MH4%PG@{c%UY^qOC&eVk}2VlXFJEWtJ)%p7|lqg;?BUGoDfa9_R zN~06WF#z(4viL>B+EMK4yj1Q`L#Y$gNtst+ zPO_eL(#v*=qyNzFnAjOL7wt;m6ZO;S4*g#`;6J-Ooj-K381eD-J>c#CXTA)^2Il%T IcVUVD2jIYa(*OVf literal 0 HcmV?d00001 diff --git a/images/square-logos/elastickube.png b/images/square-logos/elastickube.png new file mode 100644 index 0000000000000000000000000000000000000000..957c55a8e6fb14085bd0e94f3da66cea6a1a8302 GIT binary patch literal 10550 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 Ge*Hi0gyaSQ literal 0 HcmV?d00001 diff --git a/images/square-logos/intel.png b/images/square-logos/intel.png new file mode 100644 index 0000000000000000000000000000000000000000..0100964f559478ce2b14677976aae78a832333c3 GIT binary patch literal 7454 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/livewyer.png b/images/square-logos/livewyer.png new file mode 100644 index 0000000000000000000000000000000000000000..e49b2d55c926a095177a35a59a2991e9935ad147 GIT binary patch literal 1993 zcmcJQ`CpQW7RFye((7(&R+=_V13Efx;3O_s7OvMdm(*MdmohQbOhv`fv;~(&6HO4) zQb!Y^#d0YzM;&#-YcAm6!nn0SN^zsNGQ8YBV$SDt&iVa&p7T6c1N=NR)%L3a0HEpR zc_K)$?<%@Rb(dle413N4fJ&v;iDSW+Xz%_ipcvy1jK0qr{m^_R-Y4L6Ru}fTTjSqh zO|y;1q>V?LlC%YEl_Ws#V8!qkXnYfKYVQrceuu`{AH8$G4dRBI+zciv8>jT;EW{&Q zd1{}?{jjibcu(PP1QnmSd>=ZUN{Sv!utP3qZ`3VrIZrxIYF+s!>JMYvu0NkQ znK`Oe;=`BM-2+i-G$@UVpEo;7gKI;#AkW@Xp7tb#U${j9!eo)9zbw6?JRKPQ>wP;(AlNA2XtD;&K2%;@cv}|BnANuiB;Vx%6M?d(z;@L zZI#Qv=OYd{l>jRDS@>1?(AgeRtt-=KOjx$Rn<~pg8s*vWB|tZAw`BK!UhCvKOWcJS zLZYxG;*s4c0&2&mOzLkZs3IaHh;6Ek@*d13{Hp4yjd zhS>Dw+-H5s5z;wBXttCb68AA;+xL=fnv3Lx)ohQh4M$0sk|=(V7xiyKSx$4$o$2z3 zM?~Xiw?Vr!6IMrPCoPJA8Xb4c4h}tr{O+NRXz1-|&hTimo#{>ygw(m#OIhig2!l{F z|8@S+ubq36@KpX|B_B62d|MO7`q{5)+Ufrw>Nw}Ynvd=KJpW+6E!&WObeAS_E+5rv zQ{q);mxt4<2i>FoR0JIFf87_K6Mb5ruIyoP(h!(WYL@aoH@%`mQ(_$fI>t zqN}R8e2-Psyk@@vgI13a%gtB-$VAG^EsO6+!pk$TSyAf%x*=d_bg zr%p$*O!DfHUi%ib9Ja}cNQF)4rXAe;X;2%!8vF zn@xlBN)rd?+H#AnXzT(7qMyLT$r7ZDfwic`&o5$eP7c8Y6yiWkN2nHb8Cr5~cHDow z0Y#{rEkJgwe?K<>Ksk1aVw^(prcbmz>1@MH^8$_KJZoBNP>Ip)az?(RI)gHxVv;cu z{qj3`^mfMVT~0H{RZ_9P%i@D|h--_~Xr}$<58#cRLaVA*MiQ54OlJ75e|115pJ?9V%l&0t07lhVJ;nOhO6c`-k2Nfr?@Ujf z79|46s?b$ab8bATof(||qj`}gSU6JpylqCfb8X>s0n?*H6m@y4w?Y^x_PYovC9iWz z1?5|K-TdF377eYv0|}@KA>p2FY)EIso6r7{0~@D<9C4$PN&8VdjH~RUiM7k0CtPHZ z0hk}O2BPhNV~kyOq4@JJgFQ1v;MI@l-Gc1h~V08WG>QWgt|BNZ9@Cail!v*=GO`bzzHotYD|7W zN2s59=O*4j-&mEwhA?C*YY7hBufAq;`L0O$7k<`3gQWXto@JHpG$c_fsd8TveiB3+UnWYyUuUdB*KPC$V0)S+5`JC?Xp0 M!up+Hy2bwTKZtYR1poj5 literal 0 HcmV?d00001 diff --git a/images/square-logos/nuagenetworks.png b/images/square-logos/nuagenetworks.png new file mode 100644 index 0000000000000000000000000000000000000000..c84a1414a7505cc7e63d33029bd8fb77d17b6ca2 GIT binary patch literal 15060 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

    gAYCP6? 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/reactive_ops.png b/images/square-logos/reactive_ops.png new file mode 100644 index 0000000000000000000000000000000000000000..5d699e0194faf03509620d74d59507fbea16be81 GIT binary patch literal 4545 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 literal 0 HcmV?d00001 diff --git a/images/square-logos/samsung_sds.png b/images/square-logos/samsung_sds.png new file mode 100644 index 0000000000000000000000000000000000000000..2afbc1b5a0d02422b0f68410c200c8cc804a9689 GIT binary patch literal 9446 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 Date: Fri, 21 Oct 2016 08:43:51 -0700 Subject: [PATCH 104/120] new opening message for partners page --- partners/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partners/index.html b/partners/index.html index fd7ed3eeef..40dd076b30 100644 --- a/partners/index.html +++ b/partners/index.html @@ -14,7 +14,7 @@ title: Partners
    -
    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.
    +
    We are working with a broad group of partners who contribute to the Kubernetes core codebase, making it stronger and richer. There partners create a vibrant Kubernetes ecosystem supporting a spectrum of complementing platforms, from open source solutions to market-leading technologies.

    ISV Partners

    Services Partners

    From a02e7918b0c29bff6b29b4d3e2cadf9fc7dff717 Mon Sep 17 00:00:00 2001 From: scotty Date: Fri, 21 Oct 2016 09:11:23 -0700 Subject: [PATCH 105/120] alpha sort partners --- _includes/partner-script.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/_includes/partner-script.js b/_includes/partner-script.js index 851b109e61..79cbf6d513 100644 --- a/_includes/partner-script.js +++ b/_includes/partner-script.js @@ -173,7 +173,13 @@ var isvContainer = document.getElementById('isvContainer') var servContainer = document.getElementById('servContainer') - partners.forEach(function (obj) { + var sorted = partners.sort(function (a, b) { + if (a.name > b.name) return 1 + if (a.name < b.name) return -1 + return 0 + }) + + sorted.forEach(function (obj) { var box = document.createElement('div') box.className = 'partner-box' From 5ea3366ddebce1a589942d50b7d4f569ceeae4d4 Mon Sep 17 00:00:00 2001 From: scotty Date: Fri, 21 Oct 2016 09:17:01 -0700 Subject: [PATCH 106/120] remove parters and customers from community page --- community.html | 42 ------------------------------------------ 1 file changed, 42 deletions(-) diff --git a/community.html b/community.html index f47bff33e7..1cc5d57141 100644 --- a/community.html +++ b/community.html @@ -29,20 +29,6 @@ title: Community from AWS and Openstack to Big Data and Scalability, there’s a place for you to contribute and instructions for forming a new SIG if your special interest isn’t covered (yet).

    -
    -

    Customers

    -
    - - - - - - - - - -
    -

    Events

    @@ -50,34 +36,6 @@ title: Community frameborder="0" scrolling="no">
    -
    -

    Partners

    -

    We are working with a broad group of partners who contribute to the kubernetes core codebase, making it stronger and richer, as well as help in growing the kubernetes ecosystem supporting - a sprectrum of compelmenting platforms, from open source solutions to market-leading technologies.

    -
    - - - - - - - - - - - - - - - - - - - - - -
    -
    From 772455e8c121e4bdb3faeeada6e2e5c309cd5a42 Mon Sep 17 00:00:00 2001 From: scotty Date: Fri, 21 Oct 2016 09:17:28 -0700 Subject: [PATCH 107/120] add partners to footer nav --- _includes/footer.html | 1 + _sass/_desktop.sass | 3 ++- _sass/_tablet.sass | 3 +-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/_includes/footer.html b/_includes/footer.html index f98dde06b5..15dacb72e0 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -4,6 +4,7 @@ Get Started Documentation Blog + Partners Community Case Studies diff --git a/_sass/_desktop.sass b/_sass/_desktop.sass index 033e998ba0..9c02fbcf6c 100644 --- a/_sass/_desktop.sass +++ b/_sass/_desktop.sass @@ -164,10 +164,11 @@ $video-section-height: 550px margin-bottom: 20px a - width: 20% + width: 16.65% float: left font-size: 24px font-weight: 300 + white-space: nowrap .social padding: 0 30px diff --git a/_sass/_tablet.sass b/_sass/_tablet.sass index ce9bcd941d..15d5b496f4 100644 --- a/_sass/_tablet.sass +++ b/_sass/_tablet.sass @@ -222,8 +222,7 @@ $feature-box-div-width: 45% text-align: center a - font-size: 22px - width: auto + width: 30% padding: 0 20px .social From 5c16dcf76560a10653fba09915b7ad65679d34e7 Mon Sep 17 00:00:00 2001 From: scotty Date: Fri, 21 Oct 2016 09:25:51 -0700 Subject: [PATCH 108/120] hiccup --- _includes/footer.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_includes/footer.html b/_includes/footer.html index 15dacb72e0..b913c2a824 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -4,7 +4,7 @@ Get Started Documentation Blog - Partners + Partners Community Case Studies From 1e2a44d57f4c9bf8976727ca7ffbbfb118adb994 Mon Sep 17 00:00:00 2001 From: scotty Date: Fri, 21 Oct 2016 09:29:10 -0700 Subject: [PATCH 109/120] footer test --- _includes/footer.html | 1 + 1 file changed, 1 insertion(+) diff --git a/_includes/footer.html b/_includes/footer.html index b913c2a824..baac25dff3 100644 --- a/_includes/footer.html +++ b/_includes/footer.html @@ -1,5 +1,6 @@
    +
    - -
    From 62afa6f904daa67963df97591dac835f60a6c0e0 Mon Sep 17 00:00:00 2001 From: steveperry-53 Date: Fri, 21 Oct 2016 15:52:30 -0700 Subject: [PATCH 113/120] Write new task: Defining a Command and Arguments for a Container 3 --- .../define-command-argument-container.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/tasks/configure-pod-container/define-command-argument-container.md b/docs/tasks/configure-pod-container/define-command-argument-container.md index 1e623d9b43..22ac9b5e04 100644 --- a/docs/tasks/configure-pod-container/define-command-argument-container.md +++ b/docs/tasks/configure-pod-container/define-command-argument-container.md @@ -64,7 +64,7 @@ from the Pod: In the preceding example, you defined the arguments directly by providing strings. As an alternative to providing strings directly, -you can define arguments by using environment variables. +you can define arguments by using environment variables: env: - name: MESSAGE @@ -78,6 +78,18 @@ the techniques available for defining environment variables, including and [Secrets](/docs/user-guide/secrets/). +NOTE: The environment variable appears in parentheses, `"$(VAR)"`. This is +required for the variable to be expanded in the `command` or `args` field. + +### Running a command in a shell + +In some cases, you need your command to run in a shell. For example, your +command might consist of several commands piped together, or it might be a shell +script. To run your command in a shell, wrap it like this: + + command: ["/bin/sh"] + args: ["-c", "while true; do echo hello; sleep 10;done"] + {% endcapture %} {% capture whatsnext %} From 2f7dcedbbb8335ade79a1d145f05911e0e1c8e32 Mon Sep 17 00:00:00 2001 From: Justin Garrison Date: Fri, 14 Oct 2016 13:17:45 -0700 Subject: [PATCH 114/120] Update jobs.md with link to scheduled jobs Removed future work because we're living in the future :rocket: --- docs/user-guide/jobs.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/user-guide/jobs.md b/docs/user-guide/jobs.md index 266444753a..4e42b8fcef 100644 --- a/docs/user-guide/jobs.md +++ b/docs/user-guide/jobs.md @@ -374,6 +374,6 @@ driver, and then cleans up. An advantage of this approach is that the overall process gets the completion guarantee of a Job object, but complete control over what pods are created and how work is assigned to them. -## Future work +## Scheduled Jobs -Support for creating Jobs at specified times/dates (i.e. cron) is expected in [1.4](https://github.com/kubernetes/kubernetes/pull/11980). +Support for creating Jobs at specified times/dates (i.e. cron) is available in Kubernetes [1.4](https://github.com/kubernetes/kubernetes/pull/11980). More information is available in the [scheduled job documents](http://kubernetes.io/docs/user-guide/scheduled-jobs/) From f5ca6fae323501cb4e161d89b0d506ab2dd18c21 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sat, 22 Oct 2016 03:19:06 +0100 Subject: [PATCH 115/120] Update documentation about CNI flags and requirements (#1516) * Update CNI kubelet option names * Expand the minimum CNI requirements --- docs/admin/network-plugins.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/admin/network-plugins.md b/docs/admin/network-plugins.md index c0397016da..8cfeb658c9 100644 --- a/docs/admin/network-plugins.md +++ b/docs/admin/network-plugins.md @@ -36,7 +36,11 @@ Place plugins in `network-plugin-dir/plugin-name/plugin-name`, i.e if you have a ### CNI -The CNI plugin is selected by passing Kubelet the `--network-plugin=cni` command-line option. Kubelet reads the first CNI configuration file from `--network-plugin-dir` and uses the CNI configuration from that file to set up each pod's network. The CNI configuration file must match the [CNI specification](https://github.com/containernetworking/cni/blob/master/SPEC.md), and any required CNI plugins referenced by the configuration must be present in `/opt/cni/bin`. +The CNI plugin is selected by passing Kubelet the `--network-plugin=cni` command-line option. Kubelet reads a file from `--cni-conf-dir` (default `/etc/cni/net.d`) and uses the CNI configuration from that file to set up each pod's network. The CNI configuration file must match the [CNI specification](https://github.com/containernetworking/cni/blob/master/SPEC.md), and any required CNI plugins referenced by the configuration must be present in `--cni-bin-dir` (default `/opt/cni/bin`). + +If there are multiple CNI configuration files in the directory, the first one in lexicographic order of file name is used. + +In addition to the CNI plugin specified by the configuration file, Kubernetes requires the standard CNI `lo` plugin, at minimum version 0.2.0 ### kubenet @@ -44,7 +48,7 @@ The Linux-only kubenet plugin provides functionality similar to the `--configure The plugin requires a few things: -* The standard CNI `bridge` and `host-local` plugins are required. Kubenet will first search for them in `/opt/cni/bin`. Specify `network-plugin-dir` to supply additional search path. The first found match will take effect. +* The standard CNI `bridge`, `lo` and `host-local` plugins are required, at minimum version 0.2.0. Kubenet will first search for them in `/opt/cni/bin`. Specify `network-plugin-dir` to supply additional search path. The first found match will take effect. * Kubelet must be run with the `--network-plugin=kubenet` argument to enable the plugin * Kubelet must also be run with the `--reconcile-cidr` argument to ensure the IP subnet assigned to the node by configuration or the controller-manager is propagated to the plugin * The node must be assigned an IP subnet through either the `--pod-cidr` kubelet command-line option or the `--allocate-node-cidrs=true --cluster-cidr=` controller-manager command-line options. @@ -66,6 +70,6 @@ This option is provided to the network-plugin; currently **only kubenet supports ## Usage Summary * `--network-plugin=exec` specifies that we use the `exec` plugin, with executables located in `--network-plugin-dir`. -* `--network-plugin=cni` specifies that we use the `cni` network plugin with actual CNI plugin binaries located in `/opt/cni/bin` and CNI plugin configuration located in `network-plugin-dir`, config location defaults to `/etc/cni/net.d`. +* `--network-plugin=cni` specifies that we use the `cni` network plugin with actual CNI plugin binaries located in `--cni-bin-dir` (default `/opt/cni/bin`) and CNI plugin configuration located in `--cni-conf-dir` (default `/etc/cni/net.d`). * `--network-plugin=kubenet` specifies that we use the `kubenet` network plugin with CNI `bridge` and `host-local` plugins placed in `/opt/cni/bin` or `network-plugin-dir`. * `--network-plugin-mtu=9001` specifies the MTU to use, currently only used by the `kubenet` network plugin. \ No newline at end of file From ed4c37d5114ee5d4ada26866838a8b571018b2bd Mon Sep 17 00:00:00 2001 From: Ilya Dmitrichenko Date: Thu, 20 Oct 2016 12:33:42 +0100 Subject: [PATCH 116/120] Get rid of git dependency in kubeadm guide --- docs/getting-started-guides/kubeadm.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index f4f4c15211..4fa854cc94 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -177,8 +177,8 @@ Once a pod network has been installed, you can confirm that it is working by che As an example, install a sample microservices application, a socks shop, to put your cluster through its paces. To learn more about the sample microservices app, see the [GitHub README](https://github.com/microservices-demo/microservices-demo). - # git clone https://github.com/microservices-demo/microservices-demo - # kubectl apply -f microservices-demo/deploy/kubernetes/manifests/sock-shop-ns.yml -f microservices-demo/deploy/kubernetes/manifests + # kubectl create namespace sock-shop + # kubectl apply -n sock-shop -f "https://github.com/microservices-demo/microservices-demo/blob/master/deploy/kubernetes/complete-demo.yaml?raw=true" You can then find out the port that the [NodePort feature of services](/docs/user-guide/services/) allocated for the front-end service by running: @@ -216,7 +216,7 @@ See the [list of add-ons](/docs/admin/addons/) to explore other add-ons, includi ## Cleanup -* To uninstall the socks shop, run `kubectl delete -f microservices-demo/deploy/kubernetes/manifests` on the master. +* 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. From 4fd44b16043a2aa88d918acade36da2c4e3d1645 Mon Sep 17 00:00:00 2001 From: Devan Goodwin Date: Thu, 20 Oct 2016 12:45:54 -0300 Subject: [PATCH 117/120] Document kubeadm --skip-preflight-checks. --- docs/admin/kubeadm.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/admin/kubeadm.md b/docs/admin/kubeadm.md index 57a21528c2..989c925862 100644 --- a/docs/admin/kubeadm.md +++ b/docs/admin/kubeadm.md @@ -12,6 +12,11 @@ This document provides information on how to use kubeadm's advanced options. Running kubeadm init bootstraps a Kubernetes cluster. This consists of the following steps: +1. kubeadm runs a series of pre-flight checks to validate the system state +before making changes. Some checks only trigger warnings, others are +considered errors and will exit kubeadm until the problem is corrected or +the user specifies `--skip-preflight-checks`. + 1. kubeadm generates a token that additional nodes can use to register themselves with the master in future. @@ -112,6 +117,12 @@ to change the DNS name suffix. Again, you will need to update the `/etc/systemd/system/kubelet.service.d/10-kubeadm.conf` file accordingly else DNS will not function correctly. +- `--skip-preflight-checks` + +By default, `kubeadm` runs a series of preflight checks to validate the system +before making any changes. Advanced users can use this flag to bypass these if +necessary. + - `--token` By default, `kubeadm init` automatically generates the token used to initialise @@ -134,6 +145,12 @@ Here's an example on how to use it: `kubeadm join --token=the_secret_token 192.168.1.1` +- `--skip-preflight-checks` + +By default, `kubeadm` runs a series of preflight checks to validate the system +before making any changes. Advanced users can use this flag to bypass these if +necessary. + - `--token=` By default, when `kubeadm init` runs, a token is generated and revealed in the output. From e21ed27c58219b9db5be0f8f4a596f5f53e02965 Mon Sep 17 00:00:00 2001 From: Joe Beda Date: Mon, 17 Oct 2016 11:11:45 -0700 Subject: [PATCH 118/120] Document kubeadm automation. --- docs/admin/kubeadm.md | 60 ++++++++++++++++++++------ docs/getting-started-guides/kubeadm.md | 2 + 2 files changed, 48 insertions(+), 14 deletions(-) diff --git a/docs/admin/kubeadm.md b/docs/admin/kubeadm.md index 989c925862..451041ceb5 100644 --- a/docs/admin/kubeadm.md +++ b/docs/admin/kubeadm.md @@ -9,7 +9,7 @@ assignees: This document provides information on how to use kubeadm's advanced options. -Running kubeadm init bootstraps a Kubernetes cluster. This consists of the +Running `kubeadm init` bootstraps a Kubernetes cluster. This consists of the following steps: 1. kubeadm runs a series of pre-flight checks to validate the system state @@ -17,23 +17,35 @@ before making changes. Some checks only trigger warnings, others are considered errors and will exit kubeadm until the problem is corrected or the user specifies `--skip-preflight-checks`. -1. kubeadm generates a token that additional nodes can use to register themselves -with the master in future. +1. kubeadm generates a token that additional nodes can use to register +themselves with the master in future. Optionally, the user can provide a token. 1. kubeadm generates a self-signed CA using openssl to provision identities for each node in the cluster, and for the API server to secure communication with clients. -1. Outputting a kubeconfig file for the kubelet to use to connect to the API server, -as well as an additional kubeconfig file for administration. +1. Outputting a kubeconfig file for the kubelet to use to connect to the API +server, as well as an additional kubeconfig file for administration. -1. kubeadm generates Kubernetes resource manifests for the API server, controller manager -and scheduler, and placing them in `/etc/kubernetes/manifests`. The kubelet watches -this directory for static resources to create on startup. These are the core -components of Kubernetes, and once they are up and running we can use `kubectl` -to set up/manage any additional components. +1. kubeadm generates Kubernetes resource manifests for the API server, +controller manager and scheduler, and placing them in +`/etc/kubernetes/manifests`. The kubelet watches this directory for static +resources to create on startup. These are the core components of Kubernetes, and +once they are up and running we can use `kubectl` to set up/manage any +additional components. -1. kubeadm installs any add-on components, such as DNS or discovery, via the API server. +1. kubeadm installs any add-on components, such as DNS or discovery, via the API +server. + +Running `kubeadm join` on each node in the cluster consists of the following steps: + +1. Use the token to talk to the API server and securely get the root CA +certificate. + +1. Creates a local key pair. Prepares a certificate signing request (CSR) and +sends that off to the API server for signing. + +1. Configures the local kubelet to connect to the API server ## Usage @@ -127,7 +139,7 @@ necessary. By default, `kubeadm init` automatically generates the token used to initialise each new node. If you would like to manually specify this token, you can use the -`--token` flag. The token must be of the format '<6 character string>.<16 character string>'. +`--token` flag. The token must be of the format `<6 character string>.<16 character string>`. - `--use-kubernetes-version` (default 'v1.4.1') the kubernetes version to initialise @@ -138,8 +150,8 @@ for a full list of available versions). ### `kubeadm join` -`kubeadm join` has one mandatory flag, the token used to secure cluster bootstrap, -and one mandatory argument, the master IP address. +When you use kubeadm join, you must supply the token used to secure cluster +boostrap as a mandatory flag, and the master IP address as a mandatory argument. Here's an example on how to use it: @@ -156,6 +168,26 @@ necessary. By default, when `kubeadm init` runs, a token is generated and revealed in the output. That's the token you should use here. +## Automating kubeadm + +Rather than copying the token you obtained from `kubeadm init` to each node, as +in the basic `kubeadm` tutorials, you can parallelize the token distribution for +easier automation. To implement this automation, you must know the IP address +that the master will have after it is started. + +1. Generate a token. This token must have the form `<6 character string>.<16 +character string>` + + Here is a simple python one-liner for this: + + ``` + python -c 'import random; print "%0x.%0x" % (random.SystemRandom().getrandbits(3*8), random.SystemRandom().getrandbits(8*8))' + ``` + +1. Start both the master node and the worker nodes concurrently with this token. As they come up they should find each other and form the cluster. + +Once the cluster is up, you can grab the admin credentials from the master node at `/etc/kubernetes/admin.conf` and use that to talk to the cluster. + ## Troubleshooting * Some users on RHEL/CentOS 7 have reported issues with traffic being routed incorrectly due to iptables being bypassed. You should ensure `net.bridge.bridge-nf-call-iptables` is set to 1 in your sysctl config, eg. diff --git a/docs/getting-started-guides/kubeadm.md b/docs/getting-started-guides/kubeadm.md index 4fa854cc94..cd73f3e73f 100644 --- a/docs/getting-started-guides/kubeadm.md +++ b/docs/getting-started-guides/kubeadm.md @@ -13,6 +13,8 @@ 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. It is simple enough that you can easily integrate its use into your own automation (Terraform, Chef, Puppet, etc). +See the full [`kubeadm` reference](/docs/admin/kubeadm) for information on all `kubeadm` command-line flags and for advice on automating `kubeadm` itself. + **The `kubeadm` tool is currently in alpha but please try it out and give us [feedback](/docs/getting-started-guides/kubeadm/#feedback)!** ## Prerequisites From 71de608f4d5141be89db659b203dadeb031d5406 Mon Sep 17 00:00:00 2001 From: Joe Beda Date: Mon, 17 Oct 2016 12:30:58 -0700 Subject: [PATCH 119/120] Document kubeadm evn variables --- docs/admin/kubeadm.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/admin/kubeadm.md b/docs/admin/kubeadm.md index 451041ceb5..a8acd6b1cb 100644 --- a/docs/admin/kubeadm.md +++ b/docs/admin/kubeadm.md @@ -188,6 +188,21 @@ character string>` Once the cluster is up, you can grab the admin credentials from the master node at `/etc/kubernetes/admin.conf` and use that to talk to the cluster. +## Environment variables + +There are some environment variables that modify the way that `kubeadm` works. Most users will have no need to set these. + +| Variable | Default | Description | +| --- | --- | --- | +| `KUBE_KUBERNETES_DIR` | `/etc/kubernetes` | Where most configuration files are written to and read from | +| `KUBE_HOST_PKI_PATH` | `/etc/kubernetes/pki` | Directory for master PKI assets | +| `KUBE_HOST_ETCD_PATH` | `/var/lib/etcd` | Local etcd state for Kubernetes cluster | +| `KUBE_HYPERKUBE_IMAGE` | `` | If set, use a single hyperkube image with this name. If not set, individual images per server component will be used. | +| `KUBE_DISCOVERY_IMAGE` | `gcr.io/google_containers/kube-discovery-:1.0` | The bootstrap discovery helper image to use. | +| `KUBE_ETCD_IMAGE` | `gcr.io/google_containers/etcd-:2.2.5` | The etcd container image to use. | +| `KUBE_COMPONENT_LOGLEVEL` | `--v=4` | Logging configuration for all Kubernetes components | + + ## Troubleshooting * Some users on RHEL/CentOS 7 have reported issues with traffic being routed incorrectly due to iptables being bypassed. You should ensure `net.bridge.bridge-nf-call-iptables` is set to 1 in your sysctl config, eg. From 8f02f91f536844a2ec68bfd0f4288862b1fcd044 Mon Sep 17 00:00:00 2001 From: Chris Love Date: Mon, 24 Oct 2016 18:56:11 -0600 Subject: [PATCH 120/120] Improving kubectl cheat sheet (#1486) * Improving kubectl cheatsheet * removing sentence and some cleanup --- docs/user-guide/kubectl-cheatsheet.md | 236 +++++++++++++++++++++----- 1 file changed, 191 insertions(+), 45 deletions(-) diff --git a/docs/user-guide/kubectl-cheatsheet.md b/docs/user-guide/kubectl-cheatsheet.md index b2e1c51fa9..14e6850f37 100644 --- a/docs/user-guide/kubectl-cheatsheet.md +++ b/docs/user-guide/kubectl-cheatsheet.md @@ -3,24 +3,57 @@ assignees: - bgrant0607 - erictune - krousey +- clove --- -An assortment of compact kubectl examples -See also: [Kubectl overview](/docs/user-guide/kubectl-overview/) and [JsonPath guide](/docs/user-guide/jsonpath). +See also: [Kubectl Overview](/docs/user-guide/kubectl-overview/) and [JsonPath Guide](/docs/user-guide/jsonpath). + +## Kubectl Autocomplete + +```console +$ source <(kubectl completion bash) # setup autocomplete in bash +$ source <(kubectl completion zsh) # setup autocomplete in zsh +``` + +## Kubectl Context and Configuration + +Set which Kubernetes cluster `kubectl` communicates with and modify configuration +information. See [kubeconfig file](/docs/user-guide/kubeconfig-file/) documentation for +detailed config file information. + +```console +$ kubectl config view # Show Merged kubeconfig settings. + +# use multiple kubeconfig files at the same time and view merged config +$ KUBECONFIG=~/.kube/config:~/.kube/kubconfig2 kubectl config view + +# Get the password for the e2e user +$ kubectl config view -o jsonpath='{.users[?(@.name == "e2e")].user.password}' + +$ kubectl config current-context # Display the current-context +$ kubectl config use-context my-cluster-name # set the default context to my-cluster-name + +# add a new cluster to your kubeconf that supports basic auth +$ kubectl config set-credentials kubeuser/foo.kubernetes.com --username=kubeuser --password=kubepassword + +# set a context utilizing a specific username and namespace. +$ kubectl config set-context gce --user=cluster-admin --namespace=foo \ + && kubectl config use-context gce +``` ## Creating Objects -```shell -$ kubectl create -f ./file.yml # create resource(s) in a json or yaml file +Kubernetes manifests can be defined in json or yaml. The file extension `.yaml`, +`.yml`, and `.json` can be used. -$ kubectl create -f ./file1.yml -f ./file2.yaml # create resource(s) in a json or yaml file - -$ kubectl create -f ./dir # create resources in all .json, .yml, and .yaml files in dir - -# Create from a URL - -$ kubectl create -f http://www.fpaste.org/279276/48569091/raw/ +```console +$ kubectl create -f ./my-manifest.yaml # create resource(s) +$ kubectl create -f ./my1.yaml -f ./my2.yaml # create from multiple files +$ kubectl create -f ./dir # create resource(s) in all manifest files in dir +$ kubectl create -f https://git.io/vPieo # create resource(s) from url +$ kubectl run nginx --image=nginx # start a single instance of nginx +$ kubectl explain pods,svc # get the documentation for pod and svc manifests # Create multiple YAML objects from stdin $ cat < # List a particular replication controller -$ kubectl get replicationcontroller # List a particular RC +$ kubectl get deployment my-dep # List a particular deployment -# Verbose output -$ kubectl describe nodes -$ kubectl describe pods -$ kubectl describe pods/ # Equivalent to previous -$ kubectl describe pods # Lists pods created by using common prefix +# Describe commands with verbose output +$ kubectl describe nodes my-node +$ kubectl describe pods my-pod -# List Services Sorted by Name -$ kubectl get services --sort-by=.metadata.name +$ kubectl get services --sort-by=.metadata.name # List Services Sorted by Name # List pods Sorted by Restart Count $ kubectl get pods --sort-by='.status.containerStatuses[0].restartCount' # Get the version label of all pods with label app=cassandra -$ kubectl get pods --selector=app=cassandra rc -o 'jsonpath={.items[*].metadata.labels.version}' +$ kubectl get pods --selector=app=cassandra rc -o \ + jsonpath='{.items[*].metadata.labels.version}' # Get ExternalIPs of all nodes $ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}' # List Names of Pods that belong to Particular RC # "jq" command useful for transformations that are too complex for jsonpath -$ sel=$(kubectl get rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"') -$ sel=${sel%?} # Remove trailing comma -$ pods=$(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name}) -$ echo $pods +$ sel=${$(kubectl get rc my-rc --output=json | jq -j '.spec.selector | to_entries | .[] | "\(.key)=\(.value),"')%?} +$ echo $(kubectl get pods --selector=$sel --output=jsonpath={.items..metadata.name}) # Check which nodes are ready -$ kubectl get nodes -o jsonpath='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}'| tr ';' "\n" | grep "Ready=True" +$ JSONPATH='{range .items[*]}{@.metadata.name}:{range @.status.conditions[*]}{@.type}={@.status};{end}{end}' \ + && kubectl get nodes -o jsonpath=$JSONPATH | grep "Ready=True" ``` -## Modifying and Deleting Resources +## Updating Resources -```shell -$ kubectl label pods new-label=awesome # Add a Label -$ kubectl annotate pods icon-url=http://goo.gl/XXBTWq # Add an annotation +```console +$ kubectl rolling-update frontend-v1 -f frontend-v2.json # Rolling update pods of frontend-v1 +$ kubectl rolling-update frontend-v1 frontend-v2 --image=image:v2 # Change the name of the resource and update the image +$ kubectl rolling-update frontend --image=image:v2 # Update the pods image of frontend +$ kubectl rolling-update frontend-v1 frontend-v2 --rollback # Abort existing rollout in progress +$ cat pod.json | kubectl replace -f - # Replace a pod based on the JSON passed into stdin -# TODO: examples of kubectl edit, patch, delete, replace, scale, and rolling-update commands. +# Force replace, delete and then re-create the resource. Will cause a service outage. +$ kubectl replace --force -f ./pod.json + +# Create a service for a replicated nginx, which serves on port 80 and connects to the containers on port 8000 +$ kubectl expose rc nginx --port=80 --target-port=8000 + +# Update a single-container pod's image version (tag) to v4 +$ kubectl get pod mypod -o yaml | sed 's/\(image: myimage\):.*$/\1:v4/' | kubectl replace -f - + +$ kubectl label pods my-pod new-label=awesome # Add a Label +$ kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq # Add an annotation +$ kubectl autoscale deployment foo --min=2 --max=10 # Auto scale a deployment "foo" +``` + +## Patching Resources +Patch a resource(s) with a strategic merge patch. + +```console +$ kubectl patch node k8s-node-1 -p '{"spec":{"unschedulable":true}}' # Partially update a node + +# Update a container's image; spec.containers[*].name is required because it's a merge key +$ kubectl patch pod valid-pod -p '{"spec":{"containers":[{"name":"kubernetes-serve-hostname","image":"new image"}]}}' + +# Update a container's image using a json patch with positional arrays +$ kubectl patch pod valid-pod --type='json' -p='[{"op": "replace", "path": "/spec/containers/0/image", "value":"new image"}]' +``` + +## Editing Resources +The edit any API resource in an editor. + +```console +$ kubectl edit svc/docker-registry # Edit the service named docker-registry +$ KUBE_EDITOR="nano" kubectl edit svc/docker-registry # Use an alternative editor +``` + +## Scaling Resources + +```console +$ kubectl scale --replicas=3 rs/foo # Scale a replicaset named 'foo' to +$ kubectl scale --replicas=3 -f foo.yaml # Scale a resource specified in "foo.yaml" to 3 +$ kubectl scale --current-replicas=2 --replicas=3 deployment/mysql # If the deployment named mysql's current size is 2, scale mysql to 3 +$ kubectl scale --replicas=5 rc/foo rc/bar rc/baz # Scale multiple replication controllers +``` + +## Deleting Resources + +```console +$ kubectl delete -f ./pod.json # Delete a pod using the type and name specified in pod.json +$ kubectl delete pod,service baz foo # Delete pods and services with same names "baz" and "foo" +$ kubectl delete pods,services -l name=myLabel # Delete pods and services with label name=myLabel +$ kubectl -n my-ns delete po,svc --all # Delete all pods and services in namespace my-ns ``` ## Interacting with running Pods -```shell -$ kubectl logs # dump pod logs (stdout) -$ kubectl logs -f # stream pod logs (stdout) until canceled (ctrl-c) or timeout - -$ kubectl run -i --tty busybox --image=busybox -- sh # Run pod as interactive shell -$ kubectl attach -i # Attach to Running Container -$ kubectl port-forward # Forward port of Pod to your local machine -$ kubectl port-forward # Forward port to service -$ kubectl exec -- ls / # Run command in existing pod (1 container case) -$ kubectl exec -c -- ls / # Run command in existing pod (multi-container case) +```console +$ kubectl logs my-pod # dump pod logs (stdout) +$ kubectl logs -f my-pod # stream pod logs (stdout) +$ kubectl run -i --tty busybox --image=busybox -- sh # Run pod as interactive shell +$ kubectl attach my-pod -i # Attach to Running Container +$ kubectl port-forward my-pod 5000 6000 # Forward port 6000 of Pod to your to 5000 on your local machine +$ kubectl port-forward my-svc 6000 # Forward port to service +$ kubectl exec my-pod -- ls / # Run command in existing pod (1 container case) +$ kubectl exec my-pod -c my-container -- ls / # Run command in existing pod (multi-container case) +$ kubectl top pod POD_NAME --containers # Show metrics for a given pod and its containers ``` + +## Interacting with Nodes and Cluster + +```console +$ kubectl cordon my-node # Mark my-node as unschedulable +$ kubectl drain my-node # Drain my-node in preparation for maintenance +$ kubectl uncordon my-node # Mark my-node as schedulable +$ kubectl top node my-node # Show metrics for a given node +$ kubectl cluster-info # Display addresses of the master and services +$ kubectl cluster-info dump # Dump current cluster state to stdout +$ kubectl cluster-info dump --output-directory=/path/to/cluster-state # Dump current cluster state to /path/to/cluster-state + +# If a taint with that key and effect already exists, its value is replaced as specified. +$ kubectl taint nodes foo dedicated=special-user:NoSchedule +``` + +## Resource types + +The following table includes a list of all the supported resource types and their abbreviated aliases. + +Resource type | Abbreviated alias +-------------------- | -------------------- +`clusters` | +`componentstatuses` |`cs` +`configmaps` |`cm` +`daemonsets` |`ds` +`deployments` |`deploy` +`endpoints` |`ep` +`event` |`ev` +`horizontalpodautoscalers` |`hpa` +`ingresses` |`ing` +`jobs` | +`limitranges` |`limits` +`namespaces` |`ns` +`networkpolicies` | +`nodes` |`no` +`petset` | +`persistentvolumeclaims` |`pvc` +`persistentvolumes` |`pv` +`pods` |`po` +`podsecuritypolicies` |`psp` +`podtemplates` | +`replicasets` |`rs` +`replicationcontrollers` |`rc` +`resourcequotas` |`quota` +`scheduledjob` | +`secrets` | +`serviceaccount` |`sa` +`services` |`svc` +`storageclasses` | +`thirdpartyresources` | + +### Formatting output + +To output details to your terminal window in a specific format, you can add either the `-o` or `-output` flags to a supported `kubectl` command. + +Output format | Description +--------------| ----------- +`-o=custom-columns=` | Print a table using a comma separated list of custom columns +`-o=custom-columns-file=` | Print a table using the custom columns template in the `` file +`-o=json` | Output a JSON formatted API object +`-o=jsonpath=