Switch to new cert model

We'll use two isolated root certificates to allow access
control between orca and swarm.
This commit is contained in:
Daniel Hiltgen 2015-08-04 12:42:52 -07:00 committed by Joao Fernandes
parent 6e5af30036
commit a64270a11c
5 changed files with 236 additions and 588 deletions

BIN
certs.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 103 KiB

428
certs.svg
View File

@ -1,428 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<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:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="297mm"
height="210mm"
viewBox="0 0 1052.3622 744.09448"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="certs.svg"
inkscape:export-filename="/home/daniel/code/docker/orca/docs/certs.png"
inkscape:export-xdpi="90"
inkscape:export-ydpi="90">
<defs
id="defs4">
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lend"
style="overflow:visible;"
inkscape:isstock="true">
<path
id="path8309"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) rotate(180) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lstart"
orient="auto"
refY="0.0"
refX="0.0"
id="Arrow1Lstart"
style="overflow:visible"
inkscape:isstock="true">
<path
id="path8306"
d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z "
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1"
transform="scale(0.8) translate(12.5,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-6"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path8309-7"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-5"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path8309-4"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-3"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path8309-0"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-0"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path8309-3"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
<marker
inkscape:stockid="Arrow1Lend"
orient="auto"
refY="0"
refX="0"
id="Arrow1Lend-4"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path8309-76"
d="M 0,0 5,-5 -12.5,0 5,5 0,0 Z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="matrix(-0.8,0,0,-0.8,-10,0)" />
</marker>
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="0.98994949"
inkscape:cx="496.26316"
inkscape:cy="271.4965"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:window-width="2558"
inkscape:window-height="1438"
inkscape:window-x="2560"
inkscape:window-y="0"
inkscape:window-maximized="0" />
<metadata
id="metadata7">
<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>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-308.26772)">
<path
style="fill:#80ffa2;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 614.17274,689.71744 c 85.86297,-13.13198 84.85282,-45.45686 88.89343,-87.88327 4.04061,-42.42641 -13.13199,-73.74113 -51.51778,-111.11678 C 613.16259,453.34175 502.04581,384.65137 422.24376,372.52954 342.44171,360.40771 141.42135,344.24527 117.17769,375.56 c -24.243658,31.31473 -13.13198,107.07617 12.12183,134.35029 25.25381,27.27412 108.08633,119.198 143.44166,145.46197 35.35534,26.26397 216.32648,31.32727 265.67013,35.35533 49.49747,4.04062 75.76143,-1.01015 75.76143,-1.01015 z"
id="path13131"
inkscape:connector-curvature="0"
sodipodi:nodetypes="csssssssc" />
<g
id="g7274"
transform="translate(-385.87828,-24.243661)">
<rect
ry="5.3662186"
y="413.01773"
x="519.30054"
height="103.88154"
width="259.44501"
id="rect7268"
style="opacity:0.8;fill:#809cff;fill-opacity:1;fill-rule:evenodd;stroke:#0c32b1;stroke-width:2.16418409;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text7270"
y="477.69897"
x="648.17712"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="477.69897"
x="648.17712"
id="tspan7272"
sodipodi:role="line">Orca Root CA</tspan></text>
</g>
<g
id="g8188"
transform="translate(-91.923882,164.65486)">
<rect
ry="5.3496757"
y="520.75909"
x="115.90468"
height="103.56129"
width="342.96741"
id="rect7268-0"
style="opacity:0.8;fill:#809cff;fill-opacity:1;fill-rule:evenodd;stroke:#0c32b1;stroke-width:2.48443413;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text7270-7"
y="563.71283"
x="287.3371"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="563.71283"
x="287.3371"
id="tspan7272-9"
sodipodi:role="line">Orca intermediate</tspan><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="607.46283"
x="287.3371"
sodipodi:role="line"
id="tspan8182"> CA</tspan></text>
</g>
<g
id="g8253"
transform="translate(661.64992,-330.31988)">
<rect
ry="5.3662186"
y="689.29443"
x="10.688697"
height="103.88154"
width="259.44501"
id="rect7268-8"
style="opacity:0.8;fill:#80f7ff;fill-opacity:1;fill-rule:evenodd;stroke:#0ca3b1;stroke-width:2.16400003;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text7270-70"
y="732.10071"
x="139.56528"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="732.10071"
x="139.56528"
id="tspan7272-8"
sodipodi:role="line">Orca server</tspan><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="775.85071"
x="139.56528"
sodipodi:role="line"
id="tspan8231">cert</tspan></text>
</g>
<g
id="g8247"
transform="translate(-228.29447,172.73609)">
<rect
ry="5.3662186"
y="685.25385"
x="280.39941"
height="103.88154"
width="259.44501"
id="rect7268-8-2"
style="opacity:0.8;fill:#80f7ff;fill-opacity:1;fill-rule:evenodd;stroke:#0ca3b1;stroke-width:2.16400003;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text7270-70-4"
y="728.36774"
x="409.276"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="728.36774"
x="409.276"
id="tspan7272-8-5"
sodipodi:role="line">Orca normal</tspan><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="772.11774"
x="409.276"
sodipodi:role="line"
id="tspan8233">User Cert</tspan></text>
</g>
<g
id="g8225"
transform="translate(-287.89348,17.172593)">
<rect
ry="5.3429713"
y="524.86462"
x="560.94177"
height="103.4315"
width="380.21326"
id="rect7268-0-5"
style="opacity:0.8;fill:#809cff;fill-opacity:1;fill-rule:evenodd;stroke:#0c32b1;stroke-width:2.61422157;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text7270-7-6"
y="567.75348"
x="750.82623"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="567.75348"
x="750.82623"
id="tspan7272-9-4"
sodipodi:role="line">Swarm intermediate</tspan><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="611.50348"
x="750.82623"
sodipodi:role="line"
id="tspan8182-0"> CA</tspan></text>
</g>
<g
transform="translate(404.06103,29.294419)"
id="g8247-6">
<rect
ry="5.3662186"
y="685.25385"
x="280.39941"
height="103.88154"
width="259.44501"
id="rect7268-8-2-9"
style="opacity:0.8;fill:#80f7ff;fill-opacity:1;fill-rule:evenodd;stroke:#0ca3b1;stroke-width:2.16400003;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text7270-70-4-4"
y="728.36774"
x="409.276"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="728.36774"
x="409.276"
id="tspan7272-8-5-0"
sodipodi:role="line">swarm server</tspan><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="772.11774"
x="409.276"
sodipodi:role="line"
id="tspan8233-5">Cert</tspan></text>
</g>
<g
transform="translate(431.33515,-209.10159)"
id="g8247-9">
<rect
ry="5.3662186"
y="685.25385"
x="280.39941"
height="103.88154"
width="259.44501"
id="rect7268-8-2-8"
style="opacity:0.8;fill:#80f7ff;fill-opacity:1;fill-rule:evenodd;stroke:#0ca3b1;stroke-width:2.16400003;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text7270-70-4-7"
y="728.36774"
x="409.276"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="728.36774"
x="409.276"
id="tspan7272-8-5-8"
sodipodi:role="line">Orca admin</tspan><tspan
style="font-size:35px;text-align:center;text-anchor:middle"
y="772.11774"
x="409.276"
sodipodi:role="line"
id="tspan8233-0">User Cert</tspan></text>
</g>
<path
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend)"
d="m 185.92803,857.98994 5.44853,-69.0147"
id="path8300"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0"
inkscape:connection-start="#g8247"
inkscape:connection-end="#g8188" />
<path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-6)"
d="M 672.33862,418.08836 392.86726,433.5418"
id="path8300-2"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0"
inkscape:connection-end="#g7274"
inkscape:connection-start="#g8253" />
<path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-5)"
d="M 207.28496,685.41395 251.28775,492.65561"
id="path8300-3"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0"
inkscape:connection-end="#g7274"
inkscape:connection-start="#g8188" />
<path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-3)"
d="M 395.56604,542.03722 331.02772,492.65561"
id="path8300-5"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0"
inkscape:connection-end="#g7274"
inkscape:connection-start="#g8225" />
<path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-0)"
d="M 708.63079,714.54826 568.24982,645.46872"
id="path8300-0"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0"
inkscape:connection-start="#g8247-6"
inkscape:connection-end="#g8225" />
<path
style="display:inline;fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#Arrow1Lend-4)"
d="m 711.73456,508.49303 -318.8673,-48.1782"
id="path8300-24"
inkscape:connector-type="polyline"
inkscape:connector-curvature="0"
inkscape:connection-end="#g7274"
inkscape:connection-start="#g8247-9" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="393.15237"
y="531.00171"
id="text13133"
sodipodi:linespacing="125%"><tspan
sodipodi:role="line"
id="tspan13135"
x="393.15237"
y="531.00171"
style="font-size:25px">Swarm Trusted CAs</tspan></text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

View File

@ -3,17 +3,13 @@
![Components](orca_components.png) ![Components](orca_components.png)
## Known gaps
* Swarm must talk to consul with TLS enabled - https://github.com/docker/swarm/issues/404 - slated for 1.9
## Open Questions ## Open Questions
* Can Swarm talk to consul with TLS enabled? * Can we get admin user certs signed by the swarm CA to work? If not, admins will have to deal with dual certs for swarm+orca access.
* ~~Can we use a single root CA and intermediate CA certs for orca/swarm?~~ - Yes!
* ~~Should the bootstrapper container contain the other images within?~~ - no, too bloated
* ~~Should we link all our containers, or wire them up based on the punched through IP/ports?~~ - It's not ready yet
* ~~DB Clustering/HA?~~ - Not for v1
* ~~What KV store (swarm discovery backend) should we use?~~ - Use single node consul for v1
* ~~How far away is core orca from supporting multiple swarms?~~ not for v1
* ~~Does it make sense to append the Orca CA certificates to the local system's trusted certs?~~ Give fingerprint instead
## Assumptions ## Assumptions
@ -21,19 +17,18 @@
* We wont use data volume containers, but instead host volume mounts * We wont use data volume containers, but instead host volume mounts
* Our goal is to get as close to a full end-to-end deployment as possible (from bare-metal up to orca) * Our goal is to get as close to a full end-to-end deployment as possible (from bare-metal up to orca)
* Advanced customers may be able to cherry-pick, but that's not the focus in v1 * Advanced customers may be able to cherry-pick, but that's not the focus in v1
* We'll deploy an internal consul instance for swarm (not HA)
* Bare-metal ISO based installer not (yet) covered in this document * Bare-metal ISO based installer not (yet) covered in this document
* Swarm requires a common single CA "on both sides" (incoming client communication and outgoing engine communication) * Swarm requires a common single CA "on both sides" (incoming client communication and outgoing engine communication)
* Swarm Managers must have visibility to all the engines (or proxies) and be secured with TLS. All Engines/Proxies must trust the CA who signed the swarm cert * Swarm Managers must have visibility to all the engines (or proxies) and be secured with TLS. All Engines/Proxies must trust the CA who signed the swarm cert
* Swarm manager and docker proxy may fold into one component, but this shouldn't fundamentally change the flow * Swarm manager and docker proxy may fold into one component, but this shouldn't fundamentally change the flow
* We'll "own" an internal root CA with intermediaries for orca/swarm to provide access control * We'll "own" two internal root CAs for orca/swarm to provide access control
* Admin users certs will be signed by the root so they have swarm access, regular users by the orca intermediate so they do not have swarm access
* Set up so that certs can be replaced post v1 * Set up so that certs can be replaced post v1
* We'll store the certs in a host volume mount * We'll store the certs in a host volume mount
* The volume could be swapped out for a keywhiz volume mount in the future (unclear if we can write to it though...) * The volume could be swapped out for a keywhiz volume mount in the future (unclear if we can write to it though...)
* Laying the groundwork of a central CA for our managed swarm will enable keywhiz for secret management post v1 * Laying the groundwork of a central CA for our managed swarm will enable keywhiz for secret management post v1
* Installation logic should be idempotent, and not clobber any pertinent state unless the user asks us to * Installation logic should be idempotent, and not clobber any pertinent state unless the user asks us to
![Certs](certs.png)
## User Entrypoint ## User Entrypoint
@ -100,9 +95,8 @@ docker run --rm -t \
7. Stop any existing orca containers already running on the host 7. Stop any existing orca containers already running on the host
8. (conditional) clobber existing state if requested 8. (conditional) clobber existing state if requested
9. Generate Root CA and certs if not present in host volume path: /etc/docker/ssl/orca 9. Generate Root CA and certs if not present in host volume path: /etc/docker/ssl/orca
* root Orca CA cert * Orca CA cert
* Intermediat Orca CA cert * Swarm CA cert
* Intermediat Swarm CA cert
10. Generate cert for proxy/swarm manager signed by Swarm CA 10. Generate cert for proxy/swarm manager signed by Swarm CA
11. Deploy proxy with random exposed port 11. Deploy proxy with random exposed port
12. Verify we can see the proxy we just deployed using the engines external IP 12. Verify we can see the proxy we just deployed using the engines external IP

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -198,6 +198,21 @@
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1" style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="scale(0.6,0.6)" /> transform="scale(0.6,0.6)" />
</marker> </marker>
<marker
inkscape:stockid="SemiCircleIn"
orient="auto"
refY="0"
refX="0"
id="SemiCircleIn-6-5"
style="overflow:visible"
inkscape:isstock="true">
<path
inkscape:connector-curvature="0"
id="path8311-7-3"
d="m -0.37450702,-0.04569258 c 0,2.75999998 2.24000002,4.99999998 5.00000002,4.99999998 l 0,-10 c -2.76,0 -5.00000002,2.24 -5.00000002,5.00000002 z"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1"
transform="scale(0.6,0.6)" />
</marker>
</defs> </defs>
<sodipodi:namedview <sodipodi:namedview
id="base" id="base"
@ -207,15 +222,15 @@
inkscape:pageopacity="0.0" inkscape:pageopacity="0.0"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:zoom="1.4" inkscape:zoom="1.4"
inkscape:cx="496.34153" inkscape:cx="378.33262"
inkscape:cy="347.37255" inkscape:cy="426.09652"
inkscape:document-units="px" inkscape:document-units="px"
inkscape:current-layer="layer1" inkscape:current-layer="layer1"
showgrid="false" showgrid="false"
inkscape:window-width="2558" inkscape:window-width="1918"
inkscape:window-height="1438" inkscape:window-height="1061"
inkscape:window-x="2560" inkscape:window-x="0"
inkscape:window-y="0" inkscape:window-y="17"
inkscape:window-maximized="0" /> inkscape:window-maximized="0" />
<metadata <metadata
id="metadata7"> id="metadata7">
@ -237,17 +252,18 @@
<text <text
xml:space="preserve" xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="548.57147" x="528.57147"
y="685.96118" y="685.96118"
id="text8115" id="text8115"
sodipodi:linespacing="125%"><tspan sodipodi:linespacing="125%"><tspan
sodipodi:role="line" sodipodi:role="line"
id="tspan8117" id="tspan8117"
x="548.57147" x="528.57147"
y="685.96118" y="685.96118"
style="font-size:35px">. . .</tspan></text> style="font-size:35px">. . .</tspan></text>
<g <g
id="g8785"> id="g8785"
transform="translate(49.857143,0)">
<rect <rect
ry="5.3747001" ry="5.3747001"
y="569.50507" y="569.50507"
@ -318,46 +334,8 @@
inkscape:connector-curvature="0" inkscape:connector-curvature="0"
inkscape:connector-type="polyline" inkscape:connector-type="polyline"
id="path8127-9" id="path8127-9"
d="m 260.37904,645.21935 1.04953,99.28571"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-6)" />
</g>
<g
transform="translate(556.42857,1.957866)"
id="g8785-7">
<rect
ry="5.3747001"
y="569.50507"
x="236.42857"
height="75.714287"
width="47.142857"
id="rect8119-1"
style="opacity:1;fill:#80ffe0;fill-opacity:1;fill-rule:evenodd;stroke:#0cb188;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%"
id="text8121-0"
y="254.76318"
x="-608.09094"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:15px;text-align:center;text-anchor:middle"
y="254.76318"
x="-608.09094"
id="tspan8123-91"
sodipodi:role="line">Docker</tspan><tspan
id="tspan8125-5"
style="font-size:15px;text-align:center;text-anchor:middle"
y="273.51318"
x="-608.09094"
sodipodi:role="line">Proxy</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connection-start="#rect8119-1"
inkscape:connector-curvature="0"
inkscape:connector-type="polyline"
id="path8127-8"
d="m 260.39435,645.21935 1.03422,99.28571" d="m 260.39435,645.21935 1.03422,99.28571"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-8)" /> style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-6)" />
</g> </g>
<g <g
id="g9664" id="g9664"
@ -398,12 +376,11 @@
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-69)" /> style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-69)" />
</g> </g>
<g <g
transform="translate(338.57143,133.71429)" id="g7530">
id="g9664-7">
<rect <rect
ry="5.3747001" ry="5.3747001"
y="437.17722" y="570.89148"
x="69.285713" x="407.85715"
height="75.714287" height="75.714287"
width="47.142857" width="47.142857"
id="rect8119-2-2" id="rect8119-2-2"
@ -412,51 +389,41 @@
transform="matrix(0,-1,1,0,0,0)" transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%" sodipodi:linespacing="125%"
id="text8121-4-3" id="text8121-4-3"
y="87.620323" y="426.19174"
x="-475.76309" x="-609.47736"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan xml:space="preserve"><tspan
id="tspan8125-58-4" id="tspan8125-58-4"
style="font-size:15px;text-align:center;text-anchor:middle" style="font-size:15px;text-align:center;text-anchor:middle"
y="87.620323" y="426.19174"
x="-475.76309" x="-609.47736"
sodipodi:role="line">Swarm</tspan><tspan sodipodi:role="line">Swarm</tspan><tspan
id="tspan9011-1" id="tspan9011-1"
style="font-size:15px;text-align:center;text-anchor:middle" style="font-size:15px;text-align:center;text-anchor:middle"
y="106.37032" y="444.94174"
x="-475.76309" x="-609.47736"
sodipodi:role="line">Manager</tspan></text> sodipodi:role="line">Join</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connection-start="#rect8119-2-2"
inkscape:connector-curvature="0"
inkscape:connector-type="polyline"
id="path8127-7-7"
d="m 93.23618,512.8915 1.04953,99.28571"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-69-3)" />
</g> </g>
<g <g
id="g8074-8" id="g7447">
transform="translate(203.57142,36.428571)"
style="opacity:0.8">
<rect <rect
ry="5.3747001" ry="5.3934851"
y="613.07648" y="649.38525"
x="101.42857" x="352.02304"
height="68.571419" height="68.811081"
width="205.71429" width="158.8111"
id="rect8068-6" id="rect8068-6"
style="opacity:1;fill:#80d8ff;fill-opacity:1;fill-rule:evenodd;stroke:#0c73b1;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> style="opacity:0.8;fill:#80d8ff;fill-opacity:1;fill-rule:evenodd;stroke:#0c73b1;stroke-width:1.760337;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text <text
sodipodi:linespacing="125%" sodipodi:linespacing="125%"
id="text8070-1" id="text8070-1"
y="654.25916" y="690.68774"
x="203.7242" x="431.36145"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan xml:space="preserve"><tspan
style="font-size:25px;text-align:center;text-anchor:middle" style="font-size:25px;text-align:center;text-anchor:middle"
y="654.25916" y="690.68774"
x="203.7242" x="431.36145"
id="tspan8072-5" id="tspan8072-5"
sodipodi:role="line">Engine 1</tspan></text> sodipodi:role="line">Engine 1</tspan></text>
</g> </g>
@ -530,21 +497,21 @@
<text <text
xml:space="preserve" xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="12.142857" x="-70.714287"
y="733.07648" y="730.21936"
id="text9948" id="text9948"
sodipodi:linespacing="125%"><tspan sodipodi:linespacing="125%"><tspan
sodipodi:role="line" sodipodi:role="line"
id="tspan9950" id="tspan9950"
x="12.142857" x="-70.714287"
y="733.07648">Externally</tspan><tspan y="730.21936">Externally</tspan><tspan
sodipodi:role="line" sodipodi:role="line"
x="12.142857" x="-70.714287"
y="748.07648" y="745.21936"
id="tspan9952">Visible</tspan><tspan id="tspan9952">Visible</tspan><tspan
sodipodi:role="line" sodipodi:role="line"
x="12.142857" x="-70.714287"
y="763.07648" y="760.21936"
id="tspan9954">Ports</tspan></text> id="tspan9954">Ports</tspan></text>
<g <g
id="g7501"> id="g7501">
@ -582,90 +549,205 @@
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-69-65-6)" /> style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-69-65-6)" />
</g> </g>
<g <g
id="g7485"> id="g7563">
<rect <rect
ry="5.3577666" ry="5.3126082"
y="649.6131" y="649.90118"
x="32.965164" x="-66.746765"
height="68.355377" height="67.779243"
width="253.35539" width="405.63641"
id="rect8068" id="rect8068"
style="opacity:0.8;fill:#80d8ff;fill-opacity:1;fill-rule:evenodd;stroke:#0c73b1;stroke-width:2.21604013;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> style="opacity:0.8;fill:#80d8ff;fill-opacity:1;fill-rule:evenodd;stroke:#0c73b1;stroke-width:2.79217744;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text <text
sodipodi:linespacing="125%" sodipodi:linespacing="125%"
id="text8070" id="text8070"
y="690.68774" y="690.68774"
x="159.25223" x="135.68082"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan xml:space="preserve"><tspan
style="font-size:25px;text-align:center;text-anchor:middle" style="font-size:25px;text-align:center;text-anchor:middle"
y="690.68774" y="690.68774"
x="159.25223" x="135.68082"
id="tspan8072" id="tspan8072"
sodipodi:role="line">Engine 0</tspan></text> sodipodi:role="line">Engine 0</tspan></text>
</g> </g>
<g <g
transform="translate(672.85714,134.28572)" transform="translate(-201,128)"
id="g9664-7-1"> id="g9942-0">
<rect <rect
ry="5.3747001" ry="5.3747001"
y="437.17722" y="440.93365"
x="69.285713" x="182.14285"
height="75.714287" height="75.714287"
width="47.142857" width="47.142857"
id="rect8119-2-2-1" id="rect8119-2-1-3-2"
style="opacity:1;fill:#809cff;fill-opacity:1;fill-rule:evenodd;stroke:#0c32b1;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%"
id="text8121-4-9-3-8"
y="200.47746"
x="-479.51953"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:15px;text-align:center;text-anchor:middle"
y="200.47746"
x="-479.51953"
sodipodi:role="line"
id="tspan9885-8-1">SwarmCA</tspan><tspan
style="font-size:15px;text-align:center;text-anchor:middle"
y="219.22746"
x="-479.51953"
sodipodi:role="line"
id="tspan7397">(cfssl)</tspan></text>
</g>
<g
transform="translate(-251.42857,128)"
id="g9942-0-4">
<rect
ry="5.3747001"
y="440.93365"
x="182.14285"
height="75.714287"
width="47.142857"
id="rect8119-2-1-3-2-6"
style="opacity:1;fill:#809cff;fill-opacity:1;fill-rule:evenodd;stroke:#0c32b1;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%"
id="text8121-4-9-3-8-7"
y="200.47746"
x="-479.51953"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:15px;text-align:center;text-anchor:middle"
y="200.47746"
x="-479.51953"
sodipodi:role="line"
id="tspan9885-8-1-3">Orca CA</tspan><tspan
style="font-size:15px;text-align:center;text-anchor:middle"
y="219.22746"
x="-479.51953"
sodipodi:role="line"
id="tspan7397-8">(cfssl)</tspan></text>
</g>
<g
transform="translate(475.85714,1.243579)"
id="g8785-9-7">
<rect
ry="5.3747001"
y="569.50507"
x="236.42857"
height="75.714287"
width="47.142857"
id="rect8119-6-9"
style="opacity:1;fill:#80ffe0;fill-opacity:1;fill-rule:evenodd;stroke:#0cb188;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%"
id="text8121-8-8"
y="254.76318"
x="-608.09094"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:15px;text-align:center;text-anchor:middle"
y="254.76318"
x="-608.09094"
id="tspan8123-9-5"
sodipodi:role="line">Docker</tspan><tspan
id="tspan8125-2-9"
style="font-size:15px;text-align:center;text-anchor:middle"
y="273.51318"
x="-608.09094"
sodipodi:role="line">Proxy</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connection-start="#rect8119-6-9"
inkscape:connector-curvature="0"
inkscape:connector-type="polyline"
id="path8127-9-9"
d="m 260.39435,645.21935 1.03422,99.28571"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-6-5)" />
</g>
<rect
style="opacity:1;fill:#80ffa9;fill-opacity:1;fill-rule:evenodd;stroke:#0cb134;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
id="rect8119-2-2-8"
width="47.142857"
height="75.714287"
x="659.42859"
y="571.46289"
ry="5.3747001" />
<text
xml:space="preserve"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
x="-610.04877"
y="677.76318"
id="text8121-4-3-1"
sodipodi:linespacing="125%"
transform="matrix(0,-1,1,0,0,0)"><tspan
sodipodi:role="line"
x="-610.04877"
y="677.76318"
style="font-size:15px;text-align:center;text-anchor:middle"
id="tspan8125-58-4-1">Swarm</tspan><tspan
sodipodi:role="line"
x="-610.04877"
y="696.51318"
style="font-size:15px;text-align:center;text-anchor:middle"
id="tspan9011-1-5">Join</tspan></text>
<g
transform="translate(251.57142,0.571429)"
id="g7447-3">
<rect
ry="5.3934851"
y="649.38525"
x="352.02304"
height="68.811081"
width="158.8111"
id="rect8068-6-4"
style="opacity:0.8;fill:#80d8ff;fill-opacity:1;fill-rule:evenodd;stroke:#0c73b1;stroke-width:1.760337;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text8070-1-8"
y="690.68774"
x="431.36145"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:25px;text-align:center;text-anchor:middle"
y="690.68774"
x="431.36145"
id="tspan8072-5-1"
sodipodi:role="line">Engine 1</tspan></text>
</g>
<g
transform="translate(-172.71429,-1.9578247)"
id="g7530-8">
<rect
ry="5.3747001"
y="570.89148"
x="407.85715"
height="75.714287"
width="47.142857"
id="rect8119-2-2-5"
style="opacity:1;fill:#80ffa9;fill-opacity:1;fill-rule:evenodd;stroke:#0cb134;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" /> style="opacity:1;fill:#80ffa9;fill-opacity:1;fill-rule:evenodd;stroke:#0cb134;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text <text
transform="matrix(0,-1,1,0,0,0)" transform="matrix(0,-1,1,0,0,0)"
sodipodi:linespacing="125%" sodipodi:linespacing="125%"
id="text8121-4-3-6" id="text8121-4-3-8"
y="87.620323" y="426.19174"
x="-475.76309" x="-609.47736"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan xml:space="preserve"><tspan
id="tspan8125-58-4-1" id="tspan8125-58-4-0"
style="font-size:15px;text-align:center;text-anchor:middle" style="font-size:15px;text-align:center;text-anchor:middle"
y="87.620323" y="426.19174"
x="-475.76309" x="-609.47736"
sodipodi:role="line">Swarm</tspan><tspan sodipodi:role="line">Swarm</tspan><tspan
id="tspan9011-1-9" id="tspan9011-1-53"
style="font-size:15px;text-align:center;text-anchor:middle" style="font-size:15px;text-align:center;text-anchor:middle"
y="106.37032" y="444.94174"
x="-475.76309" x="-609.47736"
sodipodi:role="line">Manager</tspan></text> sodipodi:role="line">Join</tspan></text>
<path
sodipodi:nodetypes="cc"
inkscape:connection-start="#rect8119-2-2-1"
inkscape:connector-curvature="0"
inkscape:connector-type="polyline"
id="path8127-7-7-2"
d="m 93.251486,512.8915 1.034224,99.28571"
style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;marker-end:url(#SemiCircleIn-69-3-3)" />
</g>
<g
id="g8074-4"
transform="translate(535,36.428571)"
style="opacity:0.8">
<rect
ry="5.3747001"
y="613.07648"
x="101.42857"
height="68.571419"
width="205.71429"
id="rect8068-9"
style="opacity:1;fill:#80d8ff;fill-opacity:1;fill-rule:evenodd;stroke:#0c73b1;stroke-width:2;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" />
<text
sodipodi:linespacing="125%"
id="text8070-9"
y="654.25916"
x="203.7242"
style="font-style:normal;font-weight:normal;font-size:12px;line-height:125%;font-family:Sans;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
xml:space="preserve"><tspan
style="font-size:25px;text-align:center;text-anchor:middle"
y="654.25916"
x="203.7242"
id="tspan8072-8"
sodipodi:role="line">Engine N</tspan></text>
</g> </g>
</g> </g>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 28 KiB

After

Width:  |  Height:  |  Size: 31 KiB