kubernetes 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0ddd0473607bd2d2156094bac09c6fe20e45c13
4
- data.tar.gz: e099266b4c4ab18e148958c6deed8d48bb30fe9b
3
+ metadata.gz: 539462ebb2116c4c87a9c4b1ae6b37365d31f228
4
+ data.tar.gz: 6df6c8c7febba33265b4b581c846c92744709d0d
5
5
  SHA512:
6
- metadata.gz: 2ebc86e727d3aaa8e261aaaf4d3e4c59b4116e221e3ec9fd05072589d8e8224d8303ca050df864f249e6b885fcafc028e98373ac49dda4142bcadcb32162935a
7
- data.tar.gz: 478322427cf293073197f582e44f0b12dbb44ef2fcc6891ce4005cc42d65ca9a8864d59dfa05a21b2ad0ea38eb305428ec0c08d8ff655267ca3f76f9fb04034f
6
+ metadata.gz: 0eedf3fdc292d4387cd983cb92d7a7f5514a8bdc25781937800e9a7a8e2322b2295e5665908c9fa58544064828fa2325eec9c18f693c8b91e8e38e23266fabd9
7
+ data.tar.gz: 9d8326d0af203cbcc9b3df93030a33e166a49c0c3afa4c8d4a508b2b3fba36cc410636e9876379a561fd9f49dc7f95a46b6a1b163a58df8a1d842e84cfe46e89
data/Makefile ADDED
@@ -0,0 +1,53 @@
1
+ # Old-skool build tools.
2
+ #
3
+ # Targets (see each target for more information):
4
+ # all: Build code.
5
+ # check: Run tests.
6
+ # test: Run tests.
7
+ # clean: Clean up.
8
+
9
+ OUT_DIR = _output
10
+ GODEPS_PKG_DIR = Godeps/_workspace/pkg
11
+
12
+ export GOFLAGS
13
+
14
+ # Build code.
15
+ #
16
+ # Args:
17
+ # WHAT: Directory names to build. If any of these directories has a 'main'
18
+ # package, the build will produce executable files under $(OUT_DIR)/go/bin.
19
+ # If not specified, "everything" will be built.
20
+ # GOFLAGS: Extra flags to pass to 'go' when building.
21
+ #
22
+ # Example:
23
+ # make
24
+ # make all
25
+ # make all WHAT=cmd/kubelet GOFLAGS=-v
26
+ all:
27
+ hack/build-go.sh $(WHAT)
28
+ .PHONY: all
29
+
30
+ # Build and run tests.
31
+ #
32
+ # Args:
33
+ # WHAT: Directory names to test. All *_test.go files under these
34
+ # directories will be run. If not specified, "everything" will be tested.
35
+ # TESTS: Same as WHAT.
36
+ # GOFLAGS: Extra flags to pass to 'go' when building.
37
+ #
38
+ # Example:
39
+ # make check
40
+ # make test
41
+ # make check WHAT=pkg/kubelet GOFLAGS=-v
42
+ check test:
43
+ hack/test-go.sh $(WHAT) $(TESTS)
44
+ .PHONY: check test
45
+
46
+ # Remove all build artifacts.
47
+ #
48
+ # Example:
49
+ # make clean
50
+ clean:
51
+ rm -rf $(OUT_DIR)
52
+ rm -rf $(GODEPS_PKG_DIR)
53
+ .PHONY: clean
data/docs/access.md ADDED
@@ -0,0 +1,252 @@
1
+ # K8s Identity and Access Management Sketch
2
+
3
+ This document suggests a direction for identity and access management in the Kubernetes system.
4
+
5
+
6
+ ## Background
7
+
8
+ High level goals are:
9
+ - Have a plan for how identity, authentication, and authorization will fit in to the API.
10
+ - Have a plan for partitioning resources within a cluster between independent organizational units.
11
+ - Ease integration with existing enterprise and hosted scenarios.
12
+
13
+ ### Actors
14
+ Each of these can act as normal users or attackers.
15
+ - External Users: People who are accessing applications running on K8s (e.g. a web site served by webserver running in a container on K8s), but who do not have K8s API access.
16
+ - K8s Users : People who access the K8s API (e.g. create K8s API objects like Pods)
17
+ - K8s Project Admins: People who manage access for some K8s Users
18
+ - K8s Cluster Admins: People who control the machines, networks, or binaries that comprise a K8s cluster.
19
+ - K8s Admin means K8s Cluster Admins and K8s Project Admins taken together.
20
+
21
+ ### Threats
22
+ Both intentional attacks and accidental use of privilege are concerns.
23
+
24
+ For both cases it may be useful to think about these categories differently:
25
+ - Application Path - attack by sending network messages from the internet to the IP/port of any application running on K8s. May exploit weakness in application or misconfiguration of K8s.
26
+ - K8s API Path - attack by sending network messages to any K8s API endpoint.
27
+ - Insider Path - attack on K8s system components. Attacker may have privileged access to networks, machines or K8s software and data. Software errors in K8s system components and administrator error are some types of threat in this category.
28
+
29
+ This document is primarily concerned with K8s API paths, and secondarily with Internal paths. The Application path also needs to be secure, but is not the focus of this document.
30
+
31
+ ### Assets to protect
32
+
33
+ External User assets:
34
+ - Personal information like private messages, or images uploaded by External Users
35
+ - web server logs
36
+
37
+ K8s User assets:
38
+ - External User assets of each K8s User
39
+ - things private to the K8s app, like:
40
+ - credentials for accessing other services (docker private repos, storage services, facebook, etc)
41
+ - SSL certificates for web servers
42
+ - proprietary data and code
43
+
44
+ K8s Cluster assets:
45
+ - Assets of each K8s User
46
+ - Machine Certificates or secrets.
47
+ - The value of K8s cluster computing resources (cpu, memory, etc).
48
+
49
+ This document is primarily about protecting K8s User assets and K8s cluster assets from other K8s Users and K8s Project and Cluster Admins.
50
+
51
+ ### Usage environments
52
+ Cluster in Small organization:
53
+ - K8s Admins may be the same people as K8s Users.
54
+ - few K8s Admins.
55
+ - prefer ease of use to fine-grained access control/precise accounting, etc.
56
+ - Product requirement that it be easy for potential K8s Cluster Admin to try out setting up a simple cluster.
57
+
58
+ Cluster in Large organization:
59
+ - K8s Admins typically distinct people from K8s Users. May need to divide K8s Cluster Admin access by roles.
60
+ - K8s Users need to be protected from each other.
61
+ - Auditing of K8s User and K8s Admin actions important.
62
+ - flexible accurate usage accounting and resource controls important.
63
+ - Lots of automated access to APIs.
64
+ - Need to integrate with existing enterprise directory, authentication, accounting, auditing, and security policy infrastructure.
65
+
66
+ Org-run cluster:
67
+ - organization that runs K8s master components is same as the org that runs apps on K8s.
68
+ - Minions may be on-premises VMs or physical machines; Cloud VMs; or a mix.
69
+
70
+ Hosted cluster:
71
+ - Offering K8s API as a service, or offering a Paas or Saas built on K8s
72
+ - May already offer web services, and need to integrate with existing customer account concept, and existing authentication, accounting, auditing, and security policy infrastructure.
73
+ - May want to leverage K8s User accounts and accounting to manage their User accounts (not a priority to support this use case.)
74
+ - Precise and accurate accounting of resources needed. Resource controls needed for hard limits (Users given limited slice of data) and soft limits (Users can grow up to some limit and then be expanded).
75
+
76
+ K8s ecosystem services:
77
+ - There may be companies that want to offer their existing services (Build, CI, A/B-test, release automation, etc) for use with K8s. There should be some story for this case.
78
+
79
+ Pods configs should be largely portable between Org-run and hosted configurations.
80
+
81
+
82
+ # Design
83
+ Related discussion:
84
+ - https://github.com/GoogleCloudPlatform/kubernetes/issues/442
85
+ - https://github.com/GoogleCloudPlatform/kubernetes/issues/443
86
+
87
+ This doc describes two security profiles:
88
+ - Simple profile: like single-user mode. Make it easy to evaluate K8s without lots of configuring accounts and policies. Protects from unauthorized users, but does not partition authorized users.
89
+ - Enterprise profile: Provide mechanisms needed for large numbers of users. Defence in depth. Should integrate with existing enterprise security infrastructure.
90
+
91
+ K8s distribution should include templates of config, and documentation, for simple and enterprise profiles. System should be flexible enough for knowledgeable users to create intermediate profiles, but K8s developers should only reason about those two Profiles, not a matrix.
92
+
93
+ Features in this doc are divided into "Initial Feature", and "Improvements". Initial features would be candidates for version 1.00.
94
+
95
+ ## Identity
96
+ ###userAccount
97
+ K8s will have a `userAccount` API object.
98
+ - `userAccount` has a UID which is immutable. This is used to associate users with objects and to record actions in audit logs.
99
+ - `userAccount` has a name which is a string and human readable and unique among userAccounts. It is used to refer to users in Policies, to ensure that the Policies are human readable. It can be changed only when there are no Policy objects or other objects which refer to that name. An email address is a suggested format for this field.
100
+ - `userAccount` is not related to the unix username of processes in Pods created by that userAccount.
101
+ - `userAccount` API objects can have labels
102
+
103
+ The system may associate one or more Authentication Methods with a
104
+ `userAccount` (but they are not formally part of the userAccount object.)
105
+ In a simple deployment, the authentication method for a
106
+ user might be an authentication token which is verified by a K8s server. In a
107
+ more complex deployment, the authentication might be delegated to
108
+ another system which is trusted by the K8s API to authenticate users, but where
109
+ the authentication details are unknown to K8s.
110
+
111
+ Initial Features:
112
+ - there is no superuser `userAccount`
113
+ - `userAccount` objects are statically populated in the K8s API store by reading a config file. Only a K8s Cluster Admin can do this.
114
+ - `userAccount` can have a default `namespace`. If API call does not specify a `namespace`, the default `namespace` for that caller is assumed.
115
+ - `userAccount` is global. A single human with access to multiple namespaces is recommended to only have one userAccount.
116
+
117
+ Improvements:
118
+ - Make `userAccount` part of a separate API group from core K8s objects like `pod`. Facilitates plugging in alternate Access Management.
119
+
120
+ Simple Profile:
121
+ - single `userAccount`, used by all K8s Users and Project Admins. One access token shared by all.
122
+
123
+ Enterprise Profile:
124
+ - every human user has own `userAccount`.
125
+ - `userAccount`s have labels that indicate both membership in groups, and ability to act in certain roles.
126
+ - each service using the API has own `userAccount` too. (e.g. `scheduler`, `repcontroller`)
127
+ - automated jobs to denormalize the ldap group info into the local system list of users into the K8s userAccount file.
128
+
129
+ ###Unix accounts
130
+ A `userAccount` is not a Unix user account. The fact that a pod is started by a `userAccount` does not mean that the processes in that pod's containers run as a Unix user with a corresponding name or identity.
131
+
132
+ Initially:
133
+ - The unix accounts available in a container, and used by the processes running in a container are those that are provided by the combination of the base operating system and the Docker manifest.
134
+ - Kubernetes doesn't enforce any relation between `userAccount` and unix accounts.
135
+
136
+ Improvements:
137
+ - Kubelet allocates disjoint blocks of root-namespace uids for each container. This may provide some defense-in-depth against container escapes. (https://github.com/docker/docker/pull/4572)
138
+ - requires docker to integrate user namespace support, and deciding what getpwnam() does for these uids.
139
+ - any features that help users avoid use of privileged containers (https://github.com/GoogleCloudPlatform/kubernetes/issues/391)
140
+
141
+ ###Namespaces
142
+ K8s will have a have a `namespace` API object. It is similar to a Google Compute Engine `project`. It provides a namespace for objects created by a group of people co-operating together, preventing name collisions with non-cooperating groups. It also serves as a reference point for authorization policies.
143
+
144
+ Namespaces are described in [namespace.md](https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/namespaces.md),
145
+ or will be once [#1114](https://github.com/GoogleCloudPlatform/kubernetes/pull/1114) is merged.
146
+
147
+ In the Enterprise Profile:
148
+ - a `userAccount` may have permission to access several `namespace`s.
149
+
150
+ In the Simple Profile:
151
+ - There is a single `namespace` used by the single user.
152
+
153
+ Namespaces versus userAccount vs Labels:
154
+ - `userAccount`s are intended for audit logging (both name and UID should be logged), and to define who has access to `namespace`s.
155
+ - `labels` (see docs/labels.md) should be used to distinguish pods, users, and other objects that cooperate towards a common goal but are different in some way, such as version, or responsibilities.
156
+ - `namespace`s prevent name collisions between uncoordinated groups of people, and provide a place to attach common policies for co-operating groups of people.
157
+
158
+
159
+ ## Authentication
160
+
161
+ Goals for K8s authentication:
162
+ - Include a built-in authentication system with no configuration required to use in single-user mode, and little configuration required to add several user accounts, and no https proxy required.
163
+ - Allow for authentication to be handled by a system external to Kubernetes, to allow integration with existing to enterprise authorization systems. The kubernetes namespace itself should avoid taking contributions of multiple authorization schemes. Instead, a trusted proxy in front of the apiserver can be used to authenticate users.
164
+ - For organizations whose security requirements only allow FIPS compliant implementations (e.g. apache) for authentication.
165
+ - So the proxy can terminate SSL, and isolate the CA-signed certificate from less trusted, higher-touch APIserver.
166
+ - For organizations that already have existing SaaS web services (e.g. storage, VMs) and want a common authentication portal.
167
+ - Avoid mixing authentication and authorization, so that authorization policies be centrally managed, and to allow changes in authentication methods without affecting authorization code.
168
+
169
+ Initially:
170
+ - Tokens used to authenticate a user.
171
+ - Long lived tokens identify a particular `userAccount`.
172
+ - Administrator utility generates tokens at cluster setup.
173
+ - OAuth2.0 Bearer tokens protocol, http://tools.ietf.org/html/rfc6750
174
+ - No scopes for tokens. Authorization happens in the API server
175
+ - Tokens dynamically generated by apiserver to identify pods which are making API calls.
176
+ - Tokens checked in a module of the APIserver.
177
+ - Authentication in apiserver can be disabled by flag, to allow testing without authorization enabled, and to allow use of an authenticating proxy. In this mode, a query parameter or header added by the proxy will identify the caller.
178
+
179
+ Improvements:
180
+ - Refresh of tokens.
181
+ - SSH keys to access inside containers.
182
+
183
+ To be considered for subsequent versions:
184
+ - Fuller use of OAuth (http://tools.ietf.org/html/rfc6749)
185
+ - Scoped tokens.
186
+ - Tokens that are bound to the channel between the client and the api server
187
+ - http://www.ietf.org/proceedings/90/slides/slides-90-uta-0.pdf
188
+ - http://www.browserauth.net
189
+
190
+
191
+ ## Authorization
192
+
193
+ K8s authorization should:
194
+ - Allow for a range of maturity levels, from single-user for those test driving the system, to integration with existing to enterprise authorization systems.
195
+ - Allow for centralized management of users and policies. In some organizations, this will mean that the definition of users and access policies needs to reside on a system other than k8s and encompass other web services (such as a storage service).
196
+ - Allow processes running in K8s Pods to take on identity, and to allow narrow scoping of permissions for those identities in order to limit damage from software faults.
197
+ - Have Authorization Policies exposed as API objects so that a single config file can create or delete Pods, Controllers, Services, and the identities and policies for those Pods and Controllers.
198
+ - Be separate as much as practical from Authentication, to allow Authentication methods to change over time and space, without impacting Authorization policies.
199
+
200
+ K8s will implement a relatively simple
201
+ [Attribute-Based Access Control][http://en.wikipedia.org/wiki/Attribute_Based_Access_Control] model.
202
+ The model will be described in more detail in a forthcoming document. The model
203
+ - Be less complex than XACML
204
+ - Be easily recognizable to those familiar with Amazon IAM Policies.
205
+ - Have a subset/aliases/defaults which allow it to be used in a way comfortable to those users more familiar with Role-Based Access Control.
206
+
207
+ Authorization policy is set by creating a set of Policy objects.
208
+
209
+ The API Server will be the Enforcement Point for Policy. For each API call that it receives, it will construct the Attributes needed to evaluate the policy (what user is making the call, what resource they are accessing, what they are trying to do that resource, etc) and pass those attribytes to a Decision Point. The Decision Point code evaluates the Attributes against all the Policies and allows or denys the API call. The system will be modular enough that the Decision Point code can either be linked into the APIserver binary, or be another service that the apiserver calls for each Decision (with appropriate time-limited caching as needed for performance).
210
+
211
+ Policy objects may be applicable only to a single namespace or to all namespaces; K8s Project Admins would be able to create those as needed. Other Policy objects may be applicable to all namespaces; a K8s Cluster Admin might create those in order to authorize a new type of controller to be used by all namespaces, or to make a K8s User into a K8s Project Admin.)
212
+
213
+
214
+ ## Accounting
215
+
216
+ The API should have a `quota` concept (see (https://github.com/GoogleCloudPlatform/kubernetes/issues/442
217
+ ). A quota object relates a namespace (and optionally a label selector) to a maximum quantity of resources that may be used (see resources.md).
218
+
219
+ Initially:
220
+ - a `quota` object is immutable.
221
+ - for hosted K8s systems that do billing, Project is recommended level for billing accounts.
222
+ - Every object that consumes resources should have a `namespace` so that Resource usage stats are roll-up-able to `namespace`.
223
+ - K8s Cluster Admin sets quota objects by writing a config file.
224
+
225
+ Improvements:
226
+ - allow one namespace to charge the quota for one or more other namespaces. This would be controlled by a policy which allows changing a billing_namespace= label on an object.
227
+ - allow quota to be set by namespace owners for (namespace x label) combinations (e.g. let "webserver" namespace use 100 cores, but to prevent accidents, don't allow "webserver" namespace and "instance=test" use more than 10 cores.
228
+ - tools to help write consistent quota config files based on number of minions, historical namespace usages, QoS needs, etc.
229
+ - way for K8s Cluster Admin to incrementally adjust Quota objects.
230
+
231
+ Simple profile:
232
+ - a single `namespace` with infinite resource limits.
233
+
234
+ Enterprise profile:
235
+ - multiple namespaces each with their own limits.
236
+
237
+ Issues:
238
+ - need for locking or "eventual consistency" when multiple apiserver goroutines are accessing the object store and handling pod creations.
239
+
240
+
241
+ ## Audit Logging
242
+
243
+ API actions can be logged.
244
+
245
+ Initial implementation:
246
+ - All API calls logged to nginx logs.
247
+
248
+ Improvements:
249
+ - API server does logging instead.
250
+ - Policies to drop logging for high rate trusted API calls, or by users performing audit or other sensitive functions.
251
+
252
+
Binary file
@@ -0,0 +1,523 @@
1
+ <?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/PR-SVG-20010719/DTD/svg10.dtd">
3
+ <svg width="68cm" height="53cm" viewBox="-55 -75 1348 1045" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
4
+ <g>
5
+ <g>
6
+ <rect style="fill: #ffffff" x="662" y="587.938" width="630" height="381"/>
7
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="662" y="587.938" width="630" height="381"/>
8
+ </g>
9
+ <g>
10
+ <rect style="fill: #ffffff" x="689" y="651.938" width="580" height="292"/>
11
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="689" y="651.938" width="580" height="292"/>
12
+ </g>
13
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="687" y="619.938">
14
+ <tspan x="687" y="619.938">Minion</tspan>
15
+ </text>
16
+ <g>
17
+ <rect style="fill: #ffffff" x="721.2" y="698.938" width="69.6" height="38"/>
18
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="721.2" y="698.938" width="69.6" height="38"/>
19
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="756" y="721.838">
20
+ <tspan x="756" y="721.838">kubelet</tspan>
21
+ </text>
22
+ </g>
23
+ <g>
24
+ <rect style="fill: #ffffff" x="821.676" y="698.938" width="76.65" height="38"/>
25
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="821.676" y="698.938" width="76.65" height="38"/>
26
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="860.001" y="721.838">
27
+ <tspan x="860.001" y="721.838">cAdvisor</tspan>
28
+ </text>
29
+ </g>
30
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="711" y="675.938">
31
+ <tspan x="711" y="675.938">docker</tspan>
32
+ </text>
33
+ <g>
34
+ <g>
35
+ <rect style="fill: #ffffff" x="720.2" y="764.038" width="148" height="133"/>
36
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="720.2" y="764.038" width="148" height="133"/>
37
+ </g>
38
+ <g>
39
+ <rect style="fill: #ffffff" x="760.55" y="834.038" width="89.3" height="38"/>
40
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="760.55" y="834.038" width="89.3" height="38"/>
41
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="805.2" y="856.938">
42
+ <tspan x="805.2" y="856.938">container</tspan>
43
+ </text>
44
+ </g>
45
+ <g>
46
+ <rect style="fill: #ffffff" x="749.8" y="824.138" width="89.3" height="38"/>
47
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="749.8" y="824.138" width="89.3" height="38"/>
48
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="794.45" y="847.038">
49
+ <tspan x="794.45" y="847.038">container</tspan>
50
+ </text>
51
+ </g>
52
+ <g>
53
+ <rect style="fill: #ffffff" x="739.4" y="814.238" width="89.3" height="38"/>
54
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="739.4" y="814.238" width="89.3" height="38"/>
55
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="784.05" y="837.138">
56
+ <tspan x="784.05" y="837.138">container</tspan>
57
+ </text>
58
+ </g>
59
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="794.2" y="830.538">
60
+ <tspan x="794.2" y="830.538"></tspan>
61
+ </text>
62
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="742.2" y="790.538">
63
+ <tspan x="742.2" y="790.538">Pod</tspan>
64
+ </text>
65
+ </g>
66
+ <g>
67
+ <g>
68
+ <rect style="fill: #ffffff" x="1085.6" y="764.038" width="148" height="133"/>
69
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1085.6" y="764.038" width="148" height="133"/>
70
+ </g>
71
+ <g>
72
+ <rect style="fill: #ffffff" x="1125.95" y="834.038" width="89.3" height="38"/>
73
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1125.95" y="834.038" width="89.3" height="38"/>
74
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="1170.6" y="856.938">
75
+ <tspan x="1170.6" y="856.938">container</tspan>
76
+ </text>
77
+ </g>
78
+ <g>
79
+ <rect style="fill: #ffffff" x="1115.2" y="824.138" width="89.3" height="38"/>
80
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1115.2" y="824.138" width="89.3" height="38"/>
81
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="1159.85" y="847.038">
82
+ <tspan x="1159.85" y="847.038">container</tspan>
83
+ </text>
84
+ </g>
85
+ <g>
86
+ <rect style="fill: #ffffff" x="1104.8" y="814.238" width="89.3" height="38"/>
87
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1104.8" y="814.238" width="89.3" height="38"/>
88
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="1149.45" y="837.138">
89
+ <tspan x="1149.45" y="837.138">container</tspan>
90
+ </text>
91
+ </g>
92
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="1159.6" y="830.538">
93
+ <tspan x="1159.6" y="830.538"></tspan>
94
+ </text>
95
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="1107.6" y="790.538">
96
+ <tspan x="1107.6" y="790.538">Pod</tspan>
97
+ </text>
98
+ </g>
99
+ <g>
100
+ <g>
101
+ <rect style="fill: #ffffff" x="902.9" y="764.038" width="148" height="133"/>
102
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="902.9" y="764.038" width="148" height="133"/>
103
+ </g>
104
+ <g>
105
+ <rect style="fill: #ffffff" x="943.25" y="834.038" width="89.3" height="38"/>
106
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="943.25" y="834.038" width="89.3" height="38"/>
107
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="987.9" y="856.938">
108
+ <tspan x="987.9" y="856.938">container</tspan>
109
+ </text>
110
+ </g>
111
+ <g>
112
+ <rect style="fill: #ffffff" x="932.5" y="824.138" width="89.3" height="38"/>
113
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="932.5" y="824.138" width="89.3" height="38"/>
114
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="977.15" y="847.038">
115
+ <tspan x="977.15" y="847.038">container</tspan>
116
+ </text>
117
+ </g>
118
+ <g>
119
+ <rect style="fill: #ffffff" x="922.1" y="814.238" width="89.3" height="38"/>
120
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="922.1" y="814.238" width="89.3" height="38"/>
121
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="966.75" y="837.138">
122
+ <tspan x="966.75" y="837.138">container</tspan>
123
+ </text>
124
+ </g>
125
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="976.9" y="830.538">
126
+ <tspan x="976.9" y="830.538"></tspan>
127
+ </text>
128
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="924.9" y="790.538">
129
+ <tspan x="924.9" y="790.538">Pod</tspan>
130
+ </text>
131
+ </g>
132
+ <g>
133
+ <rect style="fill: #ffffff" x="924.748" y="698.938" width="57.1" height="38"/>
134
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="924.748" y="698.938" width="57.1" height="38"/>
135
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="953.298" y="721.838">
136
+ <tspan x="953.298" y="721.838">Proxy</tspan>
137
+ </text>
138
+ </g>
139
+ </g>
140
+ <g>
141
+ <rect style="fill: #ffffff" x="662" y="192" width="630" height="381"/>
142
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="662" y="192" width="630" height="381"/>
143
+ </g>
144
+ <g>
145
+ <rect style="fill: #ffffff" x="689" y="256" width="580" height="292"/>
146
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="689" y="256" width="580" height="292"/>
147
+ </g>
148
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="687" y="224">
149
+ <tspan x="687" y="224">Minion</tspan>
150
+ </text>
151
+ <g>
152
+ <rect style="fill: #ffffff" x="721.2" y="303" width="69.6" height="38"/>
153
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="721.2" y="303" width="69.6" height="38"/>
154
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="756" y="325.9">
155
+ <tspan x="756" y="325.9">kubelet</tspan>
156
+ </text>
157
+ </g>
158
+ <g>
159
+ <rect style="fill: #ffffff" x="821.676" y="303" width="76.65" height="38"/>
160
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="821.676" y="303" width="76.65" height="38"/>
161
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="860.001" y="325.9">
162
+ <tspan x="860.001" y="325.9">cAdvisor</tspan>
163
+ </text>
164
+ </g>
165
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="711" y="280">
166
+ <tspan x="711" y="280">docker</tspan>
167
+ </text>
168
+ <g>
169
+ <g>
170
+ <rect style="fill: #ffffff" x="720.2" y="368.1" width="148" height="133"/>
171
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="720.2" y="368.1" width="148" height="133"/>
172
+ </g>
173
+ <g>
174
+ <rect style="fill: #ffffff" x="760.55" y="438.1" width="89.3" height="38"/>
175
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="760.55" y="438.1" width="89.3" height="38"/>
176
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="805.2" y="461">
177
+ <tspan x="805.2" y="461">container</tspan>
178
+ </text>
179
+ </g>
180
+ <g>
181
+ <rect style="fill: #ffffff" x="749.8" y="428.2" width="89.3" height="38"/>
182
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="749.8" y="428.2" width="89.3" height="38"/>
183
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="794.45" y="451.1">
184
+ <tspan x="794.45" y="451.1">container</tspan>
185
+ </text>
186
+ </g>
187
+ <g>
188
+ <rect style="fill: #ffffff" x="739.4" y="418.3" width="89.3" height="38"/>
189
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="739.4" y="418.3" width="89.3" height="38"/>
190
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="784.05" y="441.2">
191
+ <tspan x="784.05" y="441.2">container</tspan>
192
+ </text>
193
+ </g>
194
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="794.2" y="434.6">
195
+ <tspan x="794.2" y="434.6"></tspan>
196
+ </text>
197
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="742.2" y="394.6">
198
+ <tspan x="742.2" y="394.6">Pod</tspan>
199
+ </text>
200
+ </g>
201
+ <g>
202
+ <g>
203
+ <rect style="fill: #ffffff" x="1085.6" y="368.1" width="148" height="133"/>
204
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1085.6" y="368.1" width="148" height="133"/>
205
+ </g>
206
+ <g>
207
+ <rect style="fill: #ffffff" x="1125.95" y="438.1" width="89.3" height="38"/>
208
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1125.95" y="438.1" width="89.3" height="38"/>
209
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="1170.6" y="461">
210
+ <tspan x="1170.6" y="461">container</tspan>
211
+ </text>
212
+ </g>
213
+ <g>
214
+ <rect style="fill: #ffffff" x="1115.2" y="428.2" width="89.3" height="38"/>
215
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1115.2" y="428.2" width="89.3" height="38"/>
216
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="1159.85" y="451.1">
217
+ <tspan x="1159.85" y="451.1">container</tspan>
218
+ </text>
219
+ </g>
220
+ <g>
221
+ <rect style="fill: #ffffff" x="1104.8" y="418.3" width="89.3" height="38"/>
222
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="1104.8" y="418.3" width="89.3" height="38"/>
223
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="1149.45" y="441.2">
224
+ <tspan x="1149.45" y="441.2">container</tspan>
225
+ </text>
226
+ </g>
227
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="1159.6" y="434.6">
228
+ <tspan x="1159.6" y="434.6"></tspan>
229
+ </text>
230
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="1107.6" y="394.6">
231
+ <tspan x="1107.6" y="394.6">Pod</tspan>
232
+ </text>
233
+ </g>
234
+ <g>
235
+ <g>
236
+ <rect style="fill: #ffffff" x="902.9" y="368.1" width="148" height="133"/>
237
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="902.9" y="368.1" width="148" height="133"/>
238
+ </g>
239
+ <g>
240
+ <rect style="fill: #ffffff" x="943.25" y="438.1" width="89.3" height="38"/>
241
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="943.25" y="438.1" width="89.3" height="38"/>
242
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="987.9" y="461">
243
+ <tspan x="987.9" y="461">container</tspan>
244
+ </text>
245
+ </g>
246
+ <g>
247
+ <rect style="fill: #ffffff" x="932.5" y="428.2" width="89.3" height="38"/>
248
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="932.5" y="428.2" width="89.3" height="38"/>
249
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="977.15" y="451.1">
250
+ <tspan x="977.15" y="451.1">container</tspan>
251
+ </text>
252
+ </g>
253
+ <g>
254
+ <rect style="fill: #ffffff" x="922.1" y="418.3" width="89.3" height="38"/>
255
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="922.1" y="418.3" width="89.3" height="38"/>
256
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="966.75" y="441.2">
257
+ <tspan x="966.75" y="441.2">container</tspan>
258
+ </text>
259
+ </g>
260
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="976.9" y="434.6">
261
+ <tspan x="976.9" y="434.6"></tspan>
262
+ </text>
263
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="924.9" y="394.6">
264
+ <tspan x="924.9" y="394.6">Pod</tspan>
265
+ </text>
266
+ </g>
267
+ <g>
268
+ <rect style="fill: #ffffff" x="924.748" y="303" width="57.1" height="38"/>
269
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="924.748" y="303" width="57.1" height="38"/>
270
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="953.298" y="325.9">
271
+ <tspan x="953.298" y="325.9">Proxy</tspan>
272
+ </text>
273
+ </g>
274
+ <g>
275
+ <rect style="fill: #ffffff" x="126.911" y="92.49" width="189.4" height="38"/>
276
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="126.911" y="92.49" width="189.4" height="38"/>
277
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="221.611" y="115.39">
278
+ <tspan x="221.611" y="115.39">kubecfg (user commands)</tspan>
279
+ </text>
280
+ </g>
281
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="142.476" y="866.282">
282
+ <tspan x="142.476" y="866.282"></tspan>
283
+ </text>
284
+ <g>
285
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 921.724,322.317 A 70.7456,70.7456 0 0 0 790.8,322"/>
286
+ <polygon style="fill: #000000" points="924.195,329.333 916.879,320.879 922.342,322.066 926.569,318.408 "/>
287
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="924.195,329.333 916.879,320.879 922.342,322.066 926.569,318.408 "/>
288
+ </g>
289
+ <g>
290
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="790.8" y1="331.5" x2="811.94" y2="331.5"/>
291
+ <polygon style="fill: #000000" points="819.44,331.5 809.44,336.5 811.94,331.5 809.44,326.5 "/>
292
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="819.44,331.5 809.44,336.5 811.94,331.5 809.44,326.5 "/>
293
+ </g>
294
+ <g>
295
+ <rect style="fill: #ffffff" x="876.576" y="75.6768" width="70.2" height="38"/>
296
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="876.576" y="75.6768" width="70.2" height="38"/>
297
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="911.676" y="98.5768">
298
+ <tspan x="911.676" y="98.5768">Firewall</tspan>
299
+ </text>
300
+ </g>
301
+ <g>
302
+ <path style="fill: #ffffff" d="M 886.242 -47.953 C 876.87,-48.2618 858.694,-41.7773 861.25,-27.8819 C 863.806,-13.9865 876.018,-10.8988 881.13,-14.9129 C 886.242,-18.9271 873.178,4.54051 898.17,10.7162 C 923.161,16.8919 935.941,7.01079 932.249,-0.0912821 C 928.557,-7.19336 954.117,16.5832 966.045,2.99658 C 977.973,-10.59 953.833,-23.5589 958.945,-21.7062 C 964.057,-19.8535 979.677,-22.3237 974.565,-45.4827 C 969.453,-68.6416 923.445,-50.7321 928.557,-54.1287 C 933.669,-57.5253 920.889,-74.5086 904.986,-71.112 C 889.082,-67.7153 887.954,-61.5516 886.25,-47.965 L 886.242,-47.953z"/>
303
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 886.242 -47.953 C 876.87,-48.2618 858.694,-41.7773 861.25,-27.8819 C 863.806,-13.9865 876.018,-10.8988 881.13,-14.9129 C 886.242,-18.9271 873.178,4.54051 898.17,10.7162 C 923.161,16.8919 935.941,7.01079 932.249,-0.0912821 C 928.557,-7.19336 954.117,16.5832 966.045,2.99658 C 977.973,-10.59 953.833,-23.5589 958.945,-21.7062 C 964.057,-19.8535 979.677,-22.3237 974.565,-45.4827 C 969.453,-68.6416 923.445,-50.7321 928.557,-54.1287 C 933.669,-57.5253 920.889,-74.5086 904.986,-71.112 C 889.082,-67.7153 887.954,-61.5516 886.25,-47.965 L 886.242,-47.953"/>
304
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="922.428" y="-23.1971">
305
+ <tspan x="922.428" y="-23.1971">Internet</tspan>
306
+ </text>
307
+ </g>
308
+ <g>
309
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="912.986" y1="12.703" x2="911.878" y2="65.9428"/>
310
+ <polygon style="fill: #000000" points="911.723,73.4412 906.932,63.3394 911.878,65.9428 916.929,63.5474 "/>
311
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="911.723,73.4412 906.932,63.3394 911.878,65.9428 916.929,63.5474 "/>
312
+ </g>
313
+ <g>
314
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="911.676" y1="113.677" x2="951.207" y2="293.491"/>
315
+ <polygon style="fill: #000000" points="952.818,300.816 945.787,292.123 951.207,293.491 955.554,289.976 "/>
316
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="952.818,300.816 945.787,292.123 951.207,293.491 955.554,289.976 "/>
317
+ </g>
318
+ <g>
319
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="939.022" y1="341" x2="803.77" y2="366.309"/>
320
+ <polygon style="fill: #000000" points="796.398,367.689 805.308,360.935 803.77,366.309 807.147,370.764 "/>
321
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="796.398,367.689 805.308,360.935 803.77,366.309 807.147,370.764 "/>
322
+ </g>
323
+ <g>
324
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="953.298" y1="341" x2="970.506" y2="360.758"/>
325
+ <polygon style="fill: #000000" points="975.431,366.414 965.093,362.157 970.506,360.758 972.634,355.589 "/>
326
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="975.431,366.414 965.093,362.157 970.506,360.758 972.634,355.589 "/>
327
+ </g>
328
+ <g>
329
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="967.572" y1="341" x2="1149.96" y2="366.739"/>
330
+ <polygon style="fill: #000000" points="1157.39,367.788 1146.79,371.341 1149.96,366.739 1148.18,361.439 "/>
331
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="1157.39,367.788 1146.79,371.341 1149.96,366.739 1148.18,361.439 "/>
332
+ </g>
333
+ <g>
334
+ <rect style="fill: #ffffff" x="-54" y="370.5" width="562" height="383.25"/>
335
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="-54" y="370.5" width="562" height="383.25"/>
336
+ </g>
337
+ <g>
338
+ <rect style="fill: #ffffff" x="-30" y="416.75" width="364" height="146"/>
339
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="-30" y="416.75" width="364" height="146"/>
340
+ </g>
341
+ <g>
342
+ <rect style="fill: #ffffff" x="418.775" y="551" width="176.225" height="121"/>
343
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="418.775" y="551" width="176.225" height="121"/>
344
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="506.887" y="583.4">
345
+ <tspan x="506.887" y="583.4">Distributed</tspan>
346
+ <tspan x="506.887" y="599.4">Watchable</tspan>
347
+ <tspan x="506.887" y="615.4">Storage</tspan>
348
+ <tspan x="506.887" y="631.4"></tspan>
349
+ <tspan x="506.887" y="647.4">(implemented via etcd)</tspan>
350
+ </text>
351
+ </g>
352
+ <g>
353
+ <rect style="fill: #ffffff" x="201.314" y="594.318" width="154.6" height="38"/>
354
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="201.314" y="594.318" width="154.6" height="38"/>
355
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="278.614" y="617.218">
356
+ <tspan x="278.614" y="617.218">replication controller</tspan>
357
+ </text>
358
+ </g>
359
+ <g>
360
+ <rect style="fill: #ffffff" x="94.8884" y="617.914" width="86.15" height="38"/>
361
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="94.8884" y="617.914" width="86.15" height="38"/>
362
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="137.963" y="640.814">
363
+ <tspan x="137.963" y="640.814">Scheduler</tspan>
364
+ </text>
365
+ </g>
366
+ <g>
367
+ <rect style="fill: #ffffff" x="80.162" y="594.318" width="86.15" height="38"/>
368
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="80.162" y="594.318" width="86.15" height="38"/>
369
+ <text font-size="12.8" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="123.237" y="617.218">
370
+ <tspan x="123.237" y="617.218">Scheduler</tspan>
371
+ </text>
372
+ </g>
373
+ <text font-size="12.8" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="-34.876" y="699.256">
374
+ <tspan x="-34.876" y="699.256">Master components</tspan>
375
+ <tspan x="-34.876" y="715.256">Colocated, or spread across machines,</tspan>
376
+ <tspan x="-34.876" y="731.256">as dictated by cluster size.</tspan>
377
+ </text>
378
+ <text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="506.887" y="611.5">
379
+ <tspan x="506.887" y="611.5"></tspan>
380
+ </text>
381
+ <text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="506.887" y="611.5">
382
+ <tspan x="506.887" y="611.5"></tspan>
383
+ </text>
384
+ <g>
385
+ <rect style="fill: #ffffff" x="136.717" y="468.5" width="172.175" height="70"/>
386
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="136.717" y="468.5" width="172.175" height="70"/>
387
+ <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="222.804" y="491.4">
388
+ <tspan x="222.804" y="491.4">REST</tspan>
389
+ <tspan x="222.804" y="507.4">(pods, services,</tspan>
390
+ <tspan x="222.804" y="523.4">rep. controllers)</tspan>
391
+ </text>
392
+ </g>
393
+ <g>
394
+ <rect style="fill: #ffffff" x="165.958" y="389.5" width="115" height="54"/>
395
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="165.958" y="389.5" width="115" height="54"/>
396
+ <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="223.458" y="412.4">
397
+ <tspan x="223.458" y="412.4">authorization</tspan>
398
+ <tspan x="223.458" y="428.4">authentication</tspan>
399
+ </text>
400
+ </g>
401
+ <g>
402
+ <rect style="fill: #ffffff" x="2.35" y="476.5" width="91.3" height="54"/>
403
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="2.35" y="476.5" width="91.3" height="54"/>
404
+ <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="48" y="499.4">
405
+ <tspan x="48" y="499.4">scheduling</tspan>
406
+ <tspan x="48" y="515.4">actuator</tspan>
407
+ </text>
408
+ </g>
409
+ <text font-size="12.7998" style="fill: #000000;text-anchor:start;font-family:sans-serif;font-style:normal;font-weight:normal" x="-13" y="436.75">
410
+ <tspan x="-13" y="436.75">APIs</tspan>
411
+ </text>
412
+ <g>
413
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="123.237" y1="594.318" x2="55.4248" y2="536.798"/>
414
+ <polygon style="fill: #000000" points="49.7052,531.946 60.5656,534.602 55.4248,536.798 54.097,542.228 "/>
415
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="49.7052,531.946 60.5656,534.602 55.4248,536.798 54.097,542.228 "/>
416
+ </g>
417
+ <g>
418
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="123.237" y1="594.318" x2="172.833" y2="545.341"/>
419
+ <polygon style="fill: #000000" points="178.169,540.071 174.567,550.655 172.833,545.341 167.541,543.54 "/>
420
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="178.169,540.071 174.567,550.655 172.833,545.341 167.541,543.54 "/>
421
+ </g>
422
+ <g>
423
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="278.614" y1="594.318" x2="229.688" y2="545.385"/>
424
+ <polygon style="fill: #000000" points="224.385,540.081 234.992,543.618 229.688,545.385 227.92,550.688 "/>
425
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="224.385,540.081 234.992,543.618 229.688,545.385 227.92,550.688 "/>
426
+ </g>
427
+ <g>
428
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="223.458" y1="443.5" x2="223.059" y2="458.767"/>
429
+ <polygon style="fill: #000000" points="222.863,466.265 218.126,456.137 223.059,458.767 228.123,456.399 "/>
430
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="222.863,466.265 218.126,456.137 223.059,458.767 228.123,456.399 "/>
431
+ </g>
432
+ <g>
433
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="308.892" y1="503.5" x2="362.29" y2="504.346"/>
434
+ <polygon style="fill: #000000" points="369.789,504.465 359.711,509.306 362.29,504.346 359.87,499.307 "/>
435
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="369.789,504.465 359.711,509.306 362.29,504.346 359.87,499.307 "/>
436
+ </g>
437
+ <g>
438
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="318.054" y1="544.587" x2="410.665" y2="606.112"/>
439
+ <polygon style="fill: #000000" points="320.821,540.422 309.725,539.053 315.287,548.752 "/>
440
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="320.821,540.422 309.725,539.053 315.287,548.752 "/>
441
+ <polygon style="fill: #000000" points="416.912,610.263 405.816,608.894 410.665,606.112 411.35,600.564 "/>
442
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="416.912,610.263 405.816,608.894 410.665,606.112 411.35,600.564 "/>
443
+ </g>
444
+ <g>
445
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="221.611" y1="130.49" x2="223.389" y2="379.764"/>
446
+ <polygon style="fill: #000000" points="223.442,387.264 218.371,377.3 223.389,379.764 228.371,377.229 "/>
447
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="223.442,387.264 218.371,377.3 223.389,379.764 228.371,377.229 "/>
448
+ </g>
449
+ <g>
450
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 606 581.25 C 636.898,581.25 679.302,322 711.464,322"/>
451
+ <polygon style="fill: #000000" points="606,576.25 596,581.25 606,586.25 "/>
452
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="606,576.25 596,581.25 606,586.25 "/>
453
+ <polygon style="fill: #000000" points="718.964,322 708.964,327 711.464,322 708.964,317 "/>
454
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="718.964,322 708.964,327 711.464,322 708.964,317 "/>
455
+ </g>
456
+ <g>
457
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 606 641.75 C 636.898,641.75 679.302,717.938 711.464,717.938"/>
458
+ <polygon style="fill: #000000" points="606,636.75 596,641.75 606,646.75 "/>
459
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="606,636.75 596,641.75 606,646.75 "/>
460
+ <polygon style="fill: #000000" points="718.964,717.938 708.964,722.938 711.464,717.938 708.964,712.938 "/>
461
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="718.964,717.938 708.964,722.938 711.464,717.938 708.964,712.938 "/>
462
+ </g>
463
+ <g>
464
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 790.8 708.438 C 825,677.75 879,674.75 916.908,702.665"/>
465
+ <polygon style="fill: #000000" points="922.947,707.112 911.93,705.209 916.908,702.665 917.86,697.156 "/>
466
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="922.947,707.112 911.93,705.209 916.908,702.665 917.86,697.156 "/>
467
+ </g>
468
+ <g>
469
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="801.8" y1="727.438" x2="811.94" y2="727.438"/>
470
+ <polygon style="fill: #000000" points="801.8,722.438 791.8,727.438 801.8,732.438 "/>
471
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="801.8,722.438 791.8,727.438 801.8,732.438 "/>
472
+ <polygon style="fill: #000000" points="819.44,727.438 809.44,732.438 811.94,727.438 809.44,722.438 "/>
473
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="819.44,727.438 809.44,732.438 811.94,727.438 809.44,722.438 "/>
474
+ </g>
475
+ <g>
476
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 934.594 747.007 C 928,762 804,738 797.63,754.926"/>
477
+ <polygon style="fill: #000000" points="939.171,749.02 938.62,737.853 930.017,744.994 "/>
478
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="939.171,749.02 938.62,737.853 930.017,744.994 "/>
479
+ <polygon style="fill: #000000" points="794.988,761.945 793.831,750.825 797.63,754.926 803.19,754.347 "/>
480
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="794.988,761.945 793.831,750.825 797.63,754.926 803.19,754.347 "/>
481
+ </g>
482
+ <g>
483
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 974.333 745.616 C 998,776 1131,714 1154.77,755.585"/>
484
+ <polygon style="fill: #000000" points="978.277,742.543 968.188,737.727 970.388,748.689 "/>
485
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="978.277,742.543 968.188,737.727 970.388,748.689 "/>
486
+ <polygon style="fill: #000000" points="1158.49,762.097 1149.19,755.896 1154.77,755.585 1157.87,750.934 "/>
487
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="1158.49,762.097 1149.19,755.896 1154.77,755.585 1157.87,750.934 "/>
488
+ </g>
489
+ <g>
490
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="960.522" y1="745.233" x2="970.506" y2="756.696"/>
491
+ <polygon style="fill: #000000" points="964.293,741.949 953.955,737.692 956.752,748.517 "/>
492
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="964.293,741.949 953.955,737.692 956.752,748.517 "/>
493
+ <polygon style="fill: #000000" points="975.431,762.352 965.093,758.095 970.506,756.696 972.634,751.527 "/>
494
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="975.431,762.352 965.093,758.095 970.506,756.696 972.634,751.527 "/>
495
+ </g>
496
+ <g>
497
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 478.975 491 C 552.046,491 637.129,312.5 711.464,312.5"/>
498
+ <polygon style="fill: #000000" points="478.975,486 468.975,491 478.975,496 "/>
499
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="478.975,486 468.975,491 478.975,496 "/>
500
+ <polygon style="fill: #000000" points="718.964,312.5 708.964,317.5 711.464,312.5 708.964,307.5 "/>
501
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="718.964,312.5 708.964,317.5 711.464,312.5 708.964,307.5 "/>
502
+ </g>
503
+ <g>
504
+ <path style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" d="M 478.933 505.457 C 677,522.75 650,676.75 712.305,704.479"/>
505
+ <polygon style="fill: #000000" points="479.368,500.476 468.971,504.587 478.498,510.438 "/>
506
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="479.368,500.476 468.971,504.587 478.498,510.438 "/>
507
+ <polygon style="fill: #000000" points="719.157,707.529 707.988,708.031 712.305,704.479 712.054,698.895 "/>
508
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="719.157,707.529 707.988,708.031 712.305,704.479 712.054,698.895 "/>
509
+ </g>
510
+ <g>
511
+ <line style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x1="93.65" y1="503.5" x2="126.981" y2="503.5"/>
512
+ <polygon style="fill: #000000" points="134.481,503.5 124.481,508.5 126.981,503.5 124.481,498.5 "/>
513
+ <polygon style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" points="134.481,503.5 124.481,508.5 126.981,503.5 124.481,498.5 "/>
514
+ </g>
515
+ <g>
516
+ <rect style="fill: #ffffff" x="372.025" y="477.5" width="95.95" height="54"/>
517
+ <rect style="fill: none; fill-opacity:0; stroke-width: 2; stroke: #000000" x="372.025" y="477.5" width="95.95" height="54"/>
518
+ <text font-size="12.7998" style="fill: #000000;text-anchor:middle;font-family:sans-serif;font-style:normal;font-weight:normal" x="420" y="500.4">
519
+ <tspan x="420" y="500.4">kubelet</tspan>
520
+ <tspan x="420" y="516.4">info service</tspan>
521
+ </text>
522
+ </g>
523
+ </svg>