Skydive๋ ์คํ ์์ค ์ค์๊ฐ ๋คํธ์ํฌ ํ ํด๋ก์ง ๋ฐ ํ๋กํ ์ฝ ๋ถ์๊ธฐ์ ๋๋ค. ๋คํธ์ํฌ ์ธํ๋ผ์์ ๋ฐ์ํ๋ ์ํฉ์ ํฌ๊ด์ ์ผ๋ก ์ดํดํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์ฌ๋ฌ๋ถ์ ๊ด์ฌ์ ๋๊ธฐ ์ํด ์ค์นด์ด๋ค์ด๋ธ ๊ด๋ จ ์คํฌ๋ฆฐ์ท ๋ช ์ฅ์ ๋ณด์ฌ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋๋ ์ค์นด์ด๋ค์ด๋ธ ์๊ฐ ๊ธ์ ๋๋ค.


์ฐํธ "ยป ํ๋ธ๋ฅด์ ์์.
Skydive๋ Skydive ์์ด์ ํธ๋ก๋ถํฐ ๋คํธ์ํฌ ์ด๋ฒคํธ๋ฅผ ์์ ํ์ฌ ๋คํธ์ํฌ ํ ํด๋ก์ง๋ฅผ ํ์ํฉ๋๋ค. Skydive ์์ด์ ํธ ๋คํธ์ํฌ ์ธ๋ถ์ ์๋ ๋คํธ์ํฌ ๊ตฌ์ฑ ์์๋ TOR, ๋ฐ์ดํฐ ์ ์ฅ์ ๋ฑ๊ณผ ๊ฐ์ ๋คํธ์ํฌ๊ฐ ์๋ ๊ฐ์ฒด๋ฅผ ํ ํด๋ก์ง ๋ค์ด์ด๊ทธ๋จ์ ์ถ๊ฐํ๊ฑฐ๋ ํ์ํ๋ ๋ฐฉ๋ฒ์ ๊ถ๊ธํดํ์ ์ ์ด ์์ผ์ ๊ฐ์? ๋ ธ๋ ๊ท์น API ๋๋ถ์ ๋ ์ด์ ๊ณ ๋ฏผํ ํ์๊ฐ ์์ต๋๋ค.
Skydive๋ 0.20 ๋ฒ์ ๋ถํฐ ์ ๋ ธ๋์ ์ฃ์ง๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด ๋ ธ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ ธ๋ ๊ท์น API๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ ธ๋ ๊ท์น API๋ ๋ ธ๋ ๊ท์น API์ ์ฃ์ง ๊ท์น API, ๋ ๊ฐ์ง๋ก ๋๋ฉ๋๋ค. ๋ ธ๋ ๊ท์น API๋ ์ ๋ ธ๋๋ฅผ ์์ฑํ๊ณ ๊ธฐ์กด ๋ ธ๋์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฃ์ง ๊ท์น API๋ ๋ ๋ ธ๋ ์ฌ์ด์ ๊ฒฝ๊ณ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์ฆ, ๋ ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๋ธ๋ก๊ทธ์์๋ ๋ ๊ฐ์ง ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ํ๋๋ ์ค์นด์ด๋ค์ด๋ธ ๋คํธ์ํฌ์ ์ํ์ง ์๋ ๋คํธ์ํฌ ๊ตฌ์ฑ ์์์ด๊ณ , ๋ ๋ฒ์งธ๋ ๋คํธ์ํฌ ๊ตฌ์ฑ ์์๊ฐ ์๋ ๊ตฌ์ฑ ์์์ ๋๋ค. ๊ทธ ์ ์ ํ ํด๋ก์ง ๊ท์น 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')"
}์ค์นด์ด๋ค์ด๋น ๋ฆฌ๋ธ ๋ง๋ค๊ธฐ
์์ง๋ฅผ ์์ฑํ๋ ค๋ฉด ์์ค ๋ ธ๋์ ๋์ ๋ ธ๋, ๊ทธ๋ฆฌ๊ณ ์์ง ๋งํฌ ์ ํ์ ์ง์ ํด์ผ ํฉ๋๋ค. ์์ ๋ ธ๋๋ฅผ ์์ฑํ๋ ค๋ฉด ๋งํฌ ์ ํ ๊ฐ์ด '์์ ๊ถ'์ด์ด์ผ ํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ ์ด์ด 2 ๋งํฌ๋ฅผ ์์ฑํ๋ ค๋ฉด ๋งํฌ ์ ํ ๊ฐ์ด '๋ ์ด์ด 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 ๋ช ๋ น์ ์ผ๋ถ๋ก ์ถ๊ฐํ๊ฑฐ๋, ๋์ค์ ํ๋ ์ด์์ update node rule ๋ช ๋ น์ ์์ฑํ ์ ์์ต๋๋ค.
๋ค์ ๋ ธ๋ ๊ท์น ๋ช ๋ น์ ์คํํ์ฌ ํ ํด๋ก์ง ๋ค์ด์ด๊ทธ๋จ์ ์ ์ฅ ์ฅ์น๋ฅผ ์ถ๊ฐํฉ๋๋ค.
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 rule ๋ช ๋ น์ ์คํํ์ฌ ์์ฑ๋ ๋ ธ๋๋ฅผ ํธ์คํธ ๋ ธ๋์ ์ฐ๊ฒฐํฉ๋๋ค.
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๊ณ์ธต ๋งํฌ๋ ์์ฑ๋์์ต๋๋ค. ์ต์ข ํ ํด๋ก์ง๋ ์๋ ์ด๋ฏธ์ง์ ๊ฐ์ต๋๋ค.

์ด์ ๋ ํธ์คํธ/์์ด์ ํธ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ฐ๊ฒฐ๋์์ผ๋ฉฐ ๋ ํธ์คํธ ๊ฐ์ ์ฐ๊ฒฐ์ ํ ์คํธํ๊ฑฐ๋ ์ต๋จ ๊ฒฝ๋ก ์บก์ฒ๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
P.S. ๋งํฌ
์ฐ๋ฆฌ๋ ์ค์นด์ด๋ค์ด๋ธ์ ๋ค๋ฅธ ๊ธฐ๋ฅ์ ๋ํ ๊ฒ์๋ฌผ์ ์ธ ์ ์๋ ์ฌ๋์ ์ฐพ๊ณ ์์ต๋๋ค.
skydive.network ์ ๊ณต.
์ถ์ฒ : habr.com
