Create User Journeys MVP (#4630)
* Create User Journeys Squashed commits: [9a360e8] add page link functionality (+1 squashed commit) Squashed commits: [1cbefa4] Rework App Dev "I want to..." (+1 squashed commit) Squashed commits: [0013eb1] Create User Journeys * structure 2nd page * prepare docs/home for user journey portal * Create sample.html * Update sample.html * Update index.md * Create index.html * Update index.html * Update index.html * Update index.html * Delete index.html * add custom js mechanism * bug fix * put in docsContent div * add docsportal layout * move title from layout into page * move user-journeys/ into /docs/ * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update index.md * Update style_user_journeys.css * add initial draft for app dev user journey * add links, rough outline * fix a few things before demo/discussion * rework intro section * Update index.md * Update style_user_journeys.css * Update index.md * Update index.md * Update style_user_journeys.css * Update index.md * Update index.md * Update style_user_journeys.css * Update index.md * Update index.md * Update style_user_journeys.css * Update style_user_journeys.css * Update index.md * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update index.md * Update index.md * Update index.md * Update style_user_journeys.css * Update index.md * Update index.md * Update index.md * Update style_user_journeys.css * Update style_user_journeys.css * Update index.md * Update index.md * Update index.md * Update user-journeys.js * Update index.md * Update docsportal.html * Update style_user_journeys.css * Update docsportal.html * add and reorganize content for review * edit mostly minikube install * Updates squashed (+51 squashed commits) Squashed commits: [2e18ea8] Update application_developer-foundational.html [78fd490] autogenerate home index from toc [42e89f6] Update application_developer-foundational.html [a77d7d6] Update application_developer-foundational.html [0a489be] Update application_developer-foundational.html [5b4702f] Update style_user_journeys.css [90035a6] Update application_developer-foundational.html [db4fb19] Update application_developer-foundational.html [4188ebc] Update style_user_journeys.css [aec303b] Update application_developer-foundational.html [679d7f6] Update style_user_journeys.css [e8019bf] Update application_developer-foundational.html [2d91bf6] Update style_user_journeys.css [56a49a9] Update application_developer-foundational.html [79cfb6e] Update application_developer-foundational.html [f3ec0c5] Update application_developer-foundational.html [756a42e] Update style_user_journeys.css [208cde1] Update index.md [66241e4] Update index.md [ea8df7f] Update style_user_journeys.css [0778054] Update style.css [dcd0863] Update user-journeys.js [4a99502] Update user-journeys.js [ddf3820] Update user-journeys.js [9650dfd] Update user-journeys.js [6773597] Update user-journeys.js [0e7849e] Update user-journeys.js [8c99ba7] Update style_user_journeys.css [68d5a8a] Update user-journeys.js [45c85fe] Update user-journeys.js [7bd4a5d] Update index.md [c53c6cd] Update index.md [281e4d3] Update style.css [8e5efae] Update application_developer-foundational.html [787f78e] add newline to custom js list [eea0d10] Update style_user_journeys.css [295b4d3] Update docsportal.html [49f7130] Update index.md [0125bc6] Update style_user_journeys.css [a803584] Update style_user_journeys.css [5b97319] Update index.md [0aa34b2] update kubernetes.github.io links [62c9981] hide "Edit this Page" button for portal [1fd0226] Update style_user_journeys.css [bd35646] Update style_user_journeys.css [d7a8b81] Update style_user_journeys.css [0c1e459] Update user-journeys.js [9eb237d] Update style_user_journeys.css [99685cd] Update index.md [516079a] Update index.md [1386033] Update style_user_journeys.css * add, edit app dev content, links * move user persona data to yaml * add links * edit, reorganize for navigation * Update style_user_journeys.css * Update application_developer-foundational.html * Update application_developer-foundational.html * add configmaps * move links * edits before merge * union with #5913 * revert and overwrite for clean #5913 merge * merge in #5913 changes * fix Travis error * Refactor JS for User Journeys portal (#6473) * comment code * add arbitrary number of info links * copy file to correct directory, clean up HTML * add back in current stylesheet refs * Set default message when no persona selected (#6495) * comment code * add arbitrary number of info links * Set default message when no persona selected * copy file to correct directory, clean up HTML (#6502) * copy file to correct directory, clean up HTML * add back in current stylesheet refs * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update application_developer-foundational.html * Update application_developer-foundational.html * Update application_developer-foundational.html * Update application_developer-foundational.html * Update application_developer-foundational.html * Update style_user_journeys.css * Update style_user_journeys.css * Update application_developer-foundational.html * [User Journeys] Add content template (#6523) * remove deprecated directories * add user journey content template * Convert app dev - foundational to md * support general, non-hard-coded formatting for user journey content pages * Update application_developer-foundational.html * Update application_developer-foundational.html * Update application_developer-foundational.html * Update application_developer-foundational.html * Update application_developer-foundational.html * Chenopis uj sprint 20171222 (#6748) * move section banners out of docsection1 divs * revert * liquid hack * modify js hack * add intermediate and advanced app developer with scroll * clean up app dev foundational content * fix formatting * remove html pages * add new pages to toc * Add Docs Contributor persona links * rebalance docs contributor links * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update foundational.md * Update foundational.md * Update style_user_journeys.css * resetting cluster ops content into updated format (#6783) * resetting cluster ops content into updated format * stage interstitial pages from app_developer user journey * adding cluster ops user journey interstitial pages to ToC _data * cluster op overview and initial segment * move working text into a comment * initial foundational content for cluster ops * restructuring * roughing out intermediate resource content * add notes/detail from user-journey google doc reference details on what to cover in foundation/intermediate/adv sections * imperative language in "I want to..." content * update entry page yaml strings * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Remove personas and buttons not in MVP * Update home.js * normalize strings for 'I want to' entries * Reorder Contributor buttons * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update app-developer.yaml * Sort buttons by index value (#6925) * Sort buttons by index * fix bug * Update app-developer.yaml * Update app-developer.yaml * Update app-developer.yaml * Update intermediate.md * Update advanced.md * Add community-contributor links * change foundational/intermediate/advance topics icons * update app-developer icons * add code-contributor links * remove ecosystem-contributor, renumber contributor indexes * update links, add KEP link * reorder contributor personas * change icon for release process * stub out cluster operator intermediate UJ * Set up URL state for user journey combinations of path, persona, level * add path for about kubernetes, fix formatting and javascript appropriately * add definition for personas and fix ui spacing * interim edits to intermediate cluster op user journey * Update links in Browse Docs portion of home page. * more intermediate cluster ops content * adding in logging and monitoring content, as well as additional resource listings * button - keep words together * Move about blurb to top of docs/home page (#7000) * Move about blurb to top of docs/home page * fix conflict * retire binary_release.md * fix blurb formatting (+1 squashed commit) Squashed commits: [e2e5032] Add links to blurb * fix docsportal (+1 squashed commit) Squashed commits: [f687e71] add noedit flag * Fix home ToC * tweak blurb styling * reorg docs-home links * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Update style_user_journeys.css * Add some links for Cluster Ops - Advanced Topics (#7130) * Add some links for Cluster Ops - Advanced Topics * add back pick right solution * app developer content * minor edits * Choose icons for cluster operator links * swap logospull/7153/head
parent
731b87f3e2
commit
1e5bb1f8de
|
@ -13,6 +13,7 @@ incremental: true
|
||||||
safe: false
|
safe: false
|
||||||
lsi: false
|
lsi: false
|
||||||
|
|
||||||
|
latest: "v1.9"
|
||||||
defaults:
|
defaults:
|
||||||
-
|
-
|
||||||
scope:
|
scope:
|
||||||
|
|
|
@ -1,9 +1,11 @@
|
||||||
bigheader: "Concepts"
|
bigheader: "Concepts"
|
||||||
abstract: "Detailed explanations of Kubernetes system concepts and abstractions."
|
abstract: "Detailed explanations of Kubernetes system concepts and abstractions."
|
||||||
|
landing_page: /docs/concepts/index/
|
||||||
toc:
|
toc:
|
||||||
- docs/concepts/index.md
|
- docs/concepts/index.md
|
||||||
|
|
||||||
- title: Overview
|
- title: Overview
|
||||||
|
landing_page: /docs/concepts/overview/what-is-kubernetes/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/overview/what-is-kubernetes.md
|
- docs/concepts/overview/what-is-kubernetes.md
|
||||||
- docs/concepts/overview/components.md
|
- docs/concepts/overview/components.md
|
||||||
|
@ -23,12 +25,14 @@ toc:
|
||||||
- docs/concepts/overview/object-management-kubectl/declarative-config.md
|
- docs/concepts/overview/object-management-kubectl/declarative-config.md
|
||||||
|
|
||||||
- title: Kubernetes Architecture
|
- title: Kubernetes Architecture
|
||||||
|
landing_page: /docs/concepts/architecture/nodes/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/architecture/nodes.md
|
- docs/concepts/architecture/nodes.md
|
||||||
- docs/concepts/architecture/master-node-communication.md
|
- docs/concepts/architecture/master-node-communication.md
|
||||||
- docs/concepts/architecture/cloud-controller.md
|
- docs/concepts/architecture/cloud-controller.md
|
||||||
|
|
||||||
- title: Extending Kubernetes
|
- title: Extending Kubernetes
|
||||||
|
landing_page: /docs/concepts/api-extension/custom-resources/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/overview/extending.md
|
- docs/concepts/overview/extending.md
|
||||||
- title: Extending the Kubernetes API
|
- title: Extending the Kubernetes API
|
||||||
|
@ -43,12 +47,14 @@ toc:
|
||||||
- docs/concepts/service-catalog/index.md
|
- docs/concepts/service-catalog/index.md
|
||||||
|
|
||||||
- title: Containers
|
- title: Containers
|
||||||
|
landing_page: /docs/concepts/containers/images/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/containers/images.md
|
- docs/concepts/containers/images.md
|
||||||
- docs/concepts/containers/container-environment-variables.md
|
- docs/concepts/containers/container-environment-variables.md
|
||||||
- docs/concepts/containers/container-lifecycle-hooks.md
|
- docs/concepts/containers/container-lifecycle-hooks.md
|
||||||
|
|
||||||
- title: Workloads
|
- title: Workloads
|
||||||
|
landing_page: /docs/concepts/workloads/pods/pod-overview/
|
||||||
section:
|
section:
|
||||||
- title: Pods
|
- title: Pods
|
||||||
section:
|
section:
|
||||||
|
@ -70,6 +76,7 @@ toc:
|
||||||
- docs/concepts/workloads/controllers/cron-jobs.md
|
- docs/concepts/workloads/controllers/cron-jobs.md
|
||||||
|
|
||||||
- title: Configuration
|
- title: Configuration
|
||||||
|
landing_page: /docs/concepts/configuration/overview/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/configuration/overview.md
|
- docs/concepts/configuration/overview.md
|
||||||
- docs/concepts/configuration/manage-compute-resources-container.md
|
- docs/concepts/configuration/manage-compute-resources-container.md
|
||||||
|
@ -80,6 +87,7 @@ toc:
|
||||||
- docs/concepts/configuration/pod-priority-preemption.md
|
- docs/concepts/configuration/pod-priority-preemption.md
|
||||||
|
|
||||||
- title: Services, Load Balancing, and Networking
|
- title: Services, Load Balancing, and Networking
|
||||||
|
landing_page: /docs/concepts/services-networking/service/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/services-networking/service.md
|
- docs/concepts/services-networking/service.md
|
||||||
- docs/concepts/services-networking/dns-pod-service.md
|
- docs/concepts/services-networking/dns-pod-service.md
|
||||||
|
@ -89,6 +97,7 @@ toc:
|
||||||
- docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md
|
- docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases.md
|
||||||
|
|
||||||
- title: Storage
|
- title: Storage
|
||||||
|
landing_page: /docs/concepts/storage/volumes/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/storage/volumes.md
|
- docs/concepts/storage/volumes.md
|
||||||
- docs/concepts/storage/persistent-volumes.md
|
- docs/concepts/storage/persistent-volumes.md
|
||||||
|
@ -96,6 +105,7 @@ toc:
|
||||||
- docs/concepts/storage/dynamic-provisioning.md
|
- docs/concepts/storage/dynamic-provisioning.md
|
||||||
|
|
||||||
- title: Cluster Administration
|
- title: Cluster Administration
|
||||||
|
landing_page: /docs/concepts/cluster-administration/cluster-administration-overview/
|
||||||
section:
|
section:
|
||||||
- docs/concepts/cluster-administration/cluster-administration-overview.md
|
- docs/concepts/cluster-administration/cluster-administration-overview.md
|
||||||
- docs/concepts/cluster-administration/certificates.md
|
- docs/concepts/cluster-administration/certificates.md
|
||||||
|
@ -116,5 +126,3 @@ toc:
|
||||||
section:
|
section:
|
||||||
- docs/concepts/policy/resource-quotas.md
|
- docs/concepts/policy/resource-quotas.md
|
||||||
- docs/concepts/policy/pod-security-policy.md
|
- docs/concepts/policy/pod-security-policy.md
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,13 @@
|
||||||
bigheader: "Documentation Home"
|
bigheader: "About"
|
||||||
abstract: "Documentation for using and learning about Kubernetes."
|
abstract: "Documentation for using and learning about Kubernetes."
|
||||||
toc:
|
toc:
|
||||||
- docs/home/index.md
|
- docs/home/index.md
|
||||||
- docs/home/supported-doc-versions.md
|
|
||||||
|
|
||||||
- title: Release Notes
|
- title: Supported Doc Versions
|
||||||
path: https://git.k8s.io/kubernetes/CHANGELOG.md
|
path: /docs/home/supported-doc-versions/
|
||||||
- title: Release Roadmap
|
|
||||||
path: https://github.com/kubernetes/kubernetes/milestones/
|
|
||||||
|
|
||||||
- docs/tasks/debug-application-cluster/troubleshooting.md
|
|
||||||
|
|
||||||
- title: Contributing to the Kubernetes Docs
|
- title: Contributing to the Kubernetes Docs
|
||||||
|
landing_page: /editdocs/
|
||||||
section:
|
section:
|
||||||
- editdocs.md
|
- editdocs.md
|
||||||
- docs/home/contribute/create-pull-request.md
|
- docs/home/contribute/create-pull-request.md
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
id: annotation
|
id: annotation
|
||||||
name: Annotation
|
name: Annotation
|
||||||
full-link: docs/concepts/overview/working-with-objects/annotations
|
full-link: /docs/concepts/overview/working-with-objects/annotations
|
||||||
tags:
|
tags:
|
||||||
- fundamental
|
- fundamental
|
||||||
short-description: >
|
short-description: >
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
id: application-developer
|
id: application-developer
|
||||||
name: Application Developer
|
name: Application Developer
|
||||||
|
full-link: docs/user-journeys/users/application-developer/foundational/
|
||||||
related:
|
related:
|
||||||
- application-architect
|
- application-architect
|
||||||
tags:
|
tags:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
id: cluster-operator
|
id: cluster-operator
|
||||||
name: Cluster Operator
|
name: Cluster Operator
|
||||||
|
full-link: docs/user-journeys/users/cluster-operator/foundational/
|
||||||
aka:
|
aka:
|
||||||
- Cluster Administrator
|
- Cluster Administrator
|
||||||
related:
|
related:
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
id: code-contributor
|
id: code-contributor
|
||||||
name: Code Contributor
|
name: Code Contributor
|
||||||
|
full-link: docs/imported/community/devel/
|
||||||
aka:
|
aka:
|
||||||
- Community Developer
|
- Community Developer
|
||||||
tags:
|
tags:
|
||||||
|
|
|
@ -5,6 +5,6 @@ tags:
|
||||||
- fundamental
|
- fundamental
|
||||||
- workload
|
- workload
|
||||||
short-description: >
|
short-description: >
|
||||||
Ensures a copy of a {% glossary_tooltip term_id="pod" %} is running across a set of nodes in a {% glossary_tooltip term_id="cluster" %}.
|
Ensures a copy of a {% glossary_tooltip text="Pod" term_id="pod" %} is running across a set of nodes in a {% glossary_tooltip text="cluster" term_id="cluster" %}.
|
||||||
long-description: >
|
long-description: >
|
||||||
Used to deploy system daemons such as log collectors and monitoring agents that typically must run on every {% glossary_tooltip term_id="node" %}.
|
Used to deploy system daemons such as log collectors and monitoring agents that typically must run on every {% glossary_tooltip term_id="node" %}.
|
||||||
|
|
|
@ -4,7 +4,7 @@ full-link: /docs/concepts/overview/working-with-objects/namespaces
|
||||||
tags:
|
tags:
|
||||||
- fundamental
|
- fundamental
|
||||||
short-description: >
|
short-description: >
|
||||||
An abstraction used by Kubernetes to support multiple virtual clusters on the same physical {% glossary_tooltip term_id="cluster" %}.
|
An abstraction used by Kubernetes to support multiple virtual clusters on the same physical {% glossary_tooltip text="cluster" term_id="cluster" %}.
|
||||||
long-description: >
|
long-description: >
|
||||||
Namespaces are used to organize objects in a cluster and provide a way to divide cluster resources.
|
Namespaces are used to organize objects in a cluster and provide a way to divide cluster resources.
|
||||||
Names of resources need to be unique within a namespace, but not across namespaces.
|
Names of resources need to be unique within a namespace, but not across namespaces.
|
||||||
|
|
|
@ -10,7 +10,7 @@ tags:
|
||||||
- core-object
|
- core-object
|
||||||
- storage
|
- storage
|
||||||
short-description: >
|
short-description: >
|
||||||
An API object that represents a piece of storage in the cluster. Available as a general, pluggable resource that persists beyond the lifecycle of any individual {% glossary_tooltip term_id="pod" %}.
|
An API object that represents a piece of storage in the cluster. Available as a general, pluggable resource that persists beyond the lifecycle of any individual {% glossary_tooltip text="Pod" term_id="pod" %}.
|
||||||
long-description: |
|
long-description: |
|
||||||
PersistentVolumes (PVs) provide an API that abstracts details of how storage is provided from how it is consumed.
|
PersistentVolumes (PVs) provide an API that abstracts details of how storage is provided from how it is consumed.
|
||||||
PVs are used directly in scenarios where storage can be be created ahead of time (static provisioning).
|
PVs are used directly in scenarios where storage can be be created ahead of time (static provisioning).
|
||||||
|
|
|
@ -5,6 +5,6 @@ tags:
|
||||||
- fundamental
|
- fundamental
|
||||||
- core-object
|
- core-object
|
||||||
short-description: >
|
short-description: >
|
||||||
Provides an identity for processes that run in a Pod {% glossary_tooltip text="Pods" term_id="pod" %}.
|
Provides an identity for processes that run in a {% glossary_tooltip text="Pod" term_id="pod" %}.
|
||||||
long-description: >
|
long-description: >
|
||||||
When processes inside Pods access the cluster, they are authenticated by the API server as a particular service account, for example, `default`. When you create a Pod, if you do not specify a service account, it is automatically assigned the default service account in the same namespace {% glossary_tooltip text="Namespace" term_id="namespace" %}.
|
When processes inside Pods access the cluster, they are authenticated by the API server as a particular service account, for example, `default`. When you create a Pod, if you do not specify a service account, it is automatically assigned the default service account in the same namespace {% glossary_tooltip text="Namespace" term_id="namespace" %}.
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
bigheader: "Reference Documentation"
|
bigheader: "Reference"
|
||||||
abstract: "Design docs, concept definitions, and references for APIs and CLIs."
|
abstract: "Design docs, concept definitions, and references for APIs and CLIs."
|
||||||
|
landing_page: /docs/reference/index/
|
||||||
toc:
|
toc:
|
||||||
- docs/reference/index.md
|
- docs/reference/index.md
|
||||||
- docs/reference/glossary.md
|
|
||||||
|
- title: Standardized Glossary
|
||||||
|
path: /docs/reference/glossary/
|
||||||
|
|
||||||
- title: Using the API
|
- title: Using the API
|
||||||
|
landing_page: /docs/reference/api-overview/
|
||||||
section:
|
section:
|
||||||
- docs/reference/api-overview.md
|
- docs/reference/api-overview.md
|
||||||
- docs/reference/client-libraries.md
|
- docs/reference/client-libraries.md
|
||||||
|
@ -28,6 +32,7 @@ toc:
|
||||||
- docs/reference/workloads-18-19.md
|
- docs/reference/workloads-18-19.md
|
||||||
|
|
||||||
- title: API Reference
|
- title: API Reference
|
||||||
|
landing_page: /docs/api-reference/v1.8/
|
||||||
section:
|
section:
|
||||||
- title: v1.9
|
- title: v1.9
|
||||||
path: /docs/reference/generated/kubernetes-api/v1.9/
|
path: /docs/reference/generated/kubernetes-api/v1.9/
|
||||||
|
@ -40,6 +45,7 @@ toc:
|
||||||
path: https://git.k8s.io/kubernetes/api/swagger-spec/
|
path: https://git.k8s.io/kubernetes/api/swagger-spec/
|
||||||
|
|
||||||
- title: Federation API
|
- title: Federation API
|
||||||
|
landing_page: /docs/reference/federation/v1/operations/
|
||||||
section:
|
section:
|
||||||
- docs/reference/generated/federation/v1/operations.html
|
- docs/reference/generated/federation/v1/operations.html
|
||||||
- docs/reference/generated/federation/v1/definitions.html
|
- docs/reference/generated/federation/v1/definitions.html
|
||||||
|
@ -47,6 +53,7 @@ toc:
|
||||||
- docs/reference/generated/federation/extensions/v1beta1/definitions.html
|
- docs/reference/generated/federation/extensions/v1beta1/definitions.html
|
||||||
|
|
||||||
- title: kubectl CLI
|
- title: kubectl CLI
|
||||||
|
landing_page: /docs/user-guide/kubectl-overview/
|
||||||
section:
|
section:
|
||||||
- docs/reference/kubectl/overview.md
|
- docs/reference/kubectl/overview.md
|
||||||
- docs/reference/generated/kubectl/kubectl.md
|
- docs/reference/generated/kubectl/kubectl.md
|
||||||
|
@ -58,6 +65,7 @@ toc:
|
||||||
- docs/reference/kubectl/cheatsheet.md
|
- docs/reference/kubectl/cheatsheet.md
|
||||||
|
|
||||||
- title: Setup Tools Reference
|
- title: Setup Tools Reference
|
||||||
|
landing_page: /docs/reference/setup-tools/kubeadm/kubeadm/
|
||||||
section:
|
section:
|
||||||
- title: Kubeadm
|
- title: Kubeadm
|
||||||
section:
|
section:
|
||||||
|
@ -81,6 +89,7 @@ toc:
|
||||||
- docs/reference/generated/kubefed_version.md
|
- docs/reference/generated/kubefed_version.md
|
||||||
|
|
||||||
- title: Command-line Tools Reference
|
- title: Command-line Tools Reference
|
||||||
|
landing_page: /docs/admin/kubelet/
|
||||||
section:
|
section:
|
||||||
- docs/reference/feature-gates.md
|
- docs/reference/feature-gates.md
|
||||||
- docs/reference/generated/kubelet.md
|
- docs/reference/generated/kubelet.md
|
||||||
|
@ -95,7 +104,9 @@ toc:
|
||||||
- docs/reference/generated/federation-controller-manager.md
|
- docs/reference/generated/federation-controller-manager.md
|
||||||
|
|
||||||
- title: Kubernetes Design Docs
|
- title: Kubernetes Design Docs
|
||||||
|
landing_page: /docs/reference/design-docs/overview/
|
||||||
section:
|
section:
|
||||||
|
- docs/reference/design-docs/overview.md
|
||||||
- title: Kubernetes Architecture
|
- title: Kubernetes Architecture
|
||||||
path: https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md
|
path: https://git.k8s.io/community/contributors/design-proposals/architecture/architecture.md
|
||||||
- title: Kubernetes Design Overview
|
- title: Kubernetes Design Overview
|
||||||
|
@ -109,6 +120,7 @@ toc:
|
||||||
path: https://git.k8s.io/community/contributors/design-proposals/auth/security.md
|
path: https://git.k8s.io/community/contributors/design-proposals/auth/security.md
|
||||||
|
|
||||||
- title: Kubernetes Issues and Security
|
- title: Kubernetes Issues and Security
|
||||||
|
landing_page: https://github.com/kubernetes/kubernetes/issues/
|
||||||
section:
|
section:
|
||||||
- title: Kubernetes Issue Tracker on GitHub
|
- title: Kubernetes Issue Tracker on GitHub
|
||||||
path: https://github.com/kubernetes/kubernetes/issues/
|
path: https://github.com/kubernetes/kubernetes/issues/
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
bigheader: "Setup"
|
bigheader: "Setup"
|
||||||
abstract: "Instructions for setting up a Kubernetes cluster."
|
abstract: "Instructions for setting up a Kubernetes cluster."
|
||||||
|
landing_page: /docs/setup/index/
|
||||||
toc:
|
toc:
|
||||||
- docs/setup/index.md
|
- docs/setup/index.md
|
||||||
- docs/setup/pick-right-solution.md
|
- docs/setup/pick-right-solution.md
|
||||||
|
@ -11,6 +12,7 @@ toc:
|
||||||
- docs/setup/building-from-source.md
|
- docs/setup/building-from-source.md
|
||||||
|
|
||||||
- title: Independent Solutions
|
- title: Independent Solutions
|
||||||
|
landing_page: /docs/getting-started-guides/minikube/
|
||||||
section:
|
section:
|
||||||
- docs/getting-started-guides/minikube.md
|
- docs/getting-started-guides/minikube.md
|
||||||
|
|
||||||
|
@ -25,7 +27,9 @@ toc:
|
||||||
- docs/getting-started-guides/alternatives.md
|
- docs/getting-started-guides/alternatives.md
|
||||||
|
|
||||||
- title: Hosted Solutions
|
- title: Hosted Solutions
|
||||||
|
landing_page: /docs/setup/hosted-solutions/overview/
|
||||||
section:
|
section:
|
||||||
|
- docs/setup/hosted-solutions/overview.md
|
||||||
- title: Running Kubernetes on Google Kubernetes Engine
|
- title: Running Kubernetes on Google Kubernetes Engine
|
||||||
path: https://cloud.google.com/kubernetes-engine/docs/before-you-begin/
|
path: https://cloud.google.com/kubernetes-engine/docs/before-you-begin/
|
||||||
- title: Running Kubernetes on Azure Container Service
|
- title: Running Kubernetes on Azure Container Service
|
||||||
|
@ -34,18 +38,19 @@ toc:
|
||||||
path: https://console.bluemix.net/docs/containers/container_index.html
|
path: https://console.bluemix.net/docs/containers/container_index.html
|
||||||
|
|
||||||
- title: Turn-key Cloud Solutions
|
- title: Turn-key Cloud Solutions
|
||||||
|
landing_page: /docs/getting-started-guides/alibaba-cloud/
|
||||||
section:
|
section:
|
||||||
- docs/getting-started-guides/gce.md
|
- docs/getting-started-guides/alibaba-cloud.md
|
||||||
- docs/getting-started-guides/aws.md
|
- docs/getting-started-guides/aws.md
|
||||||
- docs/getting-started-guides/azure.md
|
- docs/getting-started-guides/azure.md
|
||||||
- docs/getting-started-guides/alibaba-cloud.md
|
|
||||||
- docs/getting-started-guides/clc.md
|
- docs/getting-started-guides/clc.md
|
||||||
|
- docs/getting-started-guides/gce.md
|
||||||
- title: Running Kubernetes on IBM Cloud
|
- title: Running Kubernetes on IBM Cloud
|
||||||
path: https://github.com/patrocinio/kubernetes-softlayer
|
path: https://github.com/patrocinio/kubernetes-softlayer
|
||||||
- docs/getting-started-guides/stackpoint.md
|
- docs/getting-started-guides/stackpoint.md
|
||||||
|
|
||||||
- title: Custom Solutions
|
- title: Custom Solutions
|
||||||
|
landing_page: /docs/getting-started-guides/coreos/index/
|
||||||
section:
|
section:
|
||||||
- title: Custom Cloud Solutions
|
- title: Custom Cloud Solutions
|
||||||
section:
|
section:
|
||||||
|
@ -104,6 +109,28 @@ toc:
|
||||||
|
|
||||||
- docs/admin/node-conformance.md
|
- docs/admin/node-conformance.md
|
||||||
|
|
||||||
|
- title: User Journeys
|
||||||
|
landing_page: /docs/home/
|
||||||
|
section:
|
||||||
|
|
||||||
|
- title: Application Developer
|
||||||
|
section:
|
||||||
|
- docs/user-journeys/users/application-developer/foundational.md
|
||||||
|
- docs/user-journeys/users/application-developer/intermediate.md
|
||||||
|
- docs/user-journeys/users/application-developer/advanced.md
|
||||||
|
- title: Cluster Operator
|
||||||
|
section:
|
||||||
|
- docs/user-journeys/users/cluster-operator/foundational.md
|
||||||
|
- docs/user-journeys/users/cluster-operator/intermediate.md
|
||||||
|
- docs/user-journeys/users/cluster-operator/advanced.md
|
||||||
|
|
||||||
|
- title: Docs Contributor
|
||||||
|
path: /docs/home/?path=contributors&persona=docs-contributor&level=foundational
|
||||||
|
- title: Code Contributor
|
||||||
|
path: /docs/home/?path=contributors&persona=code-contributor&level=foundational
|
||||||
|
- title: Community Contributor
|
||||||
|
path: /docs/home/?path=contributors&persona=community-contributor&level=foundational
|
||||||
|
|
||||||
- title: Installing Addons
|
- title: Installing Addons
|
||||||
path: /docs/concepts/cluster-administration/addons/
|
path: /docs/concepts/cluster-administration/addons/
|
||||||
|
|
||||||
|
@ -117,4 +144,4 @@ toc:
|
||||||
path: /docs/admin/multiple-zones/
|
path: /docs/admin/multiple-zones/
|
||||||
|
|
||||||
- title: Building High-Availability Clusters
|
- title: Building High-Availability Clusters
|
||||||
path: /docs/admin/high-availability/
|
path: /docs/admin/high-availability/building/
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
bigheader: "Tasks"
|
bigheader: "Tasks"
|
||||||
abstract: "Step-by-step instructions for performing operations with Kubernetes."
|
abstract: "Step-by-step instructions for performing operations with Kubernetes."
|
||||||
|
landing_page: /docs/tasks/index/
|
||||||
toc:
|
toc:
|
||||||
- docs/tasks/index.md
|
- docs/tasks/index.md
|
||||||
|
|
||||||
- title: Install Tools
|
- title: Install Tools
|
||||||
|
landing_page: /docs/tasks/tools/install-kubectl/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/tools/install-kubectl.md
|
- docs/tasks/tools/install-kubectl.md
|
||||||
- docs/tasks/tools/install-minikube.md
|
- docs/tasks/tools/install-minikube.md
|
||||||
- docs/setup/independent/install-kubeadm.md
|
- docs/setup/independent/install-kubeadm.md
|
||||||
|
|
||||||
- title: Configure Pods and Containers
|
- title: Configure Pods and Containers
|
||||||
|
landing_page: /docs/tasks/configure-pod-container/configure-pod-initialization/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/configure-pod-container/assign-memory-resource.md
|
- docs/tasks/configure-pod-container/assign-memory-resource.md
|
||||||
- docs/tasks/configure-pod-container/assign-cpu-resource.md
|
- docs/tasks/configure-pod-container/assign-cpu-resource.md
|
||||||
|
@ -32,6 +35,7 @@ toc:
|
||||||
- docs/tools/kompose/user-guide.md
|
- docs/tools/kompose/user-guide.md
|
||||||
|
|
||||||
- title: Inject Data Into Applications
|
- title: Inject Data Into Applications
|
||||||
|
landing_page: /docs/tasks/inject-data-application/define-environment-variable-container/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/inject-data-application/define-command-argument-container.md
|
- docs/tasks/inject-data-application/define-command-argument-container.md
|
||||||
- docs/tasks/inject-data-application/define-environment-variable-container.md
|
- docs/tasks/inject-data-application/define-environment-variable-container.md
|
||||||
|
@ -41,6 +45,7 @@ toc:
|
||||||
- docs/tasks/inject-data-application/podpreset.md
|
- docs/tasks/inject-data-application/podpreset.md
|
||||||
|
|
||||||
- title: Run Applications
|
- title: Run Applications
|
||||||
|
landing_page: /docs/tasks/run-application/run-stateless-application-deployment/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/run-application/run-stateless-application-deployment.md
|
- docs/tasks/run-application/run-stateless-application-deployment.md
|
||||||
- docs/tasks/run-application/run-single-instance-stateful-application.md
|
- docs/tasks/run-application/run-single-instance-stateful-application.md
|
||||||
|
@ -56,12 +61,14 @@ toc:
|
||||||
- docs/tasks/run-application/configure-pdb.md
|
- docs/tasks/run-application/configure-pdb.md
|
||||||
|
|
||||||
- title: Run Jobs
|
- title: Run Jobs
|
||||||
|
landing_page: /docs/tasks/job/parallel-processing-expansion/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/job/parallel-processing-expansion.md
|
- docs/tasks/job/parallel-processing-expansion.md
|
||||||
- docs/tasks/job/coarse-parallel-processing-work-queue/index.md
|
- docs/tasks/job/coarse-parallel-processing-work-queue/index.md
|
||||||
- docs/tasks/job/fine-parallel-processing-work-queue/index.md
|
- docs/tasks/job/fine-parallel-processing-work-queue/index.md
|
||||||
|
|
||||||
- title: Access Applications in a Cluster
|
- title: Access Applications in a Cluster
|
||||||
|
landing_page: /docs/tasks/access-application-cluster/web-ui-dashboard/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/access-application-cluster/web-ui-dashboard.md
|
- docs/tasks/access-application-cluster/web-ui-dashboard.md
|
||||||
- docs/tasks/access-application-cluster/access-cluster.md
|
- docs/tasks/access-application-cluster/access-cluster.md
|
||||||
|
@ -78,6 +85,7 @@ toc:
|
||||||
path: https://github.com/kubernetes/kubernetes/tree/release-1.5/examples/cluster-dns
|
path: https://github.com/kubernetes/kubernetes/tree/release-1.5/examples/cluster-dns
|
||||||
|
|
||||||
- title: Monitor, Log, and Debug
|
- title: Monitor, Log, and Debug
|
||||||
|
landing_page: /docs/tasks/debug-application-cluster/resource-usage-monitoring/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/debug-application-cluster/core-metrics-pipeline.md
|
- docs/tasks/debug-application-cluster/core-metrics-pipeline.md
|
||||||
- docs/tasks/debug-application-cluster/resource-usage-monitoring.md
|
- docs/tasks/debug-application-cluster/resource-usage-monitoring.md
|
||||||
|
@ -100,6 +108,7 @@ toc:
|
||||||
path: https://github.com/kubernetes/kubernetes/tree/release-1.5/examples/explorer
|
path: https://github.com/kubernetes/kubernetes/tree/release-1.5/examples/explorer
|
||||||
|
|
||||||
- title: Extend Kubernetes
|
- title: Extend Kubernetes
|
||||||
|
landing_page: /docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/access-kubernetes-api/http-proxy-access-api.md
|
- docs/tasks/access-kubernetes-api/http-proxy-access-api.md
|
||||||
- docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions.md
|
- docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions.md
|
||||||
|
@ -111,11 +120,13 @@ toc:
|
||||||
- docs/tasks/service-catalog/install-service-catalog-using-sc.md
|
- docs/tasks/service-catalog/install-service-catalog-using-sc.md
|
||||||
|
|
||||||
- title: TLS
|
- title: TLS
|
||||||
|
landing_page: /docs/tasks/tls/managing-tls-in-a-cluster/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/tls/managing-tls-in-a-cluster.md
|
- docs/tasks/tls/managing-tls-in-a-cluster.md
|
||||||
- docs/tasks/tls/certificate-rotation.md
|
- docs/tasks/tls/certificate-rotation.md
|
||||||
|
|
||||||
- title: Administer a Cluster
|
- title: Administer a Cluster
|
||||||
|
landing_page: /docs/tasks/administer-cluster/memory-default-namespace/
|
||||||
section:
|
section:
|
||||||
- title: Manage Memory, CPU, and API Resources
|
- title: Manage Memory, CPU, and API Resources
|
||||||
section:
|
section:
|
||||||
|
@ -172,6 +183,7 @@ toc:
|
||||||
- docs/tasks/administer-cluster/pvc-protection.md
|
- docs/tasks/administer-cluster/pvc-protection.md
|
||||||
|
|
||||||
- title: Federation - Run an App on Multiple Clusters
|
- title: Federation - Run an App on Multiple Clusters
|
||||||
|
landing_page: /docs/tasks/federation/set-up-cluster-federation-kubefed/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/federation/federation-service-discovery.md
|
- docs/tasks/federation/federation-service-discovery.md
|
||||||
- docs/tasks/federation/set-up-cluster-federation-kubefed.md
|
- docs/tasks/federation/set-up-cluster-federation-kubefed.md
|
||||||
|
@ -190,18 +202,19 @@ toc:
|
||||||
- docs/tasks/administer-federation/secret.md
|
- docs/tasks/administer-federation/secret.md
|
||||||
|
|
||||||
- title: Manage Cluster Daemons
|
- title: Manage Cluster Daemons
|
||||||
|
landing_page: /docs/tasks/manage-daemon/update-daemon-set/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/manage-daemon/update-daemon-set.md
|
- docs/tasks/manage-daemon/update-daemon-set.md
|
||||||
- docs/tasks/manage-daemon/rollback-daemon-set.md
|
- docs/tasks/manage-daemon/rollback-daemon-set.md
|
||||||
|
|
||||||
- title: Manage GPUs
|
- title: Manage GPUs
|
||||||
section:
|
path: /docs/tasks/manage-gpus/scheduling-gpus/
|
||||||
- docs/tasks/manage-gpus/scheduling-gpus.md
|
|
||||||
|
|
||||||
- title: Manage HugePages
|
- title: Manage HugePages
|
||||||
section:
|
path: /docs/tasks/manage-hugepages/scheduling-hugepages/
|
||||||
- docs/tasks/manage-hugepages/scheduling-hugepages.md
|
|
||||||
|
|
||||||
- title: Extend kubectl with plugins
|
- title: Extend kubectl with plugins
|
||||||
section:
|
path: /docs/tasks/extend-kubectl/kubectl-plugins/
|
||||||
- docs/tasks/extend-kubectl/kubectl-plugins.md
|
|
||||||
|
- title: Troubleshooting
|
||||||
|
path: /docs/tasks/debug-application-cluster/troubleshooting/
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
bigheader: "Tutorials"
|
bigheader: "Tutorials"
|
||||||
abstract: "Detailed walkthroughs of common Kubernetes operations and workflows."
|
abstract: "Detailed walkthroughs of common Kubernetes operations and workflows."
|
||||||
|
landing_page: /docs/tutorials/index/
|
||||||
toc:
|
toc:
|
||||||
- docs/tutorials/index.md
|
- docs/tutorials/index.md
|
||||||
- title: Kubernetes Basics
|
- title: Kubernetes Basics
|
||||||
|
landing_page: /docs/tutorials/kubernetes-basics/index/
|
||||||
section:
|
section:
|
||||||
- docs/tutorials/kubernetes-basics/index.html
|
- docs/tutorials/kubernetes-basics/index.html
|
||||||
- title: 1. Create a Cluster
|
- title: 1. Create a Cluster
|
||||||
|
@ -30,24 +32,32 @@ toc:
|
||||||
- docs/tutorials/kubernetes-basics/update-intro.html
|
- docs/tutorials/kubernetes-basics/update-intro.html
|
||||||
- docs/tutorials/kubernetes-basics/update-interactive.html
|
- docs/tutorials/kubernetes-basics/update-interactive.html
|
||||||
- title: Online Training Courses
|
- title: Online Training Courses
|
||||||
|
landing_page: /docs/tutorials/online-training/overview/
|
||||||
section:
|
section:
|
||||||
|
- docs/tutorials/online-training/overview.md
|
||||||
- title: Scalable Microservices with Kubernetes (Udacity)
|
- title: Scalable Microservices with Kubernetes (Udacity)
|
||||||
path: https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615
|
path: https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615
|
||||||
- title: Introduction to Kubernetes (edX)
|
- title: Introduction to Kubernetes (edX)
|
||||||
path: https://www.edx.org/course/introduction-kubernetes-linuxfoundationx-lfs158x#
|
path: https://www.edx.org/course/introduction-kubernetes-linuxfoundationx-lfs158x#
|
||||||
- docs/tutorials/stateless-application/hello-minikube.md
|
- title: Hello Minikube
|
||||||
- docs/user-guide/walkthrough/index.md
|
path: /docs/tutorials/stateless-application/hello-minikube/
|
||||||
- docs/user-guide/walkthrough/k8s201.md
|
- title: Kubernetes 101
|
||||||
|
path: /docs/user-guide/walkthrough/
|
||||||
|
- title: Kubernetes 201
|
||||||
|
path: /docs/user-guide/walkthrough/k8s201/
|
||||||
- title: Configuration
|
- title: Configuration
|
||||||
|
landing_page: /docs/tutorials/configuration/configure-redis-using-configmap/
|
||||||
section:
|
section:
|
||||||
- docs/tutorials/configuration/configure-redis-using-configmap.md
|
- docs/tutorials/configuration/configure-redis-using-configmap.md
|
||||||
- title: Stateless Applications
|
- title: Stateless Applications
|
||||||
|
landing_page: /docs/tutorials/stateless-application/guestbook/
|
||||||
section:
|
section:
|
||||||
- docs/tasks/run-application/run-stateless-application-deployment.md
|
- docs/tasks/run-application/run-stateless-application-deployment.md
|
||||||
- docs/tutorials/stateless-application/guestbook.md
|
- docs/tutorials/stateless-application/guestbook.md
|
||||||
- docs/tasks/access-application-cluster/service-access-application-cluster.md
|
- docs/tasks/access-application-cluster/service-access-application-cluster.md
|
||||||
- docs/tutorials/stateless-application/expose-external-ip-address.md
|
- docs/tutorials/stateless-application/expose-external-ip-address.md
|
||||||
- title: Stateful Applications
|
- title: Stateful Applications
|
||||||
|
landing_page: /docs/tutorials/stateful-application/basic-stateful-set/
|
||||||
section:
|
section:
|
||||||
- docs/tutorials/stateful-application/basic-stateful-set.md
|
- docs/tutorials/stateful-application/basic-stateful-set.md
|
||||||
- docs/tasks/run-application/run-single-instance-stateful-application.md
|
- docs/tasks/run-application/run-single-instance-stateful-application.md
|
||||||
|
@ -56,8 +66,10 @@ toc:
|
||||||
- docs/tutorials/stateful-application/cassandra.md
|
- docs/tutorials/stateful-application/cassandra.md
|
||||||
- docs/tutorials/stateful-application/zookeeper.md
|
- docs/tutorials/stateful-application/zookeeper.md
|
||||||
- title: Clusters
|
- title: Clusters
|
||||||
|
landing_page: /docs/tutorials/clusters/apparmor/
|
||||||
section:
|
section:
|
||||||
- docs/tutorials/clusters/apparmor.md
|
- docs/tutorials/clusters/apparmor.md
|
||||||
- title: Services
|
- title: Services
|
||||||
|
landing_page: /docs/tutorials/services/source-ip/
|
||||||
section:
|
section:
|
||||||
- docs/tutorials/services/source-ip.md
|
- docs/tutorials/services/source-ip.md
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
id: code-contributor
|
||||||
|
name: Code Contributor
|
||||||
|
glossary_id: code-contributor
|
||||||
|
index: 0
|
||||||
|
foundational:
|
||||||
|
- label: "Read the Developer Guide"
|
||||||
|
icon: fa-book
|
||||||
|
url: "/docs/imported/community/devel/"
|
||||||
|
intermediate:
|
||||||
|
- label: "Learn about the Kubernetes Enhancement Proposal (KEP) process"
|
||||||
|
icon: fa-upload
|
||||||
|
url: "/docs/imported/community/keps/"
|
||||||
|
- label: "Understand the API conventions"
|
||||||
|
icon: fa-map-o
|
||||||
|
url: "https://github.com/kubernetes/community/blob/master/contributors/devel/api-conventions.md"
|
||||||
|
advanced:
|
||||||
|
- label: "Learn about the release process"
|
||||||
|
icon: fa-code-fork
|
||||||
|
url: "https://github.com/kubernetes/release/blob/master/README.md"
|
|
@ -0,0 +1,19 @@
|
||||||
|
id: community-contributor
|
||||||
|
name: Community Contributor
|
||||||
|
short_desc: A person who works to build the Kubernetes community (e.g. by organizing meetups).
|
||||||
|
index: 1
|
||||||
|
foundational:
|
||||||
|
- label: "Contribute to the Kubernetes OSS project"
|
||||||
|
icon: fa-users
|
||||||
|
url: "/docs/imported/community/guide/"
|
||||||
|
- label: "Find out about mentoring initiatives"
|
||||||
|
icon: fa-graduation-cap
|
||||||
|
url: "/docs/imported/community/mentoring/"
|
||||||
|
intermediate:
|
||||||
|
- label: "Apply for community membership as a member, reviewer, approver, owner, or maintainer"
|
||||||
|
icon: fa-user-plus
|
||||||
|
url: "https://github.com/kubernetes/community/blob/master/community-membership.md"
|
||||||
|
advanced:
|
||||||
|
- label: "Learn about Kubernetes community governance"
|
||||||
|
icon: fa-gavel
|
||||||
|
url: "https://github.com/kubernetes/community/blob/master/governance.md"
|
|
@ -0,0 +1,40 @@
|
||||||
|
id: docs-contributor
|
||||||
|
name: Docs Contributor
|
||||||
|
short_desc: A person who writes documentation for the Kubernetes project (e.g. this site).
|
||||||
|
index: 2
|
||||||
|
foundational:
|
||||||
|
- label: "Contribute to the Kubernetes documentation"
|
||||||
|
icon: fa-users
|
||||||
|
url: "/editdocs/"
|
||||||
|
- label: "Learn about documentation style"
|
||||||
|
icon: fa-book
|
||||||
|
url: "/docs/home/contribute/style-guide/"
|
||||||
|
- label: "Review documentation issues"
|
||||||
|
icon: fa-bug
|
||||||
|
url: "/docs/home/contribute/review-issues/"
|
||||||
|
- label: "Create a documentation pull request (PR)"
|
||||||
|
icon: fa-pencil-square-o
|
||||||
|
url: "/docs/home/contribute/create-pull-request/"
|
||||||
|
- label: "Stage documentation changes"
|
||||||
|
icon: fa-eye
|
||||||
|
url: "/docs/home/contribute/stage-documentation-changes/#staging-a-pull-request"
|
||||||
|
intermediate:
|
||||||
|
- label: "Write a new topic"
|
||||||
|
icon: fa-plus-circle
|
||||||
|
url: "/docs/home/contribute/write-new-topic/"
|
||||||
|
- label: "Stage documentation changes locally"
|
||||||
|
icon: fa-cloud-download
|
||||||
|
url: "/docs/home/contribute/stage-documentation-changes/#staging-locally-using-docker"
|
||||||
|
- label: "Apply page templates"
|
||||||
|
icon: fa-clone
|
||||||
|
url: "/docs/home/contribute/page-templates/"
|
||||||
|
- label: "Add callout formatting"
|
||||||
|
icon: fa-exclamation-circle
|
||||||
|
url: "/docs/home/contribute/style-guide/#callout-formatting"
|
||||||
|
advanced:
|
||||||
|
- label: "Add feature state tags"
|
||||||
|
icon: fa-tag
|
||||||
|
url: "/docs/home/contribute/includes/#feature-state"
|
||||||
|
- label: "Add tabs to display multiple flavors of content"
|
||||||
|
icon: fa-folder-o
|
||||||
|
url: "/docs/home/contribute/includes/#tabs"
|
|
@ -0,0 +1,24 @@
|
||||||
|
id: docker-compose-swarm
|
||||||
|
name: Migrating from Docker Compose and Swarm
|
||||||
|
index: 1
|
||||||
|
foundational:
|
||||||
|
- label: "b1: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "b2: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "b3: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
intermediate:
|
||||||
|
- label: "b1: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "b2: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "b3: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
advanced:
|
||||||
|
- label: "b1: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "b2: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "b3: advanced stuff"
|
||||||
|
url: "#"
|
|
@ -0,0 +1,24 @@
|
||||||
|
id: heroku
|
||||||
|
name: Migrating from Heroku (PaaS)
|
||||||
|
index: 2
|
||||||
|
foundational:
|
||||||
|
- label: "c1: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "c2: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "c3: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
intermediate:
|
||||||
|
- label: "c1: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "c2: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "c3: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
advanced:
|
||||||
|
- label: "c1: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "c2: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "c3: advanced stuff"
|
||||||
|
url: "#"
|
|
@ -0,0 +1,24 @@
|
||||||
|
id: mesos
|
||||||
|
name: Migrating from Apache Mesos
|
||||||
|
index: 3
|
||||||
|
foundational:
|
||||||
|
- label: "d1: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "d2: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "d3: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
intermediate:
|
||||||
|
- label: "d1: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "d2: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "d3: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
advanced:
|
||||||
|
- label: "d1: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "d2: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "d3: advanced stuff"
|
||||||
|
url: "#"
|
|
@ -0,0 +1,24 @@
|
||||||
|
id: vmware-openstack
|
||||||
|
name: Migrating from VMWare and/or OpenStack
|
||||||
|
index: 0
|
||||||
|
foundational:
|
||||||
|
- label: "a1: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "a2: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "a3: foundational stuff"
|
||||||
|
url: "#"
|
||||||
|
intermediate:
|
||||||
|
- label: "a1: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "a2: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "a3: intermediate stuff"
|
||||||
|
url: "#"
|
||||||
|
advanced:
|
||||||
|
- label: "a1: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "a2: advanced stuff"
|
||||||
|
url: "#"
|
||||||
|
- label: "a3: advanced stuff"
|
||||||
|
url: "#"
|
|
@ -0,0 +1,40 @@
|
||||||
|
id: app-developer
|
||||||
|
name: Application Developer
|
||||||
|
glossary_id: application-developer
|
||||||
|
index: 0
|
||||||
|
foundational:
|
||||||
|
- label: Get started with a cluster
|
||||||
|
icon: fa-television
|
||||||
|
url: /docs/user-journeys/users/application-developer/foundational
|
||||||
|
- label: Deploy an application
|
||||||
|
icon: fa-retweet
|
||||||
|
url: /docs/user-journeys/users/application-developer/foundational#section-2
|
||||||
|
- label: Understand basic Kubernetes architecture
|
||||||
|
icon: fa-cog
|
||||||
|
url: /docs/user-journeys/users/application-developer/foundational#section-3
|
||||||
|
- label: Explore additional resources
|
||||||
|
icon: fa-book
|
||||||
|
url: /docs/user-journeys/users/application-developer/foundational#section-4
|
||||||
|
intermediate:
|
||||||
|
- label: Learn additional workload patterns
|
||||||
|
icon: fa-cogs
|
||||||
|
url: /docs/user-journeys/users/application-developer/intermediate
|
||||||
|
- label: Deploy a production-ready workload
|
||||||
|
icon: fa-retweet
|
||||||
|
url: /docs/user-journeys/users/application-developer/intermediate#section-2
|
||||||
|
- label: Improve your dev workflow with tooling
|
||||||
|
icon: fa-scissors
|
||||||
|
url: /docs/user-journeys/users/application-developer/intermediate#section-3
|
||||||
|
- label: Explore additional resources
|
||||||
|
icon: fa-book
|
||||||
|
url: /docs/user-journeys/users/application-developer/intermediate#section-4
|
||||||
|
advanced:
|
||||||
|
- label: Deploy an application with advanced features
|
||||||
|
icon: fa-sliders
|
||||||
|
url: /docs/user-journeys/users/application-developer/advanced
|
||||||
|
- label: Extend the Kubernetes API
|
||||||
|
icon: fa-arrows
|
||||||
|
url: /docs/user-journeys/users/application-developer/advanced#section-2
|
||||||
|
- label: Explore additional resources
|
||||||
|
icon: fa-book
|
||||||
|
url: /docs/user-journeys/users/application-developer/advanced#section-3
|
|
@ -0,0 +1,43 @@
|
||||||
|
id: cluster-operator
|
||||||
|
name: Cluster Operator
|
||||||
|
glossary_id: cluster-operator
|
||||||
|
index: 1
|
||||||
|
foundational:
|
||||||
|
- label: Get an overview of Kubernetes
|
||||||
|
icon: fa-globe
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/foundational
|
||||||
|
- label: Learn about Kubernetes basics
|
||||||
|
icon: fa-cog
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/foundational#section-2
|
||||||
|
- label: Get information about my cluster
|
||||||
|
icon: fa-info-circle
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/foundational#section-3
|
||||||
|
- label: Explore additional resources
|
||||||
|
icon: fa-compass
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/foundational#section-4
|
||||||
|
intermediate:
|
||||||
|
- label: "Work with Ingress, Networking, Storage, Workloads"
|
||||||
|
icon: fa-sliders
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/intermediate
|
||||||
|
- label: "Implement security best practices"
|
||||||
|
icon: fa-shield
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/intermediate#section-2
|
||||||
|
- label: "Implement custom logging and monitoring"
|
||||||
|
icon: fa-heartbeat
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/intermediate#section-3
|
||||||
|
- label: "Additional Resources"
|
||||||
|
icon: fa-book
|
||||||
|
url: /docs/user-journeys/users/cluster-operator/intermediate#section-4
|
||||||
|
advanced:
|
||||||
|
- label: "Connect to managed services using Service Catalog"
|
||||||
|
icon: fa-puzzle-piece
|
||||||
|
url: "/docs/concepts/service-catalog/"
|
||||||
|
- label: "Extend a Kubernetes cluster"
|
||||||
|
icon: fa-arrows
|
||||||
|
url: "/docs/concepts/overview/extending/"
|
||||||
|
- label: "Create a Pod Security Policy"
|
||||||
|
icon: fa-lock
|
||||||
|
url: "/docs/concepts/policy/pod-security-policy/"
|
||||||
|
- label: "Define a Resource Quota"
|
||||||
|
icon: fa-tachometer
|
||||||
|
url: "/docs/concepts/policy/resource-quotas/"
|
|
@ -5,13 +5,14 @@
|
||||||
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic">
|
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto:400,100,100italic,300,300italic,400italic,500,500italic,700,700italic,900,900italic">
|
||||||
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto+Mono">
|
<link rel="stylesheet" type="text/css" href="https://fonts.googleapis.com/css?family=Roboto+Mono">
|
||||||
{% if page.case_study_styles %}<link rel="stylesheet" type="text/css" href="/css/case_study_styles.css"><!-- custom case_study_styles on -->{% else %}<link rel="stylesheet" type="text/css" href="/css/styles.css"><!-- default styles.css on -->{% endif %}
|
{% if page.case_study_styles %}<link rel="stylesheet" type="text/css" href="/css/case_study_styles.css"><!-- custom case_study_styles on -->{% else %}<link rel="stylesheet" type="text/css" href="/css/styles.css"><!-- default styles.css on -->{% endif %}
|
||||||
<link rel="stylesheet" type="text/css" href="/css/jquery-ui.min.css">
|
<link rel="stylesheet" type="text/css" href="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css">
|
||||||
<link rel="stylesheet" type="text/css" href="/css/sweetalert.css">
|
<link rel="stylesheet" type="text/css" href="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.css">
|
||||||
<link rel="stylesheet" type="text/css" href="/css/callouts.css">
|
<link rel="stylesheet" type="text/css" href="/css/callouts.css">
|
||||||
<link rel="stylesheet" type="text/css" href="/css/custom-jekyll/tags.css">
|
<link rel="stylesheet" type="text/css" href="/css/custom-jekyll/tags.css">
|
||||||
{% if page.deprecated %}<link rel="stylesheet" type="text/css" href="/css/deprecation-warning.css">{% endif %}
|
{% if page.deprecated %}<link rel="stylesheet" type="text/css" href="/css/deprecation-warning.css">{% endif %}
|
||||||
{% if page.class == "gridPage" %}<link rel="stylesheet" type="text/css" href="/css/gridpage.css">{% endif %}
|
{% if page.class == "gridPage" %}<link rel="stylesheet" type="text/css" href="/css/gridpage.css">{% endif %}
|
||||||
{% if page.css %}<link rel="stylesheet" type="text/css" href="{{ page.css }}"><!-- custom css added -->{% else %}<!-- no custom css detected -->{% endif %}
|
{% if page.css %}{% assign csslist = page.css | split: ',' | compact %}{% for cssurl in csslist %}<link rel="stylesheet" type="text/css" href="{{ cssurl | strip }}">
|
||||||
|
{% endfor %}<!-- custom css added -->{% else %}<!-- no custom css detected -->{% endif %}
|
||||||
|
|
||||||
{% if page.description %}
|
{% if page.description %}
|
||||||
<meta name="description" content="{{ page.description }}" />
|
<meta name="description" content="{{ page.description }}" />
|
||||||
|
@ -19,11 +20,13 @@
|
||||||
<meta name="description" content="{{ page.title }}" />
|
<meta name="description" content="{{ page.title }}" />
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
<script src="/js/jquery-2.2.0.min.js"></script>
|
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
|
||||||
<script src="/js/jquery-ui.min.js"></script>
|
<script src="https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js"></script>
|
||||||
|
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
|
||||||
|
<script src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/1.1.3/sweetalert.min.js"></script>
|
||||||
<script src="/js/script.js"></script>
|
<script src="/js/script.js"></script>
|
||||||
<script src="/js/sweetalert.min.js"></script>
|
|
||||||
<script src="/js/bootstrap.min.js"></script>
|
|
||||||
<script src="/js/custom-jekyll/tags.js"></script>
|
<script src="/js/custom-jekyll/tags.js"></script>
|
||||||
|
{% if page.js %}{% assign jslist = page.js | split: ',' | compact %}{% for jsurl in jslist %}<script src="{{ jsurl | strip }}"></script>
|
||||||
|
{% endfor %}<!-- custom js added -->{% else %}<!-- no custom js detected -->{% endif %}
|
||||||
{% seo %}
|
{% seo %}
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -0,0 +1,26 @@
|
||||||
|
<div class="track">{{ page.track }}</div>
|
||||||
|
<div class="topheader">
|
||||||
|
Introduction
|
||||||
|
</div>
|
||||||
|
<div class="sections">sections in this doc</div>
|
||||||
|
<div id="user-journeys-toc" class="tablebar">
|
||||||
|
<!-- This TOC section is populated with Javascript, see js/user-journeys-toc.js -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="docsection1">
|
||||||
|
|
||||||
|
{% if overview %}
|
||||||
|
{{ overview | liquify | markdownify }}
|
||||||
|
{% else %}
|
||||||
|
{% include templates/_errorthrower.md missing_block='overview' purpose='provides an introduction of this level.' %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if body %}
|
||||||
|
{{ body | liquify | markdownify | replace: '<h2', '</div><h2' | replace: '</h2>', '</h2><div class="docsection1">'}}
|
||||||
|
{% else %}
|
||||||
|
{% include templates/_errorthrower.md missing_block='body' purpose='contains content for this level.' %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script src="/js/user-journeys/toc.js"></script>
|
|
@ -6,7 +6,12 @@
|
||||||
{% if item.section %}
|
{% if item.section %}
|
||||||
{% include tocsearch.html tree=item.section toc=include.toc %}
|
{% include tocsearch.html tree=item.section toc=include.toc %}
|
||||||
{% else %}
|
{% else %}
|
||||||
{% if item == page.path %}
|
{% if item.path %}
|
||||||
|
{% assign filename = item.path | replace: '/', ' ' | strip | replace: ' ', '/' | append: '.md' %}
|
||||||
|
{% else %}
|
||||||
|
{% assign filename = item %}
|
||||||
|
{% endif %}
|
||||||
|
{% if filename == page.path %}
|
||||||
{% assign found_toc = include.toc %}
|
{% assign found_toc = include.toc %}
|
||||||
{% break %}
|
{% break %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
@ -0,0 +1,66 @@
|
||||||
|
<!Doctype html>
|
||||||
|
<html id="docs" class="{{ toc.bigheader }}">
|
||||||
|
|
||||||
|
{% include head.html %}
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
{% include header.html %}
|
||||||
|
|
||||||
|
<!-- HERO -->
|
||||||
|
<section id="hero" class="light-text">
|
||||||
|
<h1>{{ toc.bigheader }}</h1>
|
||||||
|
<h5>{{ toc.abstract }}</h5>
|
||||||
|
<div id="vendorStrip" class="light-text">
|
||||||
|
<ul>
|
||||||
|
<li><a href="/docs/home/" {% if toc.bigheader == "Kubernetes Documentation" %}class="YAH"{% endif %}>HOME</a></li>
|
||||||
|
<li><a href="/docs/setup/" {% if toc.bigheader == "Setup" %}class="YAH"{% endif %}>SETUP</a></li>
|
||||||
|
<li><a href="/docs/concepts/" {% if toc.bigheader == "Concepts" %}class="YAH"{% endif %}>CONCEPTS</a></li>
|
||||||
|
<li><a href="/docs/tasks/" {% if toc.bigheader == "Tasks" %}class="YAH"{% endif %}>TASKS</a></li>
|
||||||
|
<li><a href="/docs/tutorials/" {% if toc.bigheader == "Tutorials" %}class="YAH"{% endif %}>TUTORIALS</a></li>
|
||||||
|
<li><a href="/docs/reference/" {% if toc.bigheader == "Reference Documentation" %}class="YAH"{% endif %}>REFERENCE</a></li>
|
||||||
|
</ul>
|
||||||
|
<div id="searchBox">
|
||||||
|
<input type="text" id="search" placeholder="Search" onkeydown="if (event.keyCode==13) window.location.replace('/docs/search/?q=' + this.value)" autofocus="autofocus">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{% include deprecation-warning.html %}
|
||||||
|
|
||||||
|
<section id="encyclopedia">
|
||||||
|
<div id="docsToc" style="display:none;"></div>
|
||||||
|
|
||||||
|
<div id="content">
|
||||||
|
|
||||||
|
{{ content }}
|
||||||
|
|
||||||
|
<div class="issue-button-container">
|
||||||
|
<p><a href=""><img src="https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/{{ page.path }}?pixel" alt="Analytics" /></a></p>
|
||||||
|
{% if page.url != "/404.html" and page.url != "/docs/search/" %}
|
||||||
|
{% unless page.no_issue %}
|
||||||
|
<script type="text/javascript">
|
||||||
|
PDRTJS_settings_8345992 = {
|
||||||
|
"id" : "8345992",
|
||||||
|
"unique_id" : "{{ page.url }}",
|
||||||
|
"title" : "{{ page.title }}",
|
||||||
|
"permalink" : "https://kubernetes.io{{ page.url }}"
|
||||||
|
};
|
||||||
|
(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>
|
||||||
|
<a href="" onclick="window.open('https://github.com/kubernetes/website/issues/new?title=Issue%20with%20' +
|
||||||
|
'k8s.io'+window.location.pathname)" class="button issue">Create an Issue</a>
|
||||||
|
{% endunless %}
|
||||||
|
{% unless page.noedit %}
|
||||||
|
<a href="/editdocs#{{ page.path }}" class="button issue">Edit this Page</a>
|
||||||
|
{% endunless %}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{% include_cached footer.html %}
|
||||||
|
{% include footer-scripts.html %}
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -56,19 +56,19 @@
|
||||||
|
|
||||||
<p><a href=""><img src="https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/{{ page.path }}?pixel" alt="Analytics" /></a></p>
|
<p><a href=""><img src="https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/{{ page.path }}?pixel" alt="Analytics" /></a></p>
|
||||||
{% if page.url != "/404.html" and page.url != "/docs/search/"%}
|
{% if page.url != "/404.html" and page.url != "/docs/search/"%}
|
||||||
{% unless page.no_issue %}
|
{% unless page.no_issue %}
|
||||||
<script type="text/javascript">
|
<script type="text/javascript">
|
||||||
PDRTJS_settings_8345992 = {
|
PDRTJS_settings_8345992 = {
|
||||||
"id" : "8345992",
|
"id" : "8345992",
|
||||||
"unique_id" : "{{ page.url }}",
|
"unique_id" : "{{ page.url }}",
|
||||||
"title" : "{{ page.title }}",
|
"title" : "{{ page.title }}",
|
||||||
"permalink" : "http://kubernetes.github.io{{ page.url }}"
|
"permalink" : "https://kubernetes.io{{ page.url }}"
|
||||||
};
|
};
|
||||||
(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/website/issues/new?title=Issue%20with%20' +
|
||||||
'k8s.io'+window.location.pathname)" class="button issue">Create an Issue</a>
|
'k8s.io'+window.location.pathname)" class="button issue">Create an Issue</a>
|
||||||
{% endunless %}
|
{% endunless %}
|
||||||
{% unless page.noedit %}
|
{% unless page.noedit %}
|
||||||
<a href="/editdocs#{{ page.path }}" class="button issue">Edit this Page</a>
|
<a href="/editdocs#{{ page.path }}" class="button issue">Edit this Page</a>
|
||||||
{% endunless %}
|
{% endunless %}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
|
require 'pry'
|
||||||
# See /_plugins/README.md for full documentation of these custom Jekyll tags
|
# See /_plugins/README.md for full documentation of these custom Jekyll tags
|
||||||
module Jekyll
|
module Jekyll
|
||||||
module GlossaryTags
|
module GlossaryTags
|
||||||
|
@ -89,7 +90,7 @@ module Jekyll
|
||||||
gsub(NESTED_MARKDOWN_LINKS, '\2').
|
gsub(NESTED_MARKDOWN_LINKS, '\2').
|
||||||
strip
|
strip
|
||||||
|
|
||||||
"<a class='glossary-tooltip' href='#{external_link}'>" \
|
"<a class='glossary-tooltip' href='#{external_link}' target='_blank'>" \
|
||||||
"#{@args[:text] || term_info["name"]}" \
|
"#{@args[:text] || term_info["name"]}" \
|
||||||
"<span class='tooltip-text'>" \
|
"<span class='tooltip-text'>" \
|
||||||
"#{tooltip}" \
|
"#{tooltip}" \
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
/docs/admin/garbage-collection/ /docs/concepts/cluster-administration/kubelet-garbage-collection/ 301
|
/docs/admin/garbage-collection/ /docs/concepts/cluster-administration/kubelet-garbage-collection/ 301
|
||||||
/docs/admin/ha-master-gce/ /docs/tasks/administer-cluster/highly-available-master/ 301
|
/docs/admin/ha-master-gce/ /docs/tasks/administer-cluster/highly-available-master/ 301
|
||||||
/docs/admin/ha-master-gce.md/ /docs/tasks/administer-cluster/highly-available-master/ 301
|
/docs/admin/ha-master-gce.md/ /docs/tasks/administer-cluster/highly-available-master/ 301
|
||||||
|
/docs/admin/high-availability/ /docs/admin/high-availability/building/ 301
|
||||||
/docs/admin/kubeadm-upgrade-1-7/ /docs/tasks/administer-cluster/kubeadm-upgrade-1-7/ 301
|
/docs/admin/kubeadm-upgrade-1-7/ /docs/tasks/administer-cluster/kubeadm-upgrade-1-7/ 301
|
||||||
/docs/admin/limitrange/ /docs/tasks/administer-cluster/cpu-memory-limit/ 301
|
/docs/admin/limitrange/ /docs/tasks/administer-cluster/cpu-memory-limit/ 301
|
||||||
/docs/admin/limitrange/Limits/ /docs/tasks/administer-cluster/limit-storage-consumption/#limitrange-to-limit-requests-for-storage/ 301
|
/docs/admin/limitrange/Limits/ /docs/tasks/administer-cluster/limit-storage-consumption/#limitrange-to-limit-requests-for-storage/ 301
|
||||||
|
|
|
@ -38,7 +38,7 @@ title: 概述
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="content__modules">
|
<div id="basics-modules" class="content__modules">
|
||||||
<h2>Kubernetes 基础模块</h2>
|
<h2>Kubernetes 基础模块</h2>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4">
|
<div class="col-md-4">
|
||||||
|
|
|
@ -0,0 +1,891 @@
|
||||||
|
body {
|
||||||
|
|
||||||
|
margin:0 auto;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.infobarWrapper a {
|
||||||
|
color:#303030;
|
||||||
|
}
|
||||||
|
|
||||||
|
#encyclopedia {
|
||||||
|
padding: 0px !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
span .editthispage {
|
||||||
|
display: -webkit-inline-box !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.editthispage {
|
||||||
|
display: -webkit-inline-box !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
|
||||||
|
padding-top: 3% !important;
|
||||||
|
padding-bottom: 1.5% !important;
|
||||||
|
padding-left: 3% !important;
|
||||||
|
padding-right: 3% !important;
|
||||||
|
text-align: center !important;
|
||||||
|
font-size: 22pt !important;
|
||||||
|
font-weight:normal;
|
||||||
|
color:#303030;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
width:80%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.issue-button-container {
|
||||||
|
width: 75%;
|
||||||
|
margin-left: 15%;
|
||||||
|
padding-left: 1.5%;
|
||||||
|
padding-bottom: 2%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.anchor {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
top: -50px;
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pages a {
|
||||||
|
font-family: 'roboto';
|
||||||
|
font-size:11pt;
|
||||||
|
text-decoration:none !important;
|
||||||
|
letter-spacing:0.03em;
|
||||||
|
color:#606060;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pages a:hover{
|
||||||
|
color:black;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docstitle a{
|
||||||
|
font-family: 'roboto';
|
||||||
|
font-size:16pt;
|
||||||
|
margin-bottom:50px !important;
|
||||||
|
color:#3371e3 !important;
|
||||||
|
text-decoration:none !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docstitle {
|
||||||
|
margin-bottom:10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.emphasize-box {
|
||||||
|
background-color: #dde1e4;
|
||||||
|
margin: 2% 10%;
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.emphasize-box li {
|
||||||
|
font-size: 14px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.browsedocs {
|
||||||
|
font-family: 'roboto' !important;
|
||||||
|
width:75%;
|
||||||
|
margin-top:2%;
|
||||||
|
margin-bottom:5%;
|
||||||
|
margin-left:15%;
|
||||||
|
line-height:2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.browsecolumn {
|
||||||
|
float:left;
|
||||||
|
width: 33%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.browsesection {
|
||||||
|
float:left;
|
||||||
|
display:block;
|
||||||
|
width:100%;
|
||||||
|
margin:2%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pages {
|
||||||
|
width:100%;
|
||||||
|
color:#606060 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.browseheader {
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-align:center;
|
||||||
|
padding:1%;
|
||||||
|
color:white !important;
|
||||||
|
font-weight:100;
|
||||||
|
font-size:18px;
|
||||||
|
text-transform:uppercase;
|
||||||
|
font-weight:400;
|
||||||
|
background-color:#303030;
|
||||||
|
letter-spacing:0.08em;
|
||||||
|
background-repeat:repeat;
|
||||||
|
background-size:contain;
|
||||||
|
background-position:center;
|
||||||
|
}
|
||||||
|
.browseheader a{
|
||||||
|
|
||||||
|
color:white !important;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.topheader {
|
||||||
|
background-color: white !important;
|
||||||
|
color:#303030;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-align:center;
|
||||||
|
padding:3%;
|
||||||
|
font-weight:300;
|
||||||
|
font-size:24pt;
|
||||||
|
letter-spacing:0.06em;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docssectionheaders {
|
||||||
|
background-color: #eeeeee !important;
|
||||||
|
color:#3371e3;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-align:center;
|
||||||
|
padding: 3%;
|
||||||
|
margin: 6% 0% 2% 0%;
|
||||||
|
font-weight:300;
|
||||||
|
font-size:18pt;
|
||||||
|
letter-spacing:0.06em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docscols {
|
||||||
|
width:100%;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section1 {
|
||||||
|
width:100%;
|
||||||
|
float:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.docscol1 {
|
||||||
|
background-color:#eeeeee;
|
||||||
|
padding:2%;
|
||||||
|
margin-right:2%;
|
||||||
|
width:28% !important;
|
||||||
|
display:inline-block;
|
||||||
|
float:left;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docscol2 {
|
||||||
|
background-color:#ffffff;
|
||||||
|
border:1px solid #aaaaaa;
|
||||||
|
padding:2%;
|
||||||
|
width:27% !important;
|
||||||
|
float:left;
|
||||||
|
margin-right:2%;
|
||||||
|
display:inline-block;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docscol3 {
|
||||||
|
background-color:#ffffff;
|
||||||
|
padding:1.5%;
|
||||||
|
width:27% !important;
|
||||||
|
display:inline-block;
|
||||||
|
float:right;
|
||||||
|
border:1px solid blue;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docscoltitle {
|
||||||
|
float:left;
|
||||||
|
padding-top:%;
|
||||||
|
margin-right:2%;
|
||||||
|
padding-bottom:3%;
|
||||||
|
font-size:16pt;
|
||||||
|
line-height:20pt;
|
||||||
|
font-weight:400;
|
||||||
|
color:#3371e3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsfullcol1 {
|
||||||
|
|
||||||
|
width:95%;
|
||||||
|
padding:2%;
|
||||||
|
margin:3%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsfullcol2 {
|
||||||
|
|
||||||
|
width:95%;
|
||||||
|
padding:2%;
|
||||||
|
background-color:#eeeeee;
|
||||||
|
margin:3%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsfullcol3 {
|
||||||
|
background-color:#ffffff;
|
||||||
|
padding:2%;
|
||||||
|
width:95%;
|
||||||
|
display:inline-block;
|
||||||
|
|
||||||
|
border:1px solid blue;
|
||||||
|
margin:3%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsfullcol1icon {
|
||||||
|
width:5%;
|
||||||
|
padding:2%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docstitle2 {
|
||||||
|
padding:0%;
|
||||||
|
padding-bottom:3%;
|
||||||
|
font-size:16pt;
|
||||||
|
text-align:center;
|
||||||
|
font-weight:400;
|
||||||
|
padding-top:2%;
|
||||||
|
color:#3371e3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsButton {
|
||||||
|
|
||||||
|
background-color:#3371e3;
|
||||||
|
color:white;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
padding:1%;
|
||||||
|
text-decoration:none;
|
||||||
|
margin:%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.material-icons {
|
||||||
|
|
||||||
|
font-size:50pt !important;
|
||||||
|
color:#3371e3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.paths {
|
||||||
|
padding:1%;
|
||||||
|
background-color:#3371e3;
|
||||||
|
text-align:center;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.display-bar {
|
||||||
|
padding:1%;
|
||||||
|
background-color:#303030;
|
||||||
|
text-align:center;
|
||||||
|
font-size:18px;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-transform:uppercase;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
color:#ffffff;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards {
|
||||||
|
padding:0% 3% 3%;
|
||||||
|
width:80%;
|
||||||
|
margin-left:10%;
|
||||||
|
background-color:#ffffff;
|
||||||
|
text-align:center;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-transform:uppercase;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards > div {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
padding:1%;
|
||||||
|
margin:1%;
|
||||||
|
color:#ffffff;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-transform:uppercase;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.navButton {
|
||||||
|
white-space:nowrap;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
padding:1%;
|
||||||
|
margin:1%;
|
||||||
|
color:#3371e3;
|
||||||
|
background-color:white;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-transform:uppercase;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
display: inline-block;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.navButton:active {
|
||||||
|
|
||||||
|
background-color:#3371e3;
|
||||||
|
color:white;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navButton:visited {
|
||||||
|
|
||||||
|
background-color:#3371e3;
|
||||||
|
color:white;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navButton:focus {
|
||||||
|
|
||||||
|
background-color:#3371e3 !important</div>;
|
||||||
|
color:white;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.navButton:hover, .keepShow {
|
||||||
|
|
||||||
|
background-color:#3371e3;
|
||||||
|
color:white;
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.buttons {
|
||||||
|
background-color:#3371e3;
|
||||||
|
white-space:nowrap;
|
||||||
|
cursor:pointer;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
padding:2%;
|
||||||
|
margin:1%;
|
||||||
|
color:#ffffff;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-transform:uppercase;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
display: inline-block;
|
||||||
|
width:250px;
|
||||||
|
vertical-align:middle;
|
||||||
|
line-height:1.3em;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.buttonoption1 {
|
||||||
|
background-color:#3371e3;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
padding:2%;
|
||||||
|
margin:1%;
|
||||||
|
color:#ffffff;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-transform:uppercase;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
display: inline-block;
|
||||||
|
width:250px;
|
||||||
|
vertical-align:middle;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.buttons:active .active{
|
||||||
|
|
||||||
|
background-color:white;
|
||||||
|
color:#3371e3;
|
||||||
|
border: 2px solid #3371e3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons:hover {
|
||||||
|
|
||||||
|
background-color:white;
|
||||||
|
color:#3371e3;
|
||||||
|
border: 2px solid #3371e3;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons:target {
|
||||||
|
|
||||||
|
background-color:white;
|
||||||
|
color:#3371e3;
|
||||||
|
border: 2px solid #3371e3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons:visited {
|
||||||
|
|
||||||
|
background-color:white;
|
||||||
|
color:#3371e3;
|
||||||
|
border: 2px solid #3371e3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.buttons.selected {
|
||||||
|
background-color:white;
|
||||||
|
color:#3371e3;
|
||||||
|
border: 2px solid #3371e3;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*.keepShow {
|
||||||
|
|
||||||
|
background-color:white;
|
||||||
|
color:#3371e3;
|
||||||
|
border: 2px solid white;
|
||||||
|
|
||||||
|
}*/
|
||||||
|
|
||||||
|
.level {
|
||||||
|
background-color:#ffffff;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #303030;
|
||||||
|
padding:0%;
|
||||||
|
padding-top:3%;
|
||||||
|
margin:1%;
|
||||||
|
margin-top:4%;
|
||||||
|
color:#303030;
|
||||||
|
font-family: 'roboto';
|
||||||
|
font-weight:100;
|
||||||
|
text-transform:none;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
display: inline-block;
|
||||||
|
width:250px; cursor: pointer;
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
.level:hover, .level.selected {
|
||||||
|
background-color:#dddddd;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #303030;
|
||||||
|
|
||||||
|
cursor: pointer;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.tab1text{
|
||||||
|
padding:5%;
|
||||||
|
color:#303030;
|
||||||
|
font-size:15px;
|
||||||
|
line-height:22px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.tabbottom {
|
||||||
|
|
||||||
|
background-color:#303030;
|
||||||
|
color:#ffffff;;
|
||||||
|
font-family:'roboto';
|
||||||
|
width:100%;
|
||||||
|
margin:0px;
|
||||||
|
font-size:34 !important;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
i {
|
||||||
|
|
||||||
|
font-size:44px !important;
|
||||||
|
text-align:center;
|
||||||
|
color:#000066;
|
||||||
|
|
||||||
|
}
|
||||||
|
.infobarWrapper {
|
||||||
|
visibility: hidden;
|
||||||
|
margin-bottom:5%;
|
||||||
|
}
|
||||||
|
.infobar {
|
||||||
|
padding:0%;
|
||||||
|
background-color:#3371e3;
|
||||||
|
text-align:center;
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 2px solid #ffffff;
|
||||||
|
padding:2%;
|
||||||
|
font-size:22px;
|
||||||
|
line-height:30px;
|
||||||
|
letter-spacing:0.07em;
|
||||||
|
text-transform:uppercase;
|
||||||
|
margin:3%;
|
||||||
|
font-weight:bold;
|
||||||
|
color:#ffffff;
|
||||||
|
font-family: 'roboto';
|
||||||
|
width:70%;
|
||||||
|
margin-left:15%;
|
||||||
|
margin-bottom:3%;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.whitebar {
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
background-color:#ffffff;
|
||||||
|
text-transform:none;
|
||||||
|
padding:3%;
|
||||||
|
letter-spacing:0.6pt;
|
||||||
|
font-size:15px;
|
||||||
|
z-index:99;
|
||||||
|
font-weight:400;
|
||||||
|
line-height:18pt;
|
||||||
|
color:#606060;
|
||||||
|
margin:1%;
|
||||||
|
text-align:left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.whitebararrow{
|
||||||
|
float:right
|
||||||
|
padding:3%;
|
||||||
|
font-size:15px;
|
||||||
|
z-index:99;
|
||||||
|
font-weight:100;
|
||||||
|
line-height:18pt;
|
||||||
|
color:#606060;
|
||||||
|
margin:1%;
|
||||||
|
text-align:right;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.hide {
|
||||||
|
|
||||||
|
float:left;
|
||||||
|
font-size:16px;
|
||||||
|
padding-left:2%;
|
||||||
|
padding-bottom:5%;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.fa {
|
||||||
|
|
||||||
|
line-height:0.7em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.infoicon {
|
||||||
|
float:left;
|
||||||
|
padding-bottom:2%;
|
||||||
|
padding-right:2%;
|
||||||
|
margin-bottom:10%:
|
||||||
|
color:#3371e3 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.numberCircle {
|
||||||
|
display:inline-block;
|
||||||
|
line-height:0px;
|
||||||
|
|
||||||
|
border-radius:5px;
|
||||||
|
border:2px solid;
|
||||||
|
font-weight:300;
|
||||||
|
font-size:24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.numberCircle span {
|
||||||
|
display:inline-block;
|
||||||
|
padding-top:50%; padding-bottom:50%;
|
||||||
|
margin-left:12px;
|
||||||
|
margin-right:12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docButton {
|
||||||
|
-moz-border-radius: 5px;
|
||||||
|
-webkit-border-radius: 5px;
|
||||||
|
border-radius: 5px; /* future proofing */
|
||||||
|
-khtml-border-radius: 5px; /* for old Konqueror browsers */
|
||||||
|
border: 1.5px solid #3371e3;
|
||||||
|
padding:1%;
|
||||||
|
background-color:#eeeeee;
|
||||||
|
font-size:13px;
|
||||||
|
margin:.5%;
|
||||||
|
color:#3371e3;
|
||||||
|
font-family: 'roboto';
|
||||||
|
text-transform:uppercase;
|
||||||
|
text-align:center;
|
||||||
|
letter-spacing:0.1em;
|
||||||
|
display: inline-block;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.docButton:hover {
|
||||||
|
border: 1.5px solid #3371e3;
|
||||||
|
background-color:#3371e3;
|
||||||
|
font-size:13px;
|
||||||
|
color:#eeeeee;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.tablebar {
|
||||||
|
text-align:center;
|
||||||
|
background-color:#eeeeee;
|
||||||
|
padding:1.5%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.aboutsection {
|
||||||
|
background-color:white;
|
||||||
|
font-family: 'roboto';
|
||||||
|
font-weight:300 !important;
|
||||||
|
font-size:14px;
|
||||||
|
letter-spacing:0.05em;
|
||||||
|
line-height:22px;
|
||||||
|
width:70%;
|
||||||
|
margin-left:15%;
|
||||||
|
padding-bottom:5%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.aboutsection p {
|
||||||
|
font-size: 16px;
|
||||||
|
text-align:center;
|
||||||
|
font-weight:300;
|
||||||
|
line-height: 1.75em;
|
||||||
|
letter-spacing: 0.1px;
|
||||||
|
margin-bottom: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aboutsection a {
|
||||||
|
text-decoration: underline;
|
||||||
|
color:#3371e3;
|
||||||
|
font-weight:400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.aboutcolumn {
|
||||||
|
float:left;
|
||||||
|
width: 50%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsection1 {
|
||||||
|
background-color:white;
|
||||||
|
font-family: 'roboto';
|
||||||
|
padding-top:3%;
|
||||||
|
padding-left:3%;
|
||||||
|
padding-right:3%;
|
||||||
|
font-weight:300 !important;
|
||||||
|
font-size:14px;
|
||||||
|
letter-spacing:0.05em;
|
||||||
|
line-height:22px;
|
||||||
|
width:65%;
|
||||||
|
margin-left:17%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.cards .docsection1 {
|
||||||
|
display: block !important;
|
||||||
|
padding: 3% 3% 1%;
|
||||||
|
text-transform: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#persona-definition {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.about-k8s-content {
|
||||||
|
width: 100%;
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsection1 a {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsection1 p {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight:300;
|
||||||
|
line-height: 1.75em;
|
||||||
|
letter-spacing: 0.1px;
|
||||||
|
margin-bottom: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsection1 li {
|
||||||
|
margin-bottom: 0.75em;
|
||||||
|
margin-left: 3em;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight:300;
|
||||||
|
line-height: 1.75em;
|
||||||
|
letter-spacing: 0.1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsection1 ol li {
|
||||||
|
list-style: decimal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsection1 ul li {
|
||||||
|
list-style: disc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.docsection1 code {
|
||||||
|
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
|
||||||
|
|
||||||
|
font-size: 90%;
|
||||||
|
|
||||||
|
padding: 2px 4px;
|
||||||
|
|
||||||
|
color: #c7254e;
|
||||||
|
border-radius: 4px;
|
||||||
|
background-color: #f9f2f4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.intro {
|
||||||
|
background-color:white;
|
||||||
|
font-family: 'roboto';
|
||||||
|
padding:3%;
|
||||||
|
font-weight:100;
|
||||||
|
font-size:14px;
|
||||||
|
letter-spacing:0.05em;
|
||||||
|
line-height:22px;
|
||||||
|
width:100%;
|
||||||
|
margin-left:10%;
|
||||||
|
|
||||||
|
}
|
||||||
|
.introtext {
|
||||||
|
float:right;
|
||||||
|
background-color:white;
|
||||||
|
font-family: 'roboto';
|
||||||
|
padding:3%;
|
||||||
|
font-weight:100;
|
||||||
|
font-size:14px;
|
||||||
|
letter-spacing:0.05em;
|
||||||
|
line-height:22px;
|
||||||
|
width:50%;
|
||||||
|
margin-left:10%;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.track {
|
||||||
|
background-color:#3371e3;
|
||||||
|
font-family: 'roboto';
|
||||||
|
padding:1%;
|
||||||
|
color:white;
|
||||||
|
font-weight:500;
|
||||||
|
text-align:center;
|
||||||
|
text-transform:uppercase;
|
||||||
|
font-size:16px;
|
||||||
|
letter-spacing:0.05em;
|
||||||
|
line-height:22px;
|
||||||
|
width:100%;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.sections {
|
||||||
|
background-color:#303030;
|
||||||
|
font-family: 'roboto';
|
||||||
|
padding:1%;
|
||||||
|
color:white;
|
||||||
|
font-weight:500;
|
||||||
|
text-align:center;
|
||||||
|
text-transform:uppercase;
|
||||||
|
font-size:18px;
|
||||||
|
letter-spacing:0.05em;
|
||||||
|
line-height:22px;
|
||||||
|
width:100%;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.quotedocs {
|
||||||
|
line-height:26pt;
|
||||||
|
font-size:16pt;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
table {
|
||||||
|
width: 100%;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
border-spacing: 0;
|
||||||
|
margin-top: 30px;
|
||||||
|
margin-bottom: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead, tr:nth-child(even) {
|
||||||
|
background-color: $light-grey;
|
||||||
|
}
|
||||||
|
|
||||||
|
thead {
|
||||||
|
background-color: #555;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
th, td {
|
||||||
|
padding: 8px;
|
||||||
|
text-align: left;
|
||||||
|
margin: 0;
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
th {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
|
@ -103,7 +103,7 @@ kubectl apply -f "https://git.io/weave-kube"
|
||||||
|
|
||||||
### Example Liquid template code for tabs
|
### Example Liquid template code for tabs
|
||||||
|
|
||||||
Below is the [Liquid](https://shopify.github.io/liquid/) template code for the tabs demo above to illustrate how to specify the contents of each tab. The [`/_includes/tabs.md`](https://git.k8s.io/kubernetes.github.io/_includes/tabs.md) file included at the end then uses those elements to render the actual tab set.
|
Below is the [Liquid](https://shopify.github.io/liquid/) template code for the tabs demo above to illustrate how to specify the contents of each tab. The [`/_includes/tabs.md`](https://git.k8s.io/website/_includes/tabs.md) file included at the end then uses those elements to render the actual tab set.
|
||||||
|
|
||||||
The following sections break down each of the individual features used.
|
The following sections break down each of the individual features used.
|
||||||
|
|
||||||
|
|
|
@ -1,54 +1,161 @@
|
||||||
---
|
---
|
||||||
approvers:
|
approvers:
|
||||||
- bgrant0607
|
- chenopis
|
||||||
- thockin
|
|
||||||
title: Kubernetes Documentation
|
title: Kubernetes Documentation
|
||||||
|
layout: docsportal
|
||||||
|
noedit: true
|
||||||
|
cid: userJourneys
|
||||||
|
css: /css/style_user_journeys.css
|
||||||
|
js: /js/user-journeys/home.js, https://use.fontawesome.com/4bcc658a89.js
|
||||||
|
display_browse_numbers: true
|
||||||
---
|
---
|
||||||
|
|
||||||
Kubernetes documentation can help you set up Kubernetes, learn about the system, or get your applications and workloads running on Kubernetes. To learn the basics of what Kubernetes is and how it works, read "[What is Kubernetes](/docs/concepts/overview/what-is-kubernetes/)".
|
{% unless page.notitle %}
|
||||||
|
<h1>{{ page.title }}</h1>
|
||||||
|
{% endunless %}
|
||||||
|
|
||||||
## Interactive Tutorial
|
<div id="user-persona-data" class="hide">
|
||||||
|
{{ site.data.user-personas | json | replace: "=>", ": " }}
|
||||||
|
</div>
|
||||||
|
|
||||||
The [Kubernetes Basics interactive tutorial](/docs/tutorials/kubernetes-basics/) lets you try out Kubernetes right out of your web browser, using a virtual terminal. Learn about the Kubernetes system and deploy, expose, scale, and upgrade a containerized application in just a few minutes.
|
<div class="hide">
|
||||||
|
{% assign skip_uj_paths = "migrators" | split: "," %}
|
||||||
|
{% for path in site.data.user-personas %}
|
||||||
|
{% if skip_uj_paths contains path[0] %}
|
||||||
|
{% else %}
|
||||||
|
{% for persona in path[1] %}
|
||||||
|
<div class="persona-def-data" data-name="{{ persona[0] }}">
|
||||||
|
{% assign persona_info = persona[1] %}
|
||||||
|
{% if persona_info.glossary_id %}
|
||||||
|
{{ site.data.glossary[persona_info.glossary_id].short-description }}
|
||||||
|
{% else if persona_info.short_desc %}
|
||||||
|
{{ persona_info.short_desc }}
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
|
||||||
## Installing/Setting Up Kubernetes
|
<div id='aboutWrapper'>
|
||||||
|
<div class="aboutsection" markdown="1">
|
||||||
|
|
||||||
[Picking the Right Solution](/docs/setup/pick-right-solution/) can help you get a Kubernetes cluster up and running, either for local development, or on your cloud provider of choice.
|
Kubernetes is an open source system for managing [containerized applications](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/)
|
||||||
|
across multiple hosts, providing basic mechanisms for deployment, maintenance, and scaling of applications.
|
||||||
|
The open source project is hosted by the Cloud Native Computing Foundation ([CNCF](https://www.cncf.io/about)).
|
||||||
|
|
||||||
## Concepts, Tasks, and Tutorials
|
<div class="aboutcolumn" markdown="1">
|
||||||
|
[Download Current Release](/docs/imported/release/notes/)
|
||||||
|
</div>
|
||||||
|
<div class="aboutcolumn" markdown="1">
|
||||||
|
[Supported Doc Versions](/docs/home/supported-doc-versions/)
|
||||||
|
</div>
|
||||||
|
|
||||||
The Kubernetes documentation contains a number of resources to help you understand and work with Kubernetes.
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
* [Concepts](/docs/concepts/) provide a deep understanding of how Kubernetes works.
|
<div class="paths">
|
||||||
* [Tasks](/docs/tasks/) contain step-by-step instructions for common Kubernetes tasks.
|
<div class="navButton users">Users</div>
|
||||||
* [Tutorials](/docs/tutorials/) contain detailed walkthroughs of the Kubernetes workflow.
|
<div class="navButton contributors">Contributors</div>
|
||||||
|
<!-- div class="navButton migrators">Migration Paths</div -->
|
||||||
|
<a> <div class="navButton browse">Browse Docs</div></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
## API and Command References
|
<div id="cardWrapper">
|
||||||
|
<div class="display-bar">I AM...</div>
|
||||||
|
<div class='cards' markdown="1">
|
||||||
|
<div class='docsection1' id='persona-definition'>.</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
The [Reference](/docs/reference/) documentation provides complete information on the Kubernetes APIs and the `kubectl` command-line interface.
|
<div style='text-align: center;' class="applicationDeveloperContainer">
|
||||||
|
<div class="display-bar" id="subTitle">LEVEL</div>
|
||||||
|
<div class="levels">
|
||||||
|
<div class="level" data-name="foundational">
|
||||||
|
<i class="fa fa-sign-in" aria-hidden="true" style="font-size:50pt !important;padding-top:7% !important;padding-bottom:15% !important"></i>
|
||||||
|
<br>
|
||||||
|
<div class="tabbottom" style="padding-top:5%;padding-bottom:5%">
|
||||||
|
Foundational
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="level" data-name="intermediate">
|
||||||
|
<i class="fa fa-university" aria-hidden="true" style="font-size:50pt !important;padding-top:7% !important;padding-bottom:15% !important"></i>
|
||||||
|
<br>
|
||||||
|
|
||||||
## Tools
|
<div class="tabbottom" style="padding-top:5%;padding-bottom:5%">
|
||||||
|
Intermediate
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="level" data-name="advanced">
|
||||||
|
<i class="fa fa-magic" aria-hidden="true" style="font-size:50pt !important;padding-top:7% !important;padding-bottom:15% !important"></i>
|
||||||
|
<br>
|
||||||
|
<div class="tabbottom" style="padding-top:5%;padding-bottom:5%">
|
||||||
|
Advanced Topics
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
The [Tools](/docs/tools/) page contains a list of native and third-party tools for Kubernetes.
|
<div class='infobarWrapper'>
|
||||||
|
<div class="infobar">
|
||||||
|
<span style="padding-bottom: 3% ">I want to...</span>
|
||||||
|
<div id="infobarLinks"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
The [Troubleshooting](/docs/tasks/debug-application-cluster/troubleshooting) page outlines some resources for troubleshooting and finding help.
|
<div id='browsedocsWrapper'>
|
||||||
|
<div class="browseheader" id="browsedocs">
|
||||||
|
<a name="browsedocs">Browse Docs</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
## Supported Versions
|
<div class="browsedocs">
|
||||||
|
|
||||||
Kubernetes has a _X.Y.Z_ versioning scheme, where _X_ is the major version, _Y_ is the minor version, and _Z_ is the patch version.
|
{% assign sections = "setup,concepts,tasks,tutorials,reference,docs-home" | split: "," %}
|
||||||
|
|
||||||
Kubernetes is supported for three minor versions at a time. This includes the current release version and two previous versions.
|
{% for section_id in sections %}
|
||||||
|
|
||||||
See the [Kubernetes Release](https://github.com/kubernetes/kubernetes/releases) page on GitHub for the latest release information.
|
{% assign section_data = site.data[section_id] %}
|
||||||
|
{% assign section_toc = section_data.toc %}
|
||||||
|
|
||||||
### Minor Versions
|
<div class="browsesection">
|
||||||
|
<div class="docstitle">
|
||||||
|
<a href="{{ section_data.landing_page }}">{{ section_data.bigheader }}</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
A certain amount of version skew is permissible between master components, node components, and the kubectl client. Nodes may lag master by up to two versions, but not exceed the master version. Clients may lag master by one version and may exceed master up to one version.
|
{% assign section_toc = section_toc | where_exp: "elt", "elt.title != null" %}
|
||||||
|
{% assign num_pages = section_toc | size %}
|
||||||
|
{% assign column_size = num_pages | divided_by: 3.0 | ceil %}
|
||||||
|
|
||||||
For example, a v1.8 master is expected to be compatible with v1.6, v1.7, and v1.8 nodes, and compatible with v1.7, v1.8, and v1.9 clients.
|
<div class="pages">
|
||||||
|
|
||||||
### Patch Versions
|
{% for i in (1..num_pages) %}
|
||||||
|
{% assign index = i | minus: 1 %}
|
||||||
|
{% assign offset = index | modulo: column_size | plus: 1 %}
|
||||||
|
{% assign section_elt = section_toc[index] %}
|
||||||
|
|
||||||
Patch releases often include critical bug fixes. You should be running the latest patch release of a given minor release.
|
{% if page.display_browse_numbers %}
|
||||||
|
{% assign browse_number = i | prepend: "0" | slice: -2, 2 | append: " - " %}
|
||||||
|
{% else %}
|
||||||
|
{% assign browse_number = "" %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% if offset == 1 %}
|
||||||
|
<div class="browsecolumn">
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{% assign elt_url = section_elt.path | default: section_elt.landing_page | default: "#" %}
|
||||||
|
<a href="{{ elt_url }}">{{ section_elt.title | prepend: browse_number }}</a><br>
|
||||||
|
{% if offset == column_size or i == num_pages %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div><!-- end pages -->
|
||||||
|
|
||||||
|
</div><!-- end browsesection -->
|
||||||
|
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
</div><!-- end browsedocs -->
|
||||||
|
</div><!-- end browsedocsWrapper -->
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
---
|
||||||
|
title: Overview of Kubernetes Design Docs
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
Here are some documents that describe aspects of the Kubernetes design:
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
|
||||||
|
* [Kubernetes Architecture](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md)
|
||||||
|
|
||||||
|
* [Kubernetes Design Overview](https://github.com/kubernetes/kubernetes/tree/release-1.6/docs/design)
|
||||||
|
|
||||||
|
* [Kubernetes Identity and Access Management](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/auth/access.md)
|
||||||
|
|
||||||
|
* [Kubernetes OpenVSwitch GRE/VxLAN networking](https://deploy-preview-6994--kubernetes-io-user-journeys.netlify.com/docs/admin/ovs-networking/)
|
||||||
|
|
||||||
|
* [Security Contexts](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/auth/security_context.md)
|
||||||
|
|
||||||
|
* [Security in Kubernetes](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/auth/security.md)
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% include templates/concept.md %}
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
title: Hosted Kubernetes Solutions
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
|
||||||
|
TODO
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% include templates/concept.md %}
|
||||||
|
|
|
@ -38,7 +38,7 @@ title: Overview
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="content__modules">
|
<div id="basics-modules" class="content__modules">
|
||||||
<h2>Kubernetes Basics Modules</h2>
|
<h2>Kubernetes Basics Modules</h2>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-12">
|
<div class="col-md-12">
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
---
|
||||||
|
title: Overview of Kubernetes Online Training
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
Here are some of the sites that offer online training for Kubernetes:
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
|
||||||
|
* [Scalable Microservices with Kubernetes (Udacity)](https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615)
|
||||||
|
|
||||||
|
* [Introduction to Kubernetes (edX)](https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615)
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% include templates/concept.md %}
|
||||||
|
|
|
@ -0,0 +1,117 @@
|
||||||
|
---
|
||||||
|
approvers:
|
||||||
|
- chenopis
|
||||||
|
layout: docsportal
|
||||||
|
css: /css/style_user_journeys.css, https://fonts.googleapis.com/icon?family=Material+Icons
|
||||||
|
js: https://use.fontawesome.com/4bcc658a89.js, https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js
|
||||||
|
title: Advanced Topics
|
||||||
|
track: "USERS › APPLICATION DEVELOPER › ADVANCED"
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
This page assumes that you're familiar with core Kubernetes concepts, and are comfortable deploying your own apps. If not, you should review the [Intermediate App Developer](/docs/user-journeys/users/application-developer/intermediate/){:target="_blank"} topics first.
|
||||||
|
|
||||||
|
After checking out the current page and its linked sections, you should have a better understanding of the following:
|
||||||
|
* Advanced features that you can leverage in your application
|
||||||
|
* The various ways of extending the Kubernetes API
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
|
||||||
|
## Deploy an application with advanced features
|
||||||
|
|
||||||
|
Now you know the set of API objects that Kubernetes provides. Understanding the difference between a {% glossary_tooltip term_id="daemonset" %} and a {% glossary_tooltip term_id="deployment" %} is oftentimes sufficient for app deployment. That being said, it's also worth familiarizing yourself with Kubernetes's lesser known features. They can be quite powerful when applied to the right use cases.
|
||||||
|
|
||||||
|
#### Container-level features
|
||||||
|
|
||||||
|
As you may know, it's an antipattern to migrate an entire app (e.g. containerized Rails app, MySQL database, and all) into a single Pod. That being said, there are some very useful patterns that go beyond a 1:1 correspondence between a container and its Pod:
|
||||||
|
* **Sidecar container**: Although your Pod should still have a single main container, you can add a secondary container that acts as a helper (see a [logging example](/docs/concepts/cluster-administration/logging/#using-a-sidecar-container-with-the-logging-agent){:target="_blank"}). Two containers within a single Pod can communicate [via a shared volume](/docs/tasks/access-application-cluster/communicate-containers-same-pod-shared-volume/){:target="_blank"}.
|
||||||
|
* **Init containers**: *Init containers* run before any of a Pod's *app containers* (such as main and sidecar containers). [Read more](/docs/concepts/workloads/pods/init-containers/){:target="_blank"}, see an [nginx server example](/docs/tasks/configure-pod-container/configure-pod-initialization/){:target="_blank"}, and [learn how to debug these containers](/docs/tasks/debug-application-cluster/debug-init-containers/){:target="_blank"}.
|
||||||
|
|
||||||
|
#### Pod configuration
|
||||||
|
|
||||||
|
Usually, you use {% glossary_tooltip text="labels" term_id="labels" %} and {% glossary_tooltip text="annotations" term_id="annotation" %} to attach metadata to your resources. To inject data into your resources, you'd likely create {% glossary_tooltip text="ConfigMaps" term_id="configmap" %} (for nonconfidential data) or {% glossary_tooltip text="Secrets" term_id="secret" %} (for confidential data).
|
||||||
|
|
||||||
|
Below are some other, lesser-known ways of configuring your resources' Pods:
|
||||||
|
|
||||||
|
* **Taints and Tolerations** - These provide a way for nodes to "attract" or "repel" your Pods. They are often used when an application needs to be deployed onto specific hardware, such as GPUs for scientific computing. [Read more](/docs/concepts/configuration/taint-and-toleration/){:target="_blank"}.
|
||||||
|
* **Downward API** - This allows your containers to consume information about themselves or the cluster, without being overly coupled to the Kubernetes API server. This can be achieved with [environment variables](/docs/tasks/inject-data-application/environment-variable-expose-pod-information/){:target="_blank"} or [DownwardAPIVolumeFiles](/docs/tasks/inject-data-application/downward-api-volume-expose-pod-information/){:target="_blank"}.
|
||||||
|
* **Pod Presets** - Normally, to mount runtime requirements (such as environmental variables, ConfigMaps, and Secrets) into a resource, you specify them in the resource's configuration file. [PodPresets](/docs/concepts/workloads/pods/podpreset/){:target="_blank"} allow you to dynamically inject these requirements instead, when the resource is created. For instance, this allows team A to mount any number of new Secrets into the resources created by teams B and C, without requiring action from B and C. [See an example](/docs/tasks/inject-data-application/podpreset/){:target="_blank"}.
|
||||||
|
|
||||||
|
#### Additional API Objects
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
Before setting up the following resources, check to see if they are the responsibility of your organization's {% glossary_tooltip text="cluster operators" term_id="cluster-operator" %}.
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="Horizontal Pod Autoscaler (HPA)" term_id="horizontal-pod-autoscaler" %}** - These resources are a great way to automate the process of scaling your application when CPU usage or other [custom metrics](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/instrumentation/custom-metrics-api.md){:target="_blank"} spike. [See an example](/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/){:target="_blank"} to understand how HPAs are set up.
|
||||||
|
|
||||||
|
* **Federated cluster objects** - If you are running an application on multiple Kubernetes clusters using *federation*, you need to deploy the federated version of the standard Kubernetes API objects. For reference, check out the guides for setting up [Federated ConfigMaps](/docs/tasks/administer-federation/configmap/){:target="_blank"} and [Federated Deployments](/docs/tasks/administer-federation/deployment/){:target="_blank"}.
|
||||||
|
|
||||||
|
## Extend the Kubernetes API
|
||||||
|
|
||||||
|
Kubernetes is designed with extensibility in mind. If the API resources and features mentioned above are not enough for your needs, there are ways to customize its behavior without having to modify core Kubernetes code.
|
||||||
|
|
||||||
|
#### Understand Kubernetes's default behavior
|
||||||
|
|
||||||
|
Before making any customizations, it's important that you understand the general abstraction behind Kubernetes API objects. Although Deployments and Secrets may seem quite different, the following concepts are true for *any* object:
|
||||||
|
|
||||||
|
* **Kubernetes objects are a way of storing structured data about your cluster.**
|
||||||
|
In the case of Deployments, this data represents desired state (such as "How many replicas should be running?"), but it can also be general metadata (such as database credentials).
|
||||||
|
* **Kubernetes objects are modified via the {% glossary_tooltip text="Kubernetes API" term_id="kubernetes-api" %}**.
|
||||||
|
In other words, you can make `GET` and `POST` requests to a specific resource path (such as `<api-server-url>/api/v1/namespaces/default/deployments`) to read and write the corresponding object type.
|
||||||
|
* **By leveraging the [Controller pattern](/docs/concepts/api-extension/custom-resources/#custom-controllers){:target="_blank"}, Kubernetes objects can be used to enforce desired state**. For simplicity, you can think of the Controller pattern as the following continuous loop:
|
||||||
|
|
||||||
|
<div class="emphasize-box" markdown="1">
|
||||||
|
1. Check current state (number of replicas, container image, etc)
|
||||||
|
2. Compare current state to desired state
|
||||||
|
3. Update if there's a mismatch
|
||||||
|
</div>
|
||||||
|
|
||||||
|
These states are obtained from the Kubernetes API.
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
Not all Kubernetes objects need to have a Controller. Though Deployments trigger the cluster to make state changes, ConfigMaps act purely as storage.
|
||||||
|
|
||||||
|
#### Create Custom Resources
|
||||||
|
|
||||||
|
Based on the ideas above, you can define a new [Custom Resource](/docs/concepts/api-extension/custom-resources/#custom-resources){:target="_blank"} that is just as legitimate as a Deployment. For example, you might want to define a `Backup` object for periodic backups, if `CronJobs` don't provide all the functionality you need.
|
||||||
|
|
||||||
|
There are two main ways of setting up custom resources:
|
||||||
|
1. **Custom Resource Definitions (CRDs)** - This method requires the least amount of implementation work. See [an example](/docs/tasks/access-kubernetes-api/extend-api-custom-resource-definitions/){:target="_blank"}.
|
||||||
|
2. **API aggregation** - This method requires some [pre-configuration](/docs/tasks/access-kubernetes-api/configure-aggregation-layer/){:target="_blank"} before you actually [set up a separate, extension API server](/docs/tasks/access-kubernetes-api/setup-extension-api-server/){:target="_blank"}.
|
||||||
|
|
||||||
|
Note that unlike standard Kubernetes objects, which rely on the built-in [`kube-controller-manager`](/docs/reference/generated/kube-controller-manager/){:target="_blank"}, you'll need to write and run your own [custom controllers](https://github.com/kubernetes/sample-controller){:target="_blank"}.
|
||||||
|
|
||||||
|
You may also find the following info helpful:
|
||||||
|
* [How to know if custom resources are right for your use case](/docs/concepts/api-extension/custom-resources/#should-i-use-a-configmap-or-a-custom-resource){:target="_blank"}
|
||||||
|
* [How to decide between CRDs and API aggregation](/docs/concepts/api-extension/custom-resources/#choosing-a-method-for-adding-custom-resources){:target="_blank"}
|
||||||
|
|
||||||
|
#### Service Catalog
|
||||||
|
|
||||||
|
If you want to consume or provide complete services (rather than individual resources), **{% glossary_tooltip text="Service Catalog" term_id="service-catalog" %}** provides a [specification](https://github.com/openservicebrokerapi/servicebroker){:target="_blank"} for doing so. These services are registered using {% glossary_tooltip text="Service Brokers" term_id="service-broker" %} (see [some examples](https://github.com/openservicebrokerapi/servicebroker/blob/master/gettingStarted.md#example-service-brokers){:target="_blank"}).
|
||||||
|
|
||||||
|
If you do not have a {% glossary_tooltip text="cluster operator" term_id="cluster-operator" %} to manage the installation of Service Catalog, you can do so using [Helm](/docs/tasks/service-catalog/install-service-catalog-using-helm/){:target="_blank"} or an [installer binary](/docs/tasks/service-catalog/install-service-catalog-using-sc/){:target="_blank"}.
|
||||||
|
|
||||||
|
|
||||||
|
## Explore additional resources
|
||||||
|
|
||||||
|
#### References
|
||||||
|
|
||||||
|
The following topics are also useful for building more complex applications:
|
||||||
|
* [Other points of extensibility within Kubernetes](/docs/concepts/overview/extending/){:target="_blank"} - A conceptual overview of where you can hook into the Kubernetes architecture.
|
||||||
|
* [Kubernetes Client Libraries](/docs/reference/client-libraries/){:target="_blank"} - Useful for building apps that need to interact heavily with the Kubernetes API.
|
||||||
|
|
||||||
|
#### What's next
|
||||||
|
Congrats on completing the Application Developer user journey! You've covered the majority of features that Kubernetes has to offer. What now?
|
||||||
|
|
||||||
|
* If you'd like to suggest new features or keep up with the latest developments around Kubernetes app development, consider joining a {% glossary_tooltip term_id="sig" %} such as [SIG Apps](https://github.com/kubernetes/community/tree/master/sig-apps){:target="_blank"}.
|
||||||
|
|
||||||
|
* If you are interested in learning more about the inner workings of Kubernetes (e.g. networking), consider checking out the [Cluster Operator journey](/docs/user-journeys/users/cluster-operator/foundational/){:target="_blank"}.
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% include templates/user-journey-content.md %}
|
|
@ -0,0 +1,232 @@
|
||||||
|
---
|
||||||
|
approvers:
|
||||||
|
- chenopis
|
||||||
|
layout: docsportal
|
||||||
|
css: /css/style_user_journeys.css, https://fonts.googleapis.com/icon?family=Material+Icons
|
||||||
|
js: https://use.fontawesome.com/4bcc658a89.js, https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js
|
||||||
|
title: Foundational
|
||||||
|
track: "USERS › APPLICATION DEVELOPER › FOUNDATIONAL"
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
If you're a developer looking to run applications on Kubernetes, this page and its linked topics can help you get started with the fundamentals. Though this page primarily describes development workflows, [the subsequent page in the series](/docs/home/?path=users&persona=app-developer&level=intermediate){:target="_blank"} cover more advanced, production setups.
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
**A quick note**<br>This app developer "user journey" is *not* a comprehensive overview of Kubernetes. It focuses more on *what* you develop, test, and deploy to Kubernetes, rather than *how* the underlying infrastructure works.<br><br>Though it's possible for a single person to manage both, in many organizations, it’s common to assign the latter to a dedicated {% glossary_tooltip text="cluster operator" term_id="cluster-operator" %}.
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
## Get started with a cluster
|
||||||
|
|
||||||
|
#### Web-based Environment
|
||||||
|
|
||||||
|
If you're brand new to Kubernetes and simply want to experiment without setting up a full development environment, *web-based environments* are a good place to start:
|
||||||
|
|
||||||
|
* [Kubernetes Basics](/docs/tutorials/kubernetes-basics/#basics-modules){:target="_blank"} - Introduces you to six common Kubernetes workflows. Each section walks you through browser-based, interactive exercises complete with their own Kubernetes environment.
|
||||||
|
|
||||||
|
* [Katacoda](https://www.katacoda.com/courses/kubernetes/playground){:target="_blank"} - The playground equivalent of the environment used in *Kubernetes Basics* above. Katacoda also provides [more advanced tutorials](https://www.katacoda.com/courses/kubernetes/){:target="_blank"}, such as "Liveness and Readiness Healthchecks".
|
||||||
|
|
||||||
|
|
||||||
|
* [Play with Kubernetes](http://labs.play-with-k8s.com/){:target="_blank"} - A less structured environment than the *Katacoda* playground, for those who are more comfortable with Kubernetes concepts and want to explore further. It supports the ability to spin up multiple nodes.
|
||||||
|
|
||||||
|
|
||||||
|
#### Minikube (Recommended)
|
||||||
|
|
||||||
|
Web-based environments are easy to access, but are not persistent. If you want to continue exploring Kubernetes in a workspace that you can come back to and change, *Minikube* is a good option.
|
||||||
|
|
||||||
|
Minikube can be installed locally, and runs a simple, single-node Kubernetes cluster inside a virtual machine (VM). This cluster is fully functioning and contains all core Kubernetes components. Many developers have found this sufficient for local application development.
|
||||||
|
|
||||||
|
* [Install Minikube](/docs/tasks/tools/install-minikube/){:target="_blank"}.
|
||||||
|
|
||||||
|
* [Install kubectl](/docs/tasks/tools/install-kubectl/){:target="_blank"}. ({% glossary_tooltip text="What is kubectl?" term_id="kubectl" %})
|
||||||
|
|
||||||
|
* *(Optional)* [Install Docker](/docs/setup/independent/install-kubeadm/#installing-docker){:target="_blank"} if you plan to run your Minikube cluster as part of a local development environment.
|
||||||
|
|
||||||
|
Minikube includes a Docker daemon, but if you're developing applications locally, you'll want an independent Docker instance to support your workflow. This allows you to create {% glossary_tooltip text="containers" term_id="container" %} and push them to a container registry.
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
Version 1.12 is recommended for full compatibility with Kubernetes, but a few other versions are tested and known to work.
|
||||||
|
|
||||||
|
|
||||||
|
You can get basic information about your cluster with the commands `kubectl cluster-info` and `kubectl get nodes`. However, to get a good idea of what's really going on, you need to deploy an application to your cluster. This is covered in the next section.
|
||||||
|
|
||||||
|
## Deploy an application
|
||||||
|
|
||||||
|
#### Basic Workloads
|
||||||
|
|
||||||
|
The following examples demonstrate the fundamentals of deploying Kubernetes apps:
|
||||||
|
* **Stateless Apps**: [Deploy a simple nginx server](/docs/tasks/run-application/run-stateless-application-deployment/){:target="_blank"}.
|
||||||
|
|
||||||
|
* **Stateful Apps**: [Deploy a MySQL database](/docs/tasks/run-application/run-single-instance-stateful-application/){:target="_blank"}.
|
||||||
|
|
||||||
|
Through these deployment tasks, you'll gain familiarity with the following:
|
||||||
|
* General concepts
|
||||||
|
|
||||||
|
* **Configuration files** - Written in YAML or JSON, these files describe the desired state of your application in terms of Kubernetes API objects. A file can include one or more API object descriptions (*manifests*). (See [the example YAML](/docs/tasks/run-application/run-stateless-application-deployment/#creating-and-exploring-an-nginx-deployment) from the stateless app).
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="Pods" term_id="pod" %}** - This is the basic unit for all of the workloads you run on Kubernetes. These workloads, such as *Deployments* and *Jobs*, are composed of one or more Pods. To learn more, check out [this explanation of Pods and Nodes](/docs/tutorials/kubernetes-basics/explore-intro/){:target="_blank"}.
|
||||||
|
|
||||||
|
* Common workload objects
|
||||||
|
* **{% glossary_tooltip text="Deployment" term_id="deployment" %}** - The most common way of running *X* copies (Pods) of your application. Supports rolling updates to your container images.
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="Service" term_id="deployment" %}** - By itself, a Deployment can't receive traffic. Setting up a Service is one of the simplest ways to configure a Deployment to receive and loadbalance requests. Depending on the `type` of Service used, these requests can come from external client apps or be limited to apps within the same cluster. A Service is tied to a specific Deployment using {% glossary_tooltip text="label" term_id="labels" %} selection.
|
||||||
|
|
||||||
|
The subsequent topics are also useful to know for basic application deployment.
|
||||||
|
|
||||||
|
#### Metadata
|
||||||
|
|
||||||
|
You can also specify custom information about your Kubernetes API objects by attaching key/value fields. Kubernetes provides two ways of doing this:
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="Labels" term_id="labels" %}** - Identifying metadata that you can use to sort and select sets of API objects. Labels have many applications, including the following:
|
||||||
|
|
||||||
|
* *To keep the right number of replicas (Pods) running in a Deployment.* The specified label (`app: nginx` in the [stateless app example](/docs/tasks/run-application/run-stateless-application-deployment/#creating-and-exploring-an-nginx-deployment){:target="_blank"}) is used to stamp the Deployment's newly created Pods (as the value of the `spec.template.labels` configuration field), and to query which Pods it already manages (as the value of `spec.selector.matchLabels`).
|
||||||
|
|
||||||
|
* *To tie a Service to a Deployment* using the `selector` field, which is demonstrated in the [stateful app example](/docs/tasks/run-application/run-single-instance-stateful-application/#deploy-mysql){:target="_blank"}.
|
||||||
|
|
||||||
|
* *To look for specific subset of Kubernetes objects, when you are using {% glossary_tooltip text="kubectl" term_id="kubectl" %}.* For instance, the command `kubectl get deployments --selector=app=nginx` only displays Deployments from the nginx app.
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="Annotations" term_id="annotation" %}** - Nonidentifying metadata that you can attach to API objects, usually if you don't intend to use them for sorting purposes. These often serve as supplementary data about an app's deployment, such as Git SHAs, PR numbers, or URL pointers to observability dashboards.
|
||||||
|
|
||||||
|
|
||||||
|
#### Storage
|
||||||
|
|
||||||
|
You'll also want to think about storage. Kubernetes provides different types of storage API objects for different storage needs:
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="Volumes" term_id="volume" %}** - Let you define storage for your cluster that is tied to the lifecycle of a Pod. It is therefore more persistent than container storage. Learn [how to configure volume storage](/docs/tasks/configure-pod-container/configure-volume-storage/){:target="_blank"}, or [read more about about volume storage](/docs/concepts/storage/volumes/){:target="_blank"}.
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="PersistentVolumes" term_id="persistent-volume" %}** and **{% glossary_tooltip text="PersistentVolumeClaims" term_id="persistent-volume-claim" %}** - Let you define storage at the cluster level. Typically a cluster operator defines the PersistentVolume objects for the cluster, and cluster users (application developers, you) define the PersistentVolumeClaim objects that your application requires. Learn [how to set up persistent storage for your cluster](/docs/tasks/configure-pod-container/configure-persistent-volume-storage/){:target="_blank"} or [read more about persistent volumes](/docs/concepts/storage/persistent-volumes/){:target="_blank"}.
|
||||||
|
|
||||||
|
#### Configuration
|
||||||
|
|
||||||
|
To avoid having to unnecessarily rebuild your container images, you should decouple your application's *configuration data* from the code required to run it. There are a couple ways of doing this, which you should choose according to your use case:
|
||||||
|
|
||||||
|
<!-- Using HTML tables because the glossary_tooltip isn't compatible with the Markdown approach -->
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Approach</th>
|
||||||
|
<th>Type of Data</th>
|
||||||
|
<th>How it's mounted</th>
|
||||||
|
<th>Example</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tr>
|
||||||
|
<td><a href="/docs/tasks/inject-data-application/define-environment-variable-container/">Using a manifest's container definition</a></td>
|
||||||
|
<td>Non-confidential</td>
|
||||||
|
<td>Environment variable</td>
|
||||||
|
<td>Command-line flag</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Using <b>{% glossary_tooltip text="ConfigMaps" term_id="configmap" %}</b></td>
|
||||||
|
<td>Non-confidential</td>
|
||||||
|
<td>Environment variable OR local file</td>
|
||||||
|
<td>nginx configuration</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Using <b>{% glossary_tooltip text="Secrets" term_id="secret" %}</b></td>
|
||||||
|
<td>Confidential</td>
|
||||||
|
<td>Environment variable OR local file</td>
|
||||||
|
<td>Database credentials</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
If you have any data that you want to keep private, you should be using a Secret. Otherwise there is nothing stopping that data from being exposed to malicious users.
|
||||||
|
|
||||||
|
## Understand basic Kubernetes architecture
|
||||||
|
|
||||||
|
As an app developer, you don't need to know everything about the inner workings of Kubernetes, but you may find it helpful to understand it at a high level.
|
||||||
|
|
||||||
|
#### What Kubernetes offers
|
||||||
|
|
||||||
|
Say that your team is deploying an ordinary Rails application. You've run some calculations and determined that you need five instances of your app running at any given time, in order to handle external traffic.
|
||||||
|
|
||||||
|
If you're not running Kubernetes or a similar automated system, you might find the following scenario familiar:
|
||||||
|
|
||||||
|
<div class="emphasize-box" markdown="1">
|
||||||
|
|
||||||
|
1. One instance of your app (a complete machine instance or just a container) goes down.
|
||||||
|
2. Because your team has monitoring set up, this pages the person on call.
|
||||||
|
3. The on-call person has to go in, investigate, and manually spin up a new instance.
|
||||||
|
4. Depending how your team handles DNS/networking, the on-call person may also need to also update the service discovery mechanism to point at the IP of the new Rails instance rather than the old.
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
This process can be tedious and also inconvenient, especially if (2) happens in the early hours of the morning!
|
||||||
|
|
||||||
|
**If you have Kubernetes set up, however, manual intervention is not as necessary.** The Kubernetes [control plane](/docs/concepts/overview/components/#master-components){:target="_blank"}, which runs on your cluster's master node, will gracefully handle (3) and (4) on your behalf. As a a result, Kubernetes is often referred to as a *self-healing* system.
|
||||||
|
|
||||||
|
There are two key parts of the control plane that facilitate this behavior: the *Kubernetes API server* and the *Controllers*.
|
||||||
|
|
||||||
|
#### Kubernetes API Server
|
||||||
|
|
||||||
|
For Kubernetes to be useful, it needs to know *what* sort of cluster state you want it to maintain. Your YAML of JSON *configuration files* declare this desired state in terms of one or more API objects, such as {% glossary_tooltip text="Deployments" term_id="deployment" %}. To make updates to your cluster's state, you submit these files to the {% glossary_tooltip text="Kubernetes API" term_id="kubernetes-api" %} server (`kube-apiserver`).
|
||||||
|
|
||||||
|
Examples of state include but are not limited to the following:
|
||||||
|
|
||||||
|
* The applications or other workloads to run
|
||||||
|
* The container images for your applications and workloads
|
||||||
|
* Allocation of network and disk resources
|
||||||
|
|
||||||
|
Note that the API server is just the gateway, and that object data is actually stored in a highly available datastore called [*etcd*](https://github.com/coreos/etcd){:target="_blank"}. For most intents and purposes, though, you can focus on the API server. Most reads and writes to cluster state take place as API requests.
|
||||||
|
|
||||||
|
You can read more about the Kubernetes API [here](/docs/concepts/overview/working-with-objects/kubernetes-objects/){:target="_blank"}.
|
||||||
|
|
||||||
|
#### Controllers
|
||||||
|
|
||||||
|
Once you’ve declared your desired state through the Kubernetes API, the *controllers* work to make the cluster’s current state match this desired state.
|
||||||
|
|
||||||
|
The standard controller processes are [`kube-controller-manager`](/docs/reference/generated/kube-controller-manager/){:target="_blank"} and [`cloud-controller-manager`](/docs/concepts/overview/components/#cloud-controller-manager){:target="_blank"}, but you can also write your own controllers as well.
|
||||||
|
|
||||||
|
All of these controllers implement a *control loop*. For simplicity, you can think of this as the following:
|
||||||
|
|
||||||
|
<div class="emphasize-box" markdown="1">
|
||||||
|
1. What is the current state of the cluster (X)?
|
||||||
|
2. What is the desired state of the cluster (Y)?
|
||||||
|
3. X == Y ?
|
||||||
|
* `true` - Do nothing.
|
||||||
|
* `false` - Perform tasks to get to Y (such as starting or restarting containers,
|
||||||
|
or scaling the number of replicas of a given application).<br>
|
||||||
|
|
||||||
|
*(Return to 1)*
|
||||||
|
</div>
|
||||||
|
|
||||||
|
By continuously looping, these controllers ensure the cluster can pick up new updates and avoid drifting from the desired state. These ideas are covered in more detail [here](https://kubernetes.io/docs/concepts/){:target="_blank"}.
|
||||||
|
|
||||||
|
## Additional resources
|
||||||
|
|
||||||
|
The Kubernetes documentation is rich in detail. Here's a curated list of resources to help you start digging deeper.
|
||||||
|
|
||||||
|
### Basic concepts
|
||||||
|
|
||||||
|
* [More about the components that run Kubernetes](/docs/concepts/overview/components/){:target="_blank"}
|
||||||
|
|
||||||
|
* [Understanding Kubernetes objects](/docs/concepts/overview/working-with-objects/kubernetes-objects/){:target="_blank"}
|
||||||
|
|
||||||
|
* [More about Node objects](/docs/concepts/architecture/nodes/){:target="_blank"}
|
||||||
|
|
||||||
|
* [More about Pod objects](/docs/concepts/workloads/pods/pod-overview/){:target="_blank"}
|
||||||
|
|
||||||
|
### Tutorials
|
||||||
|
|
||||||
|
* [Kubernetes Basics](/docs/tutorials/kubernetes-basics/){:target="_blank"}
|
||||||
|
|
||||||
|
* [Hello Minikube](/docs/tutorials/stateless-application/hello-minikube/){:target="_blank"} *(Runs on Mac only)*
|
||||||
|
|
||||||
|
* [Kubernetes 101](/docs/user-guide/walkthrough/){:target="_blank"}
|
||||||
|
|
||||||
|
* [Kubernetes 201](/docs/user-guide/walkthrough/k8s201/){:target="_blank"}
|
||||||
|
|
||||||
|
* [Kubernetes object management](/docs/tutorials/object-management-kubectl/object-management/){:target="_blank"}
|
||||||
|
|
||||||
|
### What's next
|
||||||
|
If you feel fairly comfortable with the topics on this page and want to learn more, check out the following user journeys:
|
||||||
|
* [Intermediate App Developer](/docs/user-journeys/users/application-developer/intermediate/){:target="_blank"} - Dive deeper, with the next level of this journey.
|
||||||
|
* [Foundational Cluster Operator](/docs/user-journeys/users/cluster-operator/foundational/){:target="_blank"} - Build breadth, by exploring other journeys.
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% include templates/user-journey-content.md %}
|
|
@ -0,0 +1,157 @@
|
||||||
|
---
|
||||||
|
approvers:
|
||||||
|
- chenopis
|
||||||
|
layout: docsportal
|
||||||
|
css: /css/style_user_journeys.css, https://fonts.googleapis.com/icon?family=Material+Icons
|
||||||
|
js: https://use.fontawesome.com/4bcc658a89.js, https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js
|
||||||
|
title: Intermediate
|
||||||
|
track: "USERS › APPLICATION DEVELOPER › INTERMEDIATE"
|
||||||
|
---
|
||||||
|
{% assign reference_docs_url = '/docs/reference/generated/kubernetes-api/' | append: site.latest %}
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
This page assumes that you've experimented with Kubernetes before. At this point, you should have basic experience interacting with a Kubernetes cluster (locally with Minikube, or elsewhere), and using API objects like Deployments to run your applications.<br><br>If not, you should review the [Beginner App Developer](/docs/user-journeys/users/application-developer/foundational/){:target="_blank"} topics first.
|
||||||
|
|
||||||
|
After checking out the current page and its linked sections, you should have a better understanding of the following:
|
||||||
|
* Additional Kubernetes workload patterns, beyond Deployments
|
||||||
|
* What it takes to make a Kubernetes application production-ready
|
||||||
|
* Community tools that can improve your development workflow
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
|
||||||
|
## Learn additional workload patterns
|
||||||
|
|
||||||
|
As your Kubernetes use cases become more complex, you may find it helpful to familiarize yourself with more of the toolkit that Kubernetes provides. [Basic workload](/docs/user-journeys/users/application-developer/foundational/#section-2){:target="_blank"} objects like {% glossary_tooltip text="Deployments" term_id="deployment" %} make it straightforward to run, update, and scale applications, but they are not ideal for every scenario.
|
||||||
|
|
||||||
|
The following API objects provide functionality for additional workload types, whether they are *persistent* or *terminating*.
|
||||||
|
|
||||||
|
#### Persistent Workloads
|
||||||
|
|
||||||
|
Like Deployments, these API objects run indefinitely on a cluster until they are manually terminated. They are best for long-running applications.
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="StatefulSets" term_id="statefulset" %}** - Like Deployments, StatefulSets allow you to specify that a certain number of replicas should be running for your application.
|
||||||
|
|
||||||
|
{: .note }
|
||||||
|
It's misleading to say that Deployments can't handle stateful workloads. Using {% glossary_tooltip text="PersistentVolumes" term_id="persistent-volume" %}, you can persist data beyond the lifecycle of any individual Pod in your Deployment.
|
||||||
|
|
||||||
|
However, StatefulSets can provide stronger guarantees about "recovery" behavior than Deployments. StatefulSets maintain a sticky, stable identity for their Pods. The following table provides some concrete examples of what this might look like:
|
||||||
|
|
||||||
|
| | Deployment | StatefulSet |
|
||||||
|
|---|---|---|
|
||||||
|
| **Example Pod name** | `example-b1c4` | `example-0` |
|
||||||
|
| **When a Pod dies** | Reschedule on *any* node, with new name `example-a51z` | Reschedule on same node, as `example-0` |
|
||||||
|
| **When a node becomes unreachable** | Pod(s) are scheduled onto new node, with new names | Pod(s) are marked as "Unknown", and aren't rescheduled unless the Node object is forcefully deleted |
|
||||||
|
|
||||||
|
In practice, this means that StatefulSets are best suited for scenarios where replicas (Pods) need to coordinate their workloads in a strongly consistent manner. Guaranteeing an identity for each Pod helps avoid [split brain](https://en.wikipedia.org/wiki/Split-brain_(computing)){:target="_blank"} side-effects in the case when a node becomes unreachable ([network partition](https://en.wikipedia.org/wiki/Network_partition){:target="_blank"}). This makes StatefulSets a great fit for distributed datastores like Cassandra or Elasticsearch.
|
||||||
|
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="DaemonSets" term_id="daemonset" %}** - DaemonSets run continuously on every node in your cluster, even as nodes are added or swapped in. This guarantee is particularly useful for setting up global behavior across your cluster, such as:
|
||||||
|
|
||||||
|
* Logging and monitoring, from applications like `fluentd`
|
||||||
|
* Network proxy or [service mesh](https://www.linux.com/news/whats-service-mesh-and-why-do-i-need-one){:target="_blank"}
|
||||||
|
|
||||||
|
|
||||||
|
#### Terminating Workloads
|
||||||
|
|
||||||
|
In contrast to Deployments, these API objects are finite. They stop once the specified number of Pods have completed successfully.
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="Jobs" term_id="job" %}** - You can use these for one-off tasks like running a script or setting up a work queue. These tasks can be executed sequentially or in parallel. These tasks should be relatively independent, as Jobs do not support closely communicating parallel processes. [Read more about Job patterns](/docs/concepts/workloads/controllers/jobs-run-to-completion/#job-patterns){:target="_blank"}.
|
||||||
|
|
||||||
|
* **{% glossary_tooltip text="CronJobs" term_id="cronjob" %}** - These are similar to Jobs, but allow you to schedule their execution for a specific time or for periodic recurrence. You might use CronJobs to send reminder emails or to run backup jobs. They are set up with a similar syntax as *crontab*.
|
||||||
|
|
||||||
|
#### Other Resources
|
||||||
|
|
||||||
|
For more info, you can check out [a list of additional Kubernetes resource types](/docs/reference/kubectl/overview/#resource-types){:target="_blank"} as well as the [API reference docs]({{ reference_docs_url }}){:target="_blank"}.
|
||||||
|
|
||||||
|
There may be additional features not mentioned here that you may find useful, which are covered in the [full Kubernetes documentation](/docs/home/?path=browse){:target="_blank"}.
|
||||||
|
|
||||||
|
## Deploy a production-ready workload
|
||||||
|
|
||||||
|
The beginner tutorials on this site, such as the [Guestbook app](/docs/tutorials/stateless-application/guestbook/){:target="_blank"}, are geared towards getting workloads up and running on your cluster. This prototyping is great for building your intuition around Kubernetes! However, in order to reliably and securely promote your workloads to production, you'll need to follow some additional best practices.
|
||||||
|
|
||||||
|
#### Declarative configuration
|
||||||
|
|
||||||
|
You are likely interacting with your Kubernetes cluster via {% glossary_tooltip text="kubectl" term_id="kubectl" %}. kubectl can be used to debug the current state of your cluster (such as checking the number of nodes), or to modify live Kubernetes objects (such as updating a workload's replica count with `kubectl scale`).
|
||||||
|
|
||||||
|
When using kubectl to update your Kubernetes objects, it's important to be aware that different commands correspond to different approaches:
|
||||||
|
* [Purely imperative](/docs/tutorials/object-management-kubectl/imperative-object-management-command/){:target="_blank"}
|
||||||
|
* [Imperative with local configuration files](/docs/tutorials/object-management-kubectl/imperative-object-management-configuration/){:target="_blank"} (typically YAML)
|
||||||
|
* [Declarative with local configuration files](/docs/tutorials/object-management-kubectl/declarative-object-management-configuration/){:target="_blank"} (typically YAML)
|
||||||
|
|
||||||
|
There are pros and cons to each approach, though the declarative approach (such as `kubectl apply -f`) may be most helpful in production. With this approach, you rely on local YAML files as the source of truth about your desired state. This enables you to version control your configuration, which is helpful for code reviews and audit tracking.
|
||||||
|
|
||||||
|
For additional configuration best practices, familiarize yourself with [this guide](/docs/concepts/configuration/overview/){:target="_blank"}.
|
||||||
|
|
||||||
|
#### Security
|
||||||
|
|
||||||
|
You may be familiar with the *principle of least privilege*---if you are too generous with permissions when writing or using software, the negative effects of a compromise can escalate out of control. Would you be cautious handing out `sudo` privileges to software on your OS? If so, you should be just as careful when granting your workload permissions to the {% glossary_tooltip text="Kuberetes API" term_id="kubernetes-api" %} server! The API server is the gateway for your cluster's source of truth; it provides endpoints to read or modify cluster state.
|
||||||
|
|
||||||
|
You (or your {% glossary_tooltip text="cluster operator" term_id="cluster-operator" %}) can lock down API access with the following:
|
||||||
|
* **{% glossary_tooltip text="ServiceAccounts" term_id="service-account" %}** - An "identity" that your Pods can be tied to
|
||||||
|
* **{% glossary_tooltip text="RBAC" term_id="rbac" %}** - One way of granting your ServiceAccount explicit permissions
|
||||||
|
|
||||||
|
For even more comprehensive reading about security best practices, consider checking out the following topics:
|
||||||
|
* [Authentication](/docs/admin/authentication/){:target="_blank"} (Is the user who they say they are?)
|
||||||
|
* [Authorization](/docs/admin/authorization/){:target="_blank"} (Does the user actually have permissions to do what they're asking?)
|
||||||
|
|
||||||
|
#### Resource isolation and management
|
||||||
|
|
||||||
|
If your workloads are operating in a *multi-tenant* environment with multiple teams or projects, your container(s) are not necessarily running alone on their node(s). They are sharing node resources with other containers which you do not own.
|
||||||
|
|
||||||
|
Even if your cluster operator is managing the cluster on your behalf, it is helpful to be aware of the following:
|
||||||
|
* **{% glossary_tooltip text="Namespaces" term_id="namespace" %}**, used for isolation
|
||||||
|
* **[Resource quotas](/docs/concepts/policy/resource-quotas/){:target="_blank"}**, which affect what your team's workloads can use
|
||||||
|
* **[Memory](/docs/tasks/configure-pod-container/assign-memory-resource/){:target="_blank"} and [CPU](/docs/tasks/configure-pod-container/assign-cpu-resource/){:target="_blank"} requests**, for a given Pod or container
|
||||||
|
* **[Monitoring](/docs/tasks/debug-application-cluster/resource-usage-monitoring/){:target="_blank"}**, both on the cluster level and the app level
|
||||||
|
|
||||||
|
This list may not be completely comprehensive, but many teams have existing processes that take care of all this. If this is not the case, you'll find the Kubernetes documentation fairly rich in detail.
|
||||||
|
|
||||||
|
## Improve your dev workflow with tooling
|
||||||
|
|
||||||
|
As an app developer, you'll likely encounter the following tools in your workflow.
|
||||||
|
|
||||||
|
#### kubectl
|
||||||
|
|
||||||
|
`kubectl` is a command-line tool that allows you to easily read or modify your Kubernetes cluster. It provides convenient, short commands for common operations like scaling app instances and getting node info. How does kubectl do this? It's basically just a user-friendly wrapper for making API requests. It's written using [client-go](https://github.com/kubernetes/client-go/#client-go){:target="_blank"}, the Go library for the Kubernetes API.
|
||||||
|
|
||||||
|
To learn about the most commonly used kubectl commands, check out the [kubectl cheatsheet](/docs/reference/kubectl/cheatsheet/){:target="_blank"}. It explains topics such as the following:
|
||||||
|
* [kubeconfig files](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/){:target="_blank"} - Your kubeconfig file tells kubectl what cluster to talk to, and can reference multiple clusters (such as dev and prod).
|
||||||
|
* [The various output formats available](/docs/reference/kubectl/cheatsheet/#formatting-output){:target="_blank"} - This is useful to know when you are using `kubectl get` to list information about certain API objects.
|
||||||
|
|
||||||
|
* [The JSONPath output format](/docs/reference/kubectl/jsonpath/){:target="_blank"} - This is related to the output formats above. JSONPath is especially useful for parsing specific subfields out of `kubectl get` output (such as the URL of a {% glossary_tooltip text="Service" term_id="service" %}).
|
||||||
|
|
||||||
|
* [`kubectl run` vs `kubectl apply`](/docs/reference/kubectl/conventions/){:target="_blank"} - This ties into the [declarative configuration](#declarative-configuration) discussion in the previous section.
|
||||||
|
|
||||||
|
For the full list of kubectl commands and their options, check out [the reference guide](/docs/reference/generated/kubectl/kubectl-commands){:target="_blank"}.
|
||||||
|
|
||||||
|
#### Helm
|
||||||
|
|
||||||
|
To leverage pre-packaged configurations from the community, you can use **{% glossary_tooltip text="Helm charts" term_id="helm-chart" %}**.
|
||||||
|
|
||||||
|
Helm charts package up YAML configurations for specific apps like Jenkins and Postgres. You can then install and run these apps on your cluster with minimal extra configuration. This approach makes the most sense for "off-the-shelf" components which do not require much custom implementation logic.
|
||||||
|
|
||||||
|
For writing your own Kubernetes app configurations, there is a [thriving ecosystem of tools](https://docs.google.com/a/heptio.com/spreadsheets/d/1FCgqz1Ci7_VCz_wdh8vBitZ3giBtac_H8SBw4uxnrsE/edit?usp=drive_web){:target="_blank"} that you may find useful.
|
||||||
|
|
||||||
|
## Explore additional resources
|
||||||
|
|
||||||
|
#### References
|
||||||
|
Now that you're fairly familiar with Kubernetes, you may find it useful to browse the following reference pages. Doing so provides a high level view of what other features may exist:
|
||||||
|
|
||||||
|
* [Commonly used `kubectl` commands](/docs/reference/kubectl/cheatsheet/){:target="_blank"}
|
||||||
|
* [Kubernetes API reference]({{ reference_docs_url }}){:target="_blank"}
|
||||||
|
* [Standardized Glossary](/docs/reference/glossary/){:target="_blank"}
|
||||||
|
|
||||||
|
In addition, [the Kubernetes blog](http://blog.kubernetes.io/){:target="_blank"} often has helpful posts on Kubernetes design patterns and case studies.
|
||||||
|
|
||||||
|
#### What's next
|
||||||
|
If you feel fairly comfortable with the topics on this page and want to learn more, check out the following user journeys:
|
||||||
|
* [Advanced App Developer](/docs/user-journeys/users/application-developer/advanced/){:target="_blank"} - Dive deeper, with the next level of this journey.
|
||||||
|
* [Foundational Cluster Operator](/docs/user-journeys/users/cluster-operator/foundational/){:target="_blank"} - Build breadth, by exploring other journeys.
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% include templates/user-journey-content.md %}
|
|
@ -0,0 +1,84 @@
|
||||||
|
---
|
||||||
|
approvers:
|
||||||
|
- chenopis
|
||||||
|
layout: docsportal
|
||||||
|
css: /css/style_user_journeys.css, https://fonts.googleapis.com/icon?family=Material+Icons
|
||||||
|
js: https://use.fontawesome.com/4bcc658a89.js, https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js
|
||||||
|
title: Advanced Topics
|
||||||
|
track: "USERS > CLUSTER OPERATOR > ADVANCED"
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Advanced
|
||||||
|
Federated clusters
|
||||||
|
Multi-cluster access
|
||||||
|
Custom controllers, custom resource definitions
|
||||||
|
Network-level service management (ISTIO)
|
||||||
|
-->
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
## Setup federated clusters
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
## Deploy an application with advanced features
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
## Explore advanced topics
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
## Additional resources
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean id felis non enim faucibus lacinia. Aliquam massa mauris, interdum a ex ut, sagittis rutrum nulla. In pellentesque est at molestie fringilla. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec eu mi at velit lacinia venenatis ac nec sem. In volutpat pellentesque dui ut commodo. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Duis sollicitudin eleifend felis non facilisis. Pellentesque leo urna, congue id auctor non, varius a nunc. Duis ultrices, odio ut hendrerit suscipit, nisi mauris dignissim mauris, nec bibendum ante neque ut augue. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam condimentum libero sit amet rutrum fermentum. Proin posuere condimentum odio. Aenean volutpat, ex vel tincidunt tincidunt, massa odio condimentum lectus, vel iaculis libero dolor in nisi.
|
||||||
|
|
||||||
|
Curabitur bibendum tempor mi, vel lacinia nisi vulputate ac. Nulla dignissim consectetur nisl nec tincidunt. Etiam pharetra facilisis sapien, non gravida velit fermentum sed. Ut ac ultrices nunc, in vestibulum urna. Suspendisse accumsan euismod felis, sit amet rhoncus neque volutpat luctus. Aliquam tincidunt pellentesque mauris, sed tempus diam. Mauris in elit eget justo tempor suscipit.
|
||||||
|
|
||||||
|
Aenean suscipit arcu ac leo tincidunt tempus. Donec maximus tellus libero, ac ullamcorper magna lobortis ac. Integer mollis nisl vitae magna gravida, nec ornare ex consectetur. Sed mattis tincidunt nisi, at consequat tellus malesuada non. Integer vel semper nisi, ut fringilla velit. Nam felis ex, congue non dui vitae, sollicitudin convallis turpis. Phasellus porttitor maximus turpis, in varius nibh fermentum aliquam. Cras finibus lacus non diam porttitor porttitor. Nulla fringilla sagittis nibh nec condimentum. Duis egestas mauris nec dolor hendrerit ullamcorper sit amet in mi. Phasellus sollicitudin justo diam.
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% include templates/user-journey-content.md %}
|
|
@ -0,0 +1,95 @@
|
||||||
|
---
|
||||||
|
approvers:
|
||||||
|
- chenopis
|
||||||
|
layout: docsportal
|
||||||
|
css: /css/style_user_journeys.css, https://fonts.googleapis.com/icon?family=Material+Icons
|
||||||
|
js: https://use.fontawesome.com/4bcc658a89.js, https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js
|
||||||
|
title: Foundational
|
||||||
|
track: "USERS › CLUSTER OPERATOR › FOUNDATIONAL"
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
If you want to learn how to get started managing and operating a Kubernetes cluster, this page and the linked topics will introduce you to foundational concepts and tasks.
|
||||||
|
The concepts introduce you to a Kubernetes cluster and key concepts to understand and manage it, favoring focusing on the cluster itself over the software running within the cluster.
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
<!-- Foundational
|
||||||
|
Nodes, Pods, Networks, Deployments, Services, ConfigMaps, Secrets
|
||||||
|
Labels, Selectors, Annotations
|
||||||
|
Metrics
|
||||||
|
-->
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
|
||||||
|
## Get an overview of Kubernetes
|
||||||
|
|
||||||
|
If you have not already done so, start your understanding by reading through [What is Kubernetes?](/docs/concepts/overview/what-is-kubernetes/), which will introduce you to a number of basic concepts and terms.
|
||||||
|
|
||||||
|
Kubernetes is quite flexible, and can a cluster can be run in a wide variety of places. You can interact with Kubernetes entirely on your own laptop or local development machine with it running within a virtual machine. Kubernetes can also run on virtual machines hosted either locally or in a cloud provider, and you can run a kubernetes cluster on bare metal.
|
||||||
|
|
||||||
|
A cluster is made up of one or more [Nodes](/docs/concepts/architecture/nodes/); where a node is a physical or virtual machine. If there are more than one node in your cluster, then each of the nodes are connected with a [cluster network](/docs/concepts/cluster-administration/networking/). Regardless of how many nodes, all Kubernetes clusters will generally have the same components, which are described in [Kubernetes Components](/docs/concepts/overview/components).
|
||||||
|
|
||||||
|
## Learn about Kubernetes basics
|
||||||
|
|
||||||
|
A good way to become familiar with how to manage and operate a Kubernetes cluster is by setting them up.
|
||||||
|
One of the most compact ways to experiment with a cluster is [Installing and using Minikube](/docs/tasks/tools/install-minikube/).
|
||||||
|
Minikube is a command line tool for setting up and running a single-node cluster within a virtual machine on your local laptop or development computer. Minikube is even available through your browser at the [Katacoda Kubernetes Playground](https://www.katacoda.com/courses/kubernetes/playground).
|
||||||
|
Katacoda provides a browser-based connection to a single-node cluster, using minikube behind the scenes, to support a number of tutorials to explore Kubernetes. You can also leverage the web-based [Play with Kubernetes](http://labs.play-with-k8s.com/) to the same ends - a temporary cluster to play with in on the web.
|
||||||
|
|
||||||
|
You interact with Kubernetes either through a dashboard, an API, or using a command-line tool (such as `kubectl`) that interacts with the Kubernetes API.
|
||||||
|
Be familiar with how to [Organizing Cluster Access](/docs/concepts/configuration/organize-cluster-access-kubeconfig/) with configuration files.
|
||||||
|
The Kubernetes API exposes a number of resources that provide the building blocks and abstractions that are used to run software on Kubernetes.
|
||||||
|
Learn more about these resources at [Understanding Kubernetes Objects](/docs/concepts/overview/kubernetes-objects)
|
||||||
|
These resources are covered in a number of articles within the Kubernetes documentation.
|
||||||
|
|
||||||
|
* [Pod Overview](/docs/concepts/workloads/pods/pod-overview/)
|
||||||
|
* [Pods](/docs/concepts/workloads/pods/pod/)
|
||||||
|
* [ReplicaSets](/docs/concepts/workloads/controllers/replicaset/)
|
||||||
|
* [Deployments](/docs/concepts/workloads/controllers/deployment/)
|
||||||
|
* [Garbage Collection](/docs/concepts/workloads/controllers/garbage-collection/)
|
||||||
|
* [Container Images](/docs/concepts/containers/images/)
|
||||||
|
* [Container Environment Variables](docs/concepts/containers/container-environment-variables/)
|
||||||
|
* [Labels and Selectors](/docs/concepts/overview/working-with-objects/labels/)
|
||||||
|
* [Namespaces](/docs/concepts/overview/working-with-objects/namespaces/)
|
||||||
|
* [Namespaces Walkthrough](/docs/tasks/administer-cluster/namespaces-walkthrough/)
|
||||||
|
* [Services](/docs/concepts/services-networking/service/)
|
||||||
|
* [Annotations](/docs/concepts/overview/working-with-objects/annotations/)
|
||||||
|
* [ConfigMaps](/docs/tasks/configure-pod-container/configmap/)
|
||||||
|
* [Secrets](/docs/concepts/configuration/secret/)
|
||||||
|
|
||||||
|
As a cluster operator you may not need to use all these resources although you should be familiar with them to understand how the cluster is working and being used.
|
||||||
|
There are a number of additional resources that you should be aware of, some listed under [Intermediate Resources](/docs/user-journeys/cluster-operator/intermediate#section-1).
|
||||||
|
You should also be familiar with [how to manage kubernetes resources](/docs/concepts/cluster-administration/manage-deployment/).
|
||||||
|
|
||||||
|
## Get information about my cluster
|
||||||
|
|
||||||
|
You can [access clusters using the cluster API](/docs/tasks/administer-cluster/access-cluster-api/).
|
||||||
|
If you are not already familiar, run through the tutorial to [view your cluster's Pods and Nodes](/docs/tutorials/kubernetes-basics/explore-intro/).
|
||||||
|
Using kubectl, you can retrieve information very quickly.
|
||||||
|
To get basic information about the nodes in your cluster run the command `kubectl get nodes`.
|
||||||
|
You can get more detailed information for the same nodes with the command `kubectl describe nodes`.
|
||||||
|
You can see the status of the core of kubernetes with the command `kubectl get componentstatuses`.
|
||||||
|
|
||||||
|
Some additional resources for getting information about your cluster and how it is operating include:
|
||||||
|
|
||||||
|
* [Tools for Monitoring Compute, Storage, and Network Resources](/docs/tasks/debug-application-cluster/resource-usage-monitoring/)
|
||||||
|
* [Core metrics pipeline](/docs/tasks/debug-application-cluster/core-metrics-pipeline/)
|
||||||
|
* [Metrics](/docs/concepts/cluster-administration/controller-metrics/)
|
||||||
|
|
||||||
|
## Explore additional resources
|
||||||
|
|
||||||
|
### Tutorials
|
||||||
|
|
||||||
|
* [Kubernetes Basics](/docs/tutorials/kubernetes-basics/)
|
||||||
|
* [Kubernetes 101](/docs/user-guide/walkthrough/) - kubectl command line interface and Pods
|
||||||
|
* [Kubernetes 201](/docs/user-guide/walkthrough/k8s201/) - labels, deployments, services, and health checking
|
||||||
|
* [Configuring Redis with a ConfigMap](/docs/tutorials/configuration/configure-redis-using-configmap/)
|
||||||
|
* Stateless Applications
|
||||||
|
* [Deploying PHP Guestbook with Redis](/docs/tutorials/stateless-application/guestbook/)
|
||||||
|
* [Expose an External IP address to access an application](/docs/tutorials/stateless-application/expose-external-ip-address/)
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% include templates/user-journey-content.md %}
|
|
@ -0,0 +1,108 @@
|
||||||
|
---
|
||||||
|
approvers:
|
||||||
|
- chenopis
|
||||||
|
layout: docsportal
|
||||||
|
css: /css/style_user_journeys.css, https://fonts.googleapis.com/icon?family=Material+Icons
|
||||||
|
js: https://use.fontawesome.com/4bcc658a89.js, https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js
|
||||||
|
title: Intermediate
|
||||||
|
track: "USERS > CLUSTER OPERATOR > INTERMEDIATE"
|
||||||
|
---
|
||||||
|
|
||||||
|
{% capture overview %}
|
||||||
|
|
||||||
|
If you're a cluster operator looking to expand your grasp of Kubernetes, this page and its linked topics extend the information provided on the [foundational cluster operator page](/docs/user-journeys/users/cluster-operator/foundational). Here we'll get you going on key Kubernetes tasks that you need to manage a complete production cluster.
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% capture body %}
|
||||||
|
|
||||||
|
## Work with Ingress, Networking, Storage, Workloads
|
||||||
|
|
||||||
|
Introductions to Kubernetes typically discuss simpler stateless applications. As you move into fuller dev, testing, and production environments, you need to consider more complex cases:
|
||||||
|
|
||||||
|
Communication: Ingress and Networking
|
||||||
|
|
||||||
|
* [Ingress](/docs/concepts/services-networking/ingress/)
|
||||||
|
|
||||||
|
Storage: Volumes and PersistentVolumes
|
||||||
|
|
||||||
|
* [Volumes](/docs/concepts/storage/volumes/)
|
||||||
|
* [Persistent Volumes](/docs/concepts/storage/persistent-volumes/)
|
||||||
|
|
||||||
|
Workloads
|
||||||
|
|
||||||
|
* [DaemonSets](/docs/concepts/workloads/controllers/daemonset/)
|
||||||
|
* [Stateful Sets](/docs/concepts/workloads/controllers/statefulset/)
|
||||||
|
* [Jobs](/docs/concepts/workloads/controllers/jobs-run-to-completion/)
|
||||||
|
* [CronJobs](/docs/concepts/workloads/controllers/cron-jobs/)
|
||||||
|
|
||||||
|
Pods
|
||||||
|
|
||||||
|
* [Pod Lifecycle](/docs/concepts/workloads/pods/pod-lifecycle/)
|
||||||
|
* [Init Containers](/docs/concepts/workloads/pods/init-containers/)
|
||||||
|
* [Pod Presets](/docs/concepts/workloads/pods/podpreset/)
|
||||||
|
* [Container Lifecycle Hooks](docs/concepts/containers/container-lifecycle-hooks/)
|
||||||
|
|
||||||
|
And how Pods work with scheduling, priority, disruptions:
|
||||||
|
|
||||||
|
* [Taints and Tolerations](/docs/concepts/configuration/taint-and-toleration/)
|
||||||
|
* [Pods and Priority](/docs/concepts/configuration/pod-priority-preemption/)
|
||||||
|
* [Disruptions](/docs/concepts/workloads/pods/disruptions/)
|
||||||
|
* [Assigning Pods to Nodes](docs/concepts/configuration/assign-pod-node/)
|
||||||
|
* [Managing compute resources for containers](docs/concepts/configuration/manage-compute-resources-container/)
|
||||||
|
* [Configuration best practices](docs/concepts/configuration/overview/)
|
||||||
|
|
||||||
|
## Implement security best practices
|
||||||
|
|
||||||
|
Securing your cluster includes work beyond the scope of Kubernetes itself. (TODO: identify major items)
|
||||||
|
|
||||||
|
In Kubernetes, you configure access control:
|
||||||
|
|
||||||
|
* [Controlling Access to the Kubernetes API](docs/admin/accessing-the-api/)
|
||||||
|
* [Authenticating](/docs/admin/authentication/)
|
||||||
|
* [Using Admission Controllers](/docs/admin/admission-controllers/)
|
||||||
|
|
||||||
|
You also configure authorization. That is, you determine not just how users and services authenticate to the API server, or whether they have access, but also what resources they have access to. Role-based access control (RBAC) is currently the recommended mechanism for controlling authorization to Kubernetes resources. Other authorization modes are available for more specific use cases.
|
||||||
|
|
||||||
|
* [Authorization Overview](/docs/admin/authorization/)
|
||||||
|
* [Using RBAC Authorization](/docs/admin/authorization/rbac/)
|
||||||
|
|
||||||
|
You should create Secrets to hold sensitive data such as passwords, tokens, or keys. Be aware, however, that there are limitations to the protections that a Secret can provide. See [the Risks section of the Secrets documentation](/docs/concepts/configuration/secret/#risks).
|
||||||
|
|
||||||
|
<!-- TODO: Other security content? -->
|
||||||
|
|
||||||
|
## Implement custom logging and monitoring
|
||||||
|
|
||||||
|
Monitoring the health and state of your cluster is important. Collecting metrics, logging, and providing access to that information are common needs. Kubernetes provides some basic logging structure, but you will almost certainly want to use additional tools to help aggregate and analyze log data.
|
||||||
|
|
||||||
|
Start with the [basics on Kubernetes logging](/docs/concepts/cluster-administration/logging/) to understand how containers do logging and common patterns. You will probably want to add something to gather and aggregate those logs. See the following topics:
|
||||||
|
|
||||||
|
* [Logging Using Elasticsearch and Kibana](/docs/tasks/debug-application-cluster/logging-elasticsearch-kibana/)
|
||||||
|
* [Logging Using Stackdriver](/docs/tasks/debug-application-cluster/logging-stackdriver/)
|
||||||
|
|
||||||
|
Like log aggregation, many clusters utilize additional software to help capture metrics and display them. There is an overview at of tools at [Tools for Monitoring Compute, Storage, and Network Resources](/docs/tasks/debug-application-cluster/resource-usage-monitoring/).
|
||||||
|
Kubernetes also supports a [core metrics pipeline](/docs/tasks/debug-application-cluster/core-metrics-pipeline/) which can be used by Horizontal Pod Autoscaler with custom metrics.
|
||||||
|
|
||||||
|
[Prometheus](https://prometheus.io/), which is another CNCF project, is a common choice to support capture and temporary collection of metrics. There are several options to installing Prometheus, including using the [stable/prometheus](https://github.com/kubernetes/charts/tree/master/stable/prometheus) [helm](https://helm.sh/) chart, and CoreOS provides a [prometheus operator](https://github.com/coreos/prometheus-operator) and [kube-prometheus](https://github.com/coreos/prometheus-operator/tree/master/contrib/kube-prometheus) which adds on Grafana dashboards and common configurations.
|
||||||
|
|
||||||
|
A common configuration on [minikube](https://github.com/kubernetes/minikube) and some kubernetes clusters used [Heapster](https://github.com/kubernetes/heapster)
|
||||||
|
[along with InfluxDB and Grafana](https://github.com/kubernetes/heapster/blob/master/docs/influxdb.md).
|
||||||
|
There is a [walkthrough of how to install this configuration in your cluster](https://blog.kublr.com/how-to-utilize-the-heapster-influxdb-grafana-stack-in-kubernetes-for-monitoring-pods-4a553f4d36c9).
|
||||||
|
As of Kubernetes 1.9, the [sig-instrumentation](https://github.com/kubernetes/community/tree/master/sig-instrumentation) team is shifting away from an all-inclusive monitoring pattern with heapster, described in [Prometheus vs. Heapster vs. Kubernetes Metrics APIs](https://brancz.com/2018/01/05/prometheus-vs-heapster-vs-kubernetes-metrics-apis/).
|
||||||
|
|
||||||
|
Hosted data analytics services such as [Datadog](https://docs.datadoghq.com/integrations/kubernetes/) also offer Kubernetes integration.
|
||||||
|
|
||||||
|
## Additional resources
|
||||||
|
|
||||||
|
Cluster Administration:
|
||||||
|
|
||||||
|
* [Troubleshoot Clusters](/docs/tasks/debug-application-cluster/debug-cluster/)
|
||||||
|
* [Debug Pods and Replication Controllers](/docs/tasks/debug-application-cluster/debug-pod-replication-controller/)
|
||||||
|
* [Debug Init Containers](/docs/tasks/debug-application-cluster/debug-init-containers/)
|
||||||
|
* [Debug Stateful Sets](/docs/tasks/debug-application-cluster/debug-stateful-set/)
|
||||||
|
* [Debug Applications](/docs/tasks/debug-application-cluster/debug-application/)
|
||||||
|
* [Using explorer to investigate your cluster](https://github.com/kubernetes/examples/blob/master/staging/explorer/README.md)
|
||||||
|
|
||||||
|
{% endcapture %}
|
||||||
|
|
||||||
|
{% include templates/user-journey-content.md %}
|
Binary file not shown.
After Width: | Height: | Size: 2.0 KiB |
|
@ -0,0 +1,312 @@
|
||||||
|
$( document ).ready(function() {
|
||||||
|
// UI defaults, used if page is loaded without other params
|
||||||
|
var defaults = {
|
||||||
|
path: 'users',
|
||||||
|
persona: 'app-developer',
|
||||||
|
level: 'foundational'
|
||||||
|
};
|
||||||
|
// Top-level path types
|
||||||
|
var pathTypes = [
|
||||||
|
'users',
|
||||||
|
'contributors',
|
||||||
|
'migrators',
|
||||||
|
'browse',
|
||||||
|
'about'
|
||||||
|
];
|
||||||
|
// Paths that do not adhere to the actual user journey UI
|
||||||
|
var specialJourneyPaths = [
|
||||||
|
'browse',
|
||||||
|
'about',
|
||||||
|
];
|
||||||
|
// Load persona JSON data structure
|
||||||
|
var info = JSON.parse($('#user-persona-data').html());
|
||||||
|
|
||||||
|
var containerDivs = [
|
||||||
|
'.applicationDeveloperContainer',
|
||||||
|
'.infobarWrapper',
|
||||||
|
'#cardWrapper',
|
||||||
|
'#browsedocsWrapper',
|
||||||
|
'#aboutWrapper'
|
||||||
|
];
|
||||||
|
|
||||||
|
// Stateful wrapper for a regular hash. Stores parameters AND keeps them in
|
||||||
|
// sync with the URL state.
|
||||||
|
var urlParamHash = function() {
|
||||||
|
var paramHash = {};
|
||||||
|
|
||||||
|
// Initialize internal params based on URL state
|
||||||
|
function init() {
|
||||||
|
var sPageURL = decodeURIComponent(window.location.search.substring(1)),
|
||||||
|
sURLVariables = sPageURL.split('&'),
|
||||||
|
sParameterName,
|
||||||
|
i;
|
||||||
|
|
||||||
|
paramHash = {};
|
||||||
|
for (i = 0; i < sURLVariables.length; i++) {
|
||||||
|
sParameterName = sURLVariables[i].split('=');
|
||||||
|
if (sParameterName[0] != "" && sParameterName[1] != "")
|
||||||
|
paramHash[sParameterName[0]] = sParameterName[1];
|
||||||
|
}
|
||||||
|
return paramHash; // for visibility
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update both internal params and URL state
|
||||||
|
function set(key, value) {
|
||||||
|
if (value == null) {
|
||||||
|
delete paramHash[key];
|
||||||
|
} else {
|
||||||
|
paramHash[key] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
var urlWithoutQuery = window.location.href.split('?')[0];
|
||||||
|
var urlHash = window.location.hash;
|
||||||
|
window.history.pushState(null,null, urlWithoutQuery + "?" + $.param(paramHash) + window.location.hash);
|
||||||
|
return paramHash; // for visibility
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get value from hash based on key
|
||||||
|
function get(key) {
|
||||||
|
return paramHash[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return number of elements in hash
|
||||||
|
function numElts() {
|
||||||
|
return Object.keys(paramHash).length;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
init: init,
|
||||||
|
set: set,
|
||||||
|
get: get,
|
||||||
|
numElts: numElts,
|
||||||
|
};
|
||||||
|
}();
|
||||||
|
|
||||||
|
// Create persona buttons in "I am..." section, e.g. Application Developer
|
||||||
|
function buildCards() {
|
||||||
|
for (var c in info) {
|
||||||
|
var card = document.createElement('div');
|
||||||
|
card.className += "card_" + c;
|
||||||
|
|
||||||
|
for (var i in info[c]) {
|
||||||
|
var button = document.createElement('div');
|
||||||
|
button.className += 'buttons';
|
||||||
|
button.setAttribute('data-button', i);
|
||||||
|
button.innerText = info[c][i]["name"];
|
||||||
|
card.appendChild(button);
|
||||||
|
}
|
||||||
|
$('.cards').append(card);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Generate HTML for info links
|
||||||
|
function getInfoLinkHtml(
|
||||||
|
i = 1 //enumeration index for link id
|
||||||
|
, linkLabel = "Missing link label." //info link text
|
||||||
|
, linkUrl = "/docs/home/" //link to content
|
||||||
|
, linkIcon = "fa-ellipsis-h" //icon preceding info link text
|
||||||
|
) {
|
||||||
|
var html = '';
|
||||||
|
|
||||||
|
/*
|
||||||
|
html template:
|
||||||
|
<a id="infolink1" href="docs.html"><div class="whitebar" >
|
||||||
|
<div class="infoicon">
|
||||||
|
<i class="fa fa-ellipsis-h" aria-hidden="true" style="padding:%;float:left;color:#3399ff"></i>
|
||||||
|
</div>
|
||||||
|
<div id="info1" class='data'>Missing link label.</div>
|
||||||
|
</div></a>
|
||||||
|
|
||||||
|
defaults:
|
||||||
|
label: "Missing link label."
|
||||||
|
icon: "fa-ellipsis-h"
|
||||||
|
url: "docs.html"
|
||||||
|
*/
|
||||||
|
|
||||||
|
html = '<a id="infolink'+i+'" href="'+linkUrl+'"><div class="whitebar">' +
|
||||||
|
'<div class="infoicon">' +
|
||||||
|
'<i class="fa '+linkIcon+'" aria-hidden="true" style="padding:%;float:left;color:#3399ff"></i>' +
|
||||||
|
'</div>' +
|
||||||
|
'<div id="info'+i+'" class="data">'+linkLabel+'</div>' +
|
||||||
|
'</div></a>';
|
||||||
|
|
||||||
|
return html;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set links in the "I want to..." section, e.g. Setup a development environment
|
||||||
|
function setInfoData() {
|
||||||
|
var path = urlParamHash.get("path");
|
||||||
|
var persona = urlParamHash.get("persona");
|
||||||
|
var level = urlParamHash.get("level");
|
||||||
|
|
||||||
|
// info links specific to type/button/level
|
||||||
|
var contentArray = (typeof info[path][persona] !== 'undefined')
|
||||||
|
? info[path][persona][level]
|
||||||
|
: [{
|
||||||
|
label: 'Please select a role or persona in the "I AM..." section above.',
|
||||||
|
url: '#cardWrapper',
|
||||||
|
icon: 'fa-exclamation'
|
||||||
|
}];
|
||||||
|
|
||||||
|
//clear contents of #infobarLinks div
|
||||||
|
$('#infobarLinks').empty();
|
||||||
|
//process and add each info link
|
||||||
|
for(i = 1; i <= contentArray.length; i++) {
|
||||||
|
var content = contentArray[i-1];
|
||||||
|
|
||||||
|
//append link to the end of the div
|
||||||
|
$('#infobarLinks').append(getInfoLinkHtml(i,content.label,content.url,content.icon));
|
||||||
|
}
|
||||||
|
$('.infobarWrapper').css('visibility', 'visible');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide persona wizard section if Browse Docs button is clicked
|
||||||
|
function toggleSections(path){
|
||||||
|
for (i in containerDivs) {
|
||||||
|
if (!isSpecialJourney(path)) {
|
||||||
|
$(containerDivs[i]).show();
|
||||||
|
} else {
|
||||||
|
$(containerDivs[i]).hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!isSpecialJourney(path)) {
|
||||||
|
$('.card_' + path).show();
|
||||||
|
// TBD: Add code to set button to default to first in path list?
|
||||||
|
} else if (path == "browse") {
|
||||||
|
$('#browsedocsWrapper').show();
|
||||||
|
} else if (path == "about") {
|
||||||
|
$('#aboutWrapper').show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function isSpecialJourney(path) {
|
||||||
|
return (specialJourneyPaths.indexOf(path) != -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Click handler for high-level user journey paths ("Users", "Contributors", etc)
|
||||||
|
function handlePathClick(targetElt, fromPageload) {
|
||||||
|
// (1) Update stored state if necessary
|
||||||
|
var type = urlParamHash.get("path");
|
||||||
|
if (!fromPageload) {
|
||||||
|
for (var i in pathTypes) {
|
||||||
|
var pathType = pathTypes[i];
|
||||||
|
if (RegExp(pathType).test(targetElt.className)) {
|
||||||
|
type = pathType;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
urlParamHash.set("path", type);
|
||||||
|
urlParamHash.set("persona", null);
|
||||||
|
urlParamHash.set("level", null);
|
||||||
|
}
|
||||||
|
|
||||||
|
// (2) HTML behavior
|
||||||
|
$('.navButton').removeClass("keepShow");
|
||||||
|
$(targetElt).addClass("keepShow");
|
||||||
|
$('.cards > div').hide();
|
||||||
|
// Hide or show user journeys if "Browse Docs is selected"
|
||||||
|
toggleSections(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Click handler + scroll for persona buttons in "I am..." section
|
||||||
|
// NOTE: ALL persona clicks also set a level.
|
||||||
|
function handlePersonaClick(targetElt, fromPageload, noScroll) {
|
||||||
|
// (1) Update stored state if necessary
|
||||||
|
if (!fromPageload) {
|
||||||
|
var persona = targetElt.getAttribute('data-button');
|
||||||
|
urlParamHash.set('persona', persona);
|
||||||
|
}
|
||||||
|
// Use default level if not specified, in order to display the proper
|
||||||
|
// path-persona-level content
|
||||||
|
if (urlParamHash.get('level') == null) {
|
||||||
|
urlParamHash.set('level', defaults.level);
|
||||||
|
}
|
||||||
|
|
||||||
|
// (2) HTML behavior
|
||||||
|
$('.buttons').removeClass('selected');
|
||||||
|
$(targetElt).addClass('selected');
|
||||||
|
// Update header to display new persona and level
|
||||||
|
var cardText = targetElt.innerText;
|
||||||
|
$('#subTitle').text(cardText);
|
||||||
|
handleLevelClick($('.level[data-name="' + urlParamHash.get('level') + '"]')[0], fromPageload);
|
||||||
|
// Scroll to user journey content
|
||||||
|
if (!noScroll) {
|
||||||
|
$('html,body').animate({ scrollTop: $("#subTitle").offset().top },'slow');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleLevelClick(targetElt, fromPageload) {
|
||||||
|
// (1) Update stored state if necessary
|
||||||
|
var level = targetElt.getAttribute('data-name');
|
||||||
|
if (!fromPageload) {
|
||||||
|
urlParamHash.set('level', level);
|
||||||
|
}
|
||||||
|
|
||||||
|
// (2) HTML behavior
|
||||||
|
$('.level').removeClass('selected');
|
||||||
|
$(targetElt).addClass('selected');
|
||||||
|
// Data loading to display the right content
|
||||||
|
setInfoData();
|
||||||
|
}
|
||||||
|
|
||||||
|
function showPersonaDefinition(targetElt) {
|
||||||
|
var persona = targetElt.getAttribute('data-button');
|
||||||
|
|
||||||
|
console.log($('.persona-def-data[data-name="' + persona + '"]')[0].innerHTML);
|
||||||
|
$("#persona-definition").html($('.persona-def-data[data-name="' + persona + '"]')[0].innerHTML);
|
||||||
|
$("#persona-definition").css("visibility", "visible");
|
||||||
|
}
|
||||||
|
|
||||||
|
function attachCardEvents() {
|
||||||
|
// Set up click handling for all paths ("Users", "Contributors", etc)
|
||||||
|
$('.paths .navButton').on('click', function(e) {
|
||||||
|
handlePathClick(e.currentTarget);
|
||||||
|
});
|
||||||
|
// Set up click handling for personas ("Application Developer", etc)
|
||||||
|
$('.cards .buttons').on('click', function(e) {
|
||||||
|
handlePersonaClick(e.currentTarget);
|
||||||
|
});
|
||||||
|
// Show persona definitions when hovering over card
|
||||||
|
$('.cards .buttons').hover( function(e) {
|
||||||
|
showPersonaDefinition(e.currentTarget);
|
||||||
|
}, function(e) {
|
||||||
|
$("#persona-definition").css("visibility", "hidden");
|
||||||
|
$("#persona-definition").html(".");
|
||||||
|
});
|
||||||
|
// Set up click handling for levels ("Foundational", "Intermediate", etc)
|
||||||
|
$('.level').on('click', function(e) {
|
||||||
|
handleLevelClick(e.currentTarget);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up state based on URL query parameters or defaults
|
||||||
|
function setupCardState() {
|
||||||
|
// Initialize stored state
|
||||||
|
urlParamHash.init();
|
||||||
|
var noScroll = urlParamHash.numElts() == 0;
|
||||||
|
for (key in defaults) {
|
||||||
|
if (!isSpecialJourney(urlParamHash.get('path')) && urlParamHash.get(key) == undefined) {
|
||||||
|
urlParamHash.set(key, defaults[key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Update UI
|
||||||
|
handlePathClick($('.paths .' + urlParamHash.get('path'))[0], true);
|
||||||
|
if (!isSpecialJourney(urlParamHash.get('path'))) {
|
||||||
|
setTimeout(function() {
|
||||||
|
var elt = $('div[data-button="' + urlParamHash.get('persona') + '"]')[0];
|
||||||
|
handlePersonaClick(elt, true, noScroll);
|
||||||
|
}, 200);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function main() {
|
||||||
|
// Set up UI
|
||||||
|
buildCards();
|
||||||
|
attachCardEvents();
|
||||||
|
// Set up and display user journey state
|
||||||
|
setupCardState();
|
||||||
|
}
|
||||||
|
|
||||||
|
// What actually executes on page load
|
||||||
|
main();
|
||||||
|
});
|
|
@ -0,0 +1,30 @@
|
||||||
|
$( document ).ready(function() {
|
||||||
|
function scrollToHash(hash) {
|
||||||
|
if (hash.length > 0) {
|
||||||
|
$('html, body').animate({
|
||||||
|
scrollTop: $(`#${hash}`).offset().top
|
||||||
|
}, 500);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#content h2').each(function(index) {
|
||||||
|
var title = $(this).text();
|
||||||
|
var id = $(this).attr("id");
|
||||||
|
|
||||||
|
// inject headers into user journeys table-of-contents (buttons)
|
||||||
|
$("#user-journeys-toc").append(`<a href="#section-${index + 1}"><div class="docButton">${index + 1}. ${title}</div></a>`)
|
||||||
|
|
||||||
|
// replace content headers with styled banners
|
||||||
|
$(this).replaceWith(`<div class="anchor" id="section-${index + 1}"></div><div class="docssectionheaders" id="${id}"><span class="numberCircle"><span><br><br>${index + 1}</span></span> ${title}</div>`)
|
||||||
|
});
|
||||||
|
|
||||||
|
$('div#user-journeys-toc a').each(function() {
|
||||||
|
$(this).click(function() {
|
||||||
|
var target = $(this).attr("href").replace("#", "");
|
||||||
|
scrollToHash(target);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// jump to section in URL now that anchors are created
|
||||||
|
scrollToHash(window.location.hash.substr(1));
|
||||||
|
});
|
Loading…
Reference in New Issue