Merge remote-tracking branch 'upstream/master' into dev-1.21

This commit is contained in:
Victor Palade
2021-03-05 17:05:24 +01:00
214 changed files with 3994 additions and 5139 deletions
@@ -45,7 +45,7 @@ Before choosing a guide, here are some considerations:
## Securing a cluster
* [Certificates](/docs/concepts/cluster-administration/certificates/) describes the steps to generate certificates using different tool chains.
* [Generate Certificates](/docs/tasks/administer-cluster/certificates/) describes the steps to generate certificates using different tool chains.
* [Kubernetes Container Environment](/docs/concepts/containers/container-environment/) describes the environment for Kubelet managed containers on a Kubernetes node.
@@ -4,249 +4,6 @@ content_type: concept
weight: 20
---
<!-- overview -->
When using client certificate authentication, you can generate certificates
manually through `easyrsa`, `openssl` or `cfssl`.
<!-- body -->
### easyrsa
**easyrsa** can manually generate certificates for your cluster.
1. Download, unpack, and initialize the patched version of easyrsa3.
curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
tar xzf easy-rsa.tar.gz
cd easy-rsa-master/easyrsa3
./easyrsa init-pki
1. Generate a new certificate authority (CA). `--batch` sets automatic mode;
`--req-cn` specifies the Common Name (CN) for the CA's new root certificate.
./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass
1. Generate server certificate and key.
The argument `--subject-alt-name` sets the possible IPs and DNS names the API server will
be accessed with. The `MASTER_CLUSTER_IP` is usually the first IP from the service CIDR
that is specified as the `--service-cluster-ip-range` argument for both the API server and
the controller manager component. The argument `--days` is used to set the number of days
after which the certificate expires.
The sample below also assumes that you are using `cluster.local` as the default
DNS domain name.
./easyrsa --subject-alt-name="IP:${MASTER_IP},"\
"IP:${MASTER_CLUSTER_IP},"\
"DNS:kubernetes,"\
"DNS:kubernetes.default,"\
"DNS:kubernetes.default.svc,"\
"DNS:kubernetes.default.svc.cluster,"\
"DNS:kubernetes.default.svc.cluster.local" \
--days=10000 \
build-server-full server nopass
1. Copy `pki/ca.crt`, `pki/issued/server.crt`, and `pki/private/server.key` to your directory.
1. Fill in and add the following parameters into the API server start parameters:
--client-ca-file=/yourdirectory/ca.crt
--tls-cert-file=/yourdirectory/server.crt
--tls-private-key-file=/yourdirectory/server.key
### openssl
**openssl** can manually generate certificates for your cluster.
1. Generate a ca.key with 2048bit:
openssl genrsa -out ca.key 2048
1. According to the ca.key generate a ca.crt (use -days to set the certificate effective time):
openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
1. Generate a server.key with 2048bit:
openssl genrsa -out server.key 2048
1. Create a config file for generating a Certificate Signing Request (CSR).
Be sure to substitute the values marked with angle brackets (e.g. `<MASTER_IP>`)
with real values before saving this to a file (e.g. `csr.conf`).
Note that the value for `MASTER_CLUSTER_IP` is the service cluster IP for the
API server as described in previous subsection.
The sample below also assumes that you are using `cluster.local` as the default
DNS domain name.
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = <country>
ST = <state>
L = <city>
O = <organization>
OU = <organization unit>
CN = <MASTER_IP>
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = <MASTER_IP>
IP.2 = <MASTER_CLUSTER_IP>
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
1. Generate the certificate signing request based on the config file:
openssl req -new -key server.key -out server.csr -config csr.conf
1. Generate the server certificate using the ca.key, ca.crt and server.csr:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 10000 \
-extensions v3_ext -extfile csr.conf
1. View the certificate:
openssl x509 -noout -text -in ./server.crt
Finally, add the same parameters into the API server start parameters.
### cfssl
**cfssl** is another tool for certificate generation.
1. Download, unpack and prepare the command line tools as shown below.
Note that you may need to adapt the sample commands based on the hardware
architecture and cfssl version you are using.
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 -o cfssl
chmod +x cfssl
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64 -o cfssljson
chmod +x cfssljson
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64 -o cfssl-certinfo
chmod +x cfssl-certinfo
1. Create a directory to hold the artifacts and initialize cfssl:
mkdir cert
cd cert
../cfssl print-defaults config > config.json
../cfssl print-defaults csr > csr.json
1. Create a JSON config file for generating the CA file, for example, `ca-config.json`:
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
1. Create a JSON config file for CA certificate signing request (CSR), for example,
`ca-csr.json`. Be sure to replace the values marked with angle brackets with
real values you want to use.
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names":[{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
"OU": "<organization unit>"
}]
}
1. Generate CA key (`ca-key.pem`) and certificate (`ca.pem`):
../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca
1. Create a JSON config file for generating keys and certificates for the API
server, for example, `server-csr.json`. Be sure to replace the values in angle brackets with
real values you want to use. The `MASTER_CLUSTER_IP` is the service cluster
IP for the API server as described in previous subsection.
The sample below also assumes that you are using `cluster.local` as the default
DNS domain name.
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"<MASTER_IP>",
"<MASTER_CLUSTER_IP>",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
"OU": "<organization unit>"
}]
}
1. Generate the key and certificate for the API server, which are by default
saved into file `server-key.pem` and `server.pem` respectively:
../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
--config=ca-config.json -profile=kubernetes \
server-csr.json | ../cfssljson -bare server
## Distributing Self-Signed CA Certificate
A client node may refuse to recognize a self-signed CA certificate as valid.
For a non-production deployment, or for a deployment that runs behind a company
firewall, you can distribute a self-signed CA certificate to all clients and
refresh the local list for valid certificates.
On each client, perform the following operations:
```bash
sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
sudo update-ca-certificates
```
```
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
done.
```
## Certificates API
You can use the `certificates.k8s.io` API to provision
x509 certificates to use for authentication as documented
[here](/docs/tasks/tls/managing-tls-in-a-cluster).
To learn how to generate certificates for your cluster, see [Certificates](/docs/tasks/administer-cluster/certificates/).
@@ -47,7 +47,7 @@ kubectl apply -f https://k8s.io/examples/application/nginx/
It is a recommended practice to put resources related to the same microservice or application tier into the same file, and to group all of the files associated with your application in the same directory. If the tiers of your application bind to each other using DNS, you can deploy all of the components of your stack together.
A URL can also be specified as a configuration source, which is handy for deploying directly from configuration files checked into github:
A URL can also be specified as a configuration source, which is handy for deploying directly from configuration files checked into GitHub:
```shell
kubectl apply -f https://raw.githubusercontent.com/kubernetes/website/master/content/en/examples/application/nginx/nginx-deployment.yaml
@@ -718,7 +718,7 @@ spec:
#### Consuming Secret Values from environment variables
Inside a container that consumes a secret in an environment variables, the secret keys appear as
Inside a container that consumes a secret in the environment variables, the secret keys appear as
normal environment variables containing the base64 decoded values of the secret data.
This is the result of commands executed inside the container from the example above:
@@ -40,6 +40,7 @@ as are any environment variables specified statically in the Docker image.
### Cluster information
A list of all services that were running when a Container was created is available to that Container as environment variables.
This list is limited to services within the same namespace as the new Container's Pod and Kubernetes control plane services.
Those environment variables match the syntax of Docker links.
For a service named *foo* that maps to a Container named *bar*,
@@ -28,9 +28,7 @@ The most common way to implement the APIService is to run an *extension API serv
Extension API servers should have low latency networking to and from the kube-apiserver.
Discovery requests are required to round-trip from the kube-apiserver in five seconds or less.
If your extension API server cannot achieve that latency requirement, consider making changes that let you meet it. You can also set the
`EnableAggregatedDiscoveryTimeout=false` [feature gate](/docs/reference/command-line-tools-reference/feature-gates/) on the kube-apiserver
to disable the timeout restriction. This deprecated feature gate will be removed in a future release.
If your extension API server cannot achieve that latency requirement, consider making changes that let you meet it.
## {{% heading "whatsnext" %}}
@@ -51,11 +51,11 @@ the same machine, and do not run user containers on this machine. See
{{< glossary_definition term_id="kube-controller-manager" length="all" >}}
These controllers include:
Some types of these controllers are:
* Node controller: Responsible for noticing and responding when nodes go down.
* Replication controller: Responsible for maintaining the correct number of pods for every replication
controller object in the system.
* Job controller: Watches for Job objects that represent one-off tasks, then creates
Pods to run those tasks to completion.
* Endpoints controller: Populates the Endpoints object (that is, joins Services & Pods).
* Service Account & Token controllers: Create default accounts and API access tokens for new namespaces.
@@ -7,8 +7,8 @@ content_type: concept
weight: 20
---
<!-- overview -->
This page provides an overview of DNS support by Kubernetes.
Kubernetes creates DNS records for services and pods. You can contact
services with consistent DNS names instead of IP addresses.
<!-- body -->
@@ -18,19 +18,47 @@ Kubernetes DNS schedules a DNS Pod and Service on the cluster, and configures
the kubelets to tell individual containers to use the DNS Service's IP to
resolve DNS names.
### What things get DNS names?
Every Service defined in the cluster (including the DNS server itself) is
assigned a DNS name. By default, a client Pod's DNS search list will
include the Pod's own namespace and the cluster's default domain. This is best
illustrated by example:
assigned a DNS name. By default, a client Pod's DNS search list includes the
Pod's own namespace and the cluster's default domain.
Assume a Service named `foo` in the Kubernetes namespace `bar`. A Pod running
in namespace `bar` can look up this service by querying a DNS service for
`foo`. A Pod running in namespace `quux` can look up this service by doing a
DNS query for `foo.bar`.
### Namespaces of Services
The following sections detail the supported record types and layout that is
A DNS query may return different results based on the namespace of the pod making
it. DNS queries that don't specify a namespace are limited to the pod's
namespace. Access services in other namespaces by specifying it in the DNS query.
For example, consider a pod in a `test` namespace. A `data` service is in
the `prod` namespace.
A query for `data` returns no results, because it uses the pod's `test` namespace.
A query for `data.prod` returns the intended result, because it specifies the
namespace.
DNS queries may be expanded using the pod's `/etc/resolv.conf`. Kubelet
sets this file for each pod. For example, a query for just `data` may be
expanded to `data.test.cluster.local`. The values of the `search` option
are used to expand queries. To learn more about DNS queries, see
[the `resolv.conf` manual page.](https://www.man7.org/linux/man-pages/man5/resolv.conf.5.html)
```
nameserver 10.32.0.10
search <namespace>.svc.cluster.local svc.cluster.local cluster.local
options ndots:5
```
In summary, a pod in the _test_ namespace can successfully resolve either
`data.prod` or `data.prod.cluster.local`.
### DNS Records
What objects get DNS records?
1. Services
2. Pods
The following sections detail the supported DNS record types and layout that is
supported. Any other layout or names or queries that happen to work are
considered implementation details and are subject to change without warning.
For more up-to-date specification, see
@@ -74,8 +74,8 @@ a new instance.
The name of a Service object must be a valid
[DNS label name](/docs/concepts/overview/working-with-objects/names#dns-label-names).
For example, suppose you have a set of Pods that each listen on TCP port 9376
and carry a label `app=MyApp`:
For example, suppose you have a set of Pods where each listens on TCP port 9376
and contains a label `app=MyApp`:
```yaml
apiVersion: v1
@@ -75,7 +75,7 @@ Here are some ways to mitigate involuntary disruptions:
and [stateful](/docs/tasks/run-application/run-replicated-stateful-application/) applications.)
- For even higher availability when running replicated applications,
spread applications across racks (using
[anti-affinity](/docs/user-guide/node-selection/#inter-pod-affinity-and-anti-affinity-beta-feature))
[anti-affinity](/docs/concepts/scheduling-eviction/assign-pod-node/#affinity-and-anti-affinity))
or across zones (if using a
[multi-zone cluster](/docs/setup/multiple-zones).)
@@ -104,7 +104,7 @@ ensure that the number of replicas serving load never falls below a certain
percentage of the total.
Cluster managers and hosting providers should use tools which
respect PodDisruptionBudgets by calling the [Eviction API](/docs/tasks/administer-cluster/safely-drain-node/#the-eviction-api)
respect PodDisruptionBudgets by calling the [Eviction API](/docs/tasks/administer-cluster/safely-drain-node/#eviction-api)
instead of directly deleting pods or deployments.
For example, the `kubectl drain` subcommand lets you mark a node as going out of
+29 -19
View File
@@ -61,7 +61,7 @@ Members of `@kubernetes/sig-docs-**-owners` can approve PRs that change content
For each localization, The `@kubernetes/sig-docs-**-reviews` team automates review assignment for new PRs.
Members of `@kubernetes/website-maintainers` can create new development branches to coordinate translation efforts.
Members of `@kubernetes/website-maintainers` can create new localization branches to coordinate translation efforts.
Members of `@kubernetes/website-milestone-maintainers` can use the `/milestone` [Prow command](https://prow.k8s.io/command-help) to assign a milestone to issues or PRs.
@@ -205,14 +205,20 @@ To ensure accuracy in grammar and meaning, members of your localization team sho
### Source files
Localizations must be based on the English files from the most recent release, {{< latest-version >}}.
Localizations must be based on the English files from a specific release targeted by the localization team.
Each localization team can decide which release to target which is referred to as the _target version_ below.
To find source files for the most recent release:
To find source files for your target version:
1. Navigate to the Kubernetes website repository at https://github.com/kubernetes/website.
2. Select the `release-1.X` branch for the most recent version.
2. Select a branch for your target version from the following table:
Target version | Branch
-----|-----
Next version | [`dev-{{< skew nextMinorVersion >}}`](https://github.com/kubernetes/website/tree/dev-{{< skew nextMinorVersion >}})
Latest version | [`master`](https://github.com/kubernetes/website/tree/master)
Previous version | `release-*.**`
The latest version is {{< latest-version >}}, so the most recent release branch is [`{{< release-branch >}}`](https://github.com/kubernetes/website/tree/{{< release-branch >}}).
The `master` branch holds content for the current release `{{< latest-version >}}`. The release team will create `{{< release-branch >}}` branch shortly before the next release: v{{< skew nextMinorVersion >}}.
### Site strings in i18n
@@ -239,11 +245,11 @@ Some language teams have their own language-specific style guide and glossary. F
## Branching strategy
Because localization projects are highly collaborative efforts, we encourage teams to work in shared development branches.
Because localization projects are highly collaborative efforts, we encourage teams to work in shared localization branches.
To collaborate on a development branch:
To collaborate on a localization branch:
1. A team member of [@kubernetes/website-maintainers](https://github.com/orgs/kubernetes/teams/website-maintainers) opens a development branch from a source branch on https://github.com/kubernetes/website.
1. A team member of [@kubernetes/website-maintainers](https://github.com/orgs/kubernetes/teams/website-maintainers) opens a localization branch from a source branch on https://github.com/kubernetes/website.
Your team approvers joined the `@kubernetes/website-maintainers` team when you [added your localization team](#add-your-localization-team-in-github) to the [`kubernetes/org`](https://github.com/kubernetes/org) repository.
@@ -251,25 +257,31 @@ To collaborate on a development branch:
`dev-<source version>-<language code>.<team milestone>`
For example, an approver on a German localization team opens the development branch `dev-1.12-de.1` directly against the k/website repository, based on the source branch for Kubernetes v1.12.
For example, an approver on a German localization team opens the localization branch `dev-1.12-de.1` directly against the k/website repository, based on the source branch for Kubernetes v1.12.
2. Individual contributors open feature branches based on the development branch.
2. Individual contributors open feature branches based on the localization branch.
For example, a German contributor opens a pull request with changes to `kubernetes:dev-1.12-de.1` from `username:local-branch-name`.
3. Approvers review and merge feature branches into the development branch.
3. Approvers review and merge feature branches into the localization branch.
4. Periodically, an approver merges the development branch to its source branch by opening and approving a new pull request. Be sure to squash the commits before approving the pull request.
4. Periodically, an approver merges the localization branch to its source branch by opening and approving a new pull request. Be sure to squash the commits before approving the pull request.
Repeat steps 1-4 as needed until the localization is complete. For example, subsequent German development branches would be: `dev-1.12-de.2`, `dev-1.12-de.3`, etc.
Repeat steps 1-4 as needed until the localization is complete. For example, subsequent German localization branches would be: `dev-1.12-de.2`, `dev-1.12-de.3`, etc.
Teams must merge localized content into the same release branch from which the content was sourced. For example, a development branch sourced from {{< release-branch >}} must be based on {{< release-branch >}}.
Teams must merge localized content into the same branch from which the content was sourced.
An approver must maintain a development branch by keeping it current with its source branch and resolving merge conflicts. The longer a development branch stays open, the more maintenance it typically requires. Consider periodically merging development branches and opening new ones, rather than maintaining one extremely long-running development branch.
For example:
- a localization branch sourced from `master` must be merged into `master`.
- a localization branch sourced from `release-1.19` must be merged into `release-1.19`.
At the beginning of every team milestone, it's helpful to open an issue comparing upstream changes between the previous development branch and the current development branch. There are two scripts for comparing upstream changes. [`upstream_changes.py`](https://github.com/kubernetes/website/tree/master/scripts#upstream_changespy) is useful for checking the changes made to a specific file. And [`diff_l10n_branches.py`](https://github.com/kubernetes/website/tree/master/scripts#diff_l10n_branchespy) is useful for creating a list of outdated files for a specific localization branch.
{{< note >}}
If your localization branch was created from `master` branch but it is not merged into `master` before new release branch `{{< release-branch >}}` created, merge it into both `master` and new release branch `{{< release-branch >}}`. To merge your localization branch into new release branch `{{< release-branch >}}`, you need to switch upstream branch of your localization branch to `{{< release-branch >}}`.
{{< /note >}}
While only approvers can open a new development branch and merge pull requests, anyone can open a pull request for a new development branch. No special permissions are required.
At the beginning of every team milestone, it's helpful to open an issue comparing upstream changes between the previous localization branch and the current localization branch. There are two scripts for comparing upstream changes. [`upstream_changes.py`](https://github.com/kubernetes/website/tree/master/scripts#upstream_changespy) is useful for checking the changes made to a specific file. And [`diff_l10n_branches.py`](https://github.com/kubernetes/website/tree/master/scripts#diff_l10n_branchespy) is useful for creating a list of outdated files for a specific localization branch.
While only approvers can open a new localization branch and merge pull requests, anyone can open a pull request for a new localization branch. No special permissions are required.
For more information about working from forks or directly from the repository, see ["fork and clone the repo"](#fork-and-clone-the-repo).
@@ -290,5 +302,3 @@ Once a localization meets requirements for workflow and minimum output, SIG docs
- Enable language selection on the website
- Publicize the localization's availability through [Cloud Native Computing Foundation](https://www.cncf.io/about/) (CNCF) channels, including the [Kubernetes blog](https://kubernetes.io/blog/).
+20 -6
View File
@@ -6,8 +6,10 @@ linkTitle: "Reference"
main_menu: true
weight: 70
content_type: concept
no_list: true
---
<!-- overview -->
This section of the Kubernetes documentation contains references.
@@ -18,11 +20,17 @@ This section of the Kubernetes documentation contains references.
## API Reference
* [Glossary](/docs/reference/glossary/) - a comprehensive, standardized list of Kubernetes terminology
* [Kubernetes API Reference](/docs/reference/kubernetes-api/)
* [One-page API Reference for Kubernetes {{< param "version" >}}](/docs/reference/generated/kubernetes-api/{{< param "version" >}}/)
* [Using The Kubernetes API](/docs/reference/using-api/) - overview of the API for Kubernetes.
* [API access control](/docs/reference/access-authn-authz/) - details on how Kubernetes controls API access
* [Well-Known Labels, Annotations and Taints](/docs/reference/kubernetes-api/labels-annotations-taints/)
## API Client Libraries
## Officially supported client libraries
To call the Kubernetes API from a programming language, you can use
[client libraries](/docs/reference/using-api/client-libraries/). Officially supported
@@ -32,22 +40,28 @@ client libraries:
- [Kubernetes Python client library](https://github.com/kubernetes-client/python)
- [Kubernetes Java client library](https://github.com/kubernetes-client/java)
- [Kubernetes JavaScript client library](https://github.com/kubernetes-client/javascript)
- [Kubernetes Dotnet client library](https://github.com/kubernetes-client/csharp)
- [Kubernetes Haskell Client library](https://github.com/kubernetes-client/haskell)
## CLI Reference
## CLI
* [kubectl](/docs/reference/kubectl/overview/) - Main CLI tool for running commands and managing Kubernetes clusters.
* [JSONPath](/docs/reference/kubectl/jsonpath/) - Syntax guide for using [JSONPath expressions](https://goessner.net/articles/JsonPath/) with kubectl.
* [kubeadm](/docs/reference/setup-tools/kubeadm/) - CLI tool to easily provision a secure Kubernetes cluster.
## Components Reference
## Components
* [kubelet](/docs/reference/command-line-tools-reference/kubelet/) - The primary *node agent* that runs on each node. The kubelet takes a set of PodSpecs and ensures that the described containers are running and healthy.
* [kube-apiserver](/docs/reference/command-line-tools-reference/kube-apiserver/) - REST API that validates and configures data for API objects such as pods, services, replication controllers.
* [kube-controller-manager](/docs/reference/command-line-tools-reference/kube-controller-manager/) - Daemon that embeds the core control loops shipped with Kubernetes.
* [kube-proxy](/docs/reference/command-line-tools-reference/kube-proxy/) - Can do simple TCP/UDP stream forwarding or round-robin TCP/UDP forwarding across a set of back-ends.
* [kube-scheduler](/docs/reference/command-line-tools-reference/kube-scheduler/) - Scheduler that manages availability, performance, and capacity.
* [kube-scheduler Policies](/docs/reference/scheduling/policies)
* [kube-scheduler Profiles](/docs/reference/scheduling/config#profiles)
* [kube-scheduler](/docs/reference/command-line-tools-reference/kube-scheduler/) - Scheduler that manages availability, performance, and capacity.
## Scheduling
* [Scheduler Policies](/docs/reference/scheduling/policies)
* [Scheduler Profiles](/docs/reference/scheduling/config#profiles)
## Design Docs
@@ -1,6 +1,6 @@
---
title: API Access Control
weight: 20
weight: 15
no_list: true
---
@@ -625,6 +625,8 @@ Starting from 1.11, this admission controller is disabled by default.
### PodNodeSelector {#podnodeselector}
{{< feature-state for_k8s_version="v1.5" state="alpha" >}}
This admission controller defaults and limits what node selectors may be used within a namespace by reading a namespace annotation and a global configuration.
#### Configuration File Format
@@ -704,6 +706,8 @@ for more information.
### PodTolerationRestriction {#podtolerationrestriction}
{{< feature-state for_k8s_version="v1.7" state="alpha" >}}
The PodTolerationRestriction admission controller verifies any conflict between tolerations of a pod and the tolerations of its namespace.
It rejects the pod request if there is a conflict.
It then merges the tolerations annotated on the namespace into the tolerations of the pod.
@@ -99,7 +99,7 @@ openssl req -new -key jbeda.pem -out jbeda-csr.pem -subj "/CN=jbeda/O=app1/O=app
This would create a CSR for the username "jbeda", belonging to two groups, "app1" and "app2".
See [Managing Certificates](/docs/concepts/cluster-administration/certificates/) for how to generate a client cert.
See [Managing Certificates](/docs/tasks/administer-cluster/certificates/) for how to generate a client cert.
### Static Token File
@@ -328,7 +328,7 @@ Since all of the data needed to validate who you are is in the `id_token`, Kuber
1. Kubernetes has no "web interface" to trigger the authentication process. There is no browser or interface to collect credentials which is why you need to authenticate to your identity provider first.
2. The `id_token` can't be revoked, it's like a certificate so it should be short-lived (only a few minutes) so it can be very annoying to have to get a new token every few minutes.
3. To authenticate to the Kubernetes dashboard, you must the `kubectl proxy` command or a reverse proxy that injects the `id_token`.
3. To authenticate to the Kubernetes dashboard, you must use the `kubectl proxy` command or a reverse proxy that injects the `id_token`.
#### Configuring the API Server
@@ -1,4 +1,4 @@
---
title: Command line tools reference
title: Component tools
weight: 60
---
@@ -239,6 +239,7 @@ different Kubernetes components.
| `DynamicProvisioningScheduling` | - | Deprecated| 1.12 | - |
| `DynamicVolumeProvisioning` | `true` | Alpha | 1.3 | 1.7 |
| `DynamicVolumeProvisioning` | `true` | GA | 1.8 | - |
| `EnableAggregatedDiscoveryTimeout` | `true` | Deprecated | 1.16 | - |
| `EnableEquivalenceClassCache` | `false` | Alpha | 1.8 | 1.14 |
| `EnableEquivalenceClassCache` | - | Deprecated | 1.15 | - |
| `ExperimentalCriticalPodAnnotation` | `false` | Alpha | 1.5 | 1.12 |
@@ -302,7 +302,7 @@ kubelet [flags]
<td colspan="2">--enable-cadvisor-json-endpoints&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Default: `false`</td>
</tr>
<tr>
<td></td><td style="line-height: 130%; word-wrap: break-word;">Enable cAdvisor json `/spec` and `/stats/*` endpoints. (DEPRECATED: will be removed in a future version)</td>
<td></td><td style="line-height: 130%; word-wrap: break-word;">Enable cAdvisor json `/spec` and `/stats/*` endpoints. This flag has no effect on the /stats/summary endpoint. (DEPRECATED: will be removed in a future version)</td>
</tr>
<tr>
+1 -1
View File
@@ -2,7 +2,7 @@
approvers:
- chenopis
- abiogenesis-now
title: Standardized Glossary
title: Glossary
layout: glossary
noedit: true
default_active_tag: fundamental
@@ -1,4 +1,4 @@
---
title: Kubernetes Issues and Security
weight: 10
weight: 40
---
+1 -1
View File
@@ -1,5 +1,5 @@
---
title: "kubectl CLI"
title: "kubectl"
weight: 60
---
@@ -320,6 +320,18 @@ kubectl top pod POD_NAME --containers # Show metrics for a given p
kubectl top pod POD_NAME --sort-by=cpu # Show metrics for a given pod and sort it by 'cpu' or 'memory'
```
## Interacting with Deployments and Services
```bash
kubectl logs deploy/my-deployment # dump Pod logs for a Deployment (single-container case)
kubectl logs deploy/my-deployment -c my-container # dump Pod logs for a Deployment (multi-container case)
kubectl port-forward svc/my-service 5000 # listen on local port 5000 and forward to port 5000 on Service backend
kubectl port-forward svc/my-service 5000:my-service-port # listen on local port 5000 and forward to Service target port with name <my-service-port>
kubectl port-forward deploy/my-deployment 5000:6000 # listen on local port 5000 and forward to port 6000 on a Pod created by <my-deployment>
kubectl exec deploy/my-deployment -- ls # run command in first Pod and first container in Deployment (single- or multi-container cases)
```
## Interacting with Nodes and cluster
```bash
@@ -7,7 +7,7 @@ reviewers:
---
<!-- overview -->
You can use the Kubernetes command line tool kubectl to interact with the API Server. Using kubectl is straightforward if you are familiar with the Docker command line tool. However, there are a few differences between the docker commands and the kubectl commands. The following sections show a docker sub-command and describe the equivalent kubectl command.
You can use the Kubernetes command line tool `kubectl` to interact with the API Server. Using kubectl is straightforward if you are familiar with the Docker command line tool. However, there are a few differences between the Docker commands and the kubectl commands. The following sections show a Docker sub-command and describe the equivalent `kubectl` command.
<!-- body -->
@@ -1,4 +1,4 @@
---
title: Setup tools reference
title: Setup tools
weight: 50
---
@@ -1,8 +1,10 @@
---
title: Other Tools
reviewers:
- janetkuo
title: Tools
content_type: concept
weight: 80
no_list: true
---
<!-- overview -->
@@ -10,13 +12,6 @@ Kubernetes contains several built-in tools to help you work with the Kubernetes
<!-- body -->
## Kubectl
[`kubectl`](/docs/tasks/tools/install-kubectl/) is the command line tool for Kubernetes. It controls the Kubernetes cluster manager.
## Kubeadm
[`kubeadm`](/docs/setup/production-environment/tools/kubeadm/install-kubeadm/) is the command line tool for easily provisioning a secure Kubernetes cluster on top of physical or cloud servers or virtual machines (currently in alpha).
## Minikube
@@ -1,11 +1,12 @@
---
title: Kubernetes API Overview
title: API Overview
reviewers:
- erictune
- lavalamp
- jbeda
content_type: concept
weight: 10
no_list: true
card:
name: reference
weight: 50
@@ -67,12 +67,13 @@ their authors, not the Kubernetes team.
| Python | [github.com/fiaas/k8s](https://github.com/fiaas/k8s) |
| Python | [github.com/mnubo/kubernetes-py](https://github.com/mnubo/kubernetes-py) |
| Python | [github.com/tomplus/kubernetes_asyncio](https://github.com/tomplus/kubernetes_asyncio) |
| Python | [github.com/Frankkkkk/pykorm](https://github.com/Frankkkkk/pykorm) |
| Ruby | [github.com/abonas/kubeclient](https://github.com/abonas/kubeclient) |
| Ruby | [github.com/Ch00k/kuber](https://github.com/Ch00k/kuber) |
| Ruby | [github.com/kontena/k8s-client](https://github.com/kontena/k8s-client) |
| Rust | [github.com/clux/kube-rs](https://github.com/clux/kube-rs) |
| Rust | [github.com/ynqa/kubernetes-rust](https://github.com/ynqa/kubernetes-rust) |
| Scala | [github.com/doriordan/skuber](https://github.com/doriordan/skuber) |
| Scala | [github.com/hagay3/skuber](https://github.com/hagay3/skuber) |
| Scala | [github.com/joan38/kubernetes-client](https://github.com/joan38/kubernetes-client) |
| Swift | [github.com/swiftkube/client](https://github.com/swiftkube/client) |
| DotNet | [github.com/tonnyeremin/kubernetes_gen](https://github.com/tonnyeremin/kubernetes_gen) |
@@ -219,30 +219,39 @@ sudo systemctl restart containerd
```
{{% /tab %}}
{{% tab name="Windows (PowerShell)" %}}
<br />
Start a Powershell session, set `$Version` to the desired version (ex: `$Version=1.4.3`), and then run the following commands:
<br />
```powershell
# (Install containerd)
# download containerd
cmd /c curl -OL https://github.com/containerd/containerd/releases/download/v1.4.1/containerd-1.4.1-windows-amd64.tar.gz
cmd /c tar xvf .\containerd-1.4.1-windows-amd64.tar.gz
# Download containerd
curl.exe -L https://github.com/containerd/containerd/releases/download/v$Version/containerd-$Version-windows-amd64.tar.gz -o containerd-windows-amd64.tar.gz
tar.exe xvf .\containerd-windows-amd64.tar.gz
```
```powershell
# extract and configure
# Extract and configure
Copy-Item -Path ".\bin\" -Destination "$Env:ProgramFiles\containerd" -Recurse -Force
cd $Env:ProgramFiles\containerd\
.\containerd.exe config default | Out-File config.toml -Encoding ascii
# review the configuration. depending on setup you may want to adjust:
# - the sandbox_image (kubernetes pause image)
# Review the configuration. Depending on setup you may want to adjust:
# - the sandbox_image (Kubernetes pause image)
# - cni bin_dir and conf_dir locations
Get-Content config.toml
# (Optional - but highly recommended) Exclude containerd form Windows Defender Scans
Add-MpPreference -ExclusionProcess "$Env:ProgramFiles\containerd\containerd.exe"
```
```powershell
# start containerd
# Start containerd
.\containerd.exe --register-service
Start-Service containerd
```
{{% /tab %}}
{{< /tabs >}}
@@ -18,14 +18,7 @@ For information how to create a cluster with kubeadm once you have performed thi
## {{% heading "prerequisites" %}}
* One or more machines running one of:
- Ubuntu 16.04+
- Debian 9+
- CentOS 7+
- Red Hat Enterprise Linux (RHEL) 7+
- Fedora 25+
- HypriotOS v1.0.1+
- Flatcar Container Linux (tested with 2512.3.0)
* A compatible Linux host. The Kubernetes project provides generic instructions for Linux distributions based on Debian and Red Hat, and those distributions without a package manager.
* 2 GB or more of RAM per machine (any less will leave little room for your apps).
* 2 CPUs or more.
* Full network connectivity between all machines in the cluster (public or private network is fine).
@@ -122,7 +115,7 @@ The following table lists container runtimes and their associated socket paths:
{{< table caption = "Container runtimes and their socket paths" >}}
| Runtime | Path to Unix domain socket |
|------------|-----------------------------------|
| Docker | `/var/run/docker.sock` |
| Docker | `/var/run/dockershim.sock` |
| containerd | `/run/containerd/containerd.sock` |
| CRI-O | `/var/run/crio/crio.sock` |
{{< /table >}}
@@ -181,7 +174,7 @@ For more information on version skews, see:
* Kubeadm-specific [version skew policy](/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#version-skew-policy)
{{< tabs name="k8s_install" >}}
{{% tab name="Ubuntu, Debian or HypriotOS" %}}
{{% tab name="Debian-based distributions" %}}
```bash
sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
@@ -193,7 +186,7 @@ sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
```
{{% /tab %}}
{{% tab name="CentOS, RHEL or Fedora" %}}
{{% tab name="Red Hat-based distributions" %}}
```bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
@@ -224,7 +217,7 @@ sudo systemctl enable --now kubelet
- You can leave SELinux enabled if you know how to configure it but it may require settings that are not supported by kubeadm.
{{% /tab %}}
{{% tab name="Fedora CoreOS or Flatcar Container Linux" %}}
{{% tab name="Without a package manager" %}}
Install CNI plugins (required for most pod network):
```bash
@@ -138,10 +138,10 @@ Right after `kubeadm init` there should not be any pods in these states.
- If there are pods in one of these states _right after_ `kubeadm init`, please open an
issue in the kubeadm repo. `coredns` (or `kube-dns`) should be in the `Pending` state
until you have deployed the network solution.
until you have deployed the network add-on.
- If you see Pods in the `RunContainerError`, `CrashLoopBackOff` or `Error` state
after deploying the network solution and nothing happens to `coredns` (or `kube-dns`),
it's very likely that the Pod Network solution that you installed is somehow broken.
after deploying the network add-on and nothing happens to `coredns` (or `kube-dns`),
it's very likely that the Pod Network add-on that you installed is somehow broken.
You might have to grant it more RBAC privileges or use a newer version. Please file
an issue in the Pod Network providers' issue tracker and get the issue triaged there.
- If you install a version of Docker older than 1.12.1, remove the `MountFlags=slave` option
@@ -152,14 +152,14 @@ Right after `kubeadm init` there should not be any pods in these states.
## `coredns` (or `kube-dns`) is stuck in the `Pending` state
This is **expected** and part of the design. kubeadm is network provider-agnostic, so the admin
should [install the pod network solution](/docs/concepts/cluster-administration/addons/)
should [install the pod network add-on](/docs/concepts/cluster-administration/addons/)
of choice. You have to install a Pod Network
before CoreDNS may be deployed fully. Hence the `Pending` state before the network is set up.
## `HostPort` services do not work
The `HostPort` and `HostIP` functionality is available depending on your Pod Network
provider. Please contact the author of the Pod Network solution to find out whether
provider. Please contact the author of the Pod Network add-on to find out whether
`HostPort` and `HostIP` functionality are available.
Calico, Canal, and Flannel CNI providers are verified to support HostPort.
@@ -352,102 +352,6 @@ exampleWithKubeConfig = do
>>= print
```
## {{% heading "whatsnext" %}}
### Accessing the API from within a Pod
When accessing the API from within a Pod, locating and authenticating
to the API server are slightly different to the external client case described above.
The easiest way to use the Kubernetes API from a Pod is to use
one of the official [client libraries](/docs/reference/using-api/client-libraries/). These
libraries can automatically discover the API server and authenticate.
#### Using Official Client Libraries
From within a Pod, the recommended ways to connect to the Kubernetes API are:
- For a Go client, use the official [Go client library](https://github.com/kubernetes/client-go/).
The `rest.InClusterConfig()` function handles API host discovery and authentication automatically.
See [an example here](https://git.k8s.io/client-go/examples/in-cluster-client-configuration/main.go).
- For a Python client, use the official [Python client library](https://github.com/kubernetes-client/python/).
The `config.load_incluster_config()` function handles API host discovery and authentication automatically.
See [an example here](https://github.com/kubernetes-client/python/blob/master/examples/in_cluster_config.py).
- There are a number of other libraries available, please refer to the [Client Libraries](/docs/reference/using-api/client-libraries/) page.
In each case, the service account credentials of the Pod are used to communicate
securely with the API server.
#### Directly accessing the REST API
While running in a Pod, the Kubernetes apiserver is accessible via a Service named
`kubernetes` in the `default` namespace. Therefore, Pods can use the
`kubernetes.default.svc` hostname to query the API server. Official client libraries
do this automatically.
The recommended way to authenticate to the API server is with a
[service account](/docs/tasks/configure-pod-container/configure-service-account/) credential. By default, a Pod
is associated with a service account, and a credential (token) for that
service account is placed into the filesystem tree of each container in that Pod,
at `/var/run/secrets/kubernetes.io/serviceaccount/token`.
If available, a certificate bundle is placed into the filesystem tree of each
container at `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`, and should be
used to verify the serving certificate of the API server.
Finally, the default namespace to be used for namespaced API operations is placed in a file
at `/var/run/secrets/kubernetes.io/serviceaccount/namespace` in each container.
#### Using kubectl proxy
If you would like to query the API without an official client library, you can run `kubectl proxy`
as the [command](/docs/tasks/inject-data-application/define-command-argument-container/)
of a new sidecar container in the Pod. This way, `kubectl proxy` will authenticate
to the API and expose it on the `localhost` interface of the Pod, so that other containers
in the Pod can use it directly.
#### Without using a proxy
It is possible to avoid using the kubectl proxy by passing the authentication token
directly to the API server. The internal certificate secures the connection.
```shell
# Point to the internal API server hostname
APISERVER=https://kubernetes.default.svc
# Path to ServiceAccount token
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICEACCOUNT}/token)
# Reference the internal certificate authority (CA)
CACERT=${SERVICEACCOUNT}/ca.crt
# Explore the API with TOKEN
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api
```
The output will be similar to this:
```json
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
```
* [Accessing the Kubernetes API from a Pod](/docs/tasks/run-application/access-api-from-pod/)
@@ -0,0 +1,252 @@
---
title: Certificates
content_type: task
weight: 20
---
<!-- overview -->
When using client certificate authentication, you can generate certificates
manually through `easyrsa`, `openssl` or `cfssl`.
<!-- body -->
### easyrsa
**easyrsa** can manually generate certificates for your cluster.
1. Download, unpack, and initialize the patched version of easyrsa3.
curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
tar xzf easy-rsa.tar.gz
cd easy-rsa-master/easyrsa3
./easyrsa init-pki
1. Generate a new certificate authority (CA). `--batch` sets automatic mode;
`--req-cn` specifies the Common Name (CN) for the CA's new root certificate.
./easyrsa --batch "--req-cn=${MASTER_IP}@`date +%s`" build-ca nopass
1. Generate server certificate and key.
The argument `--subject-alt-name` sets the possible IPs and DNS names the API server will
be accessed with. The `MASTER_CLUSTER_IP` is usually the first IP from the service CIDR
that is specified as the `--service-cluster-ip-range` argument for both the API server and
the controller manager component. The argument `--days` is used to set the number of days
after which the certificate expires.
The sample below also assumes that you are using `cluster.local` as the default
DNS domain name.
./easyrsa --subject-alt-name="IP:${MASTER_IP},"\
"IP:${MASTER_CLUSTER_IP},"\
"DNS:kubernetes,"\
"DNS:kubernetes.default,"\
"DNS:kubernetes.default.svc,"\
"DNS:kubernetes.default.svc.cluster,"\
"DNS:kubernetes.default.svc.cluster.local" \
--days=10000 \
build-server-full server nopass
1. Copy `pki/ca.crt`, `pki/issued/server.crt`, and `pki/private/server.key` to your directory.
1. Fill in and add the following parameters into the API server start parameters:
--client-ca-file=/yourdirectory/ca.crt
--tls-cert-file=/yourdirectory/server.crt
--tls-private-key-file=/yourdirectory/server.key
### openssl
**openssl** can manually generate certificates for your cluster.
1. Generate a ca.key with 2048bit:
openssl genrsa -out ca.key 2048
1. According to the ca.key generate a ca.crt (use -days to set the certificate effective time):
openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
1. Generate a server.key with 2048bit:
openssl genrsa -out server.key 2048
1. Create a config file for generating a Certificate Signing Request (CSR).
Be sure to substitute the values marked with angle brackets (e.g. `<MASTER_IP>`)
with real values before saving this to a file (e.g. `csr.conf`).
Note that the value for `MASTER_CLUSTER_IP` is the service cluster IP for the
API server as described in previous subsection.
The sample below also assumes that you are using `cluster.local` as the default
DNS domain name.
[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
C = <country>
ST = <state>
L = <city>
O = <organization>
OU = <organization unit>
CN = <MASTER_IP>
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = <MASTER_IP>
IP.2 = <MASTER_CLUSTER_IP>
[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names
1. Generate the certificate signing request based on the config file:
openssl req -new -key server.key -out server.csr -config csr.conf
1. Generate the server certificate using the ca.key, ca.crt and server.csr:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 10000 \
-extensions v3_ext -extfile csr.conf
1. View the certificate:
openssl x509 -noout -text -in ./server.crt
Finally, add the same parameters into the API server start parameters.
### cfssl
**cfssl** is another tool for certificate generation.
1. Download, unpack and prepare the command line tools as shown below.
Note that you may need to adapt the sample commands based on the hardware
architecture and cfssl version you are using.
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl_1.5.0_linux_amd64 -o cfssl
chmod +x cfssl
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssljson_1.5.0_linux_amd64 -o cfssljson
chmod +x cfssljson
curl -L https://github.com/cloudflare/cfssl/releases/download/v1.5.0/cfssl-certinfo_1.5.0_linux_amd64 -o cfssl-certinfo
chmod +x cfssl-certinfo
1. Create a directory to hold the artifacts and initialize cfssl:
mkdir cert
cd cert
../cfssl print-defaults config > config.json
../cfssl print-defaults csr > csr.json
1. Create a JSON config file for generating the CA file, for example, `ca-config.json`:
{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
1. Create a JSON config file for CA certificate signing request (CSR), for example,
`ca-csr.json`. Be sure to replace the values marked with angle brackets with
real values you want to use.
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names":[{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
"OU": "<organization unit>"
}]
}
1. Generate CA key (`ca-key.pem`) and certificate (`ca.pem`):
../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca
1. Create a JSON config file for generating keys and certificates for the API
server, for example, `server-csr.json`. Be sure to replace the values in angle brackets with
real values you want to use. The `MASTER_CLUSTER_IP` is the service cluster
IP for the API server as described in previous subsection.
The sample below also assumes that you are using `cluster.local` as the default
DNS domain name.
{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"<MASTER_IP>",
"<MASTER_CLUSTER_IP>",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
"OU": "<organization unit>"
}]
}
1. Generate the key and certificate for the API server, which are by default
saved into file `server-key.pem` and `server.pem` respectively:
../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
--config=ca-config.json -profile=kubernetes \
server-csr.json | ../cfssljson -bare server
## Distributing Self-Signed CA Certificate
A client node may refuse to recognize a self-signed CA certificate as valid.
For a non-production deployment, or for a deployment that runs behind a company
firewall, you can distribute a self-signed CA certificate to all clients and
refresh the local list for valid certificates.
On each client, perform the following operations:
```bash
sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
sudo update-ca-certificates
```
```
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
done.
```
## Certificates API
You can use the `certificates.k8s.io` API to provision
x509 certificates to use for authentication as documented
[here](/docs/tasks/tls/managing-tls-in-a-cluster).
@@ -25,6 +25,12 @@ kube-dns.
{{< codenew file="admin/dns/dnsutils.yaml" >}}
{{< note >}}
This example creates a pod in the `default` namespace. DNS name resolution for
services depends on the namespace of the pod. For more information, review
[DNS for Services and Pods](/docs/concepts/services-networking/dns-pod-service/#what-things-get-dns-names).
{{< /note >}}
Use that manifest to create a Pod:
```shell
@@ -247,6 +253,27 @@ linux/amd64, go1.10.3, 2e322f6
172.17.0.18:41675 - [07/Sep/2018:15:29:11 +0000] 59925 "A IN kubernetes.default.svc.cluster.local. udp 54 false 512" NOERROR qr,aa,rd,ra 106 0.000066649s
```
### Are you in the right namespace for the service?
DNS queries that don't specify a namespace are limited to the pod's
namespace.
If the namespace of the pod and service differ, the DNS query must include
the namespace of the service.
This query is limited to the pod's namespace:
```shell
kubectl exec -i -t dnsutils -- nslookup <service-name>
```
This query specifies the namespace:
```shell
kubectl exec -i -t dnsutils -- nslookup <service-name>.<namespace>
```
To learn more about name resolution, see
[DNS for Services and Pods](/docs/concepts/services-networking/dns-pod-service/#what-things-get-dns-names).
## Known issues
Some Linux distributions (e.g. Ubuntu) use a local DNS resolver by default (systemd-resolved).
@@ -92,7 +92,7 @@ kubectl describe secrets/db-user-pass-96mffmfh4k
The output is similar to:
```
Name: db-user-pass
Name: db-user-pass-96mffmfh4k
Namespace: default
Labels: <none>
Annotations: <none>
@@ -293,6 +293,10 @@ Services.
Readiness probes runs on the container during its whole lifecycle.
{{< /note >}}
{{< caution >}}
Liveness probes *do not* wait for readiness probes to succeed. If you want to wait before executing a liveness probe you should use initialDelaySeconds or a startupProbe.
{{< /caution >}}
Readiness probes are configured similarly to liveness probes. The only difference
is that you use the `readinessProbe` field instead of the `livenessProbe` field.
@@ -99,7 +99,7 @@ kubectl run ephemeral-demo --image=k8s.gcr.io/pause:3.1 --restart=Never
```
The examples in this section use the `pause` container image because it does not
contain userland debugging utilities, but this method works with all container
contain debugging utilities, but this method works with all container
images.
If you attempt to use `kubectl exec` to create a shell you will see an error
@@ -70,8 +70,9 @@ override any environment variables specified in the container image.
{{< /note >}}
{{< note >}}
The environment variables can reference each other, and cycles are possible,
pay attention to the order before using
Environment variables may reference each other, however ordering is important.
Variables making use of others defined in the same context must come later in
the list. Similarly, avoid circular references.
{{< /note >}}
## Using environment variables inside of your config
@@ -8,7 +8,7 @@ weight: 20
[Kustomize](https://github.com/kubernetes-sigs/kustomize) is a standalone tool
to customize Kubernetes objects
through a [kustomization file](https://kubernetes-sigs.github.io/kustomize/api-reference/glossary/#kustomization).
through a [kustomization file](https://kubectl.docs.kubernetes.io/references/kustomize/glossary/#kustomization).
Since 1.14, Kubectl also
supports the management of Kubernetes objects using a kustomization file.
@@ -0,0 +1,111 @@
---
title: Accessing the Kubernetes API from a Pod
content_type: task
weight: 120
---
<!-- overview -->
This guide demonstrates how to access the Kubernetes API from within a pod.
## {{% heading "prerequisites" %}}
{{< include "task-tutorial-prereqs.md" >}}
<!-- steps -->
## Accessing the API from within a Pod
When accessing the API from within a Pod, locating and authenticating
to the API server are slightly different to the external client case.
The easiest way to use the Kubernetes API from a Pod is to use
one of the official [client libraries](/docs/reference/using-api/client-libraries/). These
libraries can automatically discover the API server and authenticate.
### Using Official Client Libraries
From within a Pod, the recommended ways to connect to the Kubernetes API are:
- For a Go client, use the official [Go client library](https://github.com/kubernetes/client-go/).
The `rest.InClusterConfig()` function handles API host discovery and authentication automatically.
See [an example here](https://git.k8s.io/client-go/examples/in-cluster-client-configuration/main.go).
- For a Python client, use the official [Python client library](https://github.com/kubernetes-client/python/).
The `config.load_incluster_config()` function handles API host discovery and authentication automatically.
See [an example here](https://github.com/kubernetes-client/python/blob/master/examples/in_cluster_config.py).
- There are a number of other libraries available, please refer to the [Client Libraries](/docs/reference/using-api/client-libraries/) page.
In each case, the service account credentials of the Pod are used to communicate
securely with the API server.
### Directly accessing the REST API
While running in a Pod, the Kubernetes apiserver is accessible via a Service named
`kubernetes` in the `default` namespace. Therefore, Pods can use the
`kubernetes.default.svc` hostname to query the API server. Official client libraries
do this automatically.
The recommended way to authenticate to the API server is with a
[service account](/docs/tasks/configure-pod-container/configure-service-account/) credential. By default, a Pod
is associated with a service account, and a credential (token) for that
service account is placed into the filesystem tree of each container in that Pod,
at `/var/run/secrets/kubernetes.io/serviceaccount/token`.
If available, a certificate bundle is placed into the filesystem tree of each
container at `/var/run/secrets/kubernetes.io/serviceaccount/ca.crt`, and should be
used to verify the serving certificate of the API server.
Finally, the default namespace to be used for namespaced API operations is placed in a file
at `/var/run/secrets/kubernetes.io/serviceaccount/namespace` in each container.
### Using kubectl proxy
If you would like to query the API without an official client library, you can run `kubectl proxy`
as the [command](/docs/tasks/inject-data-application/define-command-argument-container/)
of a new sidecar container in the Pod. This way, `kubectl proxy` will authenticate
to the API and expose it on the `localhost` interface of the Pod, so that other containers
in the Pod can use it directly.
### Without using a proxy
It is possible to avoid using the kubectl proxy by passing the authentication token
directly to the API server. The internal certificate secures the connection.
```shell
# Point to the internal API server hostname
APISERVER=https://kubernetes.default.svc
# Path to ServiceAccount token
SERVICEACCOUNT=/var/run/secrets/kubernetes.io/serviceaccount
# Read this Pod's namespace
NAMESPACE=$(cat ${SERVICEACCOUNT}/namespace)
# Read the ServiceAccount bearer token
TOKEN=$(cat ${SERVICEACCOUNT}/token)
# Reference the internal certificate authority (CA)
CACERT=${SERVICEACCOUNT}/ca.crt
# Explore the API with TOKEN
curl --cacert ${CACERT} --header "Authorization: Bearer ${TOKEN}" -X GET ${APISERVER}/api
```
The output will be similar to this:
```json
{
"kind": "APIVersions",
"versions": [
"v1"
],
"serverAddressByClientCIDRs": [
{
"clientCIDR": "0.0.0.0/0",
"serverAddress": "10.0.1.149:443"
}
]
}
```
@@ -69,8 +69,9 @@ write that to disk, in the location specified by `--cert-dir`. Then the kubelet
will use the new certificate to connect to the Kubernetes API.
As the expiration of the signed certificate approaches, the kubelet will
automatically issue a new certificate signing request, using the Kubernetes
API. Again, the controller manager will automatically approve the certificate
automatically issue a new certificate signing request, using the Kubernetes API.
This can happen at any point between 30% and 10% of the time remaining on the
certificate. Again, the controller manager will automatically approve the certificate
request and attach a signed certificate to the certificate signing request. The
kubelet will retrieve the new signed certificate from the Kubernetes API and
write that to disk. Then it will update the connections it has to the
@@ -105,8 +105,8 @@ Configurations with a single API server will experience unavailability while the
* Make sure control plane components logs no TLS errors.
{{< note >}}
To generate certificates and private keys for your cluster using the `openssl` command line tool, see [Certificates (`openssl`)](/docs/concepts/cluster-administration/certificates/#openssl).
You can also use [`cfssl`](/docs/concepts/cluster-administration/certificates/#cfssl).
To generate certificates and private keys for your cluster using the `openssl` command line tool, see [Certificates (`openssl`)](/docs/tasks/administer-cluster/certificates/#openssl).
You can also use [`cfssl`](/docs/tasks/administer-cluster/certificates/#cfssl).
{{< /note >}}
1. Annotate any Daemonsets and Deployments to trigger pod replacement in a safer rolling fashion.
+12 -11
View File
@@ -7,19 +7,20 @@ no_list: true
## kubectl
The Kubernetes command-line tool, `kubectl`, allows you to run commands against
Kubernetes clusters. You can use `kubectl` to deploy applications, inspect and
manage cluster resources, and view logs.
See [Install and Set Up `kubectl`](/docs/tasks/tools/install-kubectl/) for
information about how to download and install `kubectl` and set it up for
accessing your cluster.
<a class="btn btn-primary" href="/docs/tasks/tools/install-kubectl/" role="button" aria-label="View kubectl Install and Set Up Guide">View kubectl Install and Set Up Guide</a>
You can also read the
<!-- overview -->
The Kubernetes command-line tool, [kubectl](/docs/reference/kubectl/kubectl/), allows
you to run commands against Kubernetes clusters.
You can use kubectl to deploy applications, inspect and manage cluster resources,
and view logs. For more information including a complete list of kubectl operations, see the
[`kubectl` reference documentation](/docs/reference/kubectl/).
kubectl is installable on a variety of Linux platforms, macOS and Windows.
Find your preferred operating system below.
- [Install kubectl on Linux](install-kubectl-linux)
- [Install kubectl on macOS](install-kubectl-macos)
- [Install kubectl on Windows](install-kubectl-windows)
## kind
[`kind`](https://kind.sigs.k8s.io/docs/) lets you run Kubernetes on
@@ -0,0 +1,6 @@
---
title: "Tools Included"
description: "Snippets to be included in the main kubectl-installs-*.md pages."
headless: true
toc_hide: true
---
@@ -0,0 +1,21 @@
---
title: "gcloud kubectl install"
description: "How to install kubectl with gcloud snippet for inclusion in each OS-specific tab."
headless: true
---
You can install kubectl as part of the Google Cloud SDK.
1. Install the [Google Cloud SDK](https://cloud.google.com/sdk/).
1. Run the `kubectl` installation command:
```shell
gcloud components install kubectl
```
1. Test to ensure the version you installed is up-to-date:
```shell
kubectl version --client
```
@@ -0,0 +1,12 @@
---
title: "What's next?"
description: "What's next after installing kubectl."
headless: true
---
* [Install Minikube](https://minikube.sigs.k8s.io/docs/start/)
* See the [getting started guides](/docs/setup/) for more about creating clusters.
* [Learn how to launch and expose your application.](/docs/tasks/access-application-cluster/service-access-application-cluster/)
* If you need access to a cluster you didn't create, see the
[Sharing Cluster Access document](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/).
* Read the [kubectl reference docs](/docs/reference/kubectl/kubectl/)
@@ -0,0 +1,54 @@
---
title: "bash auto-completion on Linux"
description: "Some optional configuration for bash auto-completion on Linux."
headless: true
---
### Introduction
The kubectl completion script for Bash can be generated with the command `kubectl completion bash`. Sourcing the completion script in your shell enables kubectl autocompletion.
However, the completion script depends on [**bash-completion**](https://github.com/scop/bash-completion), which means that you have to install this software first (you can test if you have bash-completion already installed by running `type _init_completion`).
### Install bash-completion
bash-completion is provided by many package managers (see [here](https://github.com/scop/bash-completion#installation)). You can install it with `apt-get install bash-completion` or `yum install bash-completion`, etc.
The above commands create `/usr/share/bash-completion/bash_completion`, which is the main script of bash-completion. Depending on your package manager, you have to manually source this file in your `~/.bashrc` file.
To find out, reload your shell and run `type _init_completion`. If the command succeeds, you're already set, otherwise add the following to your `~/.bashrc` file:
```bash
source /usr/share/bash-completion/bash_completion
```
Reload your shell and verify that bash-completion is correctly installed by typing `type _init_completion`.
### Enable kubectl autocompletion
You now need to ensure that the kubectl completion script gets sourced in all your shell sessions. There are two ways in which you can do this:
- Source the completion script in your `~/.bashrc` file:
```bash
echo 'source <(kubectl completion bash)' >>~/.bashrc
```
- Add the completion script to the `/etc/bash_completion.d` directory:
```bash
kubectl completion bash >/etc/bash_completion.d/kubectl
```
If you have an alias for kubectl, you can extend shell completion to work with that alias:
```bash
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
```
{{< note >}}
bash-completion sources all completion scripts in `/etc/bash_completion.d`.
{{< /note >}}
Both approaches are equivalent. After reloading your shell, kubectl autocompletion should be working.
@@ -0,0 +1,89 @@
---
title: "bash auto-completion on macOS"
description: "Some optional configuration for bash auto-completion on macOS."
headless: true
---
### Introduction
The kubectl completion script for Bash can be generated with `kubectl completion bash`. Sourcing this script in your shell enables kubectl completion.
However, the kubectl completion script depends on [**bash-completion**](https://github.com/scop/bash-completion) which you thus have to previously install.
{{< warning>}}
There are two versions of bash-completion, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+. The kubectl completion script **doesn't work** correctly with bash-completion v1 and Bash 3.2. It requires **bash-completion v2** and **Bash 4.1+**. Thus, to be able to correctly use kubectl completion on macOS, you have to install and use Bash 4.1+ ([*instructions*](https://itnext.io/upgrading-bash-on-macos-7138bd1066ba)). The following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).
{{< /warning >}}
### Upgrade Bash
The instructions here assume you use Bash 4.1+. You can check your Bash's version by running:
```bash
echo $BASH_VERSION
```
If it is too old, you can install/upgrade it using Homebrew:
```bash
brew install bash
```
Reload your shell and verify that the desired version is being used:
```bash
echo $BASH_VERSION $SHELL
```
Homebrew usually installs it at `/usr/local/bin/bash`.
### Install bash-completion
{{< note >}}
As mentioned, these instructions assume you use Bash 4.1+, which means you will install bash-completion v2 (in contrast to Bash 3.2 and bash-completion v1, in which case kubectl completion won't work).
{{< /note >}}
You can test if you have bash-completion v2 already installed with `type _init_completion`. If not, you can install it with Homebrew:
```bash
brew install bash-completion@2
```
As stated in the output of this command, add the following to your `~/.bash_profile` file:
```bash
export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d"
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
```
Reload your shell and verify that bash-completion v2 is correctly installed with `type _init_completion`.
### Enable kubectl autocompletion
You now have to ensure that the kubectl completion script gets sourced in all your shell sessions. There are multiple ways to achieve this:
- Source the completion script in your `~/.bash_profile` file:
```bash
echo 'source <(kubectl completion bash)' >>~/.bash_profile
```
- Add the completion script to the `/usr/local/etc/bash_completion.d` directory:
```bash
kubectl completion bash >/usr/local/etc/bash_completion.d/kubectl
```
- If you have an alias for kubectl, you can extend shell completion to work with that alias:
```bash
echo 'alias k=kubectl' >>~/.bash_profile
echo 'complete -F __start_kubectl k' >>~/.bash_profile
```
- If you installed kubectl with Homebrew (as explained [above](#install-with-homebrew-on-macos)), then the kubectl completion script should already be in `/usr/local/etc/bash_completion.d/kubectl`. In that case, you don't need to do anything.
{{< note >}}
The Homebrew installation of bash-completion v2 sources all the files in the `BASH_COMPLETION_COMPAT_DIR` directory, that's why the latter two methods work.
{{< /note >}}
In any case, after reloading your shell, kubectl completion should be working.
@@ -0,0 +1,29 @@
---
title: "zsh auto-completion"
description: "Some optional configuration for zsh auto-completion."
headless: true
---
The kubectl completion script for Zsh can be generated with the command `kubectl completion zsh`. Sourcing the completion script in your shell enables kubectl autocompletion.
To do so in all your shell sessions, add the following to your `~/.zshrc` file:
```zsh
source <(kubectl completion zsh)
```
If you have an alias for kubectl, you can extend shell completion to work with that alias:
```zsh
echo 'alias k=kubectl' >>~/.zshrc
echo 'complete -F __start_kubectl k' >>~/.zshrc
```
After reloading your shell, kubectl autocompletion should be working.
If you get an error like `complete:13: command not found: compdef`, then add the following to the beginning of your `~/.zshrc` file:
```zsh
autoload -Uz compinit
compinit
```
@@ -0,0 +1,34 @@
---
title: "verify kubectl install"
description: "How to verify kubectl."
headless: true
---
In order for kubectl to find and access a Kubernetes cluster, it needs a
[kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/),
which is created automatically when you create a cluster using
[kube-up.sh](https://github.com/kubernetes/kubernetes/blob/master/cluster/kube-up.sh)
or successfully deploy a Minikube cluster.
By default, kubectl configuration is located at `~/.kube/config`.
Check that kubectl is properly configured by getting the cluster state:
```shell
kubectl cluster-info
```
If you see a URL response, kubectl is correctly configured to access your cluster.
If you see a message similar to the following, kubectl is not configured correctly or is not able to connect to a Kubernetes cluster.
```
The connection to the server <server-name:port> was refused - did you specify the right host or port?
```
For example, if you are intending to run a Kubernetes cluster on your laptop (locally), you will need a tool like Minikube to be installed first and then re-run the commands stated above.
If kubectl cluster-info returns the url response but you can't access your cluster, to check whether it is configured properly, use:
```shell
kubectl cluster-info dump
```
@@ -0,0 +1,172 @@
---
reviewers:
- mikedanese
title: Install and Set Up kubectl on Linux
content_type: task
weight: 10
card:
name: tasks
weight: 20
title: Install kubectl on Linux
---
## {{% heading "prerequisites" %}}
You must use a kubectl version that is within one minor version difference of your cluster.
For example, a v1.2 client should work with v1.1, v1.2, and v1.3 master.
Using the latest version of kubectl helps avoid unforeseen issues.
## Install kubectl on Linux
The following methods exist for installing kubectl on Linux:
- [Install kubectl binary with curl on Linux](#install-kubectl-binary-with-curl-on-linux)
- [Install using native package management](#install-using-native-package-management)
- [Install using other package management](#install-using-other-package-management)
- [Install on Linux as part of the Google Cloud SDK](#install-on-linux-as-part-of-the-google-cloud-sdk)
### Install kubectl binary with curl on Linux
1. Download the latest release with the command:
```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
```
{{< note >}}
To download a specific version, replace the `$(curl -L -s https://dl.k8s.io/release/stable.txt)` portion of the command with the specific version.
For example, to download version {{< param "fullversion" >}} on Linux, type:
```bash
curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/linux/amd64/kubectl
```
{{< /note >}}
1. Validate the binary (optional)
Download the kubectl checksum file:
```bash
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
```
Validate the kubectl binary against the checksum file:
```bash
echo "$(<kubectl.sha256) kubectl" | sha256sum --check
```
If valid, the output is:
```console
kubectl: OK
```
If the check fails, `sha256` exits with nonzero status and prints output similar to:
```bash
kubectl: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
```
{{< note >}}
Download the same version of the binary and checksum.
{{< /note >}}
1. Install kubectl
```bash
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
```
{{< note >}}
If you do not have root access on the target system, you can still install kubectl to the `~/.local/bin` directory:
```bash
mkdir -p ~/.local/bin/kubectl
mv ./kubectl ~/.local/bin/kubectl
# and then add ~/.local/bin/kubectl to $PATH
```
{{< /note >}}
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
### Install using native package management
{{< tabs name="kubectl_install" >}}
{{< tab name="Ubuntu, Debian or HypriotOS" codelang="bash" >}}
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
{{< /tab >}}
{{< tab name="CentOS, RHEL or Fedora" codelang="bash" >}}cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl
{{< /tab >}}
{{< /tabs >}}
### Install using other package management
{{< tabs name="other_kubectl_install" >}}
{{% tab name="Snap" %}}
If you are on Ubuntu or another Linux distribution that support [snap](https://snapcraft.io/docs/core/install) package manager, kubectl is available as a [snap](https://snapcraft.io/) application.
```shell
snap install kubectl --classic
kubectl version --client
```
{{% /tab %}}
{{% tab name="Homebrew" %}}
If you are on Linux and using [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) package manager, kubectl is available for [installation](https://docs.brew.sh/Homebrew-on-Linux#install).
```shell
brew install kubectl
kubectl version --client
```
{{% /tab %}}
{{< /tabs >}}
### Install on Linux as part of the Google Cloud SDK
{{< include "included/install-kubectl-gcloud.md" >}}
## Verify kubectl configuration
{{< include "included/verify-kubectl.md" >}}
## Optional kubectl configurations
### Enable shell autocompletion
kubectl provides autocompletion support for Bash and Zsh, which can save you a lot of typing.
Below are the procedures to set up autocompletion for Bash and Zsh.
{{< tabs name="kubectl_autocompletion" >}}
{{< tab name="Bash" include="included/optional-kubectl-configs-bash-linux.md" />}}
{{< tab name="Zsh" include="included/optional-kubectl-configs-zsh.md" />}}
{{< /tabs >}}
## {{% heading "whatsnext" %}}
{{< include "included/kubectl-whats-next.md" >}}
@@ -0,0 +1,160 @@
---
reviewers:
- mikedanese
title: Install and Set Up kubectl on macOS
content_type: task
weight: 10
card:
name: tasks
weight: 20
title: Install kubectl on macOS
---
## {{% heading "prerequisites" %}}
You must use a kubectl version that is within one minor version difference of your cluster.
For example, a v1.2 client should work with v1.1, v1.2, and v1.3 master.
Using the latest version of kubectl helps avoid unforeseen issues.
## Install kubectl on macOS
The following methods exist for installing kubectl on macOS:
- [Install kubectl binary with curl on macOS](#install-kubectl-binary-with-curl-on-macos)
- [Install with Homebrew on macOS](#install-with-homebrew-on-macos)
- [Install with Macports on macOS](#install-with-macports-on-macos)
- [Install on Linux as part of the Google Cloud SDK](#install-on-linux-as-part-of-the-google-cloud-sdk)
### Install kubectl binary with curl on macOS
1. Download the latest release:
```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
```
{{< note >}}
To download a specific version, replace the `$(curl -L -s https://dl.k8s.io/release/stable.txt)` portion of the command with the specific version.
For example, to download version {{< param "fullversion" >}} on macOS, type:
```bash
curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/darwin/amd64/kubectl
```
{{< /note >}}
1. Validate the binary (optional)
Download the kubectl checksum file:
```bash
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256"
```
Validate the kubectl binary against the checksum file:
```bash
echo "$(<kubectl.sha256) kubectl" | shasum -a 256 --check
```
If valid, the output is:
```console
kubectl: OK
```
If the check fails, `shasum` exits with nonzero status and prints output similar to:
```bash
kubectl: FAILED
shasum: WARNING: 1 computed checksum did NOT match
```
{{< note >}}
Download the same version of the binary and checksum.
{{< /note >}}
1. Make the kubectl binary executable.
```bash
chmod +x ./kubectl
```
1. Move the kubectl binary to a file location on your system `PATH`.
```bash
sudo mv ./kubectl /usr/local/bin/kubectl
sudo chown root: /usr/local/bin/kubectl
```
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
### Install with Homebrew on macOS
If you are on macOS and using [Homebrew](https://brew.sh/) package manager, you can install kubectl with Homebrew.
1. Run the installation command:
```bash
brew install kubectl
```
or
```bash
brew install kubernetes-cli
```
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
### Install with Macports on macOS
If you are on macOS and using [Macports](https://macports.org/) package manager, you can install kubectl with Macports.
1. Run the installation command:
```bash
sudo port selfupdate
sudo port install kubectl
```
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
### Install on macOS as part of the Google Cloud SDK
{{< include "included/install-kubectl-gcloud.md" >}}
## Verify kubectl configuration
{{< include "included/verify-kubectl.md" >}}
## Optional kubectl configurations
### Enable shell autocompletion
kubectl provides autocompletion support for Bash and Zsh, which can save you a lot of typing.
Below are the procedures to set up autocompletion for Bash and Zsh.
{{< tabs name="kubectl_autocompletion" >}}
{{< tab name="Bash" include="included/optional-kubectl-configs-bash-mac.md" />}}
{{< tab name="Zsh" include="included/optional-kubectl-configs-zsh.md" />}}
{{< /tabs >}}
## {{% heading "whatsnext" %}}
{{< include "included/kubectl-whats-next.md" >}}
@@ -0,0 +1,179 @@
---
reviewers:
- mikedanese
title: Install and Set Up kubectl on Windows
content_type: task
weight: 10
card:
name: tasks
weight: 20
title: Install kubectl on Windows
---
## {{% heading "prerequisites" %}}
You must use a kubectl version that is within one minor version difference of your cluster.
For example, a v1.2 client should work with v1.1, v1.2, and v1.3 master.
Using the latest version of kubectl helps avoid unforeseen issues.
## Install kubectl on Windows
The following methods exist for installing kubectl on Windows:
- [Install kubectl binary with curl on Windows](#install-kubectl-binary-with-curl-on-windows)
- [Install with PowerShell from PSGallery](#install-with-powershell-from-psgallery)
- [Install on Windows using Chocolatey or Scoop](#install-on-windows-using-chocolatey-or-scoop)
- [Install on Windows as part of the Google Cloud SDK](#install-on-windows-as-part-of-the-google-cloud-sdk)
### Install kubectl binary with curl on Windows
1. Download the [latest release {{< param "fullversion" >}}](https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe).
Or if you have `curl` installed, use this command:
```powershell
curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe
```
{{< note >}}
To find out the latest stable version (for example, for scripting), take a look at [https://dl.k8s.io/release/stable.txt](https://dl.k8s.io/release/stable.txt).
{{< /note >}}
1. Validate the binary (optional)
Download the kubectl checksum file:
```powershell
curl -LO https://dl.k8s.io/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe.sha256
```
Validate the kubectl binary against the checksum file:
- Using Command Prompt to manually compare `CertUtil`'s output to the checksum file downloaded:
```cmd
CertUtil -hashfile kubectl.exe SHA256
type kubectl.exe.sha256
```
- Using PowerShell to automate the verification using the `-eq` operator to get a `True` or `False` result:
```powershell
$($(CertUtil -hashfile .\kubectl.exe SHA256)[1] -replace " ", "") -eq $(type .\kubectl.exe.sha256)
```
1. Add the binary in to your `PATH`.
1. Test to ensure the version of `kubectl` is the same as downloaded:
```cmd
kubectl version --client
```
{{< note >}}
[Docker Desktop for Windows](https://docs.docker.com/docker-for-windows/#kubernetes) adds its own version of `kubectl` to `PATH`.
If you have installed Docker Desktop before, you may need to place your `PATH` entry before the one added by the Docker Desktop installer or remove the Docker Desktop's `kubectl`.
{{< /note >}}
### Install with PowerShell from PSGallery
If you are on Windows and using the [PowerShell Gallery](https://www.powershellgallery.com/) package manager, you can install and update kubectl with PowerShell.
1. Run the installation commands (making sure to specify a `DownloadLocation`):
```powershell
Install-Script -Name 'install-kubectl' -Scope CurrentUser -Force
install-kubectl.ps1 [-DownloadLocation <path>]
```
{{< note >}}
If you do not specify a `DownloadLocation`, `kubectl` will be installed in the user's `temp` Directory.
{{< /note >}}
The installer creates `$HOME/.kube` and instructs it to create a config file.
1. Test to ensure the version you installed is up-to-date:
```powershell
kubectl version --client
```
{{< note >}}
Updating the installation is performed by rerunning the two commands listed in step 1.
{{< /note >}}
### Install on Windows using Chocolatey or Scoop
1. To install kubectl on Windows you can use either [Chocolatey](https://chocolatey.org) package manager or [Scoop](https://scoop.sh) command-line installer.
{{< tabs name="kubectl_win_install" >}}
{{% tab name="choco" %}}
```powershell
choco install kubernetes-cli
```
{{% /tab %}}
{{% tab name="scoop" %}}
```powershell
scoop install kubectl
```
{{% /tab %}}
{{< /tabs >}}
1. Test to ensure the version you installed is up-to-date:
```powershell
kubectl version --client
```
1. Navigate to your home directory:
```powershell
# If you're using cmd.exe, run: cd %USERPROFILE%
cd ~
```
1. Create the `.kube` directory:
```powershell
mkdir .kube
```
1. Change to the `.kube` directory you just created:
```powershell
cd .kube
```
1. Configure kubectl to use a remote Kubernetes cluster:
```powershell
New-Item config -type file
```
{{< note >}}
Edit the config file with a text editor of your choice, such as Notepad.
{{< /note >}}
### Install on Windows as part of the Google Cloud SDK
{{< include "included/install-kubectl-gcloud.md" >}}
## Verify kubectl configuration
{{< include "included/verify-kubectl.md" >}}
## Optional kubectl configurations
### Enable shell autocompletion
kubectl provides autocompletion support for Bash and Zsh, which can save you a lot of typing.
Below are the procedures to set up autocompletion for Zsh, if you are running that on Windows.
{{< include "included/optional-kubectl-configs-zsh.md" >}}
## {{% heading "whatsnext" %}}
{{< include "included/kubectl-whats-next.md" >}}
@@ -1,634 +0,0 @@
---
reviewers:
- mikedanese
title: Install and Set Up kubectl
content_type: task
weight: 10
card:
name: tasks
weight: 20
title: Install kubectl
---
<!-- overview -->
The Kubernetes command-line tool, [kubectl](/docs/reference/kubectl/kubectl/), allows
you to run commands against Kubernetes clusters.
You can use kubectl to deploy applications, inspect and manage cluster resources,
and view logs. For a complete list of kubectl operations, see
[Overview of kubectl](/docs/reference/kubectl/overview/).
## {{% heading "prerequisites" %}}
You must use a kubectl version that is within one minor version difference of your cluster.
For example, a v1.2 client should work with v1.1, v1.2, and v1.3 master.
Using the latest version of kubectl helps avoid unforeseen issues.
<!-- steps -->
## Install kubectl on Linux
### Install kubectl binary with curl on Linux
1. Download the latest release with the command:
```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
```
{{< note >}}
To download a specific version, replace the `$(curl -L -s https://dl.k8s.io/release/stable.txt)` portion of the command with the specific version.
For example, to download version {{< param "fullversion" >}} on Linux, type:
```bash
curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/linux/amd64/kubectl
```
{{< /note >}}
1. Validate the binary (optional)
Download the kubectl checksum file:
```bash
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl.sha256"
```
Validate the kubectl binary against the checksum file:
```bash
echo "$(<kubectl.sha256) kubectl" | sha256sum --check
```
If valid, the output is:
```bash
kubectl: OK
```
If the check fails, `sha256` exits with nonzero status and prints output similar to:
```bash
kubectl: FAILED
sha256sum: WARNING: 1 computed checksum did NOT match
```
{{< note >}}
Download the same version of the binary and checksum.
{{< /note >}}
1. Install kubectl
```bash
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
```
{{< note >}}
If you do not have root access on the target system, you can still install kubectl to the `~/.local/bin` directory:
```bash
mkdir -p ~/.local/bin/kubectl
mv ./kubectl ~/.local/bin/kubectl
# and then add ~/.local/bin/kubectl to $PATH
```
{{< /note >}}
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
### Install using native package management
{{< tabs name="kubectl_install" >}}
{{< tab name="Ubuntu, Debian or HypriotOS" codelang="bash" >}}
sudo apt-get update && sudo apt-get install -y apt-transport-https gnupg2 curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl
{{< /tab >}}
{{< tab name="CentOS, RHEL or Fedora" codelang="bash" >}}cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
yum install -y kubectl
{{< /tab >}}
{{< /tabs >}}
### Install using other package management
{{< tabs name="other_kubectl_install" >}}
{{% tab name="Snap" %}}
If you are on Ubuntu or another Linux distribution that support [snap](https://snapcraft.io/docs/core/install) package manager, kubectl is available as a [snap](https://snapcraft.io/) application.
```shell
snap install kubectl --classic
kubectl version --client
```
{{% /tab %}}
{{% tab name="Homebrew" %}}
If you are on Linux and using [Homebrew](https://docs.brew.sh/Homebrew-on-Linux) package manager, kubectl is available for [installation](https://docs.brew.sh/Homebrew-on-Linux#install).
```shell
brew install kubectl
kubectl version --client
```
{{% /tab %}}
{{< /tabs >}}
## Install kubectl on macOS
### Install kubectl binary with curl on macOS
1. Download the latest release:
```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl"
```
{{< note >}}
To download a specific version, replace the `$(curl -L -s https://dl.k8s.io/release/stable.txt)` portion of the command with the specific version.
For example, to download version {{< param "fullversion" >}} on macOS, type:
```bash
curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/darwin/amd64/kubectl
```
{{< /note >}}
1. Validate the binary (optional)
Download the kubectl checksum file:
```bash
curl -LO "https://dl.k8s.io/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/darwin/amd64/kubectl.sha256"
```
Validate the kubectl binary against the checksum file:
```bash
echo "$(<kubectl.sha256) kubectl" | shasum -a 256 --check
```
If valid, the output is:
```bash
kubectl: OK
```
If the check fails, `shasum` exits with nonzero status and prints output similar to:
```bash
kubectl: FAILED
shasum: WARNING: 1 computed checksum did NOT match
```
{{< note >}}
Download the same version of the binary and checksum.
{{< /note >}}
1. Make the kubectl binary executable.
```bash
chmod +x ./kubectl
```
1. Move the kubectl binary to a file location on your system `PATH`.
```bash
sudo mv ./kubectl /usr/local/bin/kubectl && \
sudo chown root: /usr/local/bin/kubectl
```
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
### Install with Homebrew on macOS
If you are on macOS and using [Homebrew](https://brew.sh/) package manager, you can install kubectl with Homebrew.
1. Run the installation command:
```bash
brew install kubectl
```
or
```bash
brew install kubernetes-cli
```
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
### Install with Macports on macOS
If you are on macOS and using [Macports](https://macports.org/) package manager, you can install kubectl with Macports.
1. Run the installation command:
```bash
sudo port selfupdate
sudo port install kubectl
```
1. Test to ensure the version you installed is up-to-date:
```bash
kubectl version --client
```
## Install kubectl on Windows
### Install kubectl binary with curl on Windows
1. Download the [latest release {{< param "fullversion" >}}](https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe).
Or if you have `curl` installed, use this command:
```powershell
curl -LO https://dl.k8s.io/release/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe
```
{{< note >}}
To find out the latest stable version (for example, for scripting), take a look at [https://dl.k8s.io/release/stable.txt](https://dl.k8s.io/release/stable.txt).
{{< /note >}}
1. Validate the binary (optional)
Download the kubectl checksum file:
```powershell
curl -LO https://dl.k8s.io/{{< param "fullversion" >}}/bin/windows/amd64/kubectl.exe.sha256
```
Validate the kubectl binary against the checksum file:
- Using Command Prompt to manually compare `CertUtil`'s output to the checksum file downloaded:
```cmd
CertUtil -hashfile kubectl.exe SHA256
type kubectl.exe.sha256
```
- Using PowerShell to automate the verification using the `-eq` operator to get a `True` or `False` result:
```powershell
$($(CertUtil -hashfile .\kubectl.exe SHA256)[1] -replace " ", "") -eq $(type .\kubectl.exe.sha256)
```
1. Add the binary in to your `PATH`.
1. Test to ensure the version of `kubectl` is the same as downloaded:
```cmd
kubectl version --client
```
{{< note >}}
[Docker Desktop for Windows](https://docs.docker.com/docker-for-windows/#kubernetes) adds its own version of `kubectl` to `PATH`.
If you have installed Docker Desktop before, you may need to place your `PATH` entry before the one added by the Docker Desktop installer or remove the Docker Desktop's `kubectl`.
{{< /note >}}
### Install with PowerShell from PSGallery
If you are on Windows and using the [PowerShell Gallery](https://www.powershellgallery.com/) package manager, you can install and update kubectl with PowerShell.
1. Run the installation commands (making sure to specify a `DownloadLocation`):
```powershell
Install-Script -Name 'install-kubectl' -Scope CurrentUser -Force
install-kubectl.ps1 [-DownloadLocation <path>]
```
{{< note >}}
If you do not specify a `DownloadLocation`, `kubectl` will be installed in the user's `temp` Directory.
{{< /note >}}
The installer creates `$HOME/.kube` and instructs it to create a config file.
1. Test to ensure the version you installed is up-to-date:
```powershell
kubectl version --client
```
{{< note >}}
Updating the installation is performed by rerunning the two commands listed in step 1.
{{< /note >}}
### Install on Windows using Chocolatey or Scoop
1. To install kubectl on Windows you can use either [Chocolatey](https://chocolatey.org) package manager or [Scoop](https://scoop.sh) command-line installer.
{{< tabs name="kubectl_win_install" >}}
{{% tab name="choco" %}}
```powershell
choco install kubernetes-cli
```
{{% /tab %}}
{{% tab name="scoop" %}}
```powershell
scoop install kubectl
```
{{% /tab %}}
{{< /tabs >}}
1. Test to ensure the version you installed is up-to-date:
```powershell
kubectl version --client
```
1. Navigate to your home directory:
```powershell
# If you're using cmd.exe, run: cd %USERPROFILE%
cd ~
```
1. Create the `.kube` directory:
```powershell
mkdir .kube
```
1. Change to the `.kube` directory you just created:
```powershell
cd .kube
```
1. Configure kubectl to use a remote Kubernetes cluster:
```powershell
New-Item config -type file
```
{{< note >}}
Edit the config file with a text editor of your choice, such as Notepad.
{{< /note >}}
## Download as part of the Google Cloud SDK
You can install kubectl as part of the Google Cloud SDK.
1. Install the [Google Cloud SDK](https://cloud.google.com/sdk/).
1. Run the `kubectl` installation command:
```shell
gcloud components install kubectl
```
1. Test to ensure the version you installed is up-to-date:
```shell
kubectl version --client
```
## Verifying kubectl configuration
In order for kubectl to find and access a Kubernetes cluster, it needs a
[kubeconfig file](/docs/concepts/configuration/organize-cluster-access-kubeconfig/),
which is created automatically when you create a cluster using
[kube-up.sh](https://github.com/kubernetes/kubernetes/blob/master/cluster/kube-up.sh)
or successfully deploy a Minikube cluster.
By default, kubectl configuration is located at `~/.kube/config`.
Check that kubectl is properly configured by getting the cluster state:
```shell
kubectl cluster-info
```
If you see a URL response, kubectl is correctly configured to access your cluster.
If you see a message similar to the following, kubectl is not configured correctly or is not able to connect to a Kubernetes cluster.
```
The connection to the server <server-name:port> was refused - did you specify the right host or port?
```
For example, if you are intending to run a Kubernetes cluster on your laptop (locally), you will need a tool like Minikube to be installed first and then re-run the commands stated above.
If kubectl cluster-info returns the url response but you can't access your cluster, to check whether it is configured properly, use:
```shell
kubectl cluster-info dump
```
## Optional kubectl configurations
### Enabling shell autocompletion
kubectl provides autocompletion support for Bash and Zsh, which can save you a lot of typing.
Below are the procedures to set up autocompletion for Bash (including the difference between Linux and macOS) and Zsh.
{{< tabs name="kubectl_autocompletion" >}}
{{% tab name="Bash on Linux" %}}
### Introduction
The kubectl completion script for Bash can be generated with the command `kubectl completion bash`. Sourcing the completion script in your shell enables kubectl autocompletion.
However, the completion script depends on [**bash-completion**](https://github.com/scop/bash-completion), which means that you have to install this software first (you can test if you have bash-completion already installed by running `type _init_completion`).
### Install bash-completion
bash-completion is provided by many package managers (see [here](https://github.com/scop/bash-completion#installation)). You can install it with `apt-get install bash-completion` or `yum install bash-completion`, etc.
The above commands create `/usr/share/bash-completion/bash_completion`, which is the main script of bash-completion. Depending on your package manager, you have to manually source this file in your `~/.bashrc` file.
To find out, reload your shell and run `type _init_completion`. If the command succeeds, you're already set, otherwise add the following to your `~/.bashrc` file:
```bash
source /usr/share/bash-completion/bash_completion
```
Reload your shell and verify that bash-completion is correctly installed by typing `type _init_completion`.
### Enable kubectl autocompletion
You now need to ensure that the kubectl completion script gets sourced in all your shell sessions. There are two ways in which you can do this:
- Source the completion script in your `~/.bashrc` file:
```bash
echo 'source <(kubectl completion bash)' >>~/.bashrc
```
- Add the completion script to the `/etc/bash_completion.d` directory:
```bash
kubectl completion bash >/etc/bash_completion.d/kubectl
```
If you have an alias for kubectl, you can extend shell completion to work with that alias:
```bash
echo 'alias k=kubectl' >>~/.bashrc
echo 'complete -F __start_kubectl k' >>~/.bashrc
```
{{< note >}}
bash-completion sources all completion scripts in `/etc/bash_completion.d`.
{{< /note >}}
Both approaches are equivalent. After reloading your shell, kubectl autocompletion should be working.
{{% /tab %}}
{{% tab name="Bash on macOS" %}}
### Introduction
The kubectl completion script for Bash can be generated with `kubectl completion bash`. Sourcing this script in your shell enables kubectl completion.
However, the kubectl completion script depends on [**bash-completion**](https://github.com/scop/bash-completion) which you thus have to previously install.
{{< warning>}}
There are two versions of bash-completion, v1 and v2. V1 is for Bash 3.2 (which is the default on macOS), and v2 is for Bash 4.1+. The kubectl completion script **doesn't work** correctly with bash-completion v1 and Bash 3.2. It requires **bash-completion v2** and **Bash 4.1+**. Thus, to be able to correctly use kubectl completion on macOS, you have to install and use Bash 4.1+ ([*instructions*](https://itnext.io/upgrading-bash-on-macos-7138bd1066ba)). The following instructions assume that you use Bash 4.1+ (that is, any Bash version of 4.1 or newer).
{{< /warning >}}
### Upgrade Bash
The instructions here assume you use Bash 4.1+. You can check your Bash's version by running:
```bash
echo $BASH_VERSION
```
If it is too old, you can install/upgrade it using Homebrew:
```bash
brew install bash
```
Reload your shell and verify that the desired version is being used:
```bash
echo $BASH_VERSION $SHELL
```
Homebrew usually installs it at `/usr/local/bin/bash`.
### Install bash-completion
{{< note >}}
As mentioned, these instructions assume you use Bash 4.1+, which means you will install bash-completion v2 (in contrast to Bash 3.2 and bash-completion v1, in which case kubectl completion won't work).
{{< /note >}}
You can test if you have bash-completion v2 already installed with `type _init_completion`. If not, you can install it with Homebrew:
```bash
brew install bash-completion@2
```
As stated in the output of this command, add the following to your `~/.bash_profile` file:
```bash
export BASH_COMPLETION_COMPAT_DIR="/usr/local/etc/bash_completion.d"
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . "/usr/local/etc/profile.d/bash_completion.sh"
```
Reload your shell and verify that bash-completion v2 is correctly installed with `type _init_completion`.
### Enable kubectl autocompletion
You now have to ensure that the kubectl completion script gets sourced in all your shell sessions. There are multiple ways to achieve this:
- Source the completion script in your `~/.bash_profile` file:
```bash
echo 'source <(kubectl completion bash)' >>~/.bash_profile
```
- Add the completion script to the `/usr/local/etc/bash_completion.d` directory:
```bash
kubectl completion bash >/usr/local/etc/bash_completion.d/kubectl
```
- If you have an alias for kubectl, you can extend shell completion to work with that alias:
```bash
echo 'alias k=kubectl' >>~/.bash_profile
echo 'complete -F __start_kubectl k' >>~/.bash_profile
```
- If you installed kubectl with Homebrew (as explained [above](#install-with-homebrew-on-macos)), then the kubectl completion script should already be in `/usr/local/etc/bash_completion.d/kubectl`. In that case, you don't need to do anything.
{{< note >}}
The Homebrew installation of bash-completion v2 sources all the files in the `BASH_COMPLETION_COMPAT_DIR` directory, that's why the latter two methods work.
{{< /note >}}
In any case, after reloading your shell, kubectl completion should be working.
{{% /tab %}}
{{% tab name="Zsh" %}}
The kubectl completion script for Zsh can be generated with the command `kubectl completion zsh`. Sourcing the completion script in your shell enables kubectl autocompletion.
To do so in all your shell sessions, add the following to your `~/.zshrc` file:
```zsh
source <(kubectl completion zsh)
```
If you have an alias for kubectl, you can extend shell completion to work with that alias:
```zsh
echo 'alias k=kubectl' >>~/.zshrc
echo 'complete -F __start_kubectl k' >>~/.zshrc
```
After reloading your shell, kubectl autocompletion should be working.
If you get an error like `complete:13: command not found: compdef`, then add the following to the beginning of your `~/.zshrc` file:
```zsh
autoload -Uz compinit
compinit
```
{{% /tab %}}
{{< /tabs >}}
## {{% heading "whatsnext" %}}
* [Install Minikube](https://minikube.sigs.k8s.io/docs/start/)
* See the [getting started guides](/docs/setup/) for more about creating clusters.
* [Learn how to launch and expose your application.](/docs/tasks/access-application-cluster/service-access-application-cluster/)
* If you need access to a cluster you didn't create, see the
[Sharing Cluster Access document](/docs/tasks/access-application-cluster/configure-access-multiple-clusters/).
* Read the [kubectl reference docs](/docs/reference/kubectl/kubectl/)
@@ -59,6 +59,22 @@ If you installed minikube locally, run `minikube start`.
4. Katacoda environment only: Type `30000`, and then click **Display Port**.
{{< note >}}
The `dashboard` command enables the dashboard add-on and opens the proxy in the default web browser. You can create Kubernetes resources on the dashboard such as Deployment and Service.
If you are running in an environment as root, see [Open Dashboard with URL](/docs/tutorials/hello-minikube#open-dashboard-with-url).
To stop the proxy, run `Ctrl+C` to exit the process. The dashboard remains running.
{{< /note >}}
## Open Dashboard with URL
If you don't want to open a web browser, run the dashboard command with the url flag to emit a URL:
```shell
minikube dashboard --url
```
## Create a Deployment
A Kubernetes [*Pod*](/docs/concepts/workloads/pods/) is a group of one or more Containers,
@@ -31,7 +31,7 @@ weight: 10
Once you have a running Kubernetes cluster, you can deploy your containerized applications on top of it.
To do so, you create a Kubernetes <b>Deployment</b> configuration. The Deployment instructs Kubernetes
how to create and update instances of your application. Once you've created a Deployment, the Kubernetes
master schedules the application instances included in that Deployment to run on individual Nodes in the
control plane schedules the application instances included in that Deployment to run on individual Nodes in the
cluster.
</p>
@@ -1,5 +1,32 @@
<svg width="476.1" height="385.3" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<style type="text/css">.st0{fill:#FFFFFF;stroke:#006DE9;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
width="476.1"
height="385.3"
version="1.1"
id="svg1987">
<metadata
id="metadata1993">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs1991" />
<style
type="text/css"
id="style1792">.st0{fill:#FFFFFF;stroke:#006DE9;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st1{fill:#FFFFFF;stroke:#006DE9;stroke-width:6;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st2{fill:#FFFFFF;stroke:#326DE6;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st3{opacity:0.71;fill:#326CE6;}
@@ -63,231 +90,535 @@
.st61{fill:#011F38;stroke:#414042;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st62{fill:none;stroke:#011F38;stroke-width:0.3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
.st63{fill:none;stroke:#011F38;stroke-width:0.2813;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}</style>
<symbol id="master_x5F_level1_1_" viewBox="-68.6 -66.9 137.2 133.9">
<g id="svg_1">
<g id="svg_2">
<line class="st0" x1="0" y1="-11.1" x2="0" y2="0.7" id="svg_3"/>
<line class="st0" x1="5.9" y1="-5.2" x2="-5.9" y2="-5.2" id="svg_4"/>
</g>
<polygon class="st1" points="-29.2,-63.9 -65.6,-18.3 -52.6,38.6 0,63.9 52.6,38.6 65.6,-18.3 29.2,-63.9 " id="svg_5"/>
</g>
</symbol>
<symbol id="node_high_level" viewBox="-81 -93 162 186.1">
<polygon class="st2" points="-80,-46 -80,46 0,92 80,46 80,-46 0,-92 " id="svg_6"/>
<g id="Isolation_Mode_3_"/>
</symbol>
<symbol id="node_x5F_empty" viewBox="-87.5 -100.6 175.1 201.1">
<use xlink:href="#node_high_level" width="162" height="186.1" id="XMLID_201_" x="-81" y="-93" transform="matrix(1.0808,0,0,1.0808,-0.00003292006,-0.00003749943) "/>
<g id="svg_7">
<polygon class="st3" points="76.8,-28.1 -14,-80.3 0,-88.3 76.7,-44.4 " id="svg_8"/>
<polygon class="st4" points="76.8,-28.1 32.1,-53.8 38.8,-66.1 76.7,-44.4 " id="svg_9"/>
</g>
</symbol>
<symbol id="node_x5F_new" viewBox="-87.6 -101 175.2 202">
<polygon class="st5" points="0,-100 -86.6,-50 -86.6,50 0,100 86.6,50 86.6,-50 " id="svg_10"/>
<polygon class="st6" points="-86.6,-20.2 -86.6,-50 0,-100 25.8,-85.1 " id="svg_11"/>
<polygon class="st7" points="-40.8,-70.7 -32.9,-57 15.7,-85.1 0,-94.3 " id="svg_12"/>
<text transform="matrix(0.866,-0.5,-0.5,-0.866,-33.9256,-70.7388) " class="st8" font-size="11.3632px" font-family="&#x27;RobotoSlab-Regular'" id="svg_13">Docker</text>
<text transform="matrix(0.866,-0.5,-0.5,-0.866,-76.0668,-46.4087) " class="st8" font-size="11.3632px" font-family="&#x27;RobotoSlab-Regular'" id="svg_14">Kubelt</text>
</symbol>
<g>
<title>Layer 1</title>
<g id="CLUSTER">
<g id="XMLID_8_" class="st9">
<g id="svg_15">
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="27.9955" y1="185.5114" x2="342.4509" y2="185.5114">
<stop offset="0" stop-color="#326DE6"/>
<stop offset="1" stop-color="#10FFC6"/>
</linearGradient>
<polygon class="st10" points="311.3,92.9 342.5,229.4 255.2,338.8 115.3,338.8 28,229.4 59.1,92.9 185.2,32.2 " id="svg_16"/>
</g>
</g>
</g>
<g id="master">
<g id="master_x5F_level1"/>
<use xlink:href="#master_x5F_level1_1_" width="137.2" height="133.9" x="-68.6" y="-66.9" transform="matrix(0.4,0,0,-0.4,185.2213,187.4709) " id="svg_17"/>
</g>
<g id="Node">
<g id="Node_x5F_level3_x5F_1">
<g id="Isolation_Mode"/>
</g>
<polygon class="st16" points="224.6,160.7 189,140.1 189,98.9 224.6,78.4 260.3,98.9 260.3,140.1 " id="svg_18"/>
<polygon class="st13" points="189,127.8 189,140.1 224.6,160.7 235.2,154.5 " id="svg_19"/>
<polygon class="st7" points="207.8,148.6 211.1,143 231.1,154.5 224.6,158.3 " id="svg_20"/>
<g id="svg_21">
<path class="st8" d="m213.7,146.5c0.4,0.2 0.6,0.5 0.7,0.9c0.1,0.4 0,0.7 -0.2,1.1l-0.2,0.4c-0.2,0.4 -0.5,0.6 -0.9,0.7c-0.4,0.1 -0.7,0 -1.1,-0.2l-1.2,-0.7l0.1,-0.2l0.4,0.1l1.3,-2.3l-0.3,-0.2l0.1,-0.3l0.3,0.2l1,0.5zm-0.6,0l-1.3,2.3l0.5,0.3c0.3,0.2 0.5,0.2 0.8,0.1c0.3,-0.1 0.5,-0.3 0.6,-0.5l0.2,-0.4c0.2,-0.3 0.2,-0.5 0.2,-0.8c-0.1,-0.3 -0.2,-0.5 -0.5,-0.6l-0.5,-0.4z" id="svg_22"/>
<path class="st8" d="m214.3,149.2c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.9,0.1c0.3,0.2 0.5,0.4 0.5,0.7c0.1,0.3 0,0.6 -0.2,0.9l0,0c-0.2,0.3 -0.4,0.5 -0.7,0.6c-0.3,0.1 -0.6,0.1 -0.9,-0.1c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7c0,-0.2 0,-0.5 0.2,-0.9l0,0zm0.4,0.3c-0.1,0.2 -0.2,0.4 -0.2,0.6c0,0.2 0.1,0.4 0.3,0.5c0.2,0.1 0.4,0.1 0.5,0c0.2,-0.1 0.3,-0.3 0.5,-0.5l0,0c0.1,-0.2 0.2,-0.4 0.2,-0.6c0,-0.2 -0.1,-0.4 -0.3,-0.5c-0.2,-0.1 -0.4,-0.1 -0.6,0s-0.2,0.2 -0.4,0.5l0,0z" id="svg_23"/>
<path class="st8" d="m217.1,151.9c0.1,0.1 0.3,0.1 0.4,0.1c0.1,0 0.2,-0.1 0.3,-0.2l0.4,0.2l0,0c-0.1,0.2 -0.3,0.3 -0.5,0.3c-0.3,0 -0.5,0 -0.7,-0.1c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7c0,-0.3 0,-0.6 0.2,-0.9l0,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.9,0.1c0.2,0.1 0.3,0.2 0.4,0.4c0.1,0.1 0.2,0.3 0.2,0.4l-0.3,0.5l-0.3,-0.2l0.1,-0.4c0,-0.1 -0.1,-0.1 -0.1,-0.2c-0.1,-0.1 -0.1,-0.1 -0.2,-0.2c-0.2,-0.1 -0.4,-0.1 -0.6,0c-0.2,0.1 -0.3,0.3 -0.4,0.5l0,0.1c-0.1,0.2 -0.2,0.4 -0.2,0.6c-0.1,0.2 0,0.3 0.2,0.4z" id="svg_24"/>
<path class="st8" d="m219.7,150l0.1,-0.3l0.7,0.4l-1,1.8l0.2,0.1l0.8,-0.3l-0.2,-0.1l0.1,-0.3l0.9,0.5l-0.1,0.3l-0.3,-0.1l-1,0.3l0.2,1.3l0.2,0.2l-0.1,0.2l-0.9,-0.5l0.1,-0.2l0.2,0.1l-0.2,-1l-0.3,-0.1l-0.1,0.7l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l1.4,-2.5l-0.4,-0.2z" id="svg_25"/>
<path class="st8" d="m221.5,154.9c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7s0,-0.6 0.2,-0.9l0,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.8,0.1c0.3,0.2 0.5,0.4 0.5,0.6c0,0.3 0,0.5 -0.2,0.8l-0.1,0.2l-1.4,-0.8l0,0c-0.1,0.2 -0.2,0.4 -0.1,0.6c0,0.2 0.1,0.3 0.3,0.4c0.1,0.1 0.3,0.1 0.4,0.1c0.1,0 0.2,0 0.3,0l0,0.3c-0.1,0 -0.3,0 -0.4,0c-0.1,0.2 -0.3,0.1 -0.5,0zm1.1,-1.9c-0.1,-0.1 -0.3,-0.1 -0.4,0c-0.2,0.1 -0.3,0.2 -0.4,0.3l0,0l1,0.6l0,-0.1c0.1,-0.2 0.1,-0.3 0.1,-0.5c-0.1,-0.1 -0.2,-0.2 -0.3,-0.3z" id="svg_26"/>
<path class="st8" d="m223.9,153.7l0.1,-0.3l0.7,0.4l-0.1,0.3c0.1,-0.1 0.2,-0.1 0.4,-0.1c0.1,0 0.2,0 0.4,0.1c0,0 0.1,0 0.1,0.1c0,0 0.1,0 0.1,0.1l-0.3,0.3l-0.2,-0.1c-0.1,-0.1 -0.2,-0.1 -0.3,-0.1c-0.1,0 -0.2,0 -0.3,0.1l-0.7,1.2l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l0.9,-1.5l-0.5,-0.2z" id="svg_27"/>
</g>
<g id="svg_28">
<path class="st8" d="m194.3,135.3l0.1,-0.3l0.7,0.4l-1,1.8l0.2,0.1l0.8,-0.3l-0.2,-0.1l0.1,-0.3l0.9,0.5l-0.1,0.3l-0.3,-0.1l-1,0.3l0.2,1.3l0.2,0.2l-0.1,0.2l-0.9,-0.5l0.1,-0.2l0.2,0.1l-0.2,-1l-0.3,-0.1l-0.4,0.7l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l1.4,-2.5l-0.1,-0.2z" id="svg_29"/>
<path class="st8" d="m196.8,140.2c-0.1,0.1 -0.3,0.1 -0.4,0.1c-0.1,0 -0.3,0 -0.4,-0.1c-0.2,-0.1 -0.4,-0.3 -0.4,-0.5c0,-0.2 0,-0.5 0.2,-0.8l0.6,-1l-0.2,-0.2l0.1,-0.3l0.2,0.1l0.4,0.2l-0.7,1.3c-0.1,0.2 -0.2,0.4 -0.2,0.5c0,0.1 0.1,0.2 0.2,0.3c0.1,0.1 0.3,0.1 0.4,0.1s0.2,0 0.3,-0.1l0.7,-1.2l-0.3,-0.2l0.1,-0.3l0.3,0.2l0.4,0.2l-1.1,1.8l0.2,0.2l-0.1,0.2l-0.6,-0.3l0.3,-0.2z" id="svg_30"/>
<path class="st8" d="m200.1,141.2c-0.2,0.3 -0.4,0.5 -0.7,0.6c-0.3,0.1 -0.5,0.1 -0.8,-0.1c-0.1,-0.1 -0.2,-0.2 -0.3,-0.3c-0.1,-0.1 -0.1,-0.2 -0.1,-0.4l-0.2,0.3l-0.3,-0.2l1.6,-2.8l-0.3,-0.2l0.1,-0.3l0.7,0.4l-0.7,1.2c0.1,-0.1 0.2,-0.1 0.4,-0.1c0.1,0 0.3,0 0.4,0.1c0.3,0.2 0.4,0.4 0.4,0.7c0.1,0.4 0,0.7 -0.2,1.1l0,0zm-0.4,-0.3c0.1,-0.2 0.2,-0.5 0.2,-0.7c0,-0.2 -0.1,-0.4 -0.3,-0.5c-0.1,-0.1 -0.2,-0.1 -0.4,-0.1c-0.1,0 -0.2,0.1 -0.3,0.1l-0.5,0.9c0,0.1 0,0.2 0.1,0.3c0.1,0.1 0.1,0.2 0.3,0.3c0.2,0.1 0.4,0.1 0.5,0c0.2,0.1 0.3,0 0.4,-0.3l0,0z" id="svg_31"/>
<path class="st8" d="m200.9,143c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7s0,-0.6 0.2,-0.9l0,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.8,0.1c0.3,0.2 0.5,0.4 0.5,0.6c0,0.3 0,0.5 -0.2,0.8l-0.1,0.2l-1.4,-0.8l0,0c-0.1,0.2 -0.2,0.4 -0.1,0.6c0,0.2 0.1,0.3 0.3,0.4c0.1,0.1 0.3,0.1 0.4,0.1c0.1,0 0.2,0 0.3,0l0,0.3c-0.1,0 -0.3,0 -0.4,0c-0.2,0.2 -0.3,0.1 -0.5,0zm1,-2c-0.1,-0.1 -0.3,-0.1 -0.4,0c-0.2,0.1 -0.3,0.2 -0.4,0.3l0,0l1,0.6l0,-0.1c0.1,-0.2 0.1,-0.3 0.1,-0.5c0,0 -0.1,-0.2 -0.3,-0.3z" id="svg_32"/>
<path class="st8" d="m203.7,140.8l0.1,-0.3l0.7,0.4l-1.6,2.8l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l1.4,-2.5l-0.3,-0.1z" id="svg_33"/>
<path class="st8" d="m204.3,145c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7c-0.1,-0.3 0,-0.6 0.2,-0.9l0,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.8,0.1c0.3,0.2 0.5,0.4 0.5,0.6c0,0.3 0,0.5 -0.2,0.8l-0.1,0.2l-1.4,-0.8l0,0c-0.1,0.2 -0.2,0.4 -0.1,0.6c0,0.2 0.1,0.3 0.3,0.4c0.1,0.1 0.3,0.1 0.4,0.1s0.2,0 0.3,0l0,0.3c-0.1,0 -0.3,0 -0.4,0c-0.1,0.1 -0.3,0.1 -0.5,0zm1.1,-2c-0.1,-0.1 -0.3,-0.1 -0.4,0c-0.2,0.1 -0.3,0.2 -0.4,0.3l0,0l1,0.6l0,-0.1c0.1,-0.2 0.1,-0.3 0.1,-0.5c-0.1,-0.1 -0.2,-0.2 -0.3,-0.3z" id="svg_34"/>
<path class="st8" d="m207.8,143.4l-0.3,0.5l0.4,0.2l-0.2,0.3l-0.4,-0.2l-0.8,1.3c-0.1,0.1 -0.1,0.2 -0.1,0.2c0,0.1 0.1,0.1 0.1,0.2c0,0 0.1,0 0.1,0.1c0,0 0.1,0 0.1,0l-0.1,0.3c-0.1,0 -0.1,0 -0.2,0c-0.1,0 -0.2,-0.1 -0.2,-0.1c-0.2,-0.1 -0.3,-0.2 -0.3,-0.4s0,-0.3 0.1,-0.5l0.8,-1.3l-0.3,-0.2l0.2,-0.3l0.3,0.2l0.3,-0.5l0.5,0.2z" id="svg_35"/>
</g>
<polygon class="st16" points="182.3,140.1 146.6,160.7 111,140.1 111,99 146.6,78.4 182.3,99 " id="svg_36"/>
<polygon class="st13" points="136,154.5 146.6,160.7 182.3,140.1 182.2,127.9 " id="svg_37"/>
<polygon class="st7" points="163.4,148.6 160.2,143 180.2,131.4 180.2,138.9 " id="svg_38"/>
<g id="svg_39">
<path class="st8" d="m164.6,142.5c0.4,-0.2 0.7,-0.3 1.1,-0.2c0.4,0.1 0.6,0.3 0.9,0.7l0.2,0.4c0.2,0.4 0.3,0.7 0.2,1.1c-0.1,0.4 -0.3,0.7 -0.7,0.9l-1.2,0.7l-0.1,-0.2l0.3,-0.2l-1.3,-2.3l-0.4,0.1l-0.1,-0.3l0.3,-0.2l0.8,-0.5zm-0.3,0.6l1.3,2.3l0.5,-0.3c0.3,-0.2 0.4,-0.4 0.5,-0.6c0.1,-0.3 0,-0.5 -0.2,-0.8l-0.2,-0.4c-0.2,-0.3 -0.4,-0.5 -0.6,-0.5c-0.3,-0.1 -0.5,-0.1 -0.8,0.1l-0.5,0.2z" id="svg_40"/>
<path class="st8" d="m167.3,143.4c-0.2,-0.3 -0.2,-0.6 -0.2,-0.9c0.1,-0.3 0.2,-0.5 0.5,-0.7c0.3,-0.2 0.6,-0.2 0.9,-0.1c0.3,0.1 0.5,0.3 0.7,0.6l0,0c0.2,0.3 0.2,0.6 0.2,0.9c-0.1,0.3 -0.2,0.5 -0.5,0.7c-0.3,0.2 -0.6,0.2 -0.9,0.1c-0.3,0 -0.5,-0.3 -0.7,-0.6l0,0zm0.4,-0.2c0.1,0.2 0.3,0.4 0.5,0.5s0.4,0.1 0.6,0c0.2,-0.1 0.3,-0.3 0.3,-0.5c0,-0.2 0,-0.4 -0.2,-0.6l0,0c-0.1,-0.2 -0.3,-0.4 -0.5,-0.5c-0.2,-0.1 -0.4,-0.1 -0.6,0c-0.2,0.1 -0.3,0.3 -0.3,0.5s0,0.3 0.2,0.6l0,0z" id="svg_41"/>
<path class="st8" d="m171,142.3c0.1,-0.1 0.2,-0.2 0.3,-0.3c0.1,-0.1 0,-0.3 0,-0.4l0.3,-0.2l0,0c0.1,0.2 0.1,0.4 0,0.6c-0.1,0.2 -0.2,0.4 -0.5,0.6c-0.3,0.2 -0.6,0.2 -0.9,0.1c-0.3,-0.1 -0.5,-0.3 -0.7,-0.6l0,-0.1c-0.2,-0.3 -0.2,-0.6 -0.2,-0.9c0,-0.3 0.2,-0.5 0.5,-0.7c0.2,-0.1 0.3,-0.2 0.5,-0.2s0.3,0 0.5,0l0.3,0.5l-0.3,0.2l-0.3,-0.3c-0.1,0 -0.2,0 -0.2,0c-0.1,0 -0.2,0 -0.3,0.1c-0.2,0.1 -0.3,0.3 -0.3,0.5c0,0.2 0.1,0.4 0.2,0.6l0,0.1c0.1,0.2 0.3,0.4 0.4,0.5c0.3,0.1 0.5,0.1 0.7,-0.1z" id="svg_42"/>
<path class="st8" d="m170.6,139.1l-0.1,-0.3l0.7,-0.4l1,1.8l0.2,-0.1l0.1,-0.8l-0.2,0.1l-0.1,-0.3l0.9,-0.5l0.1,0.3l-0.2,0.2l-0.2,1l1.2,0.5l0.3,-0.1l0.1,0.2l-0.9,0.5l-0.1,-0.2l0.2,-0.1l-1,-0.4l-0.3,0.1l0.4,0.7l0.4,-0.1l0.1,0.2l-1,0.6l-0.1,-0.2l0.3,-0.2l-1.4,-2.6l-0.4,0.1z" id="svg_43"/>
<path class="st8" d="m175.8,140c-0.3,0.2 -0.6,0.2 -0.9,0.1c-0.3,-0.1 -0.5,-0.3 -0.7,-0.6l-0.1,-0.1c-0.2,-0.3 -0.2,-0.6 -0.2,-0.9c0.1,-0.3 0.2,-0.5 0.5,-0.7c0.3,-0.2 0.6,-0.2 0.8,-0.1c0.2,0.1 0.5,0.3 0.6,0.6l0.1,0.2l-1.4,0.8l0,0c0.1,0.2 0.3,0.3 0.4,0.4c0.2,0.1 0.4,0.1 0.5,0c0.1,-0.1 0.2,-0.2 0.3,-0.3c0.1,-0.1 0.1,-0.2 0.2,-0.3l0.3,0.2c0,0.1 -0.1,0.2 -0.2,0.4c0.1,0.1 -0.1,0.2 -0.2,0.3zm-1.2,-1.9c-0.1,0.1 -0.2,0.2 -0.2,0.4c0,0.2 0,0.3 0.1,0.5l0,0l1,-0.6l0,-0.1c-0.1,-0.2 -0.2,-0.3 -0.3,-0.3c-0.3,0 -0.4,0 -0.6,0.1z" id="svg_44"/>
<path class="st8" d="m175.8,137.4l-0.1,-0.3l0.7,-0.4l0.2,0.3c0,-0.1 0,-0.3 0.1,-0.4c0.1,-0.1 0.1,-0.2 0.3,-0.3c0,0 0.1,0 0.1,0c0,0 0.1,0 0.1,0l0.2,0.4l-0.2,0.1c-0.1,0.1 -0.2,0.1 -0.2,0.2s-0.1,0.2 0,0.3l0.7,1.2l0.4,-0.1l0.1,0.2l-1,0.6l-0.1,-0.2l0.3,-0.2l-0.9,-1.5l-0.7,0.1z" id="svg_45"/>
</g>
<g id="svg_46">
<path class="st8" d="m145.1,153.8l-0.1,-0.3l0.7,-0.4l1,1.8l0.2,-0.1l0.1,-0.8l-0.2,0.1l-0.1,-0.3l0.9,-0.5l0.1,0.3l-0.2,0.2l-0.2,1l1.2,0.5l0.3,-0.1l0.1,0.2l-0.9,0.5l-0.1,-0.2l0.2,-0.1l-1,-0.4l-0.3,0.1l0.4,0.7l0.4,-0.1l0.1,0.2l-1,0.6l-0.1,-0.2l0.3,-0.2l-1.4,-2.5l-0.4,0z" id="svg_47"/>
<path class="st8" d="m150.6,154c0,0.2 0,0.3 -0.1,0.4c-0.1,0.1 -0.2,0.2 -0.3,0.3c-0.2,0.1 -0.5,0.2 -0.7,0.1c-0.2,-0.1 -0.4,-0.3 -0.6,-0.6l-0.6,-1l-0.3,0.1l-0.1,-0.3l0.2,-0.1l0.4,-0.2l0.7,1.3c0.1,0.2 0.3,0.4 0.4,0.4c0.1,0 0.2,0 0.4,-0.1c0.1,-0.1 0.2,-0.2 0.3,-0.3c0.1,-0.1 0.1,-0.2 0.1,-0.4l-0.7,-1.2l-0.3,0.1l-0.1,-0.3l0.3,-0.2l0.4,-0.2l1.1,1.8l0.3,-0.1l0.1,0.2l-0.6,0.3l-0.3,0z" id="svg_48"/>
<path class="st8" d="m153.1,151.7c0.2,0.3 0.2,0.6 0.2,0.9c0,0.3 -0.2,0.5 -0.4,0.6c-0.1,0.1 -0.3,0.1 -0.4,0.1c-0.1,0 -0.3,0 -0.4,-0.1l0.1,0.3l-0.3,0.2l-1.6,-2.8l-0.4,0.1l-0.1,-0.3l0.7,-0.4l0.7,1.2c0,-0.1 0.1,-0.3 0.1,-0.4c0.1,-0.1 0.2,-0.2 0.3,-0.3c0.3,-0.2 0.5,-0.2 0.8,0c0.3,0.2 0.5,0.5 0.7,0.9l0,0zm-0.4,0.1c-0.1,-0.2 -0.3,-0.4 -0.5,-0.5s-0.4,-0.1 -0.5,0c-0.1,0.1 -0.2,0.2 -0.3,0.3c0,0.1 -0.1,0.2 -0.1,0.3l0.5,0.9c0.1,0.1 0.2,0.1 0.3,0.1c0.1,0 0.2,0 0.4,-0.1c0.2,-0.1 0.3,-0.2 0.3,-0.4c0.1,-0.1 0.1,-0.3 -0.1,-0.6l0,0z" id="svg_49"/>
<path class="st8" d="m155.1,151.9c-0.3,0.2 -0.6,0.2 -0.9,0.1s-0.5,-0.3 -0.7,-0.6l-0.1,-0.1c-0.2,-0.3 -0.2,-0.6 -0.2,-0.9c0.1,-0.3 0.2,-0.5 0.5,-0.7c0.3,-0.2 0.6,-0.2 0.8,-0.1c0.2,0.1 0.5,0.3 0.6,0.6l0.1,0.2l-1.4,0.8l0,0c0.1,0.2 0.3,0.3 0.4,0.4c0.2,0.1 0.4,0.1 0.5,0c0.1,-0.1 0.2,-0.2 0.3,-0.3c0.1,-0.1 0.1,-0.2 0.2,-0.3l0.3,0.2c0,0.1 -0.1,0.2 -0.2,0.4c0.1,0.1 0,0.2 -0.2,0.3zm-1.2,-1.9c-0.1,0.1 -0.2,0.2 -0.2,0.4c0,0.2 0,0.3 0.1,0.5l0,0l1,-0.6l0,-0.1c-0.1,-0.2 -0.2,-0.3 -0.3,-0.3c-0.3,0 -0.4,0 -0.6,0.1z" id="svg_50"/>
<path class="st8" d="m154.6,148.4l-0.1,-0.3l0.7,-0.4l1.6,2.8l0.4,-0.1l0.1,0.2l-1,0.6l-0.1,-0.2l0.3,-0.2l-1.4,-2.5l-0.5,0.1z" id="svg_51"/>
<path class="st8" d="m158.6,149.9c-0.3,0.2 -0.6,0.2 -0.9,0.1c-0.3,-0.1 -0.5,-0.3 -0.7,-0.6l-0.1,-0.1c-0.2,-0.3 -0.2,-0.6 -0.2,-0.9c0.1,-0.3 0.2,-0.5 0.5,-0.7c0.3,-0.2 0.6,-0.2 0.8,-0.1c0.2,0.1 0.5,0.3 0.6,0.6l0.1,0.2l-1.4,0.8l0,0c0.1,0.2 0.3,0.3 0.4,0.4c0.2,0.1 0.4,0.1 0.5,0c0.1,-0.1 0.2,-0.2 0.3,-0.3c0.1,-0.1 0.1,-0.2 0.2,-0.3l0.3,0.2c0,0.1 -0.1,0.2 -0.2,0.4c0.1,0.1 -0.1,0.2 -0.2,0.3zm-1.2,-1.9c-0.1,0.1 -0.2,0.2 -0.2,0.4c0,0.2 0,0.3 0.1,0.5l0,0l1,-0.6l0,-0.1c-0.1,-0.2 -0.2,-0.3 -0.3,-0.3c-0.3,0 -0.5,0 -0.6,0.1z" id="svg_52"/>
<path class="st8" d="m158.9,146.1l0.3,0.5l0.4,-0.2l0.2,0.3l-0.4,0.2l0.8,1.3c0.1,0.1 0.1,0.2 0.2,0.2c0.1,0 0.1,0 0.2,0c0,0 0.1,0 0.1,-0.1c0,0 0.1,-0.1 0.1,-0.1l0.2,0.2c0,0 -0.1,0.1 -0.1,0.2c-0.1,0.1 -0.1,0.1 -0.2,0.1c-0.2,0.1 -0.3,0.1 -0.5,0.1c-0.1,0 -0.3,-0.2 -0.4,-0.4l-0.7,-1.3l-0.3,0.2l-0.2,-0.3l0.3,-0.2l-0.3,-0.5l0.3,-0.2z" id="svg_53"/>
</g>
<polygon class="st16" points="146.2,296.6 110.6,276.1 110.6,234.9 146.2,214.4 181.9,234.9 181.9,276.1 " id="svg_54"/>
<polygon class="st13" points="135.6,220.5 146.2,214.4 181.9,234.9 181.8,247.2 " id="svg_55"/>
<polygon class="st7" points="163,226.4 159.8,232.1 179.8,243.6 179.8,236.1 " id="svg_56"/>
<g id="svg_57">
<path class="st8" d="m145.8,218.8l0.1,-0.3l0.7,0.4l-1,1.8l0.2,0.1l0.8,-0.3l-0.2,-0.1l0.1,-0.3l0.9,0.5l-0.1,0.3l-0.3,-0.1l-1,0.3l0.2,1.3l0.2,0.2l-0.1,0.2l-0.9,-0.5l0.1,-0.2l0.2,0.1l-0.2,-1l-0.3,-0.1l-0.4,0.7l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l1.4,-2.5l-0.1,-0.2z" id="svg_58"/>
<path class="st8" d="m148.4,223.7c-0.1,0.1 -0.3,0.1 -0.4,0.1c-0.1,0 -0.3,0 -0.4,-0.1c-0.2,-0.1 -0.4,-0.3 -0.4,-0.5c0,-0.2 0,-0.5 0.2,-0.8l0.6,-1l-0.2,-0.2l0.1,-0.3l0.2,0.1l0.4,0.2l-0.7,1.3c-0.1,0.2 -0.2,0.4 -0.2,0.5c0,0.1 0.1,0.2 0.2,0.3c0.1,0.1 0.3,0.1 0.4,0.1c0.1,0 0.2,0 0.3,-0.1l0.7,-1.2l-0.3,-0.2l0.1,-0.3l0.3,0.2l0.4,0.2l-1.1,1.8l0.2,0.2l-0.1,0.2l-0.6,-0.3l0.3,-0.2z" id="svg_59"/>
<path class="st8" d="m151.7,224.7c-0.2,0.3 -0.4,0.5 -0.7,0.6c-0.3,0.1 -0.5,0.1 -0.8,-0.1c-0.1,-0.1 -0.2,-0.2 -0.3,-0.3c-0.1,-0.1 -0.1,-0.2 -0.1,-0.4l-0.2,0.3l-0.3,-0.2l1.6,-2.8l-0.3,-0.2l0.1,-0.3l0.7,0.4l-0.7,1.2c0.1,-0.1 0.2,-0.1 0.4,-0.1c0.1,0 0.3,0 0.4,0.1c0.3,0.2 0.4,0.4 0.4,0.7c0.1,0.4 0,0.7 -0.2,1.1l0,0zm-0.4,-0.3c0.1,-0.2 0.2,-0.5 0.2,-0.7c0,-0.2 -0.1,-0.4 -0.3,-0.5c-0.1,-0.1 -0.2,-0.1 -0.4,-0.1c-0.1,0 -0.2,0.1 -0.3,0.1l-0.5,0.9c0,0.1 0,0.2 0.1,0.3c0.1,0.1 0.1,0.2 0.3,0.3c0.2,0.1 0.4,0.1 0.5,0c0.1,0.1 0.3,-0.1 0.4,-0.3l0,0z" id="svg_60"/>
<path class="st8" d="m152.5,226.5c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7s0,-0.6 0.2,-0.9l0.1,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.8,0.1c0.3,0.2 0.5,0.4 0.5,0.6c0,0.3 0,0.5 -0.2,0.8l-0.1,0.2l-1.4,-0.8l0,0c-0.1,0.2 -0.2,0.4 -0.1,0.6c0,0.2 0.1,0.3 0.3,0.4c0.1,0.1 0.3,0.1 0.4,0.1c0.1,0 0.2,0 0.3,0l0,0.3c-0.1,0 -0.3,0 -0.4,0c-0.3,0.1 -0.5,0.1 -0.6,0zm1,-2c-0.1,-0.1 -0.3,-0.1 -0.4,0c-0.2,0.1 -0.3,0.2 -0.4,0.3l0,0l1,0.6l0,-0.1c0.1,-0.2 0.1,-0.3 0.1,-0.5s-0.1,-0.2 -0.3,-0.3z" id="svg_61"/>
<path class="st8" d="m155.3,224.3l0.1,-0.3l0.7,0.4l-1.6,2.8l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l1.4,-2.5l-0.3,-0.1z" id="svg_62"/>
<path class="st8" d="m155.9,228.5c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7s0,-0.6 0.2,-0.9l0,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.8,0.1c0.3,0.2 0.5,0.4 0.5,0.6c0,0.3 0,0.5 -0.2,0.8l-0.1,0.2l-1.4,-0.8l0,0c-0.1,0.2 -0.2,0.4 -0.1,0.6c0,0.2 0.1,0.3 0.3,0.4c0.1,0.1 0.3,0.1 0.4,0.1c0.1,0 0.2,0 0.3,0l0,0.3c-0.1,0 -0.3,0 -0.4,0c-0.1,0.1 -0.3,0.1 -0.5,0zm1.1,-2c-0.1,-0.1 -0.3,-0.1 -0.4,0s-0.3,0.2 -0.4,0.3l0,0l1,0.6l0,-0.1c0.1,-0.2 0.1,-0.3 0.1,-0.5c-0.1,-0.1 -0.2,-0.2 -0.3,-0.3z" id="svg_63"/>
<path class="st8" d="m159.4,226.9l-0.3,0.5l0.4,0.2l-0.2,0.3l-0.4,-0.2l-0.8,1.3c-0.1,0.1 -0.1,0.2 -0.1,0.2c0,0.1 0.1,0.1 0.1,0.2c0,0 0.1,0 0.1,0.1c0,0 0.1,0 0.1,0l-0.1,0.3c-0.1,0 -0.1,0 -0.2,0c-0.1,0 -0.2,-0.1 -0.2,-0.1c-0.2,-0.1 -0.3,-0.2 -0.3,-0.4s0,-0.3 0.1,-0.5l0.8,-1.3l-0.3,-0.2l0.2,-0.3l0.3,0.2l0.3,-0.5l0.5,0.2z" id="svg_64"/>
</g>
<g id="svg_65">
<path class="st8" d="m166.1,230.5c0.4,0.2 0.6,0.5 0.7,0.9c0.1,0.4 0,0.7 -0.2,1.1l-0.2,0.4c-0.2,0.4 -0.5,0.6 -0.9,0.7s-0.7,0 -1.1,-0.2l-1.2,-0.7l0.1,-0.2l0.4,0.1l1.3,-2.3l-0.3,-0.2l0.1,-0.3l0.3,0.2l1,0.5zm-0.7,0l-1.3,2.3l0.5,0.3c0.3,0.2 0.5,0.2 0.8,0.1c0.3,-0.1 0.5,-0.3 0.6,-0.5l0.2,-0.4c0.2,-0.3 0.2,-0.5 0.2,-0.8c-0.1,-0.3 -0.2,-0.5 -0.5,-0.6l-0.5,-0.4z" id="svg_66"/>
<path class="st8" d="m166.7,233.2c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.9,0.1c0.3,0.2 0.5,0.4 0.5,0.7c0.1,0.3 0,0.6 -0.2,0.9l0,0c-0.2,0.3 -0.4,0.5 -0.7,0.6c-0.3,0.1 -0.6,0.1 -0.9,-0.1c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7c-0.1,-0.2 0,-0.5 0.2,-0.9l0,0zm0.3,0.3c-0.1,0.2 -0.2,0.4 -0.2,0.6c0,0.2 0.1,0.4 0.3,0.5c0.2,0.1 0.4,0.1 0.5,0c0.2,-0.1 0.3,-0.3 0.5,-0.5l0,0c0.1,-0.2 0.2,-0.4 0.2,-0.6c0,-0.2 -0.1,-0.4 -0.3,-0.5c-0.2,-0.1 -0.4,-0.1 -0.6,0c-0.1,0.1 -0.2,0.2 -0.4,0.5l0,0z" id="svg_67"/>
<path class="st8" d="m169.4,235.9c0.1,0.1 0.3,0.1 0.4,0.1s0.2,-0.1 0.3,-0.2l0.3,0.2l0,0c-0.1,0.2 -0.3,0.3 -0.5,0.3c-0.3,0 -0.5,0 -0.7,-0.1c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7c0,-0.3 0,-0.6 0.2,-0.9l0,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.9,0.1c0.2,0.1 0.3,0.2 0.4,0.4c0.1,0.1 0.2,0.3 0.2,0.4l-0.3,0.5l-0.3,-0.2l0.1,-0.4c0,-0.1 -0.1,-0.1 -0.1,-0.2c-0.1,-0.1 -0.1,-0.1 -0.2,-0.2c-0.2,-0.1 -0.4,-0.1 -0.6,0c-0.2,0.1 -0.3,0.3 -0.4,0.5l0,0.1c-0.1,0.2 -0.2,0.4 -0.2,0.6c0,0.1 0.1,0.3 0.3,0.4z" id="svg_68"/>
<path class="st8" d="m172.1,234l0.1,-0.3l0.7,0.4l-1,1.8l0.2,0.1l0.8,-0.3l-0.2,-0.1l0.1,-0.3l0.9,0.5l-0.1,0.3l-0.3,-0.1l-1,0.3l0.2,1.3l0.2,0.2l-0.1,0.2l-0.9,-0.5l0.1,-0.2l0.2,0.1l-0.2,-1l-0.3,-0.1l-0.4,0.7l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l1.4,-2.5l-0.1,-0.2z" id="svg_69"/>
<path class="st8" d="m173.9,238.9c-0.3,-0.2 -0.5,-0.4 -0.5,-0.7c-0.1,-0.3 0,-0.6 0.2,-0.9l0,-0.1c0.2,-0.3 0.4,-0.5 0.7,-0.6c0.3,-0.1 0.6,-0.1 0.8,0.1c0.3,0.2 0.5,0.4 0.5,0.6c0,0.3 0,0.5 -0.2,0.8l-0.1,0.2l-1.4,-0.8l0,0c-0.1,0.2 -0.2,0.4 -0.1,0.6c0,0.2 0.1,0.3 0.3,0.4c0.1,0.1 0.3,0.1 0.4,0.1c0.1,0 0.2,0 0.3,0l0,0.3c-0.1,0 -0.3,0 -0.4,0c-0.2,0.2 -0.4,0.1 -0.5,0zm1,-2c-0.1,-0.1 -0.3,-0.1 -0.4,0c-0.2,0.1 -0.3,0.2 -0.4,0.3l0,0l1,0.6l0,-0.1c0.1,-0.2 0.1,-0.3 0.1,-0.5c0,0 -0.1,-0.2 -0.3,-0.3z" id="svg_70"/>
<path class="st8" d="m176.2,237.7l0.1,-0.3l0.7,0.4l-0.1,0.3c0.1,-0.1 0.2,-0.1 0.4,-0.1c0.1,0 0.2,0 0.4,0.1c0,0 0.1,0 0.1,0.1c0,0 0.1,0 0.1,0.1l-0.3,0.3l-0.2,-0.1c-0.1,-0.1 -0.2,-0.1 -0.3,-0.1c-0.1,0 -0.2,0 -0.3,0.1l-0.7,1.2l0.3,0.2l-0.1,0.2l-1,-0.6l0.1,-0.2l0.4,0.1l0.9,-1.5l-0.5,-0.2z" id="svg_71"/>
</g>
</g>
<g id="service"/>
<g id="pods">
<circle class="st29" cx="146.2" cy="119.5" r="20.9" id="svg_72"/>
</g>
<g id="IP"/>
<g id="deployments">
<g id="svg_73">
<g id="svg_74">
<circle class="st47" cx="177.4" cy="181.7" r="10.1" id="svg_75"/>
<g id="svg_76">
<g id="svg_77">
<path class="st48" d="m180.9,176c1.9,1.2 3.2,3.3 3.2,5.8c0,3.7 -3,6.7 -6.7,6.7c-3.7,0 -6.7,-3 -6.7,-6.7c0,-2.9 1.9,-5.4 4.5,-6.4" id="svg_78"/>
<g id="svg_79">
<polygon class="st42" points="182.1,178.9 181.2,176.2 183.9,175.3 182.4,174.5 179.6,175.4 180.5,178.1 " id="svg_80"/>
</g>
<symbol
id="master_x5F_level1_1_"
viewBox="-68.6 -66.9 137.2 133.9">
<g
id="svg_1">
<g
id="svg_2">
<line
class="st0"
x1="0"
y1="-11.1"
x2="0"
y2="0.7"
id="svg_3" />
<line
class="st0"
x1="5.9"
y1="-5.2"
x2="-5.9"
y2="-5.2"
id="svg_4" />
</g>
</g>
<g id="svg_81">
<path class="st42" d="m174.8,185.1l0,-6.7l2.3,0c0.8,0 1.5,0.3 2,0.8c0.5,0.5 0.8,1.2 0.8,2l0,1.1c0,0.8 -0.3,1.5 -0.8,2c-0.5,0.5 -1.2,0.8 -2,0.8l-2.3,0zm1.3,-5.7l0,4.7l0.9,0c0.5,0 0.9,-0.2 1.1,-0.5c0.3,-0.3 0.4,-0.8 0.4,-1.3l0,-1.1c0,-0.5 -0.1,-0.9 -0.4,-1.3c-0.3,-0.3 -0.7,-0.5 -1.1,-0.5l-0.9,0z" id="svg_82"/>
</g>
<polygon
class="st1"
points="-29.2,-63.9 -65.6,-18.3 -52.6,38.6 0,63.9 52.6,38.6 65.6,-18.3 29.2,-63.9 "
id="svg_5" />
</g>
</g>
</symbol>
<symbol
id="node_high_level"
viewBox="-81 -93 162 186.1">
<polygon
class="st2"
points="-80,-46 -80,46 0,92 80,46 80,-46 0,-92 "
id="svg_6" />
<g
id="Isolation_Mode_3_" />
</symbol>
<symbol
id="node_x5F_empty"
viewBox="-87.5 -100.6 175.1 201.1">
<use
xlink:href="#node_high_level"
width="162"
height="186.1"
id="XMLID_201_"
x="-81"
y="-93"
transform="matrix(1.0808,0,0,1.0808,-0.00003292006,-0.00003749943) " />
<g
id="svg_7">
<polygon
class="st3"
points="76.8,-28.1 -14,-80.3 0,-88.3 76.7,-44.4 "
id="svg_8" />
<polygon
class="st4"
points="76.8,-28.1 32.1,-53.8 38.8,-66.1 76.7,-44.4 "
id="svg_9" />
</g>
</symbol>
<symbol
id="node_x5F_new"
viewBox="-87.6 -101 175.2 202">
<polygon
class="st5"
points="0,-100 -86.6,-50 -86.6,50 0,100 86.6,50 86.6,-50 "
id="svg_10" />
<polygon
class="st6"
points="-86.6,-20.2 -86.6,-50 0,-100 25.8,-85.1 "
id="svg_11" />
<polygon
class="st7"
points="-40.8,-70.7 -32.9,-57 15.7,-85.1 0,-94.3 "
id="svg_12" />
<text
transform="matrix(0.866,-0.5,-0.5,-0.866,-33.9256,-70.7388) "
class="st8"
font-size="11.3632px"
font-family="'RobotoSlab-Regular'"
id="svg_13">Docker</text>
<text
transform="matrix(0.866,-0.5,-0.5,-0.866,-76.0668,-46.4087) "
class="st8"
font-size="11.3632px"
font-family="'RobotoSlab-Regular'"
id="svg_14">Kubelt</text>
</symbol>
<g
id="g1985">
<title
id="title1814">Layer 1</title>
<g
id="CLUSTER"
transform="translate(-22)">
<g
id="XMLID_8_"
class="st9">
<g
id="svg_15">
<linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="27.995501"
y1="185.5114"
x2="342.4509"
y2="185.5114">
<stop
offset="0"
stop-color="#326DE6"
id="stop1816" />
<stop
offset="1"
stop-color="#10FFC6"
id="stop1818" />
</linearGradient>
<polygon
class="st10"
points="28,229.4 59.1,92.9 185.2,32.2 311.3,92.9 342.5,229.4 255.2,338.8 115.3,338.8 "
id="svg_16"
style="fill:url(#SVGID_1_)" />
</g>
</g>
</g>
<g
id="master"
transform="translate(-24)">
<g
id="master_x5F_level1" />
<use
xlink:href="#master_x5F_level1_1_"
width="137.2"
height="133.89999"
x="-68.599998"
y="-66.900002"
transform="matrix(0.4,0,0,-0.4,185.2213,187.4709)"
id="svg_17" />
</g>
<g
id="Node"
transform="translate(-24)">
<g
id="Node_x5F_level3_x5F_1">
<g
id="Isolation_Mode" />
</g>
<polygon
class="st16"
points="224.6,160.7 189,140.1 189,98.9 224.6,78.4 260.3,98.9 260.3,140.1 "
id="svg_18" />
<polygon
class="st13"
points="189,127.8 189,140.1 224.6,160.7 235.2,154.5 "
id="svg_19" />
<polygon
class="st7"
points="207.8,148.6 211.1,143 231.1,154.5 224.6,158.3 "
id="svg_20" />
<g
id="svg_21">
<path
class="st8"
d="m 213.7,146.5 c 0.4,0.2 0.6,0.5 0.7,0.9 0.1,0.4 0,0.7 -0.2,1.1 l -0.2,0.4 c -0.2,0.4 -0.5,0.6 -0.9,0.7 -0.4,0.1 -0.7,0 -1.1,-0.2 l -1.2,-0.7 0.1,-0.2 0.4,0.1 1.3,-2.3 -0.3,-0.2 0.1,-0.3 0.3,0.2 z m -0.6,0 -1.3,2.3 0.5,0.3 c 0.3,0.2 0.5,0.2 0.8,0.1 0.3,-0.1 0.5,-0.3 0.6,-0.5 l 0.2,-0.4 c 0.2,-0.3 0.2,-0.5 0.2,-0.8 -0.1,-0.3 -0.2,-0.5 -0.5,-0.6 z"
id="svg_22" />
<path
class="st8"
d="m 214.3,149.2 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.9,0.1 0.3,0.2 0.5,0.4 0.5,0.7 0.1,0.3 0,0.6 -0.2,0.9 v 0 c -0.2,0.3 -0.4,0.5 -0.7,0.6 -0.3,0.1 -0.6,0.1 -0.9,-0.1 -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 0,-0.2 0,-0.5 0.2,-0.9 z m 0.4,0.3 c -0.1,0.2 -0.2,0.4 -0.2,0.6 0,0.2 0.1,0.4 0.3,0.5 0.2,0.1 0.4,0.1 0.5,0 0.2,-0.1 0.3,-0.3 0.5,-0.5 v 0 c 0.1,-0.2 0.2,-0.4 0.2,-0.6 0,-0.2 -0.1,-0.4 -0.3,-0.5 -0.2,-0.1 -0.4,-0.1 -0.6,0 -0.2,0.1 -0.2,0.2 -0.4,0.5 z"
id="svg_23" />
<path
class="st8"
d="m 217.1,151.9 c 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,-0.1 0.3,-0.2 l 0.4,0.2 v 0 c -0.1,0.2 -0.3,0.3 -0.5,0.3 -0.3,0 -0.5,0 -0.7,-0.1 -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 0,-0.3 0,-0.6 0.2,-0.9 v -0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.9,0.1 0.2,0.1 0.3,0.2 0.4,0.4 0.1,0.1 0.2,0.3 0.2,0.4 l -0.3,0.5 -0.3,-0.2 0.1,-0.4 c 0,-0.1 -0.1,-0.1 -0.1,-0.2 -0.1,-0.1 -0.1,-0.1 -0.2,-0.2 -0.2,-0.1 -0.4,-0.1 -0.6,0 -0.2,0.1 -0.3,0.3 -0.4,0.5 v 0.1 c -0.1,0.2 -0.2,0.4 -0.2,0.6 -0.1,0.2 0,0.3 0.2,0.4 z"
id="svg_24" />
<path
class="st8"
d="m 219.7,150 0.1,-0.3 0.7,0.4 -1,1.8 0.2,0.1 0.8,-0.3 -0.2,-0.1 0.1,-0.3 0.9,0.5 -0.1,0.3 -0.3,-0.1 -1,0.3 0.2,1.3 0.2,0.2 -0.1,0.2 -0.9,-0.5 0.1,-0.2 0.2,0.1 -0.2,-1 -0.3,-0.1 -0.1,0.7 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 1.4,-2.5 z"
id="svg_25" />
<path
class="st8"
d="m 221.5,154.9 c -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 0,-0.3 0,-0.6 0.2,-0.9 v -0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.8,0.1 0.3,0.2 0.5,0.4 0.5,0.6 0,0.3 0,0.5 -0.2,0.8 l -0.1,0.2 -1.4,-0.8 v 0 c -0.1,0.2 -0.2,0.4 -0.1,0.6 0,0.2 0.1,0.3 0.3,0.4 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,0 v 0.3 c -0.1,0 -0.3,0 -0.4,0 -0.1,0.2 -0.3,0.1 -0.5,0 z m 1.1,-1.9 c -0.1,-0.1 -0.3,-0.1 -0.4,0 -0.2,0.1 -0.3,0.2 -0.4,0.3 v 0 l 1,0.6 v -0.1 c 0.1,-0.2 0.1,-0.3 0.1,-0.5 -0.1,-0.1 -0.2,-0.2 -0.3,-0.3 z"
id="svg_26" />
<path
class="st8"
d="m 223.9,153.7 0.1,-0.3 0.7,0.4 -0.1,0.3 c 0.1,-0.1 0.2,-0.1 0.4,-0.1 0.1,0 0.2,0 0.4,0.1 0,0 0.1,0 0.1,0.1 0,0 0.1,0 0.1,0.1 l -0.3,0.3 -0.2,-0.1 c -0.1,-0.1 -0.2,-0.1 -0.3,-0.1 -0.1,0 -0.2,0 -0.3,0.1 l -0.7,1.2 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 0.9,-1.5 z"
id="svg_27" />
</g>
<g
id="svg_28">
<path
class="st8"
d="m 194.3,135.3 0.1,-0.3 0.7,0.4 -1,1.8 0.2,0.1 0.8,-0.3 -0.2,-0.1 0.1,-0.3 0.9,0.5 -0.1,0.3 -0.3,-0.1 -1,0.3 0.2,1.3 0.2,0.2 -0.1,0.2 -0.9,-0.5 0.1,-0.2 0.2,0.1 -0.2,-1 -0.3,-0.1 -0.4,0.7 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 1.4,-2.5 z"
id="svg_29" />
<path
class="st8"
d="m 196.8,140.2 c -0.1,0.1 -0.3,0.1 -0.4,0.1 -0.1,0 -0.3,0 -0.4,-0.1 -0.2,-0.1 -0.4,-0.3 -0.4,-0.5 0,-0.2 0,-0.5 0.2,-0.8 l 0.6,-1 -0.2,-0.2 0.1,-0.3 0.2,0.1 0.4,0.2 -0.7,1.3 c -0.1,0.2 -0.2,0.4 -0.2,0.5 0,0.1 0.1,0.2 0.2,0.3 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,-0.1 l 0.7,-1.2 -0.3,-0.2 0.1,-0.3 0.3,0.2 0.4,0.2 -1.1,1.8 0.2,0.2 -0.1,0.2 -0.6,-0.3 z"
id="svg_30" />
<path
class="st8"
d="m 200.1,141.2 c -0.2,0.3 -0.4,0.5 -0.7,0.6 -0.3,0.1 -0.5,0.1 -0.8,-0.1 -0.1,-0.1 -0.2,-0.2 -0.3,-0.3 -0.1,-0.1 -0.1,-0.2 -0.1,-0.4 l -0.2,0.3 -0.3,-0.2 1.6,-2.8 -0.3,-0.2 0.1,-0.3 0.7,0.4 -0.7,1.2 c 0.1,-0.1 0.2,-0.1 0.4,-0.1 0.1,0 0.3,0 0.4,0.1 0.3,0.2 0.4,0.4 0.4,0.7 0.1,0.4 0,0.7 -0.2,1.1 z m -0.4,-0.3 c 0.1,-0.2 0.2,-0.5 0.2,-0.7 0,-0.2 -0.1,-0.4 -0.3,-0.5 -0.1,-0.1 -0.2,-0.1 -0.4,-0.1 -0.1,0 -0.2,0.1 -0.3,0.1 l -0.5,0.9 c 0,0.1 0,0.2 0.1,0.3 0.1,0.1 0.1,0.2 0.3,0.3 0.2,0.1 0.4,0.1 0.5,0 0.2,0.1 0.3,0 0.4,-0.3 z"
id="svg_31" />
<path
class="st8"
d="m 200.9,143 c -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 0,-0.3 0,-0.6 0.2,-0.9 v -0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.8,0.1 0.3,0.2 0.5,0.4 0.5,0.6 0,0.3 0,0.5 -0.2,0.8 l -0.1,0.2 -1.4,-0.8 v 0 c -0.1,0.2 -0.2,0.4 -0.1,0.6 0,0.2 0.1,0.3 0.3,0.4 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,0 v 0.3 c -0.1,0 -0.3,0 -0.4,0 -0.2,0.2 -0.3,0.1 -0.5,0 z m 1,-2 c -0.1,-0.1 -0.3,-0.1 -0.4,0 -0.2,0.1 -0.3,0.2 -0.4,0.3 v 0 l 1,0.6 v -0.1 c 0.1,-0.2 0.1,-0.3 0.1,-0.5 0,0 -0.1,-0.2 -0.3,-0.3 z"
id="svg_32" />
<path
class="st8"
d="m 203.7,140.8 0.1,-0.3 0.7,0.4 -1.6,2.8 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 1.4,-2.5 z"
id="svg_33" />
<path
class="st8"
d="m 204.3,145 c -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 -0.1,-0.3 0,-0.6 0.2,-0.9 v -0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.8,0.1 0.3,0.2 0.5,0.4 0.5,0.6 0,0.3 0,0.5 -0.2,0.8 l -0.1,0.2 -1.4,-0.8 v 0 c -0.1,0.2 -0.2,0.4 -0.1,0.6 0,0.2 0.1,0.3 0.3,0.4 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,0 v 0.3 c -0.1,0 -0.3,0 -0.4,0 -0.1,0.1 -0.3,0.1 -0.5,0 z m 1.1,-2 c -0.1,-0.1 -0.3,-0.1 -0.4,0 -0.2,0.1 -0.3,0.2 -0.4,0.3 v 0 l 1,0.6 v -0.1 c 0.1,-0.2 0.1,-0.3 0.1,-0.5 -0.1,-0.1 -0.2,-0.2 -0.3,-0.3 z"
id="svg_34" />
<path
class="st8"
d="m 207.8,143.4 -0.3,0.5 0.4,0.2 -0.2,0.3 -0.4,-0.2 -0.8,1.3 c -0.1,0.1 -0.1,0.2 -0.1,0.2 0,0.1 0.1,0.1 0.1,0.2 0,0 0.1,0 0.1,0.1 0,0 0.1,0 0.1,0 l -0.1,0.3 c -0.1,0 -0.1,0 -0.2,0 -0.1,0 -0.2,-0.1 -0.2,-0.1 -0.2,-0.1 -0.3,-0.2 -0.3,-0.4 0,-0.2 0,-0.3 0.1,-0.5 l 0.8,-1.3 -0.3,-0.2 0.2,-0.3 0.3,0.2 0.3,-0.5 z"
id="svg_35" />
</g>
<polygon
class="st16"
points="182.3,140.1 146.6,160.7 111,140.1 111,99 146.6,78.4 182.3,99 "
id="svg_36" />
<polygon
class="st13"
points="136,154.5 146.6,160.7 182.3,140.1 182.2,127.9 "
id="svg_37" />
<polygon
class="st7"
points="163.4,148.6 160.2,143 180.2,131.4 180.2,138.9 "
id="svg_38" />
<g
id="svg_39">
<path
class="st8"
d="m 164.6,142.5 c 0.4,-0.2 0.7,-0.3 1.1,-0.2 0.4,0.1 0.6,0.3 0.9,0.7 l 0.2,0.4 c 0.2,0.4 0.3,0.7 0.2,1.1 -0.1,0.4 -0.3,0.7 -0.7,0.9 l -1.2,0.7 -0.1,-0.2 0.3,-0.2 -1.3,-2.3 -0.4,0.1 -0.1,-0.3 0.3,-0.2 z m -0.3,0.6 1.3,2.3 0.5,-0.3 c 0.3,-0.2 0.4,-0.4 0.5,-0.6 0.1,-0.3 0,-0.5 -0.2,-0.8 l -0.2,-0.4 c -0.2,-0.3 -0.4,-0.5 -0.6,-0.5 -0.3,-0.1 -0.5,-0.1 -0.8,0.1 z"
id="svg_40" />
<path
class="st8"
d="m 167.3,143.4 c -0.2,-0.3 -0.2,-0.6 -0.2,-0.9 0.1,-0.3 0.2,-0.5 0.5,-0.7 0.3,-0.2 0.6,-0.2 0.9,-0.1 0.3,0.1 0.5,0.3 0.7,0.6 v 0 c 0.2,0.3 0.2,0.6 0.2,0.9 -0.1,0.3 -0.2,0.5 -0.5,0.7 -0.3,0.2 -0.6,0.2 -0.9,0.1 -0.3,0 -0.5,-0.3 -0.7,-0.6 z m 0.4,-0.2 c 0.1,0.2 0.3,0.4 0.5,0.5 0.2,0.1 0.4,0.1 0.6,0 0.2,-0.1 0.3,-0.3 0.3,-0.5 0,-0.2 0,-0.4 -0.2,-0.6 v 0 c -0.1,-0.2 -0.3,-0.4 -0.5,-0.5 -0.2,-0.1 -0.4,-0.1 -0.6,0 -0.2,0.1 -0.3,0.3 -0.3,0.5 0,0.2 0,0.3 0.2,0.6 z"
id="svg_41" />
<path
class="st8"
d="m 171,142.3 c 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.1,-0.1 0,-0.3 0,-0.4 l 0.3,-0.2 v 0 c 0.1,0.2 0.1,0.4 0,0.6 -0.1,0.2 -0.2,0.4 -0.5,0.6 -0.3,0.2 -0.6,0.2 -0.9,0.1 -0.3,-0.1 -0.5,-0.3 -0.7,-0.6 V 142 c -0.2,-0.3 -0.2,-0.6 -0.2,-0.9 0,-0.3 0.2,-0.5 0.5,-0.7 0.2,-0.1 0.3,-0.2 0.5,-0.2 0.2,0 0.3,0 0.5,0 l 0.3,0.5 -0.3,0.2 -0.3,-0.3 c -0.1,0 -0.2,0 -0.2,0 -0.1,0 -0.2,0 -0.3,0.1 -0.2,0.1 -0.3,0.3 -0.3,0.5 0,0.2 0.1,0.4 0.2,0.6 v 0.1 c 0.1,0.2 0.3,0.4 0.4,0.5 0.3,0.1 0.5,0.1 0.7,-0.1 z"
id="svg_42" />
<path
class="st8"
d="m 170.6,139.1 -0.1,-0.3 0.7,-0.4 1,1.8 0.2,-0.1 0.1,-0.8 -0.2,0.1 -0.1,-0.3 0.9,-0.5 0.1,0.3 -0.2,0.2 -0.2,1 1.2,0.5 0.3,-0.1 0.1,0.2 -0.9,0.5 -0.1,-0.2 0.2,-0.1 -1,-0.4 -0.3,0.1 0.4,0.7 0.4,-0.1 0.1,0.2 -1,0.6 -0.1,-0.2 0.3,-0.2 -1.4,-2.6 z"
id="svg_43" />
<path
class="st8"
d="m 175.8,140 c -0.3,0.2 -0.6,0.2 -0.9,0.1 -0.3,-0.1 -0.5,-0.3 -0.7,-0.6 l -0.1,-0.1 c -0.2,-0.3 -0.2,-0.6 -0.2,-0.9 0.1,-0.3 0.2,-0.5 0.5,-0.7 0.3,-0.2 0.6,-0.2 0.8,-0.1 0.2,0.1 0.5,0.3 0.6,0.6 l 0.1,0.2 -1.4,0.8 v 0 c 0.1,0.2 0.3,0.3 0.4,0.4 0.2,0.1 0.4,0.1 0.5,0 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.1,-0.1 0.1,-0.2 0.2,-0.3 l 0.3,0.2 c 0,0.1 -0.1,0.2 -0.2,0.4 0.1,0.1 -0.1,0.2 -0.2,0.3 z m -1.2,-1.9 c -0.1,0.1 -0.2,0.2 -0.2,0.4 0,0.2 0,0.3 0.1,0.5 v 0 l 1,-0.6 v -0.1 c -0.1,-0.2 -0.2,-0.3 -0.3,-0.3 -0.3,0 -0.4,0 -0.6,0.1 z"
id="svg_44" />
<path
class="st8"
d="m 175.8,137.4 -0.1,-0.3 0.7,-0.4 0.2,0.3 c 0,-0.1 0,-0.3 0.1,-0.4 0.1,-0.1 0.1,-0.2 0.3,-0.3 0,0 0.1,0 0.1,0 0,0 0.1,0 0.1,0 l 0.2,0.4 -0.2,0.1 c -0.1,0.1 -0.2,0.1 -0.2,0.2 0,0.1 -0.1,0.2 0,0.3 l 0.7,1.2 0.4,-0.1 0.1,0.2 -1,0.6 -0.1,-0.2 0.3,-0.2 -0.9,-1.5 z"
id="svg_45" />
</g>
<g
id="svg_46">
<path
class="st8"
d="m 145.1,153.8 -0.1,-0.3 0.7,-0.4 1,1.8 0.2,-0.1 0.1,-0.8 -0.2,0.1 -0.1,-0.3 0.9,-0.5 0.1,0.3 -0.2,0.2 -0.2,1 1.2,0.5 0.3,-0.1 0.1,0.2 -0.9,0.5 -0.1,-0.2 0.2,-0.1 -1,-0.4 -0.3,0.1 0.4,0.7 0.4,-0.1 0.1,0.2 -1,0.6 -0.1,-0.2 0.3,-0.2 -1.4,-2.5 z"
id="svg_47" />
<path
class="st8"
d="m 150.6,154 c 0,0.2 0,0.3 -0.1,0.4 -0.1,0.1 -0.2,0.2 -0.3,0.3 -0.2,0.1 -0.5,0.2 -0.7,0.1 -0.2,-0.1 -0.4,-0.3 -0.6,-0.6 l -0.6,-1 -0.3,0.1 -0.1,-0.3 0.2,-0.1 0.4,-0.2 0.7,1.3 c 0.1,0.2 0.3,0.4 0.4,0.4 0.1,0 0.2,0 0.4,-0.1 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.1,-0.1 0.1,-0.2 0.1,-0.4 l -0.7,-1.2 -0.3,0.1 -0.1,-0.3 0.3,-0.2 0.4,-0.2 1.1,1.8 0.3,-0.1 0.1,0.2 -0.6,0.3 z"
id="svg_48" />
<path
class="st8"
d="m 153.1,151.7 c 0.2,0.3 0.2,0.6 0.2,0.9 0,0.3 -0.2,0.5 -0.4,0.6 -0.1,0.1 -0.3,0.1 -0.4,0.1 -0.1,0 -0.3,0 -0.4,-0.1 l 0.1,0.3 -0.3,0.2 -1.6,-2.8 -0.4,0.1 -0.1,-0.3 0.7,-0.4 0.7,1.2 c 0,-0.1 0.1,-0.3 0.1,-0.4 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.3,-0.2 0.5,-0.2 0.8,0 0.3,0.2 0.5,0.5 0.7,0.9 z m -0.4,0.1 c -0.1,-0.2 -0.3,-0.4 -0.5,-0.5 -0.2,-0.1 -0.4,-0.1 -0.5,0 -0.1,0.1 -0.2,0.2 -0.3,0.3 0,0.1 -0.1,0.2 -0.1,0.3 l 0.5,0.9 c 0.1,0.1 0.2,0.1 0.3,0.1 0.1,0 0.2,0 0.4,-0.1 0.2,-0.1 0.3,-0.2 0.3,-0.4 0.1,-0.1 0.1,-0.3 -0.1,-0.6 z"
id="svg_49" />
<path
class="st8"
d="m 155.1,151.9 c -0.3,0.2 -0.6,0.2 -0.9,0.1 -0.3,-0.1 -0.5,-0.3 -0.7,-0.6 l -0.1,-0.1 c -0.2,-0.3 -0.2,-0.6 -0.2,-0.9 0.1,-0.3 0.2,-0.5 0.5,-0.7 0.3,-0.2 0.6,-0.2 0.8,-0.1 0.2,0.1 0.5,0.3 0.6,0.6 l 0.1,0.2 -1.4,0.8 v 0 c 0.1,0.2 0.3,0.3 0.4,0.4 0.2,0.1 0.4,0.1 0.5,0 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.1,-0.1 0.1,-0.2 0.2,-0.3 l 0.3,0.2 c 0,0.1 -0.1,0.2 -0.2,0.4 0.1,0.1 0,0.2 -0.2,0.3 z m -1.2,-1.9 c -0.1,0.1 -0.2,0.2 -0.2,0.4 0,0.2 0,0.3 0.1,0.5 v 0 l 1,-0.6 v -0.1 c -0.1,-0.2 -0.2,-0.3 -0.3,-0.3 -0.3,0 -0.4,0 -0.6,0.1 z"
id="svg_50" />
<path
class="st8"
d="m 154.6,148.4 -0.1,-0.3 0.7,-0.4 1.6,2.8 0.4,-0.1 0.1,0.2 -1,0.6 -0.1,-0.2 0.3,-0.2 -1.4,-2.5 z"
id="svg_51" />
<path
class="st8"
d="m 158.6,149.9 c -0.3,0.2 -0.6,0.2 -0.9,0.1 -0.3,-0.1 -0.5,-0.3 -0.7,-0.6 l -0.1,-0.1 c -0.2,-0.3 -0.2,-0.6 -0.2,-0.9 0.1,-0.3 0.2,-0.5 0.5,-0.7 0.3,-0.2 0.6,-0.2 0.8,-0.1 0.2,0.1 0.5,0.3 0.6,0.6 l 0.1,0.2 -1.4,0.8 v 0 c 0.1,0.2 0.3,0.3 0.4,0.4 0.2,0.1 0.4,0.1 0.5,0 0.1,-0.1 0.2,-0.2 0.3,-0.3 0.1,-0.1 0.1,-0.2 0.2,-0.3 l 0.3,0.2 c 0,0.1 -0.1,0.2 -0.2,0.4 0.1,0.1 -0.1,0.2 -0.2,0.3 z m -1.2,-1.9 c -0.1,0.1 -0.2,0.2 -0.2,0.4 0,0.2 0,0.3 0.1,0.5 v 0 l 1,-0.6 v -0.1 c -0.1,-0.2 -0.2,-0.3 -0.3,-0.3 -0.3,0 -0.5,0 -0.6,0.1 z"
id="svg_52" />
<path
class="st8"
d="m 158.9,146.1 0.3,0.5 0.4,-0.2 0.2,0.3 -0.4,0.2 0.8,1.3 c 0.1,0.1 0.1,0.2 0.2,0.2 0.1,0 0.1,0 0.2,0 0,0 0.1,0 0.1,-0.1 0,0 0.1,-0.1 0.1,-0.1 l 0.2,0.2 c 0,0 -0.1,0.1 -0.1,0.2 -0.1,0.1 -0.1,0.1 -0.2,0.1 -0.2,0.1 -0.3,0.1 -0.5,0.1 -0.1,0 -0.3,-0.2 -0.4,-0.4 l -0.7,-1.3 -0.3,0.2 -0.2,-0.3 0.3,-0.2 -0.3,-0.5 z"
id="svg_53" />
</g>
<polygon
class="st16"
points="146.2,296.6 110.6,276.1 110.6,234.9 146.2,214.4 181.9,234.9 181.9,276.1 "
id="svg_54" />
<polygon
class="st13"
points="135.6,220.5 146.2,214.4 181.9,234.9 181.8,247.2 "
id="svg_55" />
<polygon
class="st7"
points="163,226.4 159.8,232.1 179.8,243.6 179.8,236.1 "
id="svg_56" />
<g
id="svg_57">
<path
class="st8"
d="m 145.8,218.8 0.1,-0.3 0.7,0.4 -1,1.8 0.2,0.1 0.8,-0.3 -0.2,-0.1 0.1,-0.3 0.9,0.5 -0.1,0.3 -0.3,-0.1 -1,0.3 0.2,1.3 0.2,0.2 -0.1,0.2 -0.9,-0.5 0.1,-0.2 0.2,0.1 -0.2,-1 -0.3,-0.1 -0.4,0.7 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 1.4,-2.5 z"
id="svg_58" />
<path
class="st8"
d="m 148.4,223.7 c -0.1,0.1 -0.3,0.1 -0.4,0.1 -0.1,0 -0.3,0 -0.4,-0.1 -0.2,-0.1 -0.4,-0.3 -0.4,-0.5 0,-0.2 0,-0.5 0.2,-0.8 l 0.6,-1 -0.2,-0.2 0.1,-0.3 0.2,0.1 0.4,0.2 -0.7,1.3 c -0.1,0.2 -0.2,0.4 -0.2,0.5 0,0.1 0.1,0.2 0.2,0.3 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,-0.1 l 0.7,-1.2 -0.3,-0.2 0.1,-0.3 0.3,0.2 0.4,0.2 -1.1,1.8 0.2,0.2 -0.1,0.2 -0.6,-0.3 z"
id="svg_59" />
<path
class="st8"
d="m 151.7,224.7 c -0.2,0.3 -0.4,0.5 -0.7,0.6 -0.3,0.1 -0.5,0.1 -0.8,-0.1 -0.1,-0.1 -0.2,-0.2 -0.3,-0.3 -0.1,-0.1 -0.1,-0.2 -0.1,-0.4 l -0.2,0.3 -0.3,-0.2 1.6,-2.8 -0.3,-0.2 0.1,-0.3 0.7,0.4 -0.7,1.2 c 0.1,-0.1 0.2,-0.1 0.4,-0.1 0.1,0 0.3,0 0.4,0.1 0.3,0.2 0.4,0.4 0.4,0.7 0.1,0.4 0,0.7 -0.2,1.1 z m -0.4,-0.3 c 0.1,-0.2 0.2,-0.5 0.2,-0.7 0,-0.2 -0.1,-0.4 -0.3,-0.5 -0.1,-0.1 -0.2,-0.1 -0.4,-0.1 -0.1,0 -0.2,0.1 -0.3,0.1 l -0.5,0.9 c 0,0.1 0,0.2 0.1,0.3 0.1,0.1 0.1,0.2 0.3,0.3 0.2,0.1 0.4,0.1 0.5,0 0.1,0.1 0.3,-0.1 0.4,-0.3 z"
id="svg_60" />
<path
class="st8"
d="m 152.5,226.5 c -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 0,-0.3 0,-0.6 0.2,-0.9 l 0.1,-0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.8,0.1 0.3,0.2 0.5,0.4 0.5,0.6 0,0.3 0,0.5 -0.2,0.8 l -0.1,0.2 -1.4,-0.8 v 0 c -0.1,0.2 -0.2,0.4 -0.1,0.6 0,0.2 0.1,0.3 0.3,0.4 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,0 v 0.3 c -0.1,0 -0.3,0 -0.4,0 -0.3,0.1 -0.5,0.1 -0.6,0 z m 1,-2 c -0.1,-0.1 -0.3,-0.1 -0.4,0 -0.2,0.1 -0.3,0.2 -0.4,0.3 v 0 l 1,0.6 v -0.1 c 0.1,-0.2 0.1,-0.3 0.1,-0.5 0,-0.2 -0.1,-0.2 -0.3,-0.3 z"
id="svg_61" />
<path
class="st8"
d="m 155.3,224.3 0.1,-0.3 0.7,0.4 -1.6,2.8 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 1.4,-2.5 z"
id="svg_62" />
<path
class="st8"
d="m 155.9,228.5 c -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 0,-0.3 0,-0.6 0.2,-0.9 v -0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.8,0.1 0.3,0.2 0.5,0.4 0.5,0.6 0,0.3 0,0.5 -0.2,0.8 l -0.1,0.2 -1.4,-0.8 v 0 c -0.1,0.2 -0.2,0.4 -0.1,0.6 0,0.2 0.1,0.3 0.3,0.4 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,0 v 0.3 c -0.1,0 -0.3,0 -0.4,0 -0.1,0.1 -0.3,0.1 -0.5,0 z m 1.1,-2 c -0.1,-0.1 -0.3,-0.1 -0.4,0 -0.1,0.1 -0.3,0.2 -0.4,0.3 v 0 l 1,0.6 v -0.1 c 0.1,-0.2 0.1,-0.3 0.1,-0.5 -0.1,-0.1 -0.2,-0.2 -0.3,-0.3 z"
id="svg_63" />
<path
class="st8"
d="m 159.4,226.9 -0.3,0.5 0.4,0.2 -0.2,0.3 -0.4,-0.2 -0.8,1.3 c -0.1,0.1 -0.1,0.2 -0.1,0.2 0,0.1 0.1,0.1 0.1,0.2 0,0 0.1,0 0.1,0.1 0,0 0.1,0 0.1,0 l -0.1,0.3 c -0.1,0 -0.1,0 -0.2,0 -0.1,0 -0.2,-0.1 -0.2,-0.1 -0.2,-0.1 -0.3,-0.2 -0.3,-0.4 0,-0.2 0,-0.3 0.1,-0.5 l 0.8,-1.3 -0.3,-0.2 0.2,-0.3 0.3,0.2 0.3,-0.5 z"
id="svg_64" />
</g>
<g
id="svg_65">
<path
class="st8"
d="m 166.1,230.5 c 0.4,0.2 0.6,0.5 0.7,0.9 0.1,0.4 0,0.7 -0.2,1.1 l -0.2,0.4 c -0.2,0.4 -0.5,0.6 -0.9,0.7 -0.4,0.1 -0.7,0 -1.1,-0.2 l -1.2,-0.7 0.1,-0.2 0.4,0.1 1.3,-2.3 -0.3,-0.2 0.1,-0.3 0.3,0.2 z m -0.7,0 -1.3,2.3 0.5,0.3 c 0.3,0.2 0.5,0.2 0.8,0.1 0.3,-0.1 0.5,-0.3 0.6,-0.5 l 0.2,-0.4 c 0.2,-0.3 0.2,-0.5 0.2,-0.8 -0.1,-0.3 -0.2,-0.5 -0.5,-0.6 z"
id="svg_66" />
<path
class="st8"
d="m 166.7,233.2 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.9,0.1 0.3,0.2 0.5,0.4 0.5,0.7 0.1,0.3 0,0.6 -0.2,0.9 v 0 c -0.2,0.3 -0.4,0.5 -0.7,0.6 -0.3,0.1 -0.6,0.1 -0.9,-0.1 -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 -0.1,-0.2 0,-0.5 0.2,-0.9 z m 0.3,0.3 c -0.1,0.2 -0.2,0.4 -0.2,0.6 0,0.2 0.1,0.4 0.3,0.5 0.2,0.1 0.4,0.1 0.5,0 0.2,-0.1 0.3,-0.3 0.5,-0.5 v 0 c 0.1,-0.2 0.2,-0.4 0.2,-0.6 0,-0.2 -0.1,-0.4 -0.3,-0.5 -0.2,-0.1 -0.4,-0.1 -0.6,0 -0.1,0.1 -0.2,0.2 -0.4,0.5 z"
id="svg_67" />
<path
class="st8"
d="m 169.4,235.9 c 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,-0.1 0.3,-0.2 l 0.3,0.2 v 0 c -0.1,0.2 -0.3,0.3 -0.5,0.3 -0.3,0 -0.5,0 -0.7,-0.1 -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 0,-0.3 0,-0.6 0.2,-0.9 v -0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.9,0.1 0.2,0.1 0.3,0.2 0.4,0.4 0.1,0.1 0.2,0.3 0.2,0.4 l -0.3,0.5 -0.3,-0.2 0.1,-0.4 c 0,-0.1 -0.1,-0.1 -0.1,-0.2 -0.1,-0.1 -0.1,-0.1 -0.2,-0.2 -0.2,-0.1 -0.4,-0.1 -0.6,0 -0.2,0.1 -0.3,0.3 -0.4,0.5 v 0.1 c -0.1,0.2 -0.2,0.4 -0.2,0.6 0,0.1 0.1,0.3 0.3,0.4 z"
id="svg_68" />
<path
class="st8"
d="m 172.1,234 0.1,-0.3 0.7,0.4 -1,1.8 0.2,0.1 0.8,-0.3 -0.2,-0.1 0.1,-0.3 0.9,0.5 -0.1,0.3 -0.3,-0.1 -1,0.3 0.2,1.3 0.2,0.2 -0.1,0.2 -0.9,-0.5 0.1,-0.2 0.2,0.1 -0.2,-1 -0.3,-0.1 -0.4,0.7 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 1.4,-2.5 z"
id="svg_69" />
<path
class="st8"
d="m 173.9,238.9 c -0.3,-0.2 -0.5,-0.4 -0.5,-0.7 -0.1,-0.3 0,-0.6 0.2,-0.9 v -0.1 c 0.2,-0.3 0.4,-0.5 0.7,-0.6 0.3,-0.1 0.6,-0.1 0.8,0.1 0.3,0.2 0.5,0.4 0.5,0.6 0,0.3 0,0.5 -0.2,0.8 l -0.1,0.2 -1.4,-0.8 v 0 c -0.1,0.2 -0.2,0.4 -0.1,0.6 0,0.2 0.1,0.3 0.3,0.4 0.1,0.1 0.3,0.1 0.4,0.1 0.1,0 0.2,0 0.3,0 v 0.3 c -0.1,0 -0.3,0 -0.4,0 -0.2,0.2 -0.4,0.1 -0.5,0 z m 1,-2 c -0.1,-0.1 -0.3,-0.1 -0.4,0 -0.2,0.1 -0.3,0.2 -0.4,0.3 v 0 l 1,0.6 v -0.1 c 0.1,-0.2 0.1,-0.3 0.1,-0.5 0,0 -0.1,-0.2 -0.3,-0.3 z"
id="svg_70" />
<path
class="st8"
d="m 176.2,237.7 0.1,-0.3 0.7,0.4 -0.1,0.3 c 0.1,-0.1 0.2,-0.1 0.4,-0.1 0.1,0 0.2,0 0.4,0.1 0,0 0.1,0 0.1,0.1 0,0 0.1,0 0.1,0.1 l -0.3,0.3 -0.2,-0.1 c -0.1,-0.1 -0.2,-0.1 -0.3,-0.1 -0.1,0 -0.2,0 -0.3,0.1 l -0.7,1.2 0.3,0.2 -0.1,0.2 -1,-0.6 0.1,-0.2 0.4,0.1 0.9,-1.5 z"
id="svg_71" />
</g>
</g>
<g
id="service" />
<g
id="pods"
transform="translate(-24)">
<circle
class="st29"
cx="146.2"
cy="119.5"
r="20.9"
id="svg_72" />
</g>
<g
id="IP" />
<g
id="deployments"
transform="translate(-22)">
<g
id="svg_73">
<g
id="svg_74">
<circle
class="st47"
cx="177.39999"
cy="181.7"
r="10.1"
id="svg_75" />
<g
id="svg_76">
<g
id="svg_77">
<path
class="st48"
d="m 180.9,176 c 1.9,1.2 3.2,3.3 3.2,5.8 0,3.7 -3,6.7 -6.7,6.7 -3.7,0 -6.7,-3 -6.7,-6.7 0,-2.9 1.9,-5.4 4.5,-6.4"
id="svg_78" />
<g
id="svg_79">
<polygon
class="st42"
points="182.4,174.5 179.6,175.4 180.5,178.1 182.1,178.9 181.2,176.2 183.9,175.3 "
id="svg_80" />
</g>
</g>
</g>
<g
id="svg_81">
<path
class="st42"
d="m 174.8,185.1 v -6.7 h 2.3 c 0.8,0 1.5,0.3 2,0.8 0.5,0.5 0.8,1.2 0.8,2 v 1.1 c 0,0.8 -0.3,1.5 -0.8,2 -0.5,0.5 -1.2,0.8 -2,0.8 z m 1.3,-5.7 v 4.7 h 0.9 c 0.5,0 0.9,-0.2 1.1,-0.5 0.3,-0.3 0.4,-0.8 0.4,-1.3 v -1.1 c 0,-0.5 -0.1,-0.9 -0.4,-1.3 -0.3,-0.3 -0.7,-0.5 -1.1,-0.5 z"
id="svg_82" />
</g>
</g>
</g>
</g>
<g
id="containers_x2F_volumes"
transform="translate(-24)">
<g
id="svg_83">
<polygon
class="st50"
points="155.9,113.9 146.2,119.5 136.5,113.9 146.2,108.3 "
id="svg_84" />
<polygon
class="st50"
points="146.2,119.5 146.2,130.7 136.5,125.1 136.5,113.9 "
id="svg_85" />
<polygon
class="st50"
points="155.9,113.9 155.9,125.1 146.2,130.7 146.2,119.5 "
id="svg_86" />
</g>
</g>
<g
id="labels_x2F_selectors" />
<g
id="description"
transform="translate(-22)">
<line
class="st62"
x1="360"
y1="203.89999"
x2="188.60001"
y2="203.89999"
id="svg_113" />
<line
class="st62"
x1="360"
y1="181.7"
x2="181.5"
y2="181.7"
id="svg_125" />
<line
class="st62"
x1="360"
y1="229"
x2="159.39999"
y2="229"
id="svg_126" />
<line
class="st62"
x1="360"
y1="101.5"
x2="242.8"
y2="101.5"
id="svg_127" />
<line
class="st62"
x1="360"
y1="123.7"
x2="150.2"
y2="123.7"
id="svg_145" />
<g
id="svg_146" />
<text
xml:space="preserve"
style="font-size:13.3333px;line-height:1.25;font-family:Courier;-inkscape-font-specification:'Courier, Normal'"
x="361.82697"
y="104.54287"
id="text1997"><tspan
id="tspan1995"
x="361.82697"
y="104.54287">Node</tspan></text>
<text
xml:space="preserve"
style="font-size:13.3333px;line-height:1.25;font-family:Courier;-inkscape-font-specification:'Courier, Normal'"
x="361.24179"
y="126.47728"
id="text2001"><tspan
id="tspan1999"
x="361.24179"
y="126.47728">containerized app</tspan></text>
<text
xml:space="preserve"
style="font-size:13.3333px;line-height:1.25;font-family:Courier;-inkscape-font-specification:'Courier, Normal'"
x="361.82697"
y="185.326"
id="text2005"><tspan
id="tspan2003"
x="361.82697"
y="185.326">Deployment</tspan></text>
<text
xml:space="preserve"
style="font-size:13.3333px;line-height:1.25;font-family:Courier;-inkscape-font-specification:'Courier, Normal'"
x="361.60068"
y="207.72804"
id="text2009"><tspan
id="tspan2007"
x="361.60068"
y="207.72804">Control Plane</tspan></text>
<text
xml:space="preserve"
style="font-size:13.3333px;line-height:1.25;font-family:Courier;-inkscape-font-specification:'Courier, Normal'"
x="360.92181"
y="232.16661"
id="text2013"><tspan
id="tspan2011"
x="360.92181"
y="232.16661">node processes</tspan></text>
<text
xml:space="preserve"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:13.3333px;line-height:1.25;font-family:Courier;-inkscape-font-specification:'Courier, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal"
x="113.36793"
y="350.73907"
id="text2017"><tspan
id="tspan2015"
x="113.36793"
y="350.73907">Kubernetes Cluster</tspan></text>
</g>
<g
id="Layer_14" />
</g>
<g id="containers_x2F_volumes">
<g id="svg_83">
<polygon class="st50" points="136.5,113.9 146.2,108.3 155.9,113.9 146.2,119.5 " id="svg_84"/>
<polygon class="st50" points="136.5,125.1 136.5,113.9 146.2,119.5 146.2,130.7 " id="svg_85"/>
<polygon class="st50" points="146.2,130.7 146.2,119.5 155.9,113.9 155.9,125.1 " id="svg_86"/>
</g>
</g>
<g id="labels_x2F_selectors"/>
<g id="description">
<g id="svg_87">
<path class="st42" d="m373.8,200.8l0,0l-2.8,6.8l-0.8,0l-2.8,-6.8l0,0l0.1,3.5l0,2.5l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-6.8l-1,-0.2l0,-0.7l1,0l1.5,0l2.7,6.9l0,0l2.7,-6.9l2.4,0l0,0.7l-1,0.2l0,6.7l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-2.5l0.2,-3.4z" id="svg_88"/>
<path class="st42" d="m380.8,207.6c0,-0.2 -0.1,-0.3 -0.1,-0.5s0,-0.3 0,-0.4c-0.2,0.3 -0.5,0.5 -0.8,0.7s-0.7,0.3 -1.1,0.3c-0.7,0 -1.2,-0.2 -1.5,-0.5s-0.5,-0.8 -0.5,-1.4c0,-0.6 0.2,-1.1 0.7,-1.4s1.2,-0.5 2,-0.5l1.2,0l0,-0.7c0,-0.4 -0.1,-0.7 -0.4,-0.9s-0.6,-0.3 -1,-0.3c-0.3,0 -0.5,0 -0.8,0.1s-0.4,0.2 -0.5,0.3l-0.1,0.7l-0.9,0l0,-1.2c0.3,-0.2 0.6,-0.4 1,-0.6s0.9,-0.2 1.3,-0.2c0.7,0 1.3,0.2 1.7,0.6s0.7,0.9 0.7,1.6l0,3.1c0,0.1 0,0.2 0,0.2s0,0.2 0,0.2l0.5,0.1l0,0.7l-1.4,0zm-1.8,-0.8c0.4,0 0.7,-0.1 1,-0.3s0.5,-0.4 0.7,-0.7l0,-1l-1.2,0c-0.5,0 -0.8,0.1 -1.1,0.3s-0.4,0.5 -0.4,0.8c0,0.3 0.1,0.5 0.3,0.6s0.3,0.3 0.7,0.3z" id="svg_89"/>
<path class="st42" d="m388.2,203.3l-0.9,0l-0.2,-0.8c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3s-0.5,-0.1 -0.7,-0.1c-0.4,0 -0.7,0.1 -0.9,0.3s-0.3,0.4 -0.3,0.7c0,0.2 0.1,0.4 0.3,0.6s0.5,0.3 1.1,0.4c0.8,0.2 1.4,0.4 1.8,0.7s0.6,0.7 0.6,1.2c0,0.6 -0.2,1 -0.7,1.4s-1,0.5 -1.8,0.5c-0.5,0 -0.9,-0.1 -1.3,-0.2s-0.7,-0.3 -1,-0.5l0,-1.4l0.9,0l0.2,0.8c0.1,0.1 0.3,0.2 0.5,0.3s0.5,0.1 0.7,0.1c0.4,0 0.7,-0.1 1,-0.2s0.3,-0.4 0.3,-0.7c0,-0.3 -0.1,-0.5 -0.3,-0.6s-0.6,-0.3 -1.1,-0.4c-0.8,-0.2 -1.3,-0.4 -1.7,-0.7s-0.6,-0.7 -0.6,-1.2c0,-0.5 0.2,-1 0.7,-1.3s1,-0.5 1.7,-0.5c0.5,0 0.9,0.1 1.3,0.2s0.7,0.3 1,0.5l-0.1,1.2z" id="svg_90"/>
<path class="st42" d="m391.5,199.8l0,1.5l1.2,0l0,0.9l-1.2,0l0,3.8c0,0.3 0.1,0.5 0.2,0.6s0.3,0.2 0.5,0.2c0.1,0 0.2,0 0.3,0s0.2,0 0.3,-0.1l0.2,0.8c-0.1,0.1 -0.3,0.1 -0.5,0.2s-0.4,0.1 -0.6,0.1c-0.5,0 -0.8,-0.1 -1.1,-0.4s-0.4,-0.7 -0.4,-1.3l0,-3.8l-1,0l0,-0.9l1,0l0,-1.5l1.1,0l0,-0.1z" id="svg_91"/>
<path class="st42" d="m396.7,207.8c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.8,0.3 -1.4,0.3zm-0.1,-5.7c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.6,-0.4 -1,-0.4z" id="svg_92"/>
<path class="st42" d="m400.3,202l0,-0.7l2,0l0.1,0.9c0.2,-0.3 0.4,-0.6 0.7,-0.8s0.6,-0.3 0.9,-0.3c0.1,0 0.2,0 0.3,0s0.2,0 0.2,0l-0.2,1.1l-0.7,0c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.3 -0.5,0.6l0,3.6l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-4.5l-0.9,-0.1z" id="svg_93"/>
</g>
<g id="svg_94">
<path class="st42" d="m365.4,230.3l1,-0.2l0,-4.5l-1,-0.2l0,-0.7l2,0l0.1,0.9c0.2,-0.3 0.5,-0.6 0.8,-0.8s0.7,-0.3 1.1,-0.3c0.7,0 1.2,0.2 1.6,0.6s0.6,1 0.6,1.9l0,3.1l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-3.1c0,-0.6 -0.1,-1 -0.3,-1.2s-0.6,-0.4 -1,-0.4c-0.3,0 -0.6,0.1 -0.9,0.2s-0.5,0.4 -0.6,0.7l0,3.7l1,0.2l0,0.7l-3.1,0l0,-0.6l-0.2,0z" id="svg_95"/>
<path class="st42" d="m373.2,227.8c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 2.1,-0.9c0.9,0 1.6,0.3 2.1,0.9s0.8,1.4 0.8,2.3l0,0.1c0,0.9 -0.3,1.7 -0.8,2.3s-1.2,0.9 -2.1,0.9c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.1zm1.2,0.1c0,0.7 0.1,1.2 0.4,1.7s0.7,0.7 1.3,0.7c0.5,0 1,-0.2 1.2,-0.7s0.4,-1 0.4,-1.7l0,-0.1c0,-0.7 -0.1,-1.2 -0.4,-1.7s-0.7,-0.7 -1.3,-0.7s-1,0.2 -1.3,0.7s-0.4,1 -0.4,1.7l0,0.1l0.1,0z" id="svg_96"/>
<path class="st42" d="m384.2,230.3c-0.2,0.3 -0.5,0.5 -0.8,0.7s-0.6,0.2 -1,0.2c-0.8,0 -1.4,-0.3 -1.8,-0.8s-0.7,-1.3 -0.7,-2.2l0,-0.2c0,-1 0.2,-1.8 0.7,-2.5s1,-0.9 1.8,-0.9c0.4,0 0.7,0.1 1,0.2s0.5,0.3 0.7,0.6l0,-2.6l-1,-0.2l0,-0.7l1,0l1.2,0l0,8.2l1,0.2l0,0.7l-2,0l-0.1,-0.7zm-3.1,-2.2c0,0.6 0.1,1.1 0.4,1.5s0.7,0.6 1.2,0.6c0.3,0 0.6,-0.1 0.9,-0.2s0.4,-0.4 0.6,-0.7l0,-2.9c-0.1,-0.3 -0.3,-0.5 -0.6,-0.6s-0.5,-0.2 -0.9,-0.2c-0.6,0 -1,0.2 -1.2,0.7s-0.4,1.1 -0.4,1.8l0,0z" id="svg_97"/>
<path class="st42" d="m390,231.1c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.8,0.3 -1.4,0.3zm-0.1,-5.6c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.6,-0.4 -1,-0.4z" id="svg_98"/>
<path class="st42" d="m396.4,232.7l1,-0.2l0,-7l-1,-0.2l0,-0.7l1.9,0l0.1,0.8c0.2,-0.3 0.5,-0.5 0.8,-0.7s0.7,-0.2 1.1,-0.2c0.8,0 1.4,0.3 1.8,0.9s0.7,1.4 0.7,2.5l0,0.1c0,0.9 -0.2,1.7 -0.7,2.2s-1,0.8 -1.8,0.8c-0.4,0 -0.7,-0.1 -1,-0.2s-0.5,-0.3 -0.8,-0.6l0,2.2l1,0.2l0,0.7l-3.1,0l0,-0.6zm5.2,-4.7c0,-0.7 -0.1,-1.3 -0.4,-1.8s-0.7,-0.7 -1.3,-0.7c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.4 -0.6,0.6l0,3.1c0.1,0.3 0.3,0.5 0.6,0.6s0.5,0.2 0.9,0.2c0.5,0 1,-0.2 1.2,-0.6s0.4,-0.9 0.4,-1.6l0,0z" id="svg_99"/>
<path class="st42" d="m403.8,225.4l0,-0.7l2,0l0.1,0.9c0.2,-0.3 0.4,-0.6 0.7,-0.8s0.6,-0.3 0.9,-0.3c0.1,0 0.2,0 0.3,0s0.2,0 0.2,0l-0.2,1.1l-0.7,0c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.3 -0.5,0.6l0,3.6l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-4.5l-0.9,-0.1z" id="svg_100"/>
<path class="st42" d="m408.7,227.8c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 2.1,-0.9c0.9,0 1.6,0.3 2.1,0.9s0.8,1.4 0.8,2.3l0,0.1c0,0.9 -0.3,1.7 -0.8,2.3s-1.2,0.9 -2.1,0.9c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.1zm1.2,0.1c0,0.7 0.1,1.2 0.4,1.7s0.7,0.7 1.3,0.7c0.5,0 1,-0.2 1.2,-0.7s0.4,-1 0.4,-1.7l0,-0.1c0,-0.7 -0.1,-1.2 -0.4,-1.7s-0.7,-0.7 -1.3,-0.7s-1,0.2 -1.3,0.7s-0.4,1 -0.4,1.7l0,0.1l0.1,0z" id="svg_101"/>
<path class="st42" d="m418.3,230.2c0.4,0 0.7,-0.1 1,-0.4s0.4,-0.5 0.4,-0.9l1,0l0,0c0,0.5 -0.2,1 -0.7,1.5s-1.1,0.6 -1.8,0.6c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.7,-1.4 -0.7,-2.3l0,-0.2c0,-0.9 0.2,-1.7 0.7,-2.3s1.2,-0.9 2.1,-0.9c0.5,0 1,0.1 1.4,0.3s0.7,0.4 1,0.7l0.1,1.4l-0.9,0l-0.3,-1c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3s-0.5,-0.1 -0.7,-0.1c-0.6,0 -1,0.2 -1.3,0.7s-0.4,1 -0.4,1.6l0,0.2c0,0.6 0.1,1.2 0.4,1.6s0.7,0.7 1.3,0.7z" id="svg_102"/>
<path class="st42" d="m424.8,231.1c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.9,0.3 -1.4,0.3zm-0.2,-5.6c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.5,-0.4 -1,-0.4z" id="svg_103"/>
<path class="st42" d="m433.2,226.7l-0.9,0l-0.2,-0.8c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3s-0.5,-0.1 -0.7,-0.1c-0.4,0 -0.7,0.1 -0.9,0.3s-0.3,0.4 -0.3,0.7c0,0.2 0.1,0.4 0.3,0.6s0.5,0.3 1.1,0.4c0.8,0.2 1.4,0.4 1.8,0.7s0.6,0.7 0.6,1.2c0,0.6 -0.2,1 -0.7,1.4s-1,0.5 -1.8,0.5c-0.5,0 -0.9,-0.1 -1.3,-0.2s-0.7,-0.3 -1,-0.5l0,-1.4l0.9,0l0.2,0.8c0.1,0.1 0.3,0.2 0.5,0.3s0.5,0.1 0.7,0.1c0.4,0 0.7,-0.1 1,-0.2s0.3,-0.4 0.3,-0.7c0,-0.3 -0.1,-0.5 -0.3,-0.6s-0.6,-0.3 -1.1,-0.4c-0.8,-0.2 -1.3,-0.4 -1.7,-0.7s-0.6,-0.7 -0.6,-1.2c0,-0.5 0.2,-1 0.7,-1.3s1,-0.5 1.7,-0.5c0.5,0 0.9,0.1 1.3,0.2s0.7,0.3 1,0.5l-0.1,1.2z" id="svg_104"/>
<path class="st42" d="m439.3,226.7l-0.9,0l-0.2,-0.8c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3s-0.5,-0.1 -0.7,-0.1c-0.4,0 -0.7,0.1 -0.9,0.3s-0.3,0.4 -0.3,0.7c0,0.2 0.1,0.4 0.3,0.6s0.5,0.3 1.1,0.4c0.8,0.2 1.4,0.4 1.8,0.7s0.6,0.7 0.6,1.2c0,0.6 -0.2,1 -0.7,1.4s-1,0.5 -1.8,0.5c-0.5,0 -0.9,-0.1 -1.3,-0.2s-0.7,-0.3 -1,-0.5l0,-1.4l0.9,0l0.2,0.8c0.1,0.1 0.3,0.2 0.5,0.3s0.5,0.1 0.7,0.1c0.4,0 0.7,-0.1 1,-0.2s0.3,-0.4 0.3,-0.7c0,-0.3 -0.1,-0.5 -0.3,-0.6s-0.6,-0.3 -1.1,-0.4c-0.8,-0.2 -1.3,-0.4 -1.7,-0.7s-0.6,-0.7 -0.6,-1.2c0,-0.5 0.2,-1 0.7,-1.3s1,-0.5 1.7,-0.5c0.5,0 0.9,0.1 1.3,0.2s0.7,0.3 1,0.5l-0.1,1.2z" id="svg_105"/>
<path class="st42" d="m443.5,231.1c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.9,0.3 -1.4,0.3zm-0.2,-5.6c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.5,-0.4 -1,-0.4z" id="svg_106"/>
<path class="st42" d="m451.9,226.7l-0.9,0l-0.2,-0.8c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3s-0.5,-0.1 -0.7,-0.1c-0.4,0 -0.7,0.1 -0.9,0.3s-0.3,0.4 -0.3,0.7c0,0.2 0.1,0.4 0.3,0.6s0.5,0.3 1.1,0.4c0.8,0.2 1.4,0.4 1.8,0.7s0.6,0.7 0.6,1.2c0,0.6 -0.2,1 -0.7,1.4s-1,0.5 -1.8,0.5c-0.5,0 -0.9,-0.1 -1.3,-0.2s-0.7,-0.3 -1,-0.5l0,-1.4l0.9,0l0.2,0.8c0.1,0.1 0.3,0.2 0.5,0.3s0.5,0.1 0.7,0.1c0.4,0 0.7,-0.1 1,-0.2s0.3,-0.4 0.3,-0.7c0,-0.3 -0.1,-0.5 -0.3,-0.6s-0.6,-0.3 -1.1,-0.4c-0.8,-0.2 -1.3,-0.4 -1.7,-0.7s-0.6,-0.7 -0.6,-1.2c0,-0.5 0.2,-1 0.7,-1.3s1,-0.5 1.7,-0.5c0.5,0 0.9,0.1 1.3,0.2s0.7,0.3 1,0.5l-0.1,1.2z" id="svg_107"/>
</g>
<g id="svg_108">
<path class="st42" d="m373.8,95l0,0.7l-1,0.2l0,7.6l-1.2,0l-4.1,-6.6l0,0l0,5.7l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-6.7l-1,-0.2l0,-0.7l1,0l1.2,0l4.1,6.6l0,0l0,-5.7l-1,-0.2l0,-0.7l2.1,0l1,0z" id="svg_109"/>
<path class="st42" d="m374.7,100.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 2.1,-0.9c0.9,0 1.6,0.3 2.1,0.9s0.8,1.4 0.8,2.3l0,0.1c0,0.9 -0.3,1.7 -0.8,2.3s-1.2,0.9 -2.1,0.9c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.1zm1.2,0.1c0,0.7 0.1,1.2 0.4,1.7s0.7,0.7 1.3,0.7c0.5,0 1,-0.2 1.2,-0.7s0.4,-1 0.4,-1.7l0,-0.1c0,-0.7 -0.1,-1.2 -0.4,-1.7s-0.7,-0.7 -1.3,-0.7s-1,0.2 -1.3,0.7s-0.4,1 -0.4,1.7l0,0.1l0.1,0z" id="svg_110"/>
<path class="st42" d="m385.7,102.8c-0.2,0.3 -0.5,0.5 -0.8,0.7s-0.6,0.2 -1,0.2c-0.8,0 -1.4,-0.3 -1.8,-0.8s-0.7,-1.3 -0.7,-2.2l0,-0.1c0,-1 0.2,-1.8 0.7,-2.5s1,-0.9 1.8,-0.9c0.4,0 0.7,0.1 1,0.2s0.5,0.3 0.7,0.6l0,-2.6l-1,-0.2l0,-0.7l1,0l1.2,0l0,8.2l1,0.2l0,0.7l-2,0l-0.1,-0.8zm-3.1,-2.2c0,0.6 0.1,1.1 0.4,1.5s0.7,0.6 1.2,0.6c0.3,0 0.6,-0.1 0.9,-0.2s0.4,-0.4 0.6,-0.7l0,-2.9c-0.1,-0.3 -0.3,-0.5 -0.6,-0.6s-0.5,-0.2 -0.9,-0.2c-0.6,0 -1,0.2 -1.2,0.7s-0.4,1.1 -0.4,1.8l0,0z" id="svg_111"/>
<path class="st42" d="m391.5,103.6c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.9,0.3 -1.4,0.3zm-0.2,-5.6c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.5,-0.4 -1,-0.4z" id="svg_112"/>
</g>
<line class="st62" x1="360" y1="203.9" x2="188.6" y2="203.9" id="svg_113"/>
<g id="svg_114">
<path class="st42" d="m369,176.9c1.1,0 2,0.3 2.7,1s1,1.6 1,2.7l0,1.2c0,1.1 -0.3,2 -1,2.7s-1.6,1 -2.7,1l-3.6,0l0,-0.7l1,-0.2l0,-6.7l-1,-0.2l0,-0.7l1,0l2.6,0l0,-0.1zm-1.4,0.9l0,6.7l1.5,0c0.8,0 1.4,-0.3 1.9,-0.8s0.7,-1.2 0.7,-2l0,-1.2c0,-0.8 -0.2,-1.5 -0.7,-2s-1.1,-0.8 -1.9,-0.8l-1.5,0l0,0.1z" id="svg_115"/>
<path class="st42" d="m376.8,185.5c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.9,0.3 -1.4,0.3zm-0.2,-5.6c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.5,-0.4 -1,-0.4z" id="svg_116"/>
<path class="st42" d="m380.2,187.1l1,-0.2l0,-7l-1,-0.2l0,-0.7l1.9,0l0.1,0.8c0.2,-0.3 0.5,-0.5 0.8,-0.7s0.7,-0.2 1.1,-0.2c0.8,0 1.4,0.3 1.8,0.9s0.7,1.4 0.7,2.5l0,0.1c0,0.9 -0.2,1.7 -0.7,2.2s-1,0.8 -1.8,0.8c-0.4,0 -0.7,-0.1 -1,-0.2s-0.5,-0.3 -0.8,-0.6l0,2.2l1,0.2l0,0.7l-3.1,0l0,-0.6zm5.2,-4.8c0,-0.7 -0.1,-1.3 -0.4,-1.8s-0.7,-0.7 -1.3,-0.7c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.4 -0.6,0.6l0,3.1c0.1,0.3 0.3,0.5 0.6,0.6s0.5,0.2 0.9,0.2c0.5,0 1,-0.2 1.2,-0.6s0.4,-0.9 0.4,-1.6l0,0z" id="svg_117"/>
<path class="st42" d="m387.4,177l0,-0.7l2.1,0l0,8.2l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-7.3l-1,-0.2z" id="svg_118"/>
<path class="st42" d="m391.2,182.2c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 2.1,-0.9c0.9,0 1.6,0.3 2.1,0.9s0.8,1.4 0.8,2.3l0,0.1c0,0.9 -0.3,1.7 -0.8,2.3s-1.2,0.9 -2.1,0.9c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.1zm1.1,0.1c0,0.7 0.1,1.2 0.4,1.7s0.7,0.7 1.3,0.7c0.5,0 1,-0.2 1.2,-0.7s0.4,-1 0.4,-1.7l0,-0.1c0,-0.7 -0.1,-1.2 -0.4,-1.7s-0.7,-0.7 -1.3,-0.7s-1,0.2 -1.3,0.7s-0.4,1 -0.4,1.7l0,0.1l0.1,0z" id="svg_119"/>
<path class="st42" d="m403.9,179.8l-0.6,0.1l-2.4,6.5c-0.2,0.4 -0.4,0.8 -0.7,1.1s-0.7,0.5 -1.2,0.5c-0.1,0 -0.2,0 -0.4,0s-0.3,0 -0.3,-0.1l0.1,-0.9c0,0 0,0 0.2,0s0.3,0 0.3,0c0.2,0 0.4,-0.1 0.6,-0.3s0.3,-0.5 0.4,-0.7l0.3,-0.7l-2.1,-5.4l-0.6,-0.1l0,-0.7l2.6,0l0,0.7l-0.7,0.1l1.1,3.1l0.2,0.8l0,0l1.3,-3.9l-0.7,-0.1l0,-0.7l2.6,0l0,0.7z" id="svg_120"/>
<path class="st42" d="m404.4,184.7l1,-0.2l0,-4.5l-1,-0.2l0,-0.7l2,0l0.1,0.8c0.2,-0.3 0.5,-0.5 0.8,-0.7s0.7,-0.2 1.1,-0.2s0.8,0.1 1.1,0.3s0.5,0.5 0.7,0.9c0.2,-0.4 0.5,-0.6 0.8,-0.9s0.7,-0.3 1.1,-0.3c0.6,0 1.2,0.2 1.5,0.7s0.6,1.1 0.6,2l0,2.9l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-2.9c0,-0.6 -0.1,-1.1 -0.3,-1.3s-0.5,-0.4 -1,-0.4c-0.4,0 -0.7,0.1 -1,0.4s-0.4,0.6 -0.4,1.1l0,3.1l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-2.9c0,-0.6 -0.1,-1 -0.3,-1.3s-0.5,-0.4 -1,-0.4c-0.4,0 -0.6,0.1 -0.9,0.2s-0.4,0.3 -0.5,0.6l0,3.8l1,0.2l0,0.7l-3.1,0l0,-0.8l-0.1,0z" id="svg_121"/>
<path class="st42" d="m418.8,185.5c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.9,0.3 -1.4,0.3zm-0.2,-5.6c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.5,-0.4 -1,-0.4z" id="svg_122"/>
<path class="st42" d="m422.2,184.7l1,-0.2l0,-4.5l-1,-0.2l0,-0.7l2,0l0.1,0.9c0.2,-0.3 0.5,-0.6 0.8,-0.8s0.7,-0.3 1.1,-0.3c0.7,0 1.2,0.2 1.6,0.6s0.6,1 0.6,1.9l0,3.1l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-3.1c0,-0.6 -0.1,-1 -0.3,-1.2s-0.6,-0.4 -1,-0.4c-0.3,0 -0.6,0.1 -0.9,0.2s-0.5,0.4 -0.6,0.7l0,3.7l1,0.2l0,0.7l-3.1,0l0,-0.6l-0.2,0z" id="svg_123"/>
<path class="st42" d="m432.1,177.5l0,1.5l1.2,0l0,0.9l-1.2,0l0,3.8c0,0.3 0.1,0.5 0.2,0.6s0.3,0.2 0.5,0.2c0.1,0 0.2,0 0.3,0s0.2,0 0.3,-0.1l0.2,0.8c-0.1,0.1 -0.3,0.1 -0.5,0.2s-0.4,0.1 -0.6,0.1c-0.5,0 -0.8,-0.1 -1.1,-0.4s-0.4,-0.7 -0.4,-1.3l0,-3.8l-1,0l0,-0.9l1,0l0,-1.5l1.1,0l0,-0.1z" id="svg_124"/>
</g>
<line class="st62" x1="360" y1="181.7" x2="181.5" y2="181.7" id="svg_125"/>
<line class="st62" x1="360" y1="229" x2="159.4" y2="229" id="svg_126"/>
<line class="st62" x1="360" y1="101.5" x2="242.8" y2="101.5" id="svg_127"/>
<g id="svg_128">
<path class="st42" d="m368.5,126.3c0.4,0 0.7,-0.1 1,-0.4s0.4,-0.5 0.4,-0.9l1,0l0,0c0,0.5 -0.2,1 -0.7,1.5s-1.1,0.6 -1.8,0.6c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.7,-1.4 -0.7,-2.3l0,-0.2c0,-0.9 0.2,-1.7 0.7,-2.3s1.2,-0.9 2.1,-0.9c0.5,0 1,0.1 1.4,0.3s0.7,0.4 1,0.7l0.1,1.4l-0.9,0l-0.3,-1c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3s-0.5,-0.1 -0.7,-0.1c-0.6,0 -1,0.2 -1.3,0.7s-0.4,1 -0.4,1.6l0,0.2c0,0.6 0.1,1.2 0.4,1.6s0.6,0.7 1.3,0.7z" id="svg_129"/>
<path class="st42" d="m372.1,123.8c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 2.1,-0.9c0.9,0 1.6,0.3 2.1,0.9s0.8,1.4 0.8,2.3l0,0.1c0,0.9 -0.3,1.7 -0.8,2.3s-1.2,0.9 -2.1,0.9c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.1zm1.1,0.1c0,0.7 0.1,1.2 0.4,1.7s0.7,0.7 1.3,0.7c0.5,0 1,-0.2 1.2,-0.7s0.4,-1 0.4,-1.7l0,-0.1c0,-0.7 -0.1,-1.2 -0.4,-1.7s-0.7,-0.7 -1.3,-0.7s-1,0.2 -1.3,0.7s-0.4,1 -0.4,1.7l0,0.1l0.1,0z" id="svg_130"/>
<path class="st42" d="m378.6,126.3l1,-0.2l0,-4.5l-1,-0.2l0,-0.7l2,0l0.1,0.9c0.2,-0.3 0.5,-0.6 0.8,-0.8s0.7,-0.3 1.1,-0.3c0.7,0 1.2,0.2 1.6,0.6s0.6,1 0.6,1.9l0,3.1l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-3.1c0,-0.6 -0.1,-1 -0.3,-1.2s-0.6,-0.4 -1,-0.4c-0.3,0 -0.6,0.1 -0.9,0.2s-0.5,0.4 -0.6,0.7l0,3.7l1,0.2l0,0.7l-3.1,0l0,-0.6l-0.2,0z" id="svg_131"/>
<path class="st42" d="m388.6,119.2l0,1.5l1.2,0l0,0.9l-1.2,0l0,3.8c0,0.3 0.1,0.5 0.2,0.6s0.3,0.2 0.5,0.2c0.1,0 0.2,0 0.3,0s0.2,0 0.3,-0.1l0.2,0.8c-0.1,0.1 -0.3,0.1 -0.5,0.2s-0.4,0.1 -0.6,0.1c-0.5,0 -0.8,-0.1 -1.1,-0.4s-0.4,-0.7 -0.4,-1.3l0,-3.8l-1,0l0,-0.9l1,0l0,-1.5l1.1,0l0,-0.1z" id="svg_132"/>
<path class="st42" d="m395.1,127c0,-0.2 -0.1,-0.3 -0.1,-0.5s0,-0.3 0,-0.4c-0.2,0.3 -0.5,0.5 -0.8,0.7s-0.7,0.3 -1.1,0.3c-0.7,0 -1.2,-0.2 -1.5,-0.5s-0.5,-0.8 -0.5,-1.4c0,-0.6 0.2,-1.1 0.7,-1.4s1.2,-0.5 2,-0.5l1.2,0l0,-0.7c0,-0.4 -0.1,-0.7 -0.4,-0.9s-0.6,-0.3 -1,-0.3c-0.3,0 -0.5,0 -0.8,0.1s-0.4,0.2 -0.5,0.3l-0.1,0.7l-0.9,0l0,-1.2c0.3,-0.2 0.6,-0.4 1,-0.6s0.9,-0.2 1.3,-0.2c0.7,0 1.3,0.2 1.7,0.6s0.7,0.9 0.7,1.6l0,3.1c0,0.1 0,0.2 0,0.2s0,0.2 0,0.2l0.5,0.1l0,0.7l-1.4,0zm-1.9,-0.8c0.4,0 0.7,-0.1 1,-0.3s0.5,-0.4 0.7,-0.7l0,-1l-1.2,0c-0.5,0 -0.8,0.1 -1.1,0.3s-0.4,0.5 -0.4,0.8c0,0.3 0.1,0.5 0.3,0.6s0.4,0.3 0.7,0.3z" id="svg_133"/>
<path class="st42" d="m397.5,126.3l1,-0.2l0,-4.5l-1,-0.2l0,-0.7l2.1,0l0,5.4l1,0.2l0,0.7l-3.1,0l0,-0.7zm2.1,-7.2l-1.2,0l0,-1.2l1.2,0l0,1.2z" id="svg_134"/>
<path class="st42" d="m401.3,126.3l1,-0.2l0,-4.5l-1,-0.2l0,-0.7l2,0l0.1,0.9c0.2,-0.3 0.5,-0.6 0.8,-0.8s0.7,-0.3 1.1,-0.3c0.7,0 1.2,0.2 1.6,0.6s0.6,1 0.6,1.9l0,3.1l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-3.1c0,-0.6 -0.1,-1 -0.3,-1.2s-0.6,-0.4 -1,-0.4c-0.3,0 -0.6,0.1 -0.9,0.2s-0.5,0.4 -0.6,0.7l0,3.7l1,0.2l0,0.7l-3.1,0l0,-0.6l-0.2,0z" id="svg_135"/>
<path class="st42" d="m412,127.2c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.8,0.3 -1.4,0.3zm-0.1,-5.7c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.6,-0.4 -1,-0.4z" id="svg_136"/>
<path class="st42" d="m415.6,121.4l0,-0.7l2,0l0.1,0.9c0.2,-0.3 0.4,-0.6 0.7,-0.8s0.6,-0.3 0.9,-0.3c0.1,0 0.2,0 0.3,0s0.2,0 0.2,0l-0.2,1.1l-0.7,0c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.3 -0.5,0.6l0,3.6l1,0.2l0,0.7l-3.1,0l0,-0.7l1,-0.2l0,-4.5l-0.9,-0.1z" id="svg_137"/>
<path class="st42" d="m420.6,126.3l1,-0.2l0,-4.5l-1,-0.2l0,-0.7l2.1,0l0,5.4l1,0.2l0,0.7l-3.1,0l0,-0.7zm2.1,-7.2l-1.2,0l0,-1.2l1.2,0l0,1.2z" id="svg_138"/>
<path class="st42" d="m426,126.1l2.6,0l0.1,-1l1,0l0,1.9l-5,0l0,-0.8l3.4,-4.6l-2.3,0l-0.1,1l-1,0l0,-1.9l4.8,0l0,0.8l-3.5,4.6z" id="svg_139"/>
<path class="st42" d="m433.7,127.2c-0.9,0 -1.6,-0.3 -2.1,-0.9s-0.8,-1.4 -0.8,-2.3l0,-0.3c0,-0.9 0.3,-1.7 0.8,-2.3s1.2,-0.9 1.9,-0.9c0.9,0 1.5,0.3 1.9,0.8s0.7,1.2 0.7,2.1l0,0.7l-4.1,0l0,0c0,0.6 0.2,1.1 0.5,1.5s0.7,0.6 1.2,0.6c0.4,0 0.7,-0.1 1,-0.2s0.5,-0.3 0.8,-0.5l0.5,0.8c-0.2,0.2 -0.5,0.4 -0.9,0.6s-0.9,0.3 -1.4,0.3zm-0.2,-5.7c-0.4,0 -0.7,0.2 -1,0.5s-0.4,0.7 -0.5,1.2l0,0l2.9,0l0,-0.2c0,-0.5 -0.1,-0.8 -0.4,-1.1s-0.5,-0.4 -1,-0.4z" id="svg_140"/>
<path class="st42" d="m441.5,126.3c-0.2,0.3 -0.5,0.5 -0.8,0.7s-0.6,0.2 -1,0.2c-0.8,0 -1.4,-0.3 -1.8,-0.8s-0.7,-1.3 -0.7,-2.2l0,-0.2c0,-1 0.2,-1.8 0.7,-2.5s1,-0.9 1.8,-0.9c0.4,0 0.7,0.1 1,0.2s0.5,0.3 0.7,0.6l0,-2.6l-1,-0.2l0,-0.7l1,0l1.2,0l0,8.2l1,0.2l0,0.7l-2,0l-0.1,-0.7zm-3.1,-2.2c0,0.6 0.1,1.1 0.4,1.5s0.7,0.6 1.2,0.6c0.3,0 0.6,-0.1 0.9,-0.2s0.4,-0.4 0.6,-0.7l0,-2.9c-0.1,-0.3 -0.3,-0.5 -0.6,-0.6s-0.5,-0.2 -0.9,-0.2c-0.6,0 -1,0.2 -1.2,0.7s-0.4,1.1 -0.4,1.8l0,0z" id="svg_141"/>
<path class="st42" d="m451.5,127c0,-0.2 -0.1,-0.3 -0.1,-0.5s0,-0.3 0,-0.4c-0.2,0.3 -0.5,0.5 -0.8,0.7s-0.7,0.3 -1.1,0.3c-0.7,0 -1.2,-0.2 -1.5,-0.5s-0.5,-0.8 -0.5,-1.4c0,-0.6 0.2,-1.1 0.7,-1.4s1.2,-0.5 2,-0.5l1.2,0l0,-0.7c0,-0.4 -0.1,-0.7 -0.4,-0.9s-0.6,-0.3 -1,-0.3c-0.3,0 -0.5,0 -0.8,0.1s-0.4,0.2 -0.5,0.3l-0.1,0.7l-0.9,0l0,-1.2c0.3,-0.2 0.6,-0.4 1,-0.6s0.9,-0.2 1.3,-0.2c0.7,0 1.3,0.2 1.7,0.6s0.7,0.9 0.7,1.6l0,3.1c0,0.1 0,0.2 0,0.2s0,0.2 0,0.2l0.5,0.1l0,0.7l-1.4,0zm-1.8,-0.8c0.4,0 0.7,-0.1 1,-0.3s0.5,-0.4 0.7,-0.7l0,-1l-1.2,0c-0.5,0 -0.8,0.1 -1.1,0.3s-0.4,0.5 -0.4,0.8c0,0.3 0.1,0.5 0.3,0.6s0.3,0.3 0.7,0.3z" id="svg_142"/>
<path class="st42" d="m453.9,128.7l1,-0.2l0,-7l-1,-0.2l0,-0.7l1.9,0l0.1,0.8c0.2,-0.3 0.5,-0.5 0.8,-0.7s0.7,-0.2 1.1,-0.2c0.8,0 1.4,0.3 1.8,0.9s0.7,1.4 0.7,2.5l0,0.1c0,0.9 -0.2,1.7 -0.7,2.2s-1,0.8 -1.8,0.8c-0.4,0 -0.7,-0.1 -1,-0.2s-0.5,-0.3 -0.8,-0.6l0,2.2l1,0.2l0,0.7l-3.1,0l0,-0.6zm5.2,-4.7c0,-0.7 -0.1,-1.3 -0.4,-1.8s-0.7,-0.7 -1.3,-0.7c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.4 -0.6,0.6l0,3.1c0.1,0.3 0.3,0.5 0.6,0.6s0.5,0.2 0.9,0.2c0.5,0 1,-0.2 1.2,-0.6s0.4,-0.9 0.4,-1.6l0,0z" id="svg_143"/>
<path class="st42" d="m461.1,128.7l1,-0.2l0,-7l-1,-0.2l0,-0.7l1.9,0l0.1,0.8c0.2,-0.3 0.5,-0.5 0.8,-0.7s0.7,-0.2 1.1,-0.2c0.8,0 1.4,0.3 1.8,0.9s0.7,1.4 0.7,2.5l0,0.1c0,0.9 -0.2,1.7 -0.7,2.2s-1,0.8 -1.8,0.8c-0.4,0 -0.7,-0.1 -1,-0.2s-0.5,-0.3 -0.8,-0.6l0,2.2l1,0.2l0,0.7l-3.1,0l0,-0.6zm5.2,-4.7c0,-0.7 -0.1,-1.3 -0.4,-1.8s-0.7,-0.7 -1.3,-0.7c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.4 -0.6,0.6l0,3.1c0.1,0.3 0.3,0.5 0.6,0.6s0.5,0.2 0.9,0.2c0.5,0 1,-0.2 1.2,-0.6s0.4,-0.9 0.4,-1.6l0,0z" id="svg_144"/>
</g>
<line class="st62" x1="360" y1="123.7" x2="150.2" y2="123.7" id="svg_145"/>
<g id="svg_146">
<path class="st42" d="m120.9,356.9l1,-0.2l0,-6.9l-1,-0.2l0,-1.2l4,0l0,1.2l-1,0.2l0,2.6l0.8,0l1.9,-2.7l-0.6,-0.1l0,-1.2l3.8,0l0,1.2l-1,0.2l-2.4,3.2l2.7,3.8l1,0.2l0,1.2l-3.8,0l0,-1.2l0.6,-0.1l-1.9,-2.9l-1.1,0l0,2.7l1,0.2l0,1.2l-4,0l0,-1.2z" id="svg_147"/>
<path class="st42" d="m135.6,357.1c-0.2,0.3 -0.5,0.6 -0.9,0.8s-0.7,0.3 -1.2,0.3c-0.8,0 -1.4,-0.2 -1.8,-0.7c-0.4,-0.5 -0.6,-1.2 -0.6,-2.3l0,-3l-0.8,-0.2l0,-1.2l0.8,0l1.9,0l0,4.3c0,0.5 0.1,0.9 0.3,1.1s0.4,0.3 0.8,0.3c0.3,0 0.6,0 0.8,-0.1s0.4,-0.2 0.5,-0.4l0,-3.9l-0.8,-0.2l0,-1.2l0.8,0l1.9,0l0,5.8l0.9,0.2l0,1.2l-2.6,0l0,-0.8z" id="svg_148"/>
<path class="st42" d="m146,354.6c0,1.1 -0.2,1.9 -0.7,2.6c-0.5,0.6 -1.2,1 -2.1,1c-0.4,0 -0.8,-0.1 -1.1,-0.3s-0.6,-0.4 -0.8,-0.8l-0.1,0.9l-1.7,0l0,-9l-1,-0.2l0,-1.2l3,0l0,3.9c0.2,-0.3 0.5,-0.5 0.7,-0.7s0.6,-0.2 1,-0.2c0.9,0 1.6,0.3 2.1,1c0.5,0.7 0.7,1.6 0.7,2.8l0,0.2zm-1.9,-0.1c0,-0.7 -0.1,-1.3 -0.3,-1.7s-0.6,-0.6 -1.1,-0.6c-0.3,0 -0.6,0.1 -0.8,0.2s-0.4,0.3 -0.5,0.5l0,3c0.1,0.2 0.3,0.4 0.5,0.5c0.2,0.1 0.5,0.2 0.8,0.2c0.5,0 0.8,-0.2 1,-0.5c0.2,-0.4 0.3,-0.9 0.3,-1.5l0,-0.1l0.1,0z" id="svg_149"/>
<path class="st42" d="m150.3,358.2c-1,0 -1.9,-0.3 -2.5,-1c-0.6,-0.7 -0.9,-1.5 -0.9,-2.5l0,-0.3c0,-1.1 0.3,-1.9 0.9,-2.6c0.6,-0.7 1.4,-1 2.4,-1c1,0 1.7,0.3 2.3,0.9c0.5,0.6 0.8,1.4 0.8,2.4l0,1.1l-4.3,0l0,0c0,0.5 0.2,0.9 0.5,1.2c0.3,0.3 0.7,0.5 1.1,0.5c0.4,0 0.8,0 1.1,-0.1s0.6,-0.2 0.9,-0.4l0.5,1.2c-0.3,0.2 -0.7,0.4 -1.2,0.6s-1,0 -1.6,0zm-0.1,-6c-0.4,0 -0.6,0.1 -0.8,0.4c-0.2,0.3 -0.3,0.6 -0.4,1.1l0,0l2.4,0l0,-0.2c0,-0.4 -0.1,-0.7 -0.3,-1c-0.3,-0.2 -0.6,-0.3 -0.9,-0.3z" id="svg_150"/>
<path class="st42" d="m154.3,356.9l0.9,-0.2l0,-4.5l-1,-0.2l0,-1.2l2.8,0l0.1,1c0.2,-0.4 0.4,-0.7 0.7,-0.9c0.3,-0.2 0.6,-0.3 0.9,-0.3c0.1,0 0.2,0 0.3,0c0.1,0 0.2,0 0.3,0.1l-0.2,1.8l-0.8,0c-0.3,0 -0.5,0.1 -0.7,0.2c-0.2,0.1 -0.3,0.3 -0.4,0.5l0,3.5l0.9,0.2l0,1.2l-3.8,0l0,-1.2z" id="svg_151"/>
<path class="st42" d="m159.7,356.9l0.9,-0.2l0,-4.5l-1,-0.2l0,-1.2l2.8,0l0.1,1c0.2,-0.4 0.5,-0.7 0.9,-0.9s0.7,-0.3 1.2,-0.3c0.7,0 1.3,0.2 1.7,0.7c0.4,0.5 0.6,1.2 0.6,2.1l0,3.1l0.9,0.2l0,1.2l-3.7,0l0,-1.2l0.8,-0.2l0,-3.1c0,-0.5 -0.1,-0.8 -0.3,-1c-0.2,-0.2 -0.5,-0.3 -0.9,-0.3c-0.3,0 -0.5,0.1 -0.7,0.2c-0.2,0.1 -0.4,0.3 -0.5,0.4l0,3.9l0.8,0.2l0,1.2l-3.7,0l0,-1.1l0.1,0z" id="svg_152"/>
<path class="st42" d="m171.9,358.2c-1,0 -1.9,-0.3 -2.5,-1c-0.6,-0.7 -0.9,-1.5 -0.9,-2.5l0,-0.3c0,-1.1 0.3,-1.9 0.9,-2.6c0.6,-0.7 1.4,-1 2.4,-1c1,0 1.7,0.3 2.3,0.9c0.5,0.6 0.8,1.4 0.8,2.4l0,1.1l-4.3,0l0,0c0,0.5 0.2,0.9 0.5,1.2c0.3,0.3 0.7,0.5 1.1,0.5c0.4,0 0.8,0 1.1,-0.1s0.6,-0.2 0.9,-0.4l0.5,1.2c-0.3,0.2 -0.7,0.4 -1.2,0.6s-1.1,0 -1.6,0zm-0.2,-6c-0.4,0 -0.6,0.1 -0.8,0.4c-0.2,0.3 -0.3,0.6 -0.4,1.1l0,0l2.4,0l0,-0.2c0,-0.4 -0.1,-0.7 -0.3,-1c-0.2,-0.2 -0.5,-0.3 -0.9,-0.3z" id="svg_153"/>
<path class="st42" d="m178.5,349.1l0,1.8l1.3,0l0,1.4l-1.3,0l0,3.7c0,0.3 0.1,0.5 0.2,0.6c0.1,0.1 0.3,0.2 0.5,0.2c0.1,0 0.2,0 0.3,0c0.1,0 0.2,0 0.3,-0.1l0.2,1.4c-0.2,0.1 -0.4,0.1 -0.6,0.1c-0.2,0 -0.4,0 -0.7,0c-0.7,0 -1.2,-0.2 -1.5,-0.6c-0.4,-0.4 -0.5,-0.9 -0.5,-1.7l0,-3.7l-1.1,0l0,-1.4l1.1,0l0,-1.8l1.8,0l0,0.1z" id="svg_154"/>
<path class="st42" d="m184.2,358.2c-1,0 -1.9,-0.3 -2.5,-1c-0.6,-0.7 -0.9,-1.5 -0.9,-2.5l0,-0.3c0,-1.1 0.3,-1.9 0.9,-2.6c0.6,-0.7 1.4,-1 2.4,-1c1,0 1.7,0.3 2.3,0.9c0.5,0.6 0.8,1.4 0.8,2.4l0,1.1l-4.3,0l0,0c0,0.5 0.2,0.9 0.5,1.2c0.3,0.3 0.7,0.5 1.1,0.5c0.4,0 0.8,0 1.1,-0.1s0.6,-0.2 0.9,-0.4l0.5,1.2c-0.3,0.2 -0.7,0.4 -1.2,0.6s-1,0 -1.6,0zm-0.2,-6c-0.4,0 -0.6,0.1 -0.8,0.4c-0.2,0.3 -0.3,0.6 -0.4,1.1l0,0l2.4,0l0,-0.2c0,-0.4 -0.1,-0.7 -0.3,-1c-0.2,-0.2 -0.5,-0.3 -0.9,-0.3z" id="svg_155"/>
<path class="st42" d="m193.69375,353.3l-1.3,0l-0.2,-0.9c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3c-0.2,-0.1 -0.4,-0.1 -0.7,-0.1c-0.3,0 -0.6,0.1 -0.8,0.2c-0.2,0.2 -0.3,0.3 -0.3,0.6c0,0.2 0.1,0.4 0.3,0.5s0.6,0.3 1.1,0.4c0.9,0.2 1.5,0.4 2,0.8s0.6,0.8 0.6,1.4c0,0.6 -0.3,1.2 -0.8,1.6c-0.6,0.4 -1.3,0.6 -2.2,0.6c-0.6,0 -1.1,-0.1 -1.5,-0.2c-0.5,-0.2 -0.9,-0.4 -1.2,-0.7l0,-1.6l1.4,0l0.3,0.9c0.1,0.1 0.3,0.2 0.5,0.2c0.2,0 0.4,0.1 0.6,0.1c0.4,0 0.7,-0.1 0.9,-0.2s0.3,-0.3 0.3,-0.6c0,-0.2 -0.1,-0.4 -0.3,-0.6s-0.6,-0.3 -1.1,-0.4c-0.8,-0.2 -1.5,-0.4 -1.9,-0.8s-0.6,-0.8 -0.6,-1.4c0,-0.6 0.2,-1.1 0.7,-1.6s1.2,-0.7 2.1,-0.7c0.6,0 1.1,0.1 1.6,0.2s0.9,0.3 1.2,0.6l-0.2,2z" id="svg_157" fill="black"/>
<path class="st42" d="m211.9,351.6l-1.4,0l-0.2,-1.3c-0.2,-0.2 -0.4,-0.3 -0.7,-0.5s-0.6,-0.2 -1,-0.2c-0.8,0 -1.5,0.3 -1.9,0.9c-0.5,0.6 -0.7,1.4 -0.7,2.4l0,0.3c0,1 0.2,1.8 0.7,2.4c0.5,0.6 1.1,0.9 1.9,0.9c0.4,0 0.7,-0.1 1,-0.2c0.3,-0.1 0.6,-0.3 0.7,-0.5l0.2,-1.3l1.4,0l0,1.9c-0.4,0.5 -0.9,0.8 -1.5,1.1c-0.6,0.3 -1.3,0.4 -2,0.4c-1.3,0 -2.4,-0.4 -3.2,-1.3s-1.2,-2.1 -1.2,-3.5l0,-0.1c0,-1.4 0.4,-2.6 1.2,-3.5c0.8,-0.9 1.9,-1.4 3.2,-1.4c0.7,0 1.4,0.1 2,0.4c0.6,0.3 1.1,0.6 1.5,1.1l0,2z" id="svg_158"/>
<path class="st42" d="m212.6,348.8l0,-1.2l3,0l0,9l0.9,0.2l0,1.2l-3.8,0l0,-1.2l0.9,-0.2l0,-7.6l-1,-0.2z" id="svg_159"/>
<path class="st42" d="m222.2,357.1c-0.2,0.3 -0.5,0.6 -0.9,0.8s-0.7,0.3 -1.2,0.3c-0.8,0 -1.4,-0.2 -1.8,-0.7c-0.4,-0.5 -0.6,-1.2 -0.6,-2.3l0,-3l-0.7,-0.2l0,-1.2l0.8,0l1.9,0l0,4.3c0,0.5 0.1,0.9 0.3,1.1s0.4,0.3 0.8,0.3c0.3,0 0.6,0 0.8,-0.1s0.4,-0.2 0.5,-0.4l0,-3.9l-0.8,-0.2l0,-1.2l0.8,0l1.9,0l0,5.8l0.9,0.2l0,1.2l-2.6,0l-0.1,-0.8z" id="svg_160"/>
<path class="st42" d="m231.5,353.3l-1.3,0l-0.2,-0.9c-0.1,-0.1 -0.3,-0.2 -0.5,-0.3c-0.2,-0.1 -0.4,-0.1 -0.7,-0.1c-0.3,0 -0.6,0.1 -0.8,0.2c-0.2,0.2 -0.3,0.3 -0.3,0.6c0,0.2 0.1,0.4 0.3,0.5s0.6,0.3 1.1,0.4c0.9,0.2 1.5,0.4 2,0.8s0.6,0.8 0.6,1.4c0,0.6 -0.3,1.2 -0.8,1.6c-0.6,0.4 -1.3,0.6 -2.2,0.6c-0.6,0 -1.1,-0.1 -1.5,-0.2c-0.5,-0.2 -0.9,-0.4 -1.2,-0.7l0,-1.6l1.4,0l0.3,0.9c0.1,0.1 0.3,0.2 0.5,0.2c0.2,0 0.4,0.1 0.6,0.1c0.4,0 0.7,-0.1 0.9,-0.2s0.3,-0.3 0.3,-0.6c0,-0.2 -0.1,-0.4 -0.3,-0.6s-0.6,-0.3 -1.1,-0.4c-0.8,-0.2 -1.5,-0.4 -1.9,-0.8s-0.6,-0.8 -0.6,-1.4c0,-0.6 0.2,-1.1 0.7,-1.6s1.2,-0.7 2.1,-0.7c0.6,0 1.1,0.1 1.6,0.2s0.9,0.3 1.2,0.6l-0.2,2z" id="svg_161"/>
<path class="st42" d="m235.5,349.1l0,1.8l1.3,0l0,1.4l-1.3,0l0,3.7c0,0.3 0.1,0.5 0.2,0.6c0.1,0.1 0.3,0.2 0.5,0.2c0.1,0 0.2,0 0.3,0c0.1,0 0.2,0 0.3,-0.1l0.2,1.4c-0.2,0.1 -0.4,0.1 -0.6,0.1c-0.2,0 -0.4,0 -0.7,0c-0.7,0 -1.2,-0.2 -1.5,-0.6c-0.4,-0.4 -0.5,-0.9 -0.5,-1.7l0,-3.7l-1.1,0l0,-1.4l1.1,0l0,-1.8l1.8,0l0,0.1z" id="svg_162"/>
<path class="st42" d="m241.2,358.2c-1,0 -1.9,-0.3 -2.5,-1c-0.6,-0.7 -0.9,-1.5 -0.9,-2.5l0,-0.3c0,-1.1 0.3,-1.9 0.9,-2.6c0.6,-0.7 1.4,-1 2.4,-1c1,0 1.7,0.3 2.3,0.9c0.5,0.6 0.8,1.4 0.8,2.4l0,1.1l-4.3,0l0,0c0,0.5 0.2,0.9 0.5,1.2c0.3,0.3 0.7,0.5 1.1,0.5c0.4,0 0.8,0 1.1,-0.1s0.6,-0.2 0.9,-0.4l0.5,1.2c-0.3,0.2 -0.7,0.4 -1.2,0.6s-1,0 -1.6,0zm-0.2,-6c-0.4,0 -0.6,0.1 -0.8,0.4c-0.2,0.3 -0.3,0.6 -0.4,1.1l0,0l2.4,0l0,-0.2c0,-0.4 -0.1,-0.7 -0.3,-1c-0.2,-0.2 -0.5,-0.3 -0.9,-0.3z" id="svg_163"/>
<path class="st42" d="m245.1,356.9l0.9,-0.2l0,-4.5l-1,-0.2l0,-1.2l2.8,0l0.1,1c0.2,-0.4 0.4,-0.7 0.7,-0.9c0.3,-0.2 0.6,-0.3 0.9,-0.3c0.1,0 0.2,0 0.3,0c0.1,0 0.2,0 0.3,0.1l-0.2,1.8l-0.8,0c-0.3,0 -0.5,0.1 -0.7,0.2c-0.2,0.1 -0.3,0.3 -0.4,0.5l0,3.5l0.9,0.2l0,1.2l-3.8,0l0,-1.2z" id="svg_164"/>
</g>
</g>
<g id="Layer_14"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 32 KiB

@@ -148,7 +148,7 @@ kubectl apply -f ./content/en/examples/application/guestbook/frontend-deployment
### Creating the Frontend Service
The `mongo` Services you applied is only accessible within the Kubernetes cluster because the default type for a Service is [ClusterIP](/docs/concepts/services-networking/service/#publishing-services---service-types). `ClusterIP` provides a single IP address for the set of Pods the Service is pointing to. This IP address is accessible only within the cluster.
The `mongo` Services you applied is only accessible within the Kubernetes cluster because the default type for a Service is [ClusterIP](/docs/concepts/services-networking/service/#publishing-services-service-types). `ClusterIP` provides a single IP address for the set of Pods the Service is pointing to. This IP address is accessible only within the cluster.
If you want guests to be able to access your guestbook, you must configure the frontend Service to be externally visible, so a client can request the Service from outside the Kubernetes cluster. However a Kubernetes user you can use `kubectl port-forward` to access the service even though it uses a `ClusterIP`.