Skydive๋ ์คํ ์์ค, ์ค์๊ฐ ๋คํธ์ํฌ ํ ํด๋ก์ง ๋ฐ ํ๋กํ ์ฝ ๋ถ์๊ธฐ์ ๋๋ค. ์ด๋ ๋คํธ์ํฌ ์ธํ๋ผ์์ ๋ฌด์จ ์ผ์ด ์ผ์ด๋๊ณ ์๋์ง ์ดํดํ ์ ์๋ ํฌ๊ด์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ฌ๋ฌ๋ถ์ ๊ด์ฌ์ ๋๊ธฐ ์ํด ์ค์นด์ด๋ค์ด๋ธ์ ๋ํ ๋ช ๊ฐ์ง ์คํฌ๋ฆฐ์ท์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋์๋ ์ค์นด์ด๋ค์ด๋ธ ์๊ฐ ํฌ์คํ ์ด ์์ ์์ ์ ๋๋ค.
์ฐํธ "
Skydive๋ Skydive ์์ด์ ํธ๋ก๋ถํฐ ๋คํธ์ํฌ ์ด๋ฒคํธ๋ฅผ ์์ ํ์ฌ ๋คํธ์ํฌ ํ ํด๋ก์ง๋ฅผ ํ์ํฉ๋๋ค. ์ค์นด์ด๋ค์ด๋ธ ์์ด์ ํธ ๋คํธ์ํฌ ์ธ๋ถ์ ์๋ ๋คํธ์ํฌ ๊ตฌ์ฑ ์์๋ TOR, ๋ฐ์ดํฐ ์ ์ฅ์ ๋ฑ๊ณผ ๊ฐ์ ๋น๋คํธ์ํฌ ๊ฐ์ฒด๋ฅผ ํ ํด๋ก์ง ๋ค์ด์ด๊ทธ๋จ์ ์ถ๊ฐํ๊ฑฐ๋ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ๊ถ๊ธํ ์ ์ด ์์ต๋๊น? ๋ ธ๋ ๊ท์น API ๋๋ถ์ ๋ ์ด์ ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
๋ฒ์ 0.20๋ถํฐ Skydive๋ ์ ๋ ธ๋์ ์์ง๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด ๋ ธ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ ธ๋ ๊ท์น API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ ธ๋ ๊ท์น API๋ ๋ ธ๋ ๊ท์น API์ ์์ง ๊ท์น API์ ๋ ๊ฐ์ง API๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๋ ธ๋ ๊ท์น API๋ ์ ๋ ธ๋๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด ๋ ธ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. Edge Rule API๋ ๋ ๋ ธ๋ ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ๋ง๋๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ ๊ฐ์ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํฉ๋๋ค.
์ด ๋ธ๋ก๊ทธ์์๋ ๋ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๊ทธ ์ค ํ๋๋ ์ค์นด์ด๋ค์ด๋น ๋คํธ์ํฌ์ ์ผ๋ถ๊ฐ ์๋ ๋คํธ์ํฌ ๊ตฌ์ฑ ์์์ ๋๋ค. ๋ ๋ฒ์งธ ์ต์ ์ ๋น๋คํธ์ํฌ ๊ตฌ์ฑ ์์์ ๋๋ค. ๊ทธ ์ ์ Topology Rules API๋ฅผ ์ฌ์ฉํ๋ ๋ช ๊ฐ์ง ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
์ค์นด์ด๋ค์ด๋น ๋ ธ๋ ์์ฑ
๋ ธ๋๋ฅผ ์์ฑํ๋ ค๋ฉด ๊ณ ์ ํ ๋ ธ๋ ์ด๋ฆ๊ณผ ์ ํจํ ๋ ธ๋ ์ ํ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ๋ช ๊ฐ์ง ์ถ๊ฐ ์ต์ ์ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
skydive client node-rule create --action="create" --node-name="node1" --node-type="fabric" --name="node rule1"
{
"UUID": "ea21c30f-cfaa-4f2d-693d-95159acb71ed",
"Name": "node rule1",
"Description": "",
"Metadata": {
"Name": "node1",
"Type": "fabric"
},
"Action": "create",
"Query": ""
}
์ค์นด์ด๋ค์ด๋น ๋ ธ๋ ๋ฉํ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ
๊ธฐ์กด ๋ ธ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๋ฉด Gremlin ์ฟผ๋ฆฌ๋ฅผ ์ ๊ณตํ์ฌ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ค๋ ๋ ธ๋๋ฅผ ์ ํํด์ผ ํฉ๋๋ค. ์์ฒญ์ ๋ฐ๋ผ ๋จ์ผ ๋ ธ๋ ๊ท์น์ ์ฌ์ฉํ์ฌ ํ๋ ์ด์์ ๋ ธ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
skydive client node-rule create --action="update" --name="update rule" --query="G.V().Has('Name', 'node1')" --metadata="key1=val1, key2=val2"
{
"UUID": "3e6c0e15-a863-4583-6345-715053ac47ce",
"Name": "update rule",
"Description": "",
"Metadata": {
"key1": "val1",
"key2": "val2"
},
"Action": "update",
"Query": "G.V().Has('Name', 'node1')"
}
์ค์นด์ด๋ค์ด๋ธ ์ฃ์ง ์์ฑ
์ฃ์ง๋ฅผ ์์ฑํ๋ ค๋ฉด ์์ค ๋ฐ ๋์ ๋ ธ๋์ ์ฃ์ง์ ๋งํฌ ์ ํ์ ์ง์ ํด์ผ ํฉ๋๋ค. ํ์ ๋ ธ๋๋ฅผ ์์ฑํ๋ ค๋ฉด ๋งํฌ ์ ํ ๊ฐ์ด ์์ ๊ถ์ด์ด์ผ ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋งํฌ ์ ํ layer2๋ฅผ ์์ฑํ๋ ค๋ฉด ๋งํฌ ์ ํ ๊ฐ์ด ๋ค์๊ณผ ๊ฐ์์ผ ํฉ๋๋ค. ๋ ์ด์ด2. ๋ ๋ ธ๋ ์ฌ์ด์ ๋ ๊ฐ ์ด์์ ๋งํฌ๋ฅผ ์์ฑํ ์ ์์ง๋ง ๋งํฌ ์ ํ์ ๋ฌ๋ผ์ผ ํฉ๋๋ค.
skydive client edge-rule create --name="edge" --src="G.v().has('TID', '2f6f9b99-82ef-5507-76b6-cbab28bda9cb')" --dst="G.V().Has('TID', 'd6ec6e2f-362e-51e5-4bb5-6ade37c2ca5c')" --relationtype="both"
{
"UUID": "50fec124-c6d0-40c7-42a3-2ed8d5fbd410",
"Name": "edge",
"Description": "",
"Src": "G.v().has('TID', '2f6f9b99-82ef-5507-76b6-cbab28bda9cb')",
"Dst": "G.V().Has('TID', 'd6ec6e2f-362e-51e5-4bb5-6ade37c2ca5c')",
"Metadata": {
"RelationType": "both"
}
}
์ฒซ ๋ฒ์งธ ์ฌ์ฉ ์ฌ๋ก
์ด ๊ฒฝ์ฐ ์ค์นด์ด๋ค์ด๋น ํ ํด๋ก์ง์์ ๋คํธ์ํฌ๊ฐ ์๋ ์ฅ์น๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ช ๊ฐ์ง ์ ์ฉํ ๋ฉํ๋ฐ์ดํฐ์ ํจ๊ป ์ค์นด์ด๋ค์ด๋น ํ ํด๋ก์ง ๋ค์ด์ด๊ทธ๋จ์ ํ์ํด์ผ ํ๋ ๋ฐ์ดํฐ ์จ์ดํ์ฐ์ค๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
ํ ํด๋ก์ง์ ์ฅ์น๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ ธ๋ ๊ท์น์ ์์ฑํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. create ๋ช ๋ น์ ์ผ๋ถ๋ก ์ฅ์น ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋์ค์ ํ๋ ์ด์์ ์ ๋ฐ์ดํธ ๋ ธ๋ ๊ท์น ๋ช ๋ น์ ๋ง๋ค ์ ์์ต๋๋ค.
ํ ํด๋ก์ง ๋ค์ด์ด๊ทธ๋จ์ ์คํ ๋ฆฌ์ง ๋๋ฐ์ด์ค๋ฅผ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์ ํธ์คํธ ๊ท์น ๋ช ๋ น์ ์คํํ์ญ์์ค.
skydive client node-rule create --action="create" --node-name="sda" --node-type="persistentvolume" --metadata="DEVNAME=/dev/sda,DEVTYPE=disk,ID.MODEL=SD_MMC, ID.MODEL ID=0316, ID.PATH TAG=pci-0000_00_14_0-usb-0_3_1_0-scsi-0_0_0_0, ID.SERIAL SHORT=20120501030900000, ID.VENDOR=Generic-, ID.VENDOR ID=0bda, MAJOR=8, MINOR=0, SUBSYSTEM=block, USEC_INITIALIZED=104393719727"
Edge ๊ท์น ์๋ ๋ช ๋ น์ ์คํํ์ฌ ์์ฑ๋ ๋ ธ๋๋ฅผ ํธ์คํธ ๋ ธ๋์ ์ฐ๊ฒฐํฉ๋๋ค.
skydive client edge-rule create --src="G.V().Has('Name', 'node1')" --dst="G.V().Has('Name', 'sda')" --relationtype="ownership"
์์ ๋ช ๋ น ํ์๋ ์๋ ์ด๋ฏธ์ง์ ํ์๋ ๋๋ก ์ง์ ๋ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ค์นด์ด๋ค์ด๋ธ ํ ํด๋ก์ง ๋ค์ด์ด๊ทธ๋จ์ ์ฅ์น๊ฐ ํ์๋๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๋ ๋ฒ์งธ ์ฌ์ฉ ์ฌ๋ก
์ด ๊ฒฝ์ฐ ์ค์นด์ด๋ค์ด๋น ๋คํธ์ํฌ์ ์ผ๋ถ๊ฐ ์๋ ๋คํธ์ํฌ ์ฅ์น๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์ด ์๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ๋ ๊ฐ์ ์๋ก ๋ค๋ฅธ ํธ์คํธ์์ ์คํ๋๋ ๋ ๊ฐ์ ์ค์นด์ด๋ค์ด๋น ์์ด์ ํธ๊ฐ ์์ต๋๋ค. ์ด ๋ ํธ์คํธ๋ฅผ ์ฐ๊ฒฐํ๋ ค๋ฉด TOR ์ค์์น๊ฐ ํ์ํฉ๋๋ค. ๊ตฌ์ฑ ํ์ผ์์ ๊ตฌ์กฐ ๋ ธ๋์ ๋งํฌ๋ฅผ ์ ์ํ์ฌ ์ด๋ฅผ ๋ฌ์ฑํ ์ ์์ง๋ง ํ ํด๋ก์ง ๊ท์น API๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์์ ์ ์ํํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
TOR ์ค์์น๊ฐ ์์ผ๋ฉด ์๋ ์ด๋ฏธ์ง์ ํ์๋ ๊ฒ์ฒ๋ผ ๋ ์์ด์ ํธ๊ฐ ๋งํฌ ์์ด ์๋ก ๋ค๋ฅธ ๋ ๋ ธ๋๋ก ๋ํ๋ฉ๋๋ค.
์ด์ ๋ค์ ํธ์คํธ ๊ท์น ๋ช ๋ น์ ์คํํ์ฌ TOR ์ค์์น์ ํฌํธ๋ฅผ ์์ฑํ์ญ์์ค.
skydive client node-rule create --node-name="TOR" --node-type="fabric" --action="create"
skydive client node-rule create --node-name="port1" --node-type="port" --action="create"
skydive client node-rule create --node-name="port2" --node-type="port" --action="create"
๋ณด์๋ค์ํผ TOR ์ค์์น์ ํฌํธ๊ฐ ์์ฑ๋์ด ์ค์นด์ด๋ค์ด๋ธ ํ ํด๋ก์ง์ ์ถ๊ฐ๋์์ผ๋ฉฐ ์ด์ ํ ํด๋ก์ง๋ ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ต๋๋ค.
์ด์ ๋ค์ Edge Rule ๋ช ๋ น์ ์คํํ์ฌ TOR ์ค์์น, ํฌํธ 1 ๋ฐ ํธ์คํธ 1์ ๊ณต์ฉ ์ธํฐํ์ด์ค ๊ฐ์ ์ฐ๊ฒฐ์ ์์ฑํฉ๋๋ค.
skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port1')" --relationtype="ownership"
skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port1')" --relationtype="layer2"
skydive client edge-rule create --src="G.V().Has('TID', '372c254d-bac9-50c2-4ca9-86dcc6ce8a57')" --dst="G.V().Has('Name', 'port1')" --relationtype="layer2"
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ TOR ์ค์์น ํฌํธ 2์ ํธ์คํธ 2 ๊ณต์ฉ ์ธํฐํ์ด์ค ๊ฐ์ ๋งํฌ๋ฅผ ์์ฑํ์ญ์์ค.
skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port2')" --relationtype="layer2"
skydive client edge-rule create --src="G.V().Has('Name', 'TOR')" --dst="G.V().Has('Name', 'port2')" --relationtype="ownership"
skydive client edge-rule create --src="G.V().Has('TID', '50037073-7862-5234-4996-e58cc067c69c')" --dst="G.V().Has('Name', 'port2')" --relationtype="layer2"
์ด์ TOR ์ค์์น์ ํฌํธ ์ฌ์ด์ ์์ ๊ถ ๋ฐ ๋ ์ด์ด 2 ์ฐ๊ฒฐ์ด ์์ฑ๋ ๋ฟ๋ง ์๋๋ผ ์์ด์ ํธ์ ํฌํธ ์ฌ์ด์ ๋ ์ด์ด 2 ์ฐ๊ฒฐ์ด ์์ฑ๋ฉ๋๋ค. ์ด์ ์ต์ข ํ ํด๋ก์ง๋ ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ต๋๋ค.
์ด์ ๋ ํธ์คํธ/์์ด์ ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐ๋์์ผ๋ฉฐ ์ฐ๊ฒฐ์ ํ ์คํธํ๊ฑฐ๋ ๋ ํธ์คํธ ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก ์บก์ฒ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
PS ๋งํฌ
์ฐ๋ฆฌ๋ ๋ค๋ฅธ ์ค์นด์ด๋ค์ด๋น ๊ธฐ๋ฅ์ ๋ํ ๊ฒ์๋ฌผ์ ์์ฑํ ์ ์๋ ์ฌ๋๋ค์ ์ฐพ๊ณ ์์ต๋๋ค.
์ถ์ฒ : habr.com