Merge branch 'master' into kubenet-note

This commit is contained in:
Bryan Boreham
2016-10-25 10:26:30 +01:00
committed by GitHub
271 changed files with 4299 additions and 2911 deletions
+3 -61
View File
@@ -2,67 +2,9 @@
layout: docwithnav layout: docwithnav
title: 404 Error! title: 404 Error!
permalink: /404.html permalink: /404.html
no_canonical: true
--- ---
<script language="JavaScript">
$( document ).ready(function() { <script src="/js/redirects.js"></script>
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;
if (forwardingURL.indexOf("third_party/swagger-ui") > -1)
{
notHere = true;
window.location.replace("http://kubernetes.io/kubernetes/third_party/swagger-ui/");
}
if (forwardingURL.indexOf("resource-quota") > -1)
{
notHere = true;
window.location.replace("http://kubernetes.io/docs/admin/resourcequota/");
}
if (forwardingURL.indexOf("horizontal-pod-autoscaler") > -1)
{
notHere = true;
window.location.replace("http://kubernetes.io/docs/user-guide/horizontal-pod-autoscaling/");
}
if (forwardingURL.indexOf("docs/roadmap") > -1)
{
notHere = true;
window.location.replace("https://github.com/kubernetes/kubernetes/milestones/");
}
if (forwardingURL.indexOf("api-ref/") > -1)
{
notHere = true;
window.location.replace("http://kubernetes.io/docs/api/");
}
if (forwardingURL.indexOf("docs/user-guide/overview") > -1)
{
notHere = true;
window.location.replace("http://kubernetes.io/docs/whatisk8s/");
}
for (i=0;i<fwdDirs.length;i++) {
if (forwardingURL.indexOf(fwdDirs[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<oldURLs.length;i++) {
if (forwardingURL.indexOf(oldURLs[i]) > -1)
{
doRedirect=true;
forwardingURL=forwardingURL.replace(oldURLs[i],"/");
}
}
if (doRedirect)
{
window.location.replace(forwardingURL);
};
}
});
</script>
Sorry, this page was not found. :( Sorry, this page was not found. :(
+19 -24
View File
@@ -4,16 +4,29 @@ 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. 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 * [Creating a Documentation Pull Request](http://kubernetes.io/docs/contribute/create-pull-request/)
change the name of the fork to be: * [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 ## Automatic Staging for Pull Requests
Then make your changes. 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:
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. - 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
## Branch structure and staging
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 `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 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) ## Staging the site locally (using Docker)
@@ -64,7 +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) Your copy of the site will then be viewable at: [http://localhost:4000](http://localhost:4000)
(or wherever Jekyll tells you). (or wherever Jekyll tells you).
## GitHub help ## GitHub help
If you're a bit rusty with git/GitHub, you might want to read If you're a bit rusty with git/GitHub, you might want to read
@@ -135,23 +147,6 @@ That, of course, will send users to:
(Or whatever Kubernetes release that docs branch is associated with.) (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 ## Config yaml guidelines
Guidelines for config yamls that are included in the site docs. These Guidelines for config yamls that are included in the site docs. These
+4 -1
View File
@@ -18,7 +18,7 @@ defaults:
values: values:
version: "v1.3" version: "v1.3"
githubbranch: "master" githubbranch: "master"
docsbranch: "release-1.3" docsbranch: "master"
- -
scope: scope:
path: "docs" path: "docs"
@@ -27,3 +27,6 @@ defaults:
showedit: true showedit: true
permalink: pretty permalink: pretty
gems:
- jekyll-redirect-from
+1
View File
@@ -4,5 +4,6 @@ tocs:
- tasks - tasks
- concepts - concepts
- reference - reference
- tools
- samples - samples
- support - support
+4 -2
View File
@@ -163,10 +163,10 @@ toc:
path: /docs/getting-started-guides/gce/ path: /docs/getting-started-guides/gce/
- title: Running Kubernetes on AWS EC2 - title: Running Kubernetes on AWS EC2
path: /docs/getting-started-guides/aws/ path: /docs/getting-started-guides/aws/
- title: Running Kubernetes on Azure
path: /docs/getting-started-guides/azure/
- title: Running Kubernetes on Azure (Weave-based) - title: Running Kubernetes on Azure (Weave-based)
path: /docs/getting-started-guides/coreos/azure/ 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 - title: Running Kubernetes on CenturyLink Cloud
path: /docs/getting-started-guides/clc/ path: /docs/getting-started-guides/clc/
- title: Running Kubernetes on IBM SoftLayer - title: Running Kubernetes on IBM SoftLayer
@@ -252,6 +252,8 @@ toc:
path: /docs/admin/ path: /docs/admin/
- title: Cluster Management Guide - title: Cluster Management Guide
path: /docs/admin/cluster-management/ path: /docs/admin/cluster-management/
- title: kubeadm reference
path: /docs/admin/kubeadm/
- title: Installing Addons - title: Installing Addons
path: /docs/admin/addons/ path: /docs/admin/addons/
- title: Sharing a Cluster with Namespaces - title: Sharing a Cluster with Namespaces
+3 -1
View File
@@ -63,7 +63,7 @@ toc:
- title: kubectl Commands - title: kubectl Commands
section: section:
- title: kubectl - title: kubectl
path: /docs/user-guide/kubectl/kubectl/ path: /docs/user-guide/kubectl/
- title: kubectl annotate - title: kubectl annotate
path: /docs/user-guide/kubectl/kubectl_annotate/ path: /docs/user-guide/kubectl/kubectl_annotate/
- title: kubectl api-versions - title: kubectl api-versions
@@ -230,6 +230,8 @@ toc:
path: /docs/user-guide/services/ path: /docs/user-guide/services/
- title: Service Accounts - title: Service Accounts
path: /docs/user-guide/service-accounts/ path: /docs/user-guide/service-accounts/
- title: Third Party Resources
path: /docs/user-guide/thirdpartyresources/
- title: Volumes - title: Volumes
path: /docs/user-guide/volumes/ path: /docs/user-guide/volumes/
+6
View File
@@ -6,6 +6,12 @@ toc:
- title: Contributing to the Kubernetes Docs - title: Contributing to the Kubernetes Docs
section: 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 - title: Using Page Templates
path: /docs/contribute/page-templates/ path: /docs/contribute/page-templates/
+10
View File
@@ -2,6 +2,12 @@ bigheader: "Tasks"
toc: toc:
- title: Tasks - title: Tasks
path: /docs/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: Defining a Command and Arguments for a Container
path: /docs/tasks/configure-pod-container/define-command-argument-container/
- title: Accessing Applications in a Cluster - title: Accessing Applications in a Cluster
section: section:
- title: Using Port Forwarding to Access Applications in a Cluster - title: Using Port Forwarding to Access Applications in a Cluster
@@ -10,4 +16,8 @@ toc:
section: section:
- title: Using an HTTP Proxy to Access the Kubernetes API - title: Using an HTTP Proxy to Access the Kubernetes API
path: /docs/tasks/access-kubernetes-api/http-proxy-access-api/ path: /docs/tasks/access-kubernetes-api/http-proxy-access-api/
- title: Administering a Cluster
section:
- title: Assigning Pods to Nodes
path: /docs/tasks/administer-cluster/assign-pods-nodes/
+4
View File
@@ -0,0 +1,4 @@
bigheader: "Tools"
toc:
- title: Tools
path: /docs/tools/
+18 -26
View File
@@ -2,59 +2,51 @@ bigheader: "Tutorials"
toc: toc:
- title: Tutorials - title: Tutorials
path: /docs/tutorials/ path: /docs/tutorials/
- title: Getting Started - title: Kubernetes Basics
section: section:
- title: Overview
path: /docs/tutorials/kubernetes-basics/
- title: 1. Create a Cluster - title: 1. Create a Cluster
section: section:
- title: Creating a Cluster
path: /docs/tutorials/getting-started/create-cluster/
- title: Using Minikube to Create a 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 - 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 - title: 2. Deploy an App
section: section:
- title: Deploying an App
path: /docs/tutorials/getting-started/deploy-app/
- title: Using kubectl to Create a Deployment - 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 - 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 - title: 3. Explore Your App
section: section:
- title: Exploring Your App
path: /docs/tutorials/getting-started/explore-app/
- title: Viewing Pods and Nodes - 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 - 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 - title: 4. Expose Your App Publicly
section: section:
- title: Exposing Your App Publicly
path: /docs/tutorials/getting-started/expose-app/
- title: Using a Service to Expose Your 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 - 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 - title: 5. Scale Your App
section: section:
- title: Scaling Your App
path: /docs/tutorials/getting-started/scale-app/
- title: Running Multiple Instances of Your 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 - 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 - title: 6. Update Your App
section: section:
- title: Updating Your App
path: /docs/tutorials/getting-started/update-app/
- title: Performing a Rolling Update - 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 - title: Interactive Tutorial - Updating Your App
path: /docs/tutorials/getting-started/update-interactive/ path: /docs/tutorials/kubernetes-basics/update-interactive/
- title: Stateless Applications - title: Stateless Applications
section: section:
- title: Running a Stateless Application Using a Deployment - title: Running a Stateless Application Using a Deployment
path: /docs/tutorials/stateless-application/run-stateless-application-deployment/ path: /docs/tutorials/stateless-application/run-stateless-application-deployment/
- title: Exposing an External IP Address Using a Service - title: Using a Service to Access an Application in a Cluster
path: /docs/tutorials/stateless-application/expose-external-ip-address-service/ path: /docs/tutorials/stateless-application/expose-external-ip-address-service/
- title: Exposing an External IP Address to Access an Application in a Cluster
path: /docs/tutorials/stateless-application/expose-external-ip-address/
+38 -38
View File
@@ -3,40 +3,40 @@
margin-top: 1em !important; margin-top: 1em !important;
} }
#caseStudies p { .gridPage p {
color: rgb(26,26,26) !important; color: rgb(26,26,26) !important;
margin-left: 0 !important; margin-left: 0 !important;
padding-left: 0 !important; padding-left: 0 !important;
font-weight: 300 !important; font-weight: 300 !important;
} }
#caseStudies #mainContent { .gridPage #mainContent {
padding: 0; padding: 0;
} }
#caseStudies #mainContent .content { .gridPage #mainContent .content {
padding-top: 0; padding-top: 0;
} }
#caseStudies main { .gridPage main {
max-width: 1100px !important; max-width: 1100px !important;
} }
#caseStudies .content { .gridPage .content {
position: relative; position: relative;
margin: 0 auto 50px; margin: 0 auto 50px;
max-width: 90%; max-width: 90%;
} }
#caseStudies .content p { .gridPage .content p {
line-height: 24px !important; line-height: 24px !important;
} }
#caseStudies .content h3 { .gridPage .content h3 {
padding: 0 !important; padding: 0 !important;
} }
#caseStudies #hero h5 { .gridPage #hero h5 {
padding-left: 20px; padding-left: 20px;
margin: 0; margin: 0;
} }
@@ -67,7 +67,7 @@
left: 0; left: 0;
} }
#caseStudies #mainContent .content .case-study p { .gridPage #mainContent .content .case-study p {
font-family: "Roboto", sans-serif; font-family: "Roboto", sans-serif;
font-size: 16px; font-size: 16px;
padding: 0; padding: 0;
@@ -77,13 +77,13 @@
font-style: italic; font-style: italic;
} }
#caseStudies #video { .gridPage #video {
background: #f9f9f9; background: #f9f9f9;
height: auto; height: auto;
/*height: 340px;*/ /*height: 340px;*/
} }
#caseStudies #video main { .gridPage #video main {
position: relative; position: relative;
max-width: 900px !important; max-width: 900px !important;
height: 100%; height: 100%;
@@ -93,19 +93,19 @@
padding: 50px 20px; padding: 50px 20px;
} }
#caseStudies #video main > div { .gridPage #video main > div {
width: 50%; width: 50%;
} }
#caseStudies #video main #zulilyLogo { .gridPage #video main #zulilyLogo {
width: 100px; width: 100px;
} }
#caseStudies #video main img { .gridPage #video main img {
max-width: 100%; max-width: 100%;
} }
#caseStudies #video h3 { .gridPage #video h3 {
font-size: 32px; font-size: 32px;
font-weight: 300; font-weight: 300;
line-height: 38px; line-height: 38px;
@@ -113,57 +113,57 @@
margin: 0 0 1em 0; margin: 0 0 1em 0;
} }
#caseStudies #video p { .gridPage #video p {
margin: 0; margin: 0;
} }
#caseStudies #video p.attrib { .gridPage #video p.attrib {
margin-bottom: 20px; margin-bottom: 20px;
} }
#caseStudies #video button > h6 { .gridPage #video button > h6 {
font-size: 18px; font-size: 18px;
font-weight: 500; font-weight: 500;
margin: 1em 0; margin: 1em 0;
color: #326de6; color: #326de6;
} }
#caseStudies #users { .gridPage #users {
padding: 50px; padding: 50px;
} }
#caseStudies #users main { .gridPage #users main {
max-width: 1150px !important; max-width: 1150px !important;
} }
#caseStudies #users main h3 { .gridPage #users main h3 {
padding-left: 20px; padding-left: 20px;
margin-bottom: 20px; margin-bottom: 20px;
} }
#caseStudies #usersGrid { .gridPage #usersGrid {
position: relative; position: relative;
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
} }
#caseStudies #usersGrid a { .gridPage #usersGrid a {
display: inline-block; display: inline-block;
margin: 5px; margin: 5px;
} }
#caseStudies #usersGrid a img { .gridPage #usersGrid a img {
box-shadow: 1px 1px 2px transparent; box-shadow: 1px 1px 2px transparent;
transition: box-shadow 0.25s; transition: box-shadow 0.25s;
} }
#caseStudies #usersGrid a img:hover { .gridPage #usersGrid a img:hover {
box-shadow: 1px 1px 2px #cccccc; box-shadow: 1px 1px 2px #cccccc;
} }
#caseStudies #usersGrid a:last-child img, .gridPage #usersGrid a:last-child img,
#caseStudies #usersGrid a:last-child img:hover { .gridPage #usersGrid a:last-child img:hover {
box-shadow: 1px 1px 2px transparent; box-shadow: 1px 1px 2px transparent;
} }
@@ -173,12 +173,12 @@
box-shadow: 1px 2px 2px #dddddd; box-shadow: 1px 2px 2px #dddddd;
} }
#caseStudies .feature { .gridPage .feature {
position: relative; position: relative;
padding: 20px 0 20px 242px; padding: 20px 0 20px 242px;
} }
#caseStudies .feature img { .gridPage .feature img {
position: absolute; position: absolute;
top: 20px; top: 20px;
left: 0; left: 0;
@@ -225,7 +225,7 @@
margin-bottom: 0.5em; margin-bottom: 0.5em;
} }
#caseStudies .feature p.quote { .gridPage .feature p.quote {
font-size: 20px; font-size: 20px;
line-height: 28px !important; line-height: 28px !important;
} }
@@ -250,20 +250,20 @@
} }
@media screen and (max-width: 900px){ @media screen and (max-width: 900px){
#caseStudies #video main { .gridPage #video main {
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
} }
#caseStudies #video main > div { .gridPage #video main > div {
width: 400px; width: 400px;
} }
#caseStudies #video main > div + div { .gridPage #video main > div + div {
margin-top: 30px; margin-top: 30px;
} }
#caseStudies #video h3 { .gridPage #video h3 {
max-width: 100%; max-width: 100%;
} }
} }
@@ -282,12 +282,12 @@
transform: translateX(-50%); transform: translateX(-50%);
} }
#caseStudies .feature { .gridPage .feature {
margin-top: 50px; margin-top: 50px;
padding: 180px 0 0; padding: 180px 0 0;
} }
#caseStudies .feature img { .gridPage .feature img {
top: 0; top: 0;
left: 50%; left: 50%;
transform: translateX(-50%); transform: translateX(-50%);
@@ -295,12 +295,12 @@
} }
@media screen and (max-width: 480px){ @media screen and (max-width: 480px){
#caseStudies #hero { .gridPage #hero {
padding-right: 20px; padding-right: 20px;
padding-left: 20px; padding-left: 20px;
} }
#caseStudies #video main > div { .gridPage #video main > div {
width: 80%; width: 80%;
min-width: 280px; min-width: 280px;
} }
+1
View File
@@ -4,6 +4,7 @@
<a href="/docs/hellonode/">Get Started</a> <a href="/docs/hellonode/">Get Started</a>
<a href="/docs/">Documentation</a> <a href="/docs/">Documentation</a>
<a href="http://blog.kubernetes.io/">Blog</a> <a href="http://blog.kubernetes.io/">Blog</a>
<a href="/partners/">Partners</a>
<a href="/community/">Community</a> <a href="/community/">Community</a>
<a href="/case-studies/">Case Studies</a> <a href="/case-studies/">Case Studies</a>
</nav> </nav>
+1 -1
View File
@@ -2,7 +2,7 @@
<head> <head>
<meta charset="utf-8"> <meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1"> <meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="canonical" href="http://kubernetes.io{{page.url}}" /> {% if !page.no_canonical %}<link rel="canonical" href="http://kubernetes.io{{page.url}}" />{% endif %}
<link rel="shortcut icon" type="image/png" href="/images/favicon.png"> <link rel="shortcut icon" type="image/png" href="/images/favicon.png">
<link href='https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic' rel='stylesheet' type='text/css'> <link href='https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href='https://fonts.googleapis.com/css?family=Roboto+Mono' type='text/css'> <link rel="stylesheet" href='https://fonts.googleapis.com/css?family=Roboto+Mono' type='text/css'>
+208
View File
@@ -0,0 +1,208 @@
;(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 (Googles 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 SDSs 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')
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'
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)
})
})();
+94
View File
@@ -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;
}
}
+4
View File
@@ -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).
+1 -1
View File
@@ -16,6 +16,7 @@
<li><a href="/docs/tasks/" {% if site.data[foundTOC].bigheader == "Tasks" %}class="YAH"{% endif %}>TASKS</a></li> <li><a href="/docs/tasks/" {% if site.data[foundTOC].bigheader == "Tasks" %}class="YAH"{% endif %}>TASKS</a></li>
<li><a href="/docs/concepts/" {% if site.data[foundTOC].bigheader == "Concepts" %}class="YAH"{% endif %}>CONCEPTS</a></li> <li><a href="/docs/concepts/" {% if site.data[foundTOC].bigheader == "Concepts" %}class="YAH"{% endif %}>CONCEPTS</a></li>
<li><a href="/docs/reference" {% if site.data[foundTOC].bigheader == "Reference Documentation" %}class="YAH"{% endif %}>REFERENCE</a></li> <li><a href="/docs/reference" {% if site.data[foundTOC].bigheader == "Reference Documentation" %}class="YAH"{% endif %}>REFERENCE</a></li>
<li><a href="/docs/tools" {% if site.data[foundTOC].bigheader == "Tools" %}class="YAH"{% endif %}>TOOLS</a></li>
<li><a href="/docs/samples" {% if site.data[foundTOC].bigheader == "Samples" %}class="YAH"{% endif %}>SAMPLES</a></li> <li><a href="/docs/samples" {% if site.data[foundTOC].bigheader == "Samples" %}class="YAH"{% endif %}>SAMPLES</a></li>
<li><a href="/docs/troubleshooting/" {% if site.data[foundTOC].bigheader == "Support" %}class="YAH"{% endif %}>SUPPORT</a></li> <li><a href="/docs/troubleshooting/" {% if site.data[foundTOC].bigheader == "Support" %}class="YAH"{% endif %}>SUPPORT</a></li>
</ul> </ul>
@@ -48,7 +49,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')); (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'));
</script> </script>
<a href="" onclick="window.open('https://github.com/kubernetes/kubernetes.github.io/issues/new?title=Issue%20with%20' + <a href="" onclick="window.open('https://github.com/kubernetes/kubernetes.github.io/issues/new?title=Issue%20with%20' +
window.location.pathname + '&body=Issue%20with%20' +
window.location.pathname)" class="button issue">Create Issue</a> window.location.pathname)" class="button issue">Create Issue</a>
<a href="/editdocs#{{ page.path }}" class="button issue">Edit This Page</a> <a href="/editdocs#{{ page.path }}" class="button issue">Edit This Page</a>
{% endif %} {% endif %}
+2 -1
View File
@@ -1131,7 +1131,7 @@ $feature-box-div-margin-bottom: 40px
// Community // Community
#community, #caseStudies #community, .gridPage
&.open-nav, &.flip-nav &.open-nav, &.flip-nav
.logo .logo
background-image: url(/images/nav_logo2.svg) background-image: url(/images/nav_logo2.svg)
@@ -1340,3 +1340,4 @@ $feature-box-div-margin-bottom: 40px
// //
// //
// //
//
+3 -2
View File
@@ -164,10 +164,11 @@ $video-section-height: 550px
margin-bottom: 20px margin-bottom: 20px
a a
width: 20% width: 16.65%
float: left float: left
font-size: 24px font-size: 24px
font-weight: 300 font-weight: 300
white-space: nowrap
.social .social
padding: 0 30px padding: 0 30px
@@ -270,7 +271,7 @@ $video-section-height: 550px
#community, #caseStudies #community, .gridPage
#hero #hero
text-align: left text-align: left
+1 -2
View File
@@ -222,8 +222,7 @@ $feature-box-div-width: 45%
text-align: center text-align: center
a a
font-size: 22px width: 30%
width: auto
padding: 0 20px padding: 0 20px
.social .social
+1 -1
View File
@@ -3,7 +3,7 @@ title: Case Studies
--- ---
<!Doctype html> <!Doctype html>
<html id="caseStudies"> <html id="caseStudies" class="gridPage">
{% include head-header.html %} {% include head-header.html %}
<section id="hero" class="light-text"> <section id="hero" class="light-text">
+1 -1
View File
@@ -3,7 +3,7 @@ title: Pearson Case Study
--- ---
<!Doctype html> <!Doctype html>
<html id="caseStudies"> <html id="caseStudies" class="gridPage">
{% include head-header.html %} {% include head-header.html %}
<section id="hero" class="light-text"> <section id="hero" class="light-text">
+1 -1
View File
@@ -3,7 +3,7 @@ title: Wikimedia Case Study
--- ---
<!Doctype html> <!Doctype html>
<html id="caseStudies"> <html id="caseStudies" class="gridPage">
{% include head-header.html %} {% include head-header.html %}
<section id="hero" class="light-text"> <section id="hero" class="light-text">
-44
View File
@@ -10,8 +10,6 @@ title: Community
<h1>Community</h1> <h1>Community</h1>
</section> </section>
<section id="mainContent"> <section id="mainContent">
<main> <main>
<div class="content"> <div class="content">
@@ -29,20 +27,6 @@ title: Community
from AWS and Openstack to Big Data and Scalability, theres a place for you to contribute and instructions from AWS and Openstack to Big Data and Scalability, theres a place for you to contribute and instructions
for forming a new SIG if your special interest isnt covered (yet).</p> for forming a new SIG if your special interest isnt covered (yet).</p>
</div> </div>
<div class="content">
<h3>Customers</h3>
<div class="company-logos">
<img src="/images/community_logos/zulily_logo.png">
<img src="/images/community_logos/we_pay_logo.png">
<img src="/images/community_logos/goldman_sachs_logo.png">
<img src="/images/community_logos/ebay_logo.png">
<img src="/images/community_logos/box_logo.png">
<img src="/images/community_logos/wikimedia_logo.png">
<img src="/images/community_logos/soundcloud_logo.png">
<img src="/images/community_logos/new_york_times_logo.png">
<img src="/images/community_logos/kabam_logo.png">
</div>
</div>
<div class="content"> <div class="content">
<h3>Events</h3> <h3>Events</h3>
<div id="calendarWrapper"> <div id="calendarWrapper">
@@ -50,34 +34,6 @@ title: Community
frameborder="0" scrolling="no"></iframe> frameborder="0" scrolling="no"></iframe>
</div> </div>
</div> </div>
<div class="content">
<h3>Partners</h3>
<p>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.</p>
<div class="partner-logos">
<a href="https://coreos.com/kubernetes"><img src="/images/community_logos/core_os_logo.png"></a>
<a href="https://deis.com"><img src="/images/community_logos/deis_logo.png"></a>
<a href="https://sysdig.com/blog/monitoring-kubernetes-with-sysdig-cloud/"><img src="/images/community_logos/sysdig_cloud_logo.png"></a>
<a href="https://puppet.com/blog/managing-kubernetes-configuration-puppet"><img src="/images/community_logos/puppet_logo.png"></a>
<a href="https://www.citrix.com/blogs/2016/07/15/citrix-kubernetes-a-home-run/"><img src="/images/community_logos/citrix_logo.png"></a>
<a href="http://wercker.com/workflows/partners/kubernetes/"><img src="/images/community_logos/wercker_logo.png"></a>
<a href="http://rancher.com/kubernetes/"><img src="/images/community_logos/rancher_logo.png"></a>
<a href="https://www.openshift.com/"><img src="/images/community_logos/red_hat_logo.png"></a>
<a href="https://tectonic.com/press/intel-coreos-collaborate-on-openstack-with-kubernetes.html"><img src="/images/community_logos/intel_logo.png"></a>
<a href="https://elasticbox.com/kubernetes/"><img src="/images/community_logos/elastickube_logo.png"></a>
<a href="https://platform9.com/blog/containers-as-a-service-kubernetes-docker"><img src="/images/community_logos/platform9_logo.png"></a>
<a href="http://www.appformix.com/solutions/appformix-for-kubernetes/"><img src="/images/community_logos/appformix_logo.png"></a>
<a href="http://kubernetes.io/docs/getting-started-guides/dcos/"><img src="/images/community_logos/mesosphere_logo.png"></a>
<a href="http://docs.datadoghq.com/integrations/kubernetes/"><img src="/images/community_logos/datadog_logo.png"></a>
<a href="https://apprenda.com/kubernetes-support/"><img src="/images/community_logos/apprenda_logo.png"></a>
<a href="http://www.ibm.com/cloud-computing/"><img src="/images/community_logos/ibm_logo.png"></a>
<a href="http://info.crunchydata.com/blog/advanced-crunchy-containers-for-postgresql"><img src="/images/community_logos/crunchy_data_logo.png"></a>
<a href="https://content.mirantis.com/Containerizing-OpenStack-on-Kubernetes-Video-Landing-Page.html"><img src="/images/community_logos/mirantis_logo.png"></a>
<a href="http://blog.aquasec.com/security-best-practices-for-kubernetes-deployment"><img src="/images/community_logos/aqua_logo.png"></a>
<a href="https://jujucharms.com/canonical-kubernetes/"><img src="/images/community_logos/ubuntu_cannonical_logo.png"></a>
<a href="https://github.com/nuagenetworks/nuage-kubernetes"><img src="/images/community_logos/nuage_network_logo.png"></a>
</div>
</div>
</main> </main>
</section> </section>
+2 -2
View File
@@ -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. 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 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 is available to subsequent steps to use in their decisions. Some authenticators
may also provide the group memberships of the user, while other authenticators also provide the group memberships of the user, while other authenticators
do not (and expect the authorizer to determine these). do not.
While Kubernetes uses "usernames" for access control decisions and in request logging, 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 it does not have a `user` object nor does it store usernames or other information about
+2 -2
View File
@@ -349,8 +349,8 @@ logs or through `journalctl`. More information is provided in
Additional resources: Additional resources:
- http://wiki.apparmor.net/index.php/QuickProfileLanguage - [Quick guide to the AppArmor profile language](http://wiki.apparmor.net/index.php/QuickProfileLanguage)
- http://wiki.apparmor.net/index.php/ProfileLanguage - [AppArmor core policy reference](http://wiki.apparmor.net/index.php/ProfileLanguage)
## API Reference ## API Reference
+56 -18
View File
@@ -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 stored as `Secrets`, which are mounted into pods allowing in cluster processes
to talk to the Kubernetes API. to talk to the Kubernetes API.
All API requests are tied to either a normal user or a service account. This API requests are tied to either a normal user or a service account, or are treated
means every process inside or outside the cluster, from a human user typing as anonymous requests. This means every process inside or outside the cluster, from
`kubectl` on a workstation, to `kubelets` on nodes, to members of the control a human user typing `kubectl` on a workstation, to `kubelets` on nodes, to members
plane, must authenticate when making requests to the the API server. of the control plane, must authenticate when making requests to the the API server,
or be treated as an anonymous user.
## Authentication strategies ## Authentication strategies
@@ -54,20 +55,31 @@ When multiple are enabled, the first authenticator module
to successfully authenticate the request short-circuits evaluation. to successfully authenticate the request short-circuits evaluation.
The API server does not guarantee the order authenticators run in. 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 ### X509 Client Certs
Client certificate authentication is enabled by passing the `--client-ca-file=SOMEFILE` Client certificate authentication is enabled by passing the `--client-ca-file=SOMEFILE`
option to API server. The referenced file must contain one or more certificates authorities 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 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 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. See [APPENDIX](#appendix) for how to generate a client cert.
### Static Token File ### Static Token File
Token file is enabled by passing the `--token-auth-file=SOMEFILE` option to the 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
API server. Currently, tokens last indefinitely, and the token list cannot be
changed without restarting API server. changed without restarting API server.
The token file format is implemented in `plugin/pkg/auth/authenticator/token/tokenfile/...` The token file format is implemented in `plugin/pkg/auth/authenticator/token/tokenfile/...`
@@ -78,8 +90,19 @@ optional group names. Note, if you have more than one group the column must be d
token,user,uid,"group1,group2,group3" token,user,uid,"group1,group2,group3"
``` ```
When using token authentication from an http client the API server expects an `Authorization` #### Putting a Bearer Token in a Request
header with a value of `Bearer SOMETOKEN`.
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
Authorization: Bearer 31ada4fd-adec-460c-809a-9e56ceb75269
```
### Static Password File ### Static Password File
@@ -171,7 +194,8 @@ type: kubernetes.io/service-account-token
Note: values are base64 encoded because secrets are always base64 encoded. 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 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. the API server, but can be used from outside the cluster as well.
Service accounts authenticate with the username `system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)`, Service accounts authenticate with the username `system:serviceaccount:(NAMESPACE):(SERVICEACCOUNT)`,
@@ -192,11 +216,8 @@ email, signed by the server.
To identify the user, the authenticator uses the `id_token` (not the `access_token`) 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) from the OAuth2 [token response](https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse)
as a bearer token. as a bearer token. See [above](#putting-a-bearer-token-in-a-request) for how the token
is included in a request.
```
Authentication: Bearer (id_token)
```
To enable the plugin, pass the following required flags: To enable the plugin, pass the following required flags:
@@ -272,10 +293,11 @@ contexts:
name: webhook name: webhook
``` ```
When a client attempts to authenticate with the API server using a bearer token, When a client attempts to authenticate with the API server using a bearer token
using the `Authorization: Bearer (TOKEN)` HTTP header the authentication webhook 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 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/) 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 as other Kubernetes API objects. Implementers should be aware of looser
@@ -354,6 +376,22 @@ Please refer to the [discussion](https://github.com/kubernetes/kubernetes/pull/1
[blueprint](https://github.com/kubernetes/kubernetes/issues/11626) and [proposed [blueprint](https://github.com/kubernetes/kubernetes/issues/11626) and [proposed
changes](https://github.com/kubernetes/kubernetes/pull/25536) for more details. 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 ## Plugin Development
We plan for the Kubernetes API server to issue tokens after the user has been We plan for the Kubernetes API server to issue tokens after the user has been
+33 -2
View File
@@ -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 resource is being accessed (for resource requests only)
- what subresource 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 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: 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 namespace: default
name: pod-reader name: pod-reader
rules: rules:
- apiGroups: [""] # The API group "" indicates the default API Group. - apiGroups: [""] # The API group "" indicates the core API Group.
resources: ["pods"] resources: ["pods"]
verbs: ["get", "watch", "list"] verbs: ["get", "watch", "list"]
nonResourceURLs: [] nonResourceURLs: []
@@ -323,6 +323,32 @@ roleRef:
apiVersion: rbac.authorization.k8s.io/v1alpha1 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 ### Referring to Subjects
RoleBindings and ClusterRoleBindings bind "subjects" to "roles". 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. Only the `subjects` section of a RoleBinding object shown in the following examples.
For a user called `alice@example.com`, specify For a user called `alice@example.com`, specify
```yaml ```yaml
subjects: subjects:
- kind: User - kind: User
@@ -358,6 +385,7 @@ subjects:
``` ```
For a group called `frontend-admins`, specify: For a group called `frontend-admins`, specify:
```yaml ```yaml
subjects: subjects:
- kind: Group - kind: Group
@@ -365,6 +393,7 @@ subjects:
``` ```
For the default service account in the kube-system namespace: For the default service account in the kube-system namespace:
```yaml ```yaml
subjects: subjects:
- kind: ServiceAccount - kind: ServiceAccount
@@ -373,6 +402,7 @@ subjects:
``` ```
For all service accounts in the `qa` namespace: For all service accounts in the `qa` namespace:
```yaml ```yaml
subjects: subjects:
- kind: Group - kind: Group
@@ -380,6 +410,7 @@ subjects:
``` ```
For all service accounts everywhere: For all service accounts everywhere:
```yaml ```yaml
subjects: subjects:
- kind: Group - kind: Group
+181 -11
View File
@@ -9,10 +9,14 @@ assignees:
## Introduction ## 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). 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 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 include the Pod's own namespace and the cluster's default domain. This is best
illustrated by example: illustrated by example:
@@ -22,17 +26,164 @@ 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 `foo`. A Pod running in namespace `quux` can look up this service by doing a
DNS query for `foo.bar`. DNS query for `foo.bar`.
The Kubernetes cluster DNS server (based off the [SkyDNS](https://github.com/skynetservices/skydns) library) ## Supported DNS schema
supports forward lookups (A records), service lookups (SRV records) and reverse IP address lookups (PTR records).
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. #### A records
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 "Normal" (not headless) Services are assigned a DNS A record for a name of the
performance. The healthz container provides a single health check endpoint while performing dual healthchecks form `my-svc.my-namespace.svc.cluster.local`. This resolves to the cluster IP
(for dnsmasq and kubedns). 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 "<hostname>.<subdomain>.<pod namespace>.svc.<cluster domain>".
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 <hostname>.<service name>.<pod namespace>.svc.<cluster domain>
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 <some-time>
```
### 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) ## Kubernetes Federation (Multiple Zone support)
@@ -44,6 +195,25 @@ the lookup of federated services (which span multiple Kubernetes clusters).
See the [Cluster Federation Administrators' Guide](/docs/admin/federation) for more See the [Cluster Federation Administrators' Guide](/docs/admin/federation) for more
details on Cluster Federation and multi-site support. 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=<default local 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 ## References
- [Docs for the DNS cluster addon](http://releases.k8s.io/{{page.githubbranch}}/build/kube-dns/README.md) - [Docs for the DNS cluster addon](http://releases.k8s.io/{{page.githubbranch}}/build/kube-dns/README.md)
+214
View File
@@ -0,0 +1,214 @@
---
assignees:
- mikedanese
- luxas
- errordeveloper
---
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. 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. 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.
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
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
`<service_name>.<namespace>.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.
- `--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
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`
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:
`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=<token>`
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.
## 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-<arch>:1.0` | The bootstrap discovery helper image to use. |
| `KUBE_ETCD_IMAGE` | `gcr.io/google_containers/etcd-<arch>: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.
```
# cat /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
```
+1 -1
View File
@@ -8,7 +8,7 @@ assignees:
By default, pods run with unbounded CPU and memory limits. This means that any pod in the 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. 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 a variety of reasons.
For example: For example:
+7 -3
View File
@@ -36,7 +36,11 @@ Place plugins in `network-plugin-dir/plugin-name/plugin-name`, i.e if you have a
### CNI ### 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 ### kubenet
@@ -48,7 +52,7 @@ The kubenet plugin is mutually exclusive with the --configure-cbr0 option.
The plugin requires a few things: 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 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 * 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=<cidr>` controller-manager command-line options. * 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=<cidr>` controller-manager command-line options.
@@ -70,6 +74,6 @@ This option is provided to the network-plugin; currently **only kubenet supports
## Usage Summary ## Usage Summary
* `--network-plugin=exec` specifies that we use the `exec` plugin, with executables located in `--network-plugin-dir`. * `--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=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. * `--network-plugin-mtu=9001` specifies the MTU to use, currently only used by the `kubenet` network plugin.
+3 -3
View File
@@ -29,7 +29,7 @@ table below. The value of each signal is described in the description column ba
summary API. summary API.
| Eviction Signal | Description | | Eviction Signal | Description |
|------------------|---------------------------------------------------------------------------------| |----------------------------|-----------------------------------------------------------------------|
| `memory.available` | `memory.available` := `node.status.capacity[memory]` - `node.stats.memory.workingSet` | | `memory.available` | `memory.available` := `node.status.capacity[memory]` - `node.stats.memory.workingSet` |
| `nodefs.available` | `nodefs.available` := `node.stats.fs.available` | | `nodefs.available` | `nodefs.available` := `node.stats.fs.available` |
| `nodefs.inodesFree` | `nodefs.inodesFree` := `node.stats.fs.inodesFree` | | `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. The following node conditions are defined that correspond to the specified eviction signal.
| Node Condition | Eviction Signal | Description | | Node Condition | Eviction Signal | Description |
|----------------|------------------|------------------------------------------------------------------| |-------------------------|-------------------------------|--------------------------------------------|
| `MemoryPressure` | `memory.available` | Available memory on the node has satisfied an eviction threshold | | `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 | | `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. 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 | | Quality of Service | oom_score_adj |
| ----------------- | ------------- | |----------------------------|-----------------------------------------------------------------------|
| `Guaranteed` | -998 | | `Guaranteed` | -998 |
| `BestEffort` | 1000 | | `BestEffort` | 1000 |
| `Burstable` | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) | | `Burstable` | min(max(2, 1000 - (1000 * memoryRequestBytes) / machineMemoryCapacityBytes), 999) |
+2 -2
View File
@@ -58,7 +58,7 @@ that can be requested in a given namespace.
The following resource types are supported: The following resource types are supported:
| Resource Name | Description | | Resource Name | Description |
| ------------ | ----------- | | --------------------- | ----------------------------------------------------------- |
| `cpu` | Across all pods in a non-terminal state, the sum of CPU requests cannot exceed this value. | | `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.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. | | `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: are supported:
| Resource Name | Description | | Resource Name | Description |
| ------------ | ----------- | | ------------------------------- | ------------------------------------------------- |
| `configmaps` | The total number of config maps that can exist in the namespace. | | `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. | | `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. | | `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. |
+1 -1
View File
@@ -64,7 +64,7 @@ Each hosting environment has a slightly different grains.conf file that is used
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. 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 Key | Value
------------- | ------------- -----------------------------------|----------------------------------------------------------------
`api_servers` | (Optional) The IP address / host name where a kubelet can get read-only access to kube-apiserver `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. `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* `cloud` | (Optional) Which IaaS platform is used to host Kubernetes, *gce*, *azure*, *aws*, *vagrant*
+1 -1
View File
@@ -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. 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 ```shell
[joe@my-master ~] $ kubectl delete pod static-web-my-node1 [joe@my-master ~] $ kubectl delete pod static-web-my-node1
+94
View File
@@ -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 &lt;vnext&gt; branch
If your documentation change should not be released until the next release of
the Kubernetes product, create a pull request against the &lt;vnext&gt; branch
of the Kubernetes documentation repository. The &lt;vnext&gt; branch has the
form `release-<version-number>`, for example release-1.5.
1. In your GitHub account, in your new branch, create a pull request
against the &lt;vnext&gt; 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 %}
+2 -2
View File
@@ -12,7 +12,7 @@
<li><a href="#concept_template">Concept</a></li> <li><a href="#concept_template">Concept</a></li>
</ul> </ul>
<p>The page templates are in the <a href="https://github.com/kubernetes/kubernetes.github.io/tree/master/_includes/templates">_includes/templates</a> directory of the <a href="https://github.com/kubernetes/kubernetes.github.io">kubernetes.github.io</a> repository. <p>The page templates are in the <a href="https://github.com/kubernetes/kubernetes.github.io/tree/master/_includes/templates" target="_blank">_includes/templates</a> directory of the <a href="https://github.com/kubernetes/kubernetes.github.io">kubernetes.github.io</a> repository.
<h3 id="task_template">Task template</h3> <h3 id="task_template">Task template</h3>
@@ -71,7 +71,7 @@ Here's an interesting thing to know about the steps you just did.
<p>Here's an example of a published topic that uses the task template:</p> <p>Here's an example of a published topic that uses the task template:</p>
<p><a href="/docs/tasks/access-application-cluster/http-proxy-access-application-cluster">Using an HTTP Proxy to Access Applications in a Cluster</a></p> <p><a href="/docs/tasks/access-kubernetes-api/http-proxy-access-api">Using an HTTP Proxy to Access the Kubernetes API</a></p>
<h3 id="tutorial_template">Tutorial template</h3> <h3 id="tutorial_template">Tutorial template</h3>
@@ -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 `<your-username>.github.io`, where
`<your-username>` is the username of your GitHub account.
1. Delete the `CNAME` file.
1. View your staged content at this URL:
https://<your-username>.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 %}
+83
View File
@@ -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:
<table>
<tr>
<td>Task</td>
<td>A 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.</td>
</tr>
<tr>
<td>Tutorial</td>
<td>A 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.</td>
</tr>
<tr>
<td>Concept</td>
<td>A 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.</td>
</tr>
</table>
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 %}
+3 -7
View File
@@ -5,12 +5,8 @@ assignees:
--- ---
* TOC
{:toc}
## Overview
The recommended approach for deploying a Kubernetes 1.4 cluster on Azure is the 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 [`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). [Azure Getting Started Guide](https://github.com/kubernetes/kubernetes-anywhere/blob/master/phase1/azure/README.md).
@@ -10,15 +10,15 @@ assignees:
## Prerequisites ## Prerequisites
You need two machines with CentOS installed on them. 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 ## 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 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:** **System Information:**
@@ -28,12 +28,14 @@ Please replace host IP with your environment.
```conf ```conf
centos-master = 192.168.121.9 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:** **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 ```conf
[virt7-docker-common-release] [virt7-docker-common-release]
@@ -42,17 +44,19 @@ baseurl=http://cbs.centos.org/repos/virt7-docker-common-release/x86_64/os/
gpgcheck=0 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 ```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) * Add master and node to /etc/hosts on all machines (not needed if hostnames already in DNS)
```shell ```shell
echo "192.168.121.9 centos-master 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: * 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" 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 ```shell
systemctl disable iptables-services firewalld systemctl disable iptables-services firewalld
@@ -114,17 +118,39 @@ KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_API_ARGS="" KUBE_API_ARGS=""
``` ```
* Configure ETCD to hold the network overlay configuration on master:
**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.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):
```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: * Start the appropriate services on master:
```shell ```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 restart $SERVICES
systemctl enable $SERVICES systemctl enable $SERVICES
systemctl status $SERVICES systemctl status $SERVICES
done 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*** ***We need to configure the kubelet and start the kubelet and proxy***
@@ -138,7 +164,7 @@ KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="--port=10250" KUBELET_PORT="--port=10250"
# You may leave this blank to use the actual hostname # 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 # Location of the api-server
KUBELET_API_SERVER="--api-servers=http://centos-master:8080" KUBELET_API_SERVER="--api-servers=http://centos-master:8080"
@@ -147,10 +173,24 @@ KUBELET_API_SERVER="--api-servers=http://centos-master:8080"
KUBELET_ARGS="" 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 ```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 restart $SERVICES
systemctl enable $SERVICES systemctl enable $SERVICES
systemctl status $SERVICES systemctl status $SERVICES
@@ -164,7 +204,9 @@ done
```shell ```shell
$ kubectl get nodes $ kubectl get nodes
NAME LABELS STATUS NAME LABELS STATUS
centos-minion <none> Ready centos-minion-1 <none> Ready
centos-minion-2 <none> Ready
centos-minion-3 <none> Ready
``` ```
**The cluster should be running! Launch a test pod.** **The cluster should be running! Launch a test pod.**
@@ -176,7 +218,7 @@ You should have a functional cluster, check out [101](/docs/user-guide/walkthrou
IaaS Provider | Config. Mgmt | OS | Networking | Docs | Conforms | 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)) 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. For support level information on all solutions, see the [Table of solutions](/docs/getting-started-guides/#table-of-solutions) chart.
@@ -16,7 +16,7 @@ and a _worker_ node which receives work from the master. You can repeat the proc
times to create larger clusters. times to create larger clusters.
Here's a diagram of what the final result will look like: 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 ### Bootstrap Docker
@@ -86,7 +86,7 @@ Clone the `kube-deploy` repo, and run `worker.sh` on the worker machine _with ro
```shell ```shell
$ git clone https://github.com/kubernetes/kube-deploy $ git clone https://github.com/kubernetes/kube-deploy
$ cd docker-multinode $ cd kube-deploy/docker-multinode
$ export MASTER_IP=${SOME_IP} $ export MASTER_IP=${SOME_IP}
$ ./worker.sh $ ./worker.sh
``` ```
+1 -2
View File
@@ -26,6 +26,7 @@ If you want to use custom binaries or pure open source Kubernetes, please contin
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. 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 <project-id>`. 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 <project-id>`.
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 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. 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 Please see the [Kubernetes docs](/docs/) for more details on administering
and using a Kubernetes cluster. and using a Kubernetes cluster.
+6 -3
View File
@@ -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). [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 ### Turn-key Cloud Solutions
These solutions allow you to create Kubernetes clusters on a range of Cloud IaaS providers with only a These solutions allow you to create Kubernetes clusters on a range of Cloud IaaS providers with only a
@@ -48,8 +50,8 @@ few commands, and have active community support.
- [GCE](/docs/getting-started-guides/gce) - [GCE](/docs/getting-started-guides/gce)
- [AWS](/docs/getting-started-guides/aws) - [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/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) - [CenturyLink Cloud](/docs/getting-started-guides/clc)
- [IBM SoftLayer](https://github.com/patrocinio/kubernetes-softlayer) - [IBM SoftLayer](https://github.com/patrocinio/kubernetes-softlayer)
@@ -70,7 +72,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. 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) - [GCE + CoreOS](/docs/getting-started-guides/coreos)
- [AWS + Ubuntu](/docs/getting-started-guides/juju) - [AWS + Ubuntu](/docs/getting-started-guides/juju)
- [Joyent + Ubuntu](/docs/getting-started-guides/juju) - [Joyent + Ubuntu](/docs/getting-started-guides/juju)
@@ -120,9 +122,10 @@ IaaS Provider | Config. Mgmt | OS | Networking | Docs
GKE | | | GCE | [docs](https://cloud.google.com/container-engine) | ['œ“][3] | Commercial GKE | | | GCE | [docs](https://cloud.google.com/container-engine) | ['œ“][3] | Commercial
Stackpoint.io | | multi-support | multi-support | [docs](http://www.stackpointcloud.com) | | 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 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 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 | 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 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)) 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 Bare-metal | Ansible | Fedora | flannel | [docs](/docs/getting-started-guides/fedora/fedora_ansible_config) | | Project
+26 -15
View File
@@ -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. 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). 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)!** **The `kubeadm` tool is currently in alpha but please try it out and give us [feedback](/docs/getting-started-guides/kubeadm/#feedback)!**
## Prerequisites ## Prerequisites
@@ -45,7 +47,7 @@ For each host in turn:
* SSH into the machine and become `root` if you are not already (for example, run `sudo su -`). * SSH into the machine and become `root` if you are not already (for example, run `sudo su -`).
* If the machine is running Ubuntu 16.04, run: * If the machine is running Ubuntu 16.04, run:
# 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 <<EOF > /etc/apt/sources.list.d/kubernetes.list # cat <<EOF > /etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF EOF
@@ -177,14 +179,14 @@ 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. 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). 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 create namespace sock-shop
# kubectl apply -f microservices-demo/deploy/kubernetes/manifests # 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: 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 Name: front-end
Namespace: default Namespace: sock-shop
Labels: name=front-end Labels: name=front-end
Selector: name=front-end Selector: name=front-end
Type: NodePort Type: NodePort
@@ -194,7 +196,7 @@ You can then find out the port that the [NodePort feature of services](/docs/use
Endpoints: <none> Endpoints: <none>
Session Affinity: None 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. Then go to the IP address of your cluster's master node in your browser, and specify the given port.
So for example, `http://<master_ip>:<port>`. So for example, `http://<master_ip>:<port>`.
@@ -211,21 +213,24 @@ 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/). * 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. * 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/admin/kubeadm/)
## Cleanup ## 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 uninstall the packages. * 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.
<details>
<br>
Reset local state:
<pre><code>systemctl stop kubelet; <pre><code>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; docker rm -f -v $(docker ps -q);
rm -rf /var/lib/kubelet /etc/kubernetes /var/lib/etcd /etc/cni; find /var/lib/kubelet | xargs -n 1 findmnt -n -t tmpfs -o TARGET -T | uniq | xargs -r umount -v;
ip link set cbr0 down; ip link del cbr0; rm -r -f /etc/kubernetes /var/lib/kubelet /var/lib/etcd;
ip link set cni0 down; ip link del cni0; </code></pre>
systemctl start kubelet</code></pre> If you wish to start over, run `systemctl start kubelet` followed by `kubeadm init` or `kubeadm join`.
</details> <!-- *syntax-highlighting-hack --> <!-- *syntax-highlighting-hack -->
## Feedback ## Feedback
@@ -253,3 +258,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. 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@<master>:/etc/kubernetes/admin.conf .` and then e.g. `kubectl --kubeconfig ./admin.conf get nodes` from your workstation. Workaround: copy the kubelet's `kubeconfig` from the master: use `scp root@<master>:/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),
@@ -134,7 +134,7 @@ export KUBERNETES_PROVIDER=libvirt-coreos; wget -q -O - https://get.k8s.io | bas
Here is the curl version of this command: Here is the curl version of this command:
```shell ```shell
export KUBERNETES_PROVIDER=libvirt-coreos; curl -sS https://get.k8s.io | bash` export KUBERNETES_PROVIDER=libvirt-coreos; curl -sS https://get.k8s.io | bash
``` ```
This script downloads and unpacks the tarball, then spawns a Kubernetes cluster on CoreOS instances with the following characteristics: This script downloads and unpacks the tarball, then spawns a Kubernetes cluster on CoreOS instances with the following characteristics:
+2 -3
View File
@@ -47,9 +47,8 @@ ssh jclouds@${ip_address_of_master_node}
Build Kubernetes-Mesos. Build Kubernetes-Mesos.
```shell ```shell
git clone https://github.com/kubernetes/kubernetes git clone https://github.com/kubernetes-incubator/kube-mesos-framework
cd kubernetes cd kube-mesos-framework
export KUBERNETES_CONTRIB=mesos
make make
``` ```
+8 -1
View File
@@ -29,6 +29,7 @@ Internet to download the necessary files, while worker nodes do not.
Ubuntu 15 which uses systemd instead of upstart. 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. 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. 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 ## Starting a Cluster
@@ -116,7 +117,13 @@ that conflicts with your own private network range.
The `FLANNEL_NET` variable defines the IP range used for flannel overlay network, The `FLANNEL_NET` variable defines the IP range used for flannel overlay network,
should not conflict with above `SERVICE_CLUSTER_IP_RANGE`. should not conflict with above `SERVICE_CLUSTER_IP_RANGE`.
You can optionally provide additional Flannel network configuration 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. **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, If your machines are located in a private network that need proxy setting to connect the Internet,
+4 -4
View File
@@ -77,9 +77,9 @@ h2, h3, h4 {
<a href="/docs/whatisk8s/" class="button">Read the Overview</a> <a href="/docs/whatisk8s/" class="button">Read the Overview</a>
</div> </div>
<div class="col3rd"> <div class="col3rd">
<h3>Hello World on Google Container Engine</h3> <h3>Kubernetes Basics Interactive Tutorial</h3>
<p>In this quickstart, well 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.</p> <p>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.</p>
<a href="/docs/hellonode/" class="button">Get Started on GKE</a> <a href="/docs/tutorials/kubernetes-basics/" class="button">Try the Interactive Tutorials</a>
</div> </div>
<div class="col3rd"> <div class="col3rd">
<h3>Installing Kubernetes on Linux with kubeadm</h3> <h3>Installing Kubernetes on Linux with kubeadm</h3>
@@ -117,7 +117,7 @@ h2, h3, h4 {
<div class="col2nd"> <div class="col2nd">
<h3>Contribute to Our Docs</h3> <h3>Contribute to Our Docs</h3>
<p>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!</p> <p>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!</p>
<a href="/editdocs/" class="button">Write Docs for K8s</a> <a href="/docs/contribute/create-pull-request/" class="button">Write Docs for K8s</a>
</div> </div>
<div class="col2nd"> <div class="col2nd">
<h3>Need Help?</h3> <h3>Need Help?</h3>
@@ -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 %}
@@ -0,0 +1,88 @@
---
---
{% capture overview %}
This page shows how to assign a Kubernetes Pod to a particular node in a
Kubernetes cluster.
{% endcapture %}
{% capture prerequisites %}
* Install [kubectl](http://kubernetes.io/docs/user-guide/prereqs).
* Create a Kubernetes cluster, including a running Kubernetes
API server. One way to create a new cluster is to use
[Minikube](/docs/getting-started-guides/minikube).
* Configure `kubectl` to communicate with your Kubernetes API server. This
configuration is done automatically if you use Minikube.
{% endcapture %}
{% capture steps %}
### Adding a label to a node
1. List the nodes in your cluster:
kubectl get nodes
The output is similar to this:
NAME STATUS AGE
worker0 Ready 1d
worker1 Ready 1d
worker2 Ready 1d
1. Chose one of your nodes, and add a label to it:
kubectl label nodes <your-node-name> disktype=ssd
where `<your-node-name>` is the name of your chosen node.
1. Verify that your chosen node has a `disktype=ssd` label:
kubectl get nodes --show-labels
The output is similar to this:
NAME STATUS AGE LABELS
worker0 Ready 1d ...,disktype=ssd,kubernetes.io/hostname=worker0
worker1 Ready 1d ...,kubernetes.io/hostname=worker1
worker2 Ready 1d ...,kubernetes.io/hostname=worker2
In the preceding output, you can see that the `worker0` node has a
`disktype=ssd` label.
### Creating a pod that gets scheduled to your chosen node
This pod configuration file describes a pod that has a node selector,
`disktype: ssd`. This means that the pod will get scheduled on a node that has
a `disktype=ssd` label.
{% include code.html language="yaml" file="pod.yaml" ghlink="/docs/tasks/administer-cluster/pod.yaml" %}
1. Use the configuration file to create a pod that will get scheduled on your
chosen node:
export REPO=https://raw.githubusercontent.com/kubernetes/kubernetes.github.io/master
kubectl create -f $REPO/docs/tasks/administer-cluster/pod.yaml
1. Verify that the pod is running on your chosen node:
kubectl get pods --output=wide
The output is similar to this:
NAME READY STATUS RESTARTS AGE IP NODE
nginx 1/1 Running 0 13s 10.200.0.4 worker0
{% endcapture %}
{% capture whatsnext %}
Learn more about
[labels and selectors](/docs/user-guide/labels/).
{% endcapture %}
{% include templates/task.md %}
+13
View File
@@ -0,0 +1,13 @@
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
@@ -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"]
@@ -0,0 +1,105 @@
---
---
{% 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 and arguments when you create a Pod
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:
{% 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
### 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/).
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 %}
* 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 %}
@@ -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 %}
@@ -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"
+8
View File
@@ -3,6 +3,11 @@
The Tasks section of the Kubernetes documentation is a work in progress 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 #### Accessing Applications in a Cluster
* [Using Port Forwarding to Access Applications in a Cluster](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/) * [Using Port Forwarding to Access Applications in a Cluster](/docs/tasks/access-application-cluster/port-forward-access-application-cluster/)
@@ -11,6 +16,9 @@ The Tasks section of the Kubernetes documentation is a work in progress
* [Using an HTTP Proxy to Access the Kubernetes API](/docs/tasks/access-kubernetes-api/http-proxy-access-api) * [Using an HTTP Proxy to Access the Kubernetes API](/docs/tasks/access-kubernetes-api/http-proxy-access-api)
#### Administering a Cluster
* [Assigning Pods to Nodes](/docs/tasks/administer-cluster/assign-pods-nodes/)
### What's next ### What's next
+40
View File
@@ -0,0 +1,40 @@
---
assignees:
- janetkuo
---
* TOC
{:toc}
## Native 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.
@@ -1,47 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-8">
<h3>Module overview</h3>
<ul style="color: #3771e3;">
<li><i>learn what a Kubernetes cluster is</i></li>
<li><i>learn what <a href="https://github.com/kubernetes/minikube">minikube</a> is</i></li>
<li><i>start a Kubernetes cluster using an online terminal</i></li>
</ul>
<p><img src="/docs/tutorials/getting-started/public/images/module_01.svg?v=1469803628347"></p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>What you need to know first</h3>
<p>
Before you do this tutorial, you should be familiar with Linux containers.
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/cluster-intro.html" role="button">Start Module 1 <span class="btn__next"></span></a>
</div>
</div>
</main>
</div>
</body>
</html>
@@ -1,52 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/cluster-interactive.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h3>Module overview</h3>
<ul style="color: #3771e3;">
<li><i>Learn about application Deployments</i></li>
<li><i>Deploy your first app on Kubernetes with Kubectl</i></li>
</ul>
<p><img src="/docs/tutorials/getting-started/public/images/module_02.svg?v=1469803628347"></p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>What you need to know first</h3>
<p>
How to <a href="/docs/tutorials/getting-started/create-cluster.html">start a Kubernetes cluster</a> with minikube <br>
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/deploy-intro.html" role="button">Start Module 2 <span class="btn__next"></span></a>
</div>
</div>
</main>
</div>
</body>
</html>
@@ -1,53 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/deploy-interactive.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h3>Module overview</h3>
<ul style="color: #3771e3;">
<li><i>Learn about Kubernetes <a href="http://kubernetes.io/docs/user-guide/pods/">Pods</a></i></li>
<li><i>Learn about Kubernetes <a href="https://github.com/kubernetes/kubernetes/blob/master/docs/admin/node.md">Nodes</a></i></li>
<li><i>Troubleshoot deployed applications</i></li>
</ul>
<p><img src="/docs/tutorials/getting-started/public/images/module_03.svg?v=1469803628347"></p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>What you need to know first</h3>
<p>
What are <a href="/docs/tutorials/getting-started/deploy-app.html">Deployments</a> <br>
How to deploy applications on Kubernetes
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/explore-intro.html" role="button">Start Module 3 <span class="btn__next"></span></a>
</div>
</div>
</main>
</div>
</body>
</html>
@@ -1,54 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/explore-interactive.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h3>Module overview</h3>
<ul style="color: #3771e3;">
<li><i><a href="http://kubernetes.io/docs/user-guide/services">Services</a></i></li>
<li><i>Learn about Kubernetes <a href="http://kubernetes.io/docs/user-guide/labels">Labels</a></i></li>
<li><i>Exposing applications outside Kubernetes</i></li>
</ul>
<p><img src="/docs/tutorials/getting-started/public/images/module_04.svg?v=1469803628347"></p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>What you need to know first</h3>
<p>
How to <a href="/docs/tutorials/getting-started/deploy-app.html">deploy apps</a> on Kubernetes<br>
How to <a href="/docs/tutorials/getting-started/explore-app.html"> troubleshoot </a> applications with Kubectl
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/expose-intro.html" role="button">Start Module 4 <span class="btn__next"></span></a>
</div>
</div>
</main>
</div>
</body>
</html>
-97
View File
@@ -1,97 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="./public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-9">
<h2>Getting Started with Kubernetes</h2>
<p><i style="color: #3771e3;">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.</i></p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-9">
<h2>Why Kubernetes?</h2>
<p>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. <a href="http://kubernetes.io/docs/whatisk8s/">Kubernetes</a> 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.</p>
</div>
</div>
<div class="content__modules">
<h2>Getting Started Modules</h2>
<div class="row">
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/getting-started/create-cluster.html"><img src="./public/images/module_01.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="1-0.html"><h5>1. Create a Kubernetes cluster</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/getting-started/deploy-app.html"><img src="./public/images/module_02.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="2-0.html"><h5>2. Deploy an app</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/getting-started/explore-app.html"><img src="./public/images/module_03.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="3-0.html"><h5>3. Explore your app</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/getting-started/expose-app.html"><img src="./public/images/module_04.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="4-0.html"><h5>4. Expose your app publicly</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/getting-started/scale-app.html"><img src="./public/images/module_05.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="5-0.html"><h5>5. Scale up your app</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/getting-started/update-app.html"><img src="./public/images/module_06.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="6-0.html"><h5>6. Update your app</h5></a>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/create-cluster.html" role="button">Start the tutorial<span class="btn__next"></span></a>
</div>
</div>
</main>
</div>
</body>
</html>
@@ -1,52 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/explore-interactive.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h3>Module overview</h3>
<ul style="color: #3771e3;">
<li><i>Scaling an app with Kubectl</i></li>
</ul>
<p><img src="/docs/tutorials/getting-started/public/images/module_05.svg?v=1469803628347"></p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>What you need to know first</h3>
<p>
What are <a href="/docs/tutorials/getting-started/deploy-app.html">Deployments</a> <br>
What are <a href="/docs/tutorials/getting-started/expose-app.html">Services</a>
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/scale-intro.html" role="button">Start Module 5 <span class="btn__next"></span></a>
</div>
</div>
</main>
</div>
</body>
</html>
@@ -1,54 +0,0 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/scale-interactive.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<div class="row">
<div class="col-md-8">
<h3>Module overview</h3>
<ul style="color: #3771e3;">
<li><i>Performing Rolling Updates with Kubectl</i></li>
</ul>
<p><img src="/docs/tutorials/getting-started/public/images/module_06.svg?v=1469803628347"></p>
</div>
<div class="col-md-4">
<div class="content__box content__box_lined">
<h3>What you need to know first</h3>
<p>
What are <a href="/docs/tutorials/getting-started/deploy-app.html">Deployments</a> <br>
What is <a href="/docs/tutorials/getting-started/scale-app.html">Scaling</a>
</p>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/update-intro.html" role="button">Start Module 6 <span class="btn__next"></span></a>
</div>
</div>
</main>
<a class="scrolltop" href="#top"></a>
</div>
</body>
</html>
+7 -1
View File
@@ -3,11 +3,17 @@
The Tutorials section of the Kubernetes documentation is a work in progress. 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 #### Stateless Applications
* [Running a Stateless Application Using a Deployment](/docs/tutorials/stateless-application/run-stateless-application-deployment/) * [Running a Stateless Application Using a Deployment](/docs/tutorials/stateless-application/run-stateless-application-deployment/)
* [Exposing an External IP Address Using a Service](/docs/tutorials/stateless-application/expose-external-ip-address-service/) * [Using a Service to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address-service/)
* [Exposing an External IP Address to Access an Application in a Cluster](/docs/tutorials/stateless-application/expose-external-ip-address/)
### What's next ### What's next
@@ -7,19 +7,13 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script> <script src="https://katacoda.com/embed.js"></script>
<div class="layout" id="top"> <div class="layout" id="top">
<main class="content"> <main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/cluster-intro.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br>
<div class="katacoda"> <div class="katacoda">
<div class="katacoda__alert"> <div class="katacoda__alert">
To interact with the Terminal, please use the desktop/tablet version To interact with the Terminal, please use the desktop/tablet version
@@ -28,7 +22,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/deploy-app.html" role="button">Continue to Module 2<span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/deploy-intro.html" role="button">Continue to Module 2<span class="btn__next"></span></a>
</div> </div>
</div> </div>
@@ -1,4 +1,7 @@
--- ---
redirect_from:
- /docs/tutorials/getting-started/create-cluster/
- /docs/tutorials/getting-started/create-cluster.html
--- ---
<!DOCTYPE html> <!DOCTYPE html>
@@ -7,23 +10,25 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top"> <div class="layout" id="top">
<main class="content"> <main class="content">
<div class="row"> <div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/create-cluster.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br>
<br>
<div class="row">
<div class="col-md-8"> <div class="col-md-8">
<h3>Objectives</h3>
<ul>
<li>Learn what a Kubernetes cluster is.</li>
<li>Learn what Minikube is.</li>
<li>Start a Kubernetes cluster using an online terminal.</li>
</ul>
</div>
<div class="col-md-8">
<h3>Kubernetes Clusters</h3>
<p> <p>
<b>Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit.</b> 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. <b>Kubernetes automates the distribution and scheduling of application containers across a cluster in a more efficient way.</b> Kubernetes is an <a href="https://github.com/kubernetes/kubernetes">open-source</a> platform and is production-ready. <b>Kubernetes coordinates a highly available cluster of computers that are connected to work as a single unit.</b> 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. <b>Kubernetes automates the distribution and scheduling of application containers across a cluster in a more efficient way.</b> Kubernetes is an <a href="https://github.com/kubernetes/kubernetes">open-source</a> platform and is production-ready.
</p> </p>
@@ -60,7 +65,7 @@
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
<p><img src="/docs/tutorials/getting-started/public/images/module_01_cluster.svg"></p> <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_01_cluster.svg"></p>
</div> </div>
</div> </div>
<br> <br>
@@ -82,7 +87,7 @@
<div class="col-md-8"> <div class="col-md-8">
<p>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. <b>The nodes communicate with the master using the Kubernetes API</b>, which the master exposes. End users can also use the Kubernetes API directly to interact with the cluster.</p> <p>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. <b>The nodes communicate with the master using the Kubernetes API</b>, which the master exposes. End users can also use the Kubernetes API directly to interact with the cluster.</p>
<p>A Kubernetes cluster can be deployed on either physical or virtual machines. To get started with Kubernetes development, you can use <a href="https://github.com/kubernetes/minikube">minikube</a>. 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.</p> <p>A Kubernetes cluster can be deployed on either physical or virtual machines. To get started with Kubernetes development, you can use <a href="https://github.com/kubernetes/minikube">minikube</a>. 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.</p>
<p>Now that you know what Kubernetes is, lets go to the online tutorial and start our first cluster!</p> <p>Now that you know what Kubernetes is, lets go to the online tutorial and start our first cluster!</p>
@@ -92,7 +97,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/cluster-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/cluster-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a>
</div> </div>
</div> </div>
@@ -7,18 +7,13 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script> <script src="https://katacoda.com/embed.js"></script>
<div class="layout" id="top"> <div class="layout" id="top">
<main class="content"> <main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/deploy-intro.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br> <br>
<div class="katacoda"> <div class="katacoda">
<div class="katacoda__alert"> <div class="katacoda__alert">
@@ -31,7 +26,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/explore-app.html" role="button">Continue to Module 3<span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/explore-intro.html" role="button">Continue to Module 3<span class="btn__next"></span></a>
</div> </div>
</div> </div>
@@ -7,23 +7,24 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top"> <div class="layout" id="top">
<main class="content"> <main class="content">
<div class="row"> <div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/deploy-app.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br>
<br>
<div class="row">
<div class="col-md-8"> <div class="col-md-8">
<h3>Objectives</h3>
<ul>
<li>Learn about application Deployments.</li>
<li>Deploy your first app on Kubernetes with kubectl.</li>
</ul>
</div>
<div class="col-md-8">
<h3>Kubernetes Deployments</h3>
<p> <p>
Once you have a running Kubernetes cluster, you can deploy your containerized applications on top of it. To do so, you create a Kubernetes <b>Deployment</b>. 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. Once you have a running Kubernetes cluster, you can deploy your containerized applications on top of it. To do so, you create a Kubernetes <b>Deployment</b>. 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.
</p> </p>
@@ -59,7 +60,7 @@
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
<p><img src="/docs/tutorials/getting-started/public/images/module_02_first_app.svg"></p> <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_02_first_app.svg"></p>
</div> </div>
</div> </div>
<br> <br>
@@ -94,7 +95,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/deploy-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/deploy-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a>
</div> </div>
</div> </div>
@@ -7,18 +7,13 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script> <script src="https://katacoda.com/embed.js"></script>
<div class="layout" id="top"> <div class="layout" id="top">
<main class="content"> <main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/explore-intro.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br> <br>
<div class="katacoda"> <div class="katacoda">
@@ -31,7 +26,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/expose-app.html" role="button">Continue to Module 4<span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/expose-intro.html" role="button">Continue to Module 4<span class="btn__next"></span></a>
</div> </div>
</div> </div>
@@ -7,7 +7,7 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top"> <div class="layout" id="top">
@@ -15,18 +15,19 @@
<main class="content"> <main class="content">
<div class="row"> <div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/explore-app.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br>
<br>
<div class="row">
<div class="col-md-8"> <div class="col-md-8">
<h2>Pods</h2> <h3>Objectives</h3>
<p>When you created a Deployment in Module <a href="/docs/tutorials/getting-started/deploy-app.html">2</a>, Kubernetes created a <b>Pod</b> 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:</p> <ul>
<li>Learn about Kubernetes Pods.</li>
<li>Learn about Kubernetes Nodes.</li>
<li>Troubleshoot deployed applications.</li>
</ul>
</div>
<div class="col-md-8">
<h2>Kubernetes Pods</h2>
<p>When you created a Deployment in Module <a href="/docs/tutorials/kubernetes-basics/deploy-app.html">2</a>, Kubernetes created a <b>Pod</b> 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:</p>
<ul> <ul>
<li>Shared storage, as Volumes</li> <li>Shared storage, as Volumes</li>
<li>Networking, as a unique cluster IP address</li> <li>Networking, as a unique cluster IP address</li>
@@ -63,7 +64,7 @@
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
<p><img src="/docs/tutorials/getting-started/public/images/module_03_pods.svg"></p> <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_03_pods.svg"></p>
</div> </div>
</div> </div>
<br> <br>
@@ -97,7 +98,7 @@
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
<p><img src="/docs/tutorials/getting-started/public/images/module_03_nodes.svg"></p> <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_03_nodes.svg"></p>
</div> </div>
</div> </div>
<br> <br>
@@ -128,7 +129,7 @@
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/explore-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/explore-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a>
</div> </div>
</div> </div>
@@ -7,19 +7,13 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<script src="https://katacoda.com/embed.js"></script> <script src="https://katacoda.com/embed.js"></script>
<div class="layout" id="top"> <div class="layout" id="top">
<main class="content"> <main class="content">
<div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/expose-intro.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br>
<div class="katacoda"> <div class="katacoda">
<div class="katacoda__alert"> <div class="katacoda__alert">
To interact with the Terminal, please use the desktop/tablet version To interact with the Terminal, please use the desktop/tablet version
@@ -29,7 +23,7 @@
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/scale-app.html" role="button">Continue to Module 5<span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/scale-intro.html" role="button">Continue to Module 5<span class="btn__next"></span></a>
</div> </div>
</div> </div>
@@ -7,23 +7,26 @@
<body> <body>
<link href="/docs/tutorials/getting-started/public/css/styles.css" rel="stylesheet"> <link href="/docs/tutorials/kubernetes-basics/public/css/styles.css" rel="stylesheet">
<div class="layout" id="top"> <div class="layout" id="top">
<main class="content"> <main class="content">
<div class="row"> <div class="row">
<div class="col-md-12 text-left">
<a class="btn btn-default" href="/docs/tutorials/getting-started/explore-app.html" role="button"><span class="btn__prev"></span> Back</a>
</div>
</div>
<br>
<br>
<div class="row">
<div class="col-md-8"> <div class="col-md-8">
<h3>Objectives</h3>
<ul>
<li>Learn about Kubernetes Services.</li>
<li>Learn about Kubernetes Labels.</li>
<li>Expose an application outside Kubernetes.</li>
</ul>
</div>
<div class="col-md-8">
<h3>Kubernetes Services</h3>
<p>While Pods do have their own unique IP across the cluster, those IPs 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 <b>Service</b> is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.</p> <p>While Pods do have their own unique IP across the cluster, those IPs 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 <b>Service</b> is an abstraction layer which defines a logical set of Pods and enables external traffic exposure, load balancing and service discovery for those Pods.</p>
<p>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:</p> <p>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:</p>
@@ -58,7 +61,7 @@
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
<p><img src="/docs/tutorials/getting-started/public/images/module_04_services.svg"></p> <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_04_services.svg"></p>
</div> </div>
</div> </div>
<br> <br>
@@ -106,7 +109,7 @@
<div class="row"> <div class="row">
<div class="col-md-8"> <div class="col-md-8">
<p><img src="/docs/tutorials/getting-started/public/images/module_04_labels.svg"></p> <p><img src="/docs/tutorials/kubernetes-basics/public/images/module_04_labels.svg"></p>
</div> </div>
</div> </div>
<br> <br>
@@ -122,7 +125,7 @@
<br> <br>
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/getting-started/expose-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a> <a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/expose-interactive.html" role="button">Start Interactive Tutorial <span class="btn__next"></span></a>
</div> </div>
</div> </div>
+105
View File
@@ -0,0 +1,105 @@
---
---
<!DOCTYPE html>
<html lang="en">
<body>
<link href="./public/css/styles.css" rel="stylesheet">
<div class="layout" id="top">
<main class="content">
<div class="row">
<div class="col-md-9">
<h2>Kubernetes Basics</h2>
<p>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.</p>
<p>Using the interactive tutorials, you can learn to:</p>
<ul>
<li>Deploy a containerized application on a cluster</li>
<li>Scale the deployment</li>
<li>Update the containerized application with a new software version</li>
<li>Debug the containerized application</li>
</ul>
<p>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.</p>
</div>
</div>
<br>
<div class="row">
<div class="col-md-9">
<h2>What can Kubernetes do for you?</h2>
<p>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. <a href="http://kubernetes.io/docs/whatisk8s/">Kubernetes</a> 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.</p>
</div>
</div>
<div class="content__modules">
<h2>Kubernetes Basics Modules</h2>
<div class="row">
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/kubernetes-basics/cluster-intro/"><img src="./public/images/module_01.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="cluster-intro/"><h5>1. Create a Kubernetes cluster</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/kubernetes-basics/deploy-intro/"><img src="./public/images/module_02.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="deploy-intro/"><h5>2. Deploy an app</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/kubernetes-basics/explore-intro/"><img src="./public/images/module_03.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="explore-intro/"><h5>3. Explore your app</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/kubernetes-basics/expose-intro/"><img src="./public/images/module_04.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="expose-intro/"><h5>4. Expose your app publicly</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/kubernetes-basics/scale-intro/"><img src="./public/images/module_05.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="scale-intro/"><h5>5. Scale up your app</h5></a>
</div>
</div>
</div>
<div class="col-md-4">
<div class="thumbnail">
<a href="/docs/tutorials/kubernetes-basics/update-intro/"><img src="./public/images/module_06.svg?v=1469803628347" alt=""></a>
<div class="caption">
<a href="update-intro/"><h5>6. Update your app</h5></a>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
<a class="btn btn-lg btn-success" href="/docs/tutorials/kubernetes-basics/cluster-intro/" role="button">Start the tutorial<span class="btn__next"></span></a>
</div>
</div>
</main>
</div>
</body>
</html>

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 7.2 KiB

After

Width:  |  Height:  |  Size: 7.2 KiB

Before

Width:  |  Height:  |  Size: 729 B

After

Width:  |  Height:  |  Size: 729 B

Before

Width:  |  Height:  |  Size: 768 B

After

Width:  |  Height:  |  Size: 768 B

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 5.5 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

Before

Width:  |  Height:  |  Size: 5.8 KiB

After

Width:  |  Height:  |  Size: 5.8 KiB

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Before

Width:  |  Height:  |  Size: 2.3 KiB

After

Width:  |  Height:  |  Size: 2.3 KiB

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 3.0 KiB

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Before

Width:  |  Height:  |  Size: 37 KiB

After

Width:  |  Height:  |  Size: 37 KiB

Some files were not shown because too many files have changed in this diff Show More