Apicurio-studio: Kubernetes์—์„œ API ํŽธ์ง‘ ์—ฐ๊ฒฐ ๋Š๊น€

์— ๋งŒ๋“  2020๋…„ 06์›” 07์ผ  ยท  29์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Apicurio/apicurio-studio

์•ˆ๋…•ํ•˜์„ธ์š”. Ingress๋ฅผ ํ†ตํ•ด WS๋ฅผ ๋…ธ์ถœํ•˜๋Š” Kubernetes์—์„œ ์‹คํ–‰ํ•˜๋ ค๊ณ  ํ•  ๋•Œ #813์— ์„ค๋ช…๋œ ๋ฌธ์ œ์™€ ๋น„์Šทํ•œ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

WebSocket connection to 'ws://apicurio-ws.192.168.1.5.nip.io/ws/designs/2?uuid=68064b1e-f839-4973-b65e-89660d4a07d9&user=admin&secret=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJxRV9
COWQ4NFZS' failed: Error during WebSocket handshake: Unexpected response code: 404

๋ฐฐํฌํŒ/kubernetes์—์„œ kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„œ๋น„์Šค์— ๋Œ€ํ•ด ํ˜ธ์ŠคํŠธ๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ข‹์€ ์†Œ์‹! ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ PR์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ? @t-rap๊ณผ @jsenko ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

๋ชจ๋“  29 ๋Œ“๊ธ€

#813์˜ ์ •๋ณด๊ฐ€ ๋„์›€์ด ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๊ฐ™์€ ๋ฌธ์ œ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. @0x218 ์ด ์„ค์น˜์— ์ ์šฉํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด @t-rap์ด ์ƒ๊ฐ์ด ์žˆ์œผ์‹ ๊ฐ€์š”? ๋‚ด kubernetes ์ „๋ฌธ ์ง€์‹์€ ๊ทนํžˆ ์ œํ•œ์ ์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ œ์•ˆ๋œ Nginx Ingress @0x218 ์—์„œ ๋ฒ„์ „, ์—…๊ทธ๋ ˆ์ด๋“œ ๋ฐ ์—ฐ๊ฒฐ ํ—ค๋”๋ฅผ ์ ์šฉํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์›น ์†Œ์ผ“์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋” ์ž˜ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

-ws ํฌ๋“œ์—์„œ "์ „์ฒด" ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†” ์ถœ๋ ฅ ๋ฐ ์„œ๋ฒ„ ๋กœ๊ทธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ:

[ApiEditorPageComponent] Attempting to reconnect to the server.
main.a117148be57ecc117ff5.js:1 [ApisService] Getting an API Design: http://apicurio.192.168.1.5.nip.io/studio-api/designs/2
main.a117148be57ecc117ff5.js:1 [ApisService] Editing API Design: http://apicurio.192.168.1.5.nip.io/studio-api/designs/2/session
main.a117148be57ecc117ff5.js:1 [ApisService] Editing Session UUID: 0d50ffc8-1f69-41b0-b1f0-6c80a1771e00
main.a117148be57ecc117ff5.js:1 [ApisService] Content Version: 3
main.a117148be57ecc117ff5.js:1 [ApiEditorPageComponent] Definition loaded.  Opening editing session.
main.a117148be57ecc117ff5.js:1 [ApisService] Opening editing session on URL: ws://apicurio-ws.192.168.1.5.nip.io/ws/designs/2?uuid=0d50ffc8-1f69-41b0-b1f0-6c80a1771e00&user=admin&secret=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJCNlRDTFAxdkIz
main.a117148be57ecc117ff5.js:1 WebSocket connection to 'ws://apicurio-ws.192.168.1.5.nip.io/ws/designs/2?uuid=0d50ffc8-1f69-41b0-b1f0-6c80a1771e00&user=admin&secret=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJCNlRDTFAxdkIz' failed: Error during WebSocket handshake: Unexpected response code: 404
t.openEditingSession @ main.a117148be57ecc117ff5.js:1
(anonymous) @ main.a117148be57ecc117ff5.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
onInvoke @ main.a117148be57ecc117ff5.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
t.run @ polyfills.9c67d1be23abf75fea1a.js:1
(anonymous) @ polyfills.9c67d1be23abf75fea1a.js:1
e.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
onInvokeTask @ main.a117148be57ecc117ff5.js:1
e.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.runTask @ polyfills.9c67d1be23abf75fea1a.js:1
y @ polyfills.9c67d1be23abf75fea1a.js:1
t.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
_ @ polyfills.9c67d1be23abf75fea1a.js:1
m @ polyfills.9c67d1be23abf75fea1a.js:1
main.a117148be57ecc117ff5.js:1 [ApiEditingSession] WS connection to server CLOSED: CloseEventย {isTrusted: true, wasClean: false, code: 1006, reason: "", type: "close",ย โ€ฆ}
main.a117148be57ecc117ff5.js:1 [ApiEditorPageComponent] **Notice** editing session DROPPED!  Reason code: 1006
main.a117148be57ecc117ff5.js:1 [ApiEditorPageComponent] Attempting to reconnect to the server.
main.a117148be57ecc117ff5.js:1 [ApisService] Getting an API Design: http://apicurio.192.168.1.5.nip.io/studio-api/designs/2
main.a117148be57ecc117ff5.js:1 [ApisService] Editing API Design: http://apicurio.192.168.1.5.nip.io/studio-api/designs/2/session
main.a117148be57ecc117ff5.js:1 [ApisService] Editing Session UUID: 5eecf1e6-2a83-4940-bdb0-110240374093
main.a117148be57ecc117ff5.js:1 [ApisService] Content Version: 3
main.a117148be57ecc117ff5.js:1 [ApiEditorPageComponent] Definition loaded.  Opening editing session.
main.a117148be57ecc117ff5.js:1 [ApisService] Opening editing session on URL: ws://apicurio-ws.192.168.1.5.nip.io/ws/designs/2?uuid=5eecf1e6-2a83-4940-bdb0-110240374093&user=admin&secret=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJCNlRDTFAxdkIz
main.a117148be57ecc117ff5.js:1 WebSocket connection to 'ws://apicurio-ws.192.168.1.5.nip.io/ws/designs/2?uuid=5eecf1e6-2a83-4940-bdb0-110240374093&user=admin&secret=eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJCNlRDTFAxdkIz' failed: Error during WebSocket handshake: Unexpected response code: 404
t.openEditingSession @ main.a117148be57ecc117ff5.js:1
(anonymous) @ main.a117148be57ecc117ff5.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
onInvoke @ main.a117148be57ecc117ff5.js:1
e.invoke @ polyfills.9c67d1be23abf75fea1a.js:1
t.run @ polyfills.9c67d1be23abf75fea1a.js:1
(anonymous) @ polyfills.9c67d1be23abf75fea1a.js:1
e.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
onInvokeTask @ main.a117148be57ecc117ff5.js:1
e.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
t.runTask @ polyfills.9c67d1be23abf75fea1a.js:1
y @ polyfills.9c67d1be23abf75fea1a.js:1
t.invokeTask @ polyfills.9c67d1be23abf75fea1a.js:1
_ @ polyfills.9c67d1be23abf75fea1a.js:1
m @ polyfills.9c67d1be23abf75fea1a.js:1
main.a117148be57ecc117ff5.js:1 [ApiEditingSession] WS connection to server CLOSED: CloseEventย {isTrusted: true, wasClean: false, code: 1006, reason: "", type: "close",ย โ€ฆ}
main.a117148be57ecc117ff5.js:1 [ApiEditorPageComponent] **Notice** editing session DROPPED!  Reason code: 1006

ws ํฌ๋“œ ์ „์ฒด ๋กœ๊ทธ:

06-10 14:46:08,780 DEBUG [io.undertow.request.security] (default task-1) Authentication result was ATTEMPTED for /ws/designs/2
2020-06-10 14:46:08,781 DEBUG [io.undertow.request] (default task-1) Matched default handler path /ws/designs/2
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) PeriodicRecovery: background thread Status <== SCANNING
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) PeriodicRecovery: background thread scanning
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Periodic recovery first pass at Wed, 10 Jun 2020 14:46:11
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) processing /StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction transactions
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.CommitMarkableResourceRecordRecoveryModule<strong i="6">@7e04aa62</strong>' first pass processed
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) AtomicActionRecoveryModule first pass
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) processing /StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction transactions
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule<strong i="7">@3b062bc6</strong>' first pass processed
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.txoj] (Periodic Recovery) TORecoveryModule - first pass
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.txoj.recovery.TORecoveryModule<strong i="8">@29e089e5</strong>' first pass processed
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.SubordinateAtomicActionRecoveryModule<strong i="9">@5f676b11</strong>' first pass processed
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) XARecoveryModule state change IDLE->FIRST_PASS

2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) Local XARecoveryModule - first pass
2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) XARecoveryModule state change FIRST_PASS->BETWEEN_PASSES

2020-06-10 14:46:11,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule<strong i="10">@5ad9faef</strong>' first pass processed
2020-06-10 14:46:20,674 DEBUG [io.undertow.request] (default I/O-2) Matched default handler path /ws/designs/2
2020-06-10 14:46:20,675 DEBUG [io.undertow.request.security] (default task-1) Attempting to authenticate /ws/designs/2, authentication required: false
2020-06-10 14:46:20,675 DEBUG [io.undertow.request.security] (default task-1) Authentication outcome was NOT_ATTEMPTED with method io.undertow.security.impl.CachedAuthenticatedSessionMechanism<strong i="11">@59a16760</strong> for /ws/designs/2
2020-06-10 14:46:20,675 DEBUG [io.undertow.request.security] (default task-1) Authentication result was ATTEMPTED for /ws/designs/2
2020-06-10 14:46:20,675 DEBUG [io.undertow.request] (default task-1) Matched default handler path /ws/designs/2
2020-06-10 14:46:21,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Periodic recovery second pass at Wed, 10 Jun 2020 14:46:21
2020-06-10 14:46:21,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.CommitMarkableResourceRecordRecoveryModule<strong i="12">@7e04aa62</strong>' second pass processed
2020-06-10 14:46:21,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) AtomicActionRecoveryModule second pass
2020-06-10 14:46:21,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule<strong i="13">@3b062bc6</strong>' second pass processed
2020-06-10 14:46:21,291 DEBUG [com.arjuna.ats.txoj] (Periodic Recovery) TORecoveryModule - second pass
2020-06-10 14:46:21,291 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.txoj.recovery.TORecoveryModule<strong i="14">@29e089e5</strong>' second pass processed
2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.SubordinateAtomicActionRecoveryModule<strong i="15">@5f676b11</strong>' second pass processed
2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) XARecoveryModule state change BETWEEN_PASSES->SECOND_PASS

2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) Local XARecoveryModule - second pass
2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) Local XARecoveryModule.transactionInitiatedRecovery completed
2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) Local XARecoveryModule.resourceInitiatedRecovery completed
2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) XARecoveryModule state change SECOND_PASS->IDLE

2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule<strong i="16">@5ad9faef</strong>' second pass processed
2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) PeriodicRecovery: background thread Status <== INACTIVE
2020-06-10 14:46:21,292 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) PeriodicRecovery: background thread backing off

๊ทธ๋ ‡๋‹ค๋ฉด ๋ฌด์—‡์ด ์ž˜๋ชป๋˜๊ณ  ์žˆ๋Š”์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. -ws ๋ฐ -api ํฌ๋“œ๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋„๋ก ์š”์ฒญํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—ฐ๊ฒฐ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ -ws ํฌ๋“œ ๋กœ๊ทธ์— ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋˜๊ณ  404๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ Ingress ๋ฌธ์ œ์ธ ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ๋„์›€์ด ๋  ๋งŒํผ k8์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค! :(

๋˜ํ•œ NodePort๋ฅผ ํ†ตํ•ด ์ง์ ‘ ws pod๋ฅผ ๋…ธ์ถœํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ–ˆ๋‹ค.

๋‹ค์‹œ ์‹œ๋„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋†’์ด๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋ ๊นŒ์š”?

๊ทธ๊ฒƒ์€ ์ƒ์ฒ˜๋ฅผ ์ค„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. -ws ๊ตฌ์„ฑ ์š”์†Œ์— ํ™œ์„ฑํ™”๋œ ์ธ์ฆ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ธ์ฆ์— ๋Œ€ํ•œ -ws ๋กœ๊ทธ์— ์ œ๊ฐ€ ์ž˜ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ๋‚ด์šฉ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์–ด์ฉŒ๋ฉด ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋†’์ด๋ฉด ๋” ๋งŽ์€ ๊ฒƒ์„ ๋ฐํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋กœ๊ทธ ์ˆ˜์ค€์„ ์–ด๋Š ์ˆ˜์ค€์œผ๋กœ ๋†’์—ฌ์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์•„๋งˆ๋„ DEBUG๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด์‹ญ์‹œ์˜ค. :)

๋””๋ฒ„๊ทธ๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ ์ˆ˜์ค€์„ ๋†’์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์œ ์ตํ•œ ๋กœ๊ทธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ

cloak.adapters.OAuthRequestAuthenticator] (default task-2) there was no code
2020-06-13 22:20:10,628 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-2) redirecting to auth server
2020-06-13 22:20:10,628 DEBUG [org.keycloak.adapters.undertow.ServletSessionTokenStore] (default task-3) session was null, returning null
2020-06-13 22:20:10,628 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-3) there was no code
2020-06-13 22:20:10,628 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-3) redirecting to auth server
2020-06-13 22:20:10,628 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-2) callback uri: http://apicurio-studio-ui.192.168.1.5.nip.io/version.js
2020-06-13 22:20:10,628 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-3) callback uri: http://apicurio-studio-ui.192.168.1.5.nip.io/config.js
2020-06-13 22:20:10,628 DEBUG [io.undertow.request.security] (default task-2) Authentication outcome was NOT_ATTEMPTED with method org.keycloak.adapters.wildfly.WildflyAuthenticationMechanism<strong i="7">@26c8577b</strong> for /version.js
2020-06-13 22:20:10,628 DEBUG [io.undertow.request.security] (default task-2) Authentication result was ATTEMPTED for /version.js
2020-06-13 22:20:10,628 DEBUG [io.undertow.request.security] (default task-3) Authentication outcome was NOT_ATTEMPTED with method org.keycloak.adapters.wildfly.WildflyAuthenticationMechanism<strong i="8">@26c8577b</strong> for /config.js
2020-06-13 22:20:10,628 DEBUG [io.undertow.request.security] (default task-3) Sending authentication challenge for HttpServerExchange{ GET /config.js}
2020-06-13 22:20:10,628 DEBUG [io.undertow.request] (default task-2) Matched default handler path /version.js
2020-06-13 22:20:10,628 DEBUG [org.keycloak.adapters.AuthenticatedActionsHandler] (default task-2) AuthenticatedActionsValve.invoke http://apicurio-studio-ui.192.168.1.5.nip.io/version.js
2020-06-13 22:20:10,629 DEBUG [org.keycloak.adapters.AuthenticatedActionsHandler] (default task-2) Policy enforcement is disabled.
2020-06-13 22:20:10,629 DEBUG [io.undertow.session] (default task-3) Created session with id oIOfXf1RPvC2PBpI4dTuVZKYk7f8BDg0XUAFHWrC for exchange HttpServerExchange{ GET /config.js}
2020-06-13 22:20:10,629 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-3) Sending redirect to login page: http://keycloak-microcks.192.168.1.5.nip.io/auth/realms/Apicurio/protocol/openid-connect/auth?response_type=code&client_id=apicurio-studio&redirect_uri=http%3A%2F%2Fapicurio-studio-ui.192.168.1.5.nip.io%2Fconfig.js&state=3e4e092e-bc54-4802-a517-d3462de6f343&login=true&scope=openid
2020-06-13 22:20:10,629 DEBUG [io.undertow.request.security] (default task-3) Authentication result was CHALLENGE_SENT for /config.js
2020-06-13 22:21:00,918 DEBUG [io.undertow.request] (default I/O-2) Timing out idle connection from /10.1.94.1:41180
2020-06-13 22:21:00,918 DEBUG [io.undertow.request] (default I/O-2) Timing out idle connection from /10.1.94.1:41178
2020-06-13 22:21:48,749 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) PeriodicRecovery: background thread Status <== SCANNING
2020-06-13 22:21:48,749 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) PeriodicRecovery: background thread scanning
2020-06-13 22:21:48,749 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Periodic recovery first pass at Sat, 13 Jun 2020 22:21:48
2020-06-13 22:21:48,750 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) processing /StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction transactions
2020-06-13 22:21:48,750 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.CommitMarkableResourceRecordRecoveryModule<strong i="9">@3bc2db45</strong>' first pass processed
2020-06-13 22:21:48,750 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) AtomicActionRecoveryModule first pass
2020-06-13 22:21:48,750 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) processing /StateManager/BasicAction/TwoPhaseCoordinator/AtomicAction transactions
2020-06-13 22:21:48,750 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.arjuna.recovery.AtomicActionRecoveryModule<strong i="10">@7ec04259</strong>' first pass processed
2020-06-13 22:21:48,750 DEBUG [com.arjuna.ats.txoj] (Periodic Recovery) TORecoveryModule - first pass
2020-06-13 22:21:48,750 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.txoj.recovery.TORecoveryModule<strong i="11">@1a9ffeac</strong>' first pass processed
2020-06-13 22:21:48,751 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.SubordinateAtomicActionRecoveryModule<strong i="12">@1aa1c748</strong>' first pass processed
2020-06-13 22:21:48,751 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) XARecoveryModule state change IDLE->FIRST_PASS

2020-06-13 22:21:48,751 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) Local XARecoveryModule - first pass
2020-06-13 22:21:48,751 DEBUG [com.arjuna.ats.jta] (Periodic Recovery) XARecoveryModule state change FIRST_PASS->BETWEEN_PASSES

2020-06-13 22:21:48,751 DEBUG [com.arjuna.ats.arjuna] (Periodic Recovery) Recovery module 'com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule<strong i="13">@5b07f3c7</strong>' first pass processed

๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค.

main.a117148โ€ฆ.js:1 [ApiEditingSession] WS connection to server CLOSED: 
CloseEvent {isTrusted: true, wasClean: false, code: 1006, reason: "", type: "close", โ€ฆ}
bubbles: false
cancelBubble: false
cancelable: false
code: 1006
composed: false
currentTarget: WebSocket {__zone_symbol__openfalse: Array(1), __zone_symbol__messagefalse: Array(1), __zone_symbol__ON_PROPERTYopen: ฦ’, __zone_symbol__ON_PROPERTYmessage: ฦ’, __zone_symbol__ON_PROPERTYclose: ฦ’, โ€ฆ}
defaultPrevented: false
eventPhase: 0
isTrusted: true
path: []
reason: ""
returnValue: true
srcElement: WebSocket {__zone_symbol__openfalse: Array(1), __zone_symbol__messagefalse: Array(1), __zone_symbol__ON_PROPERTYopen: ฦ’, __zone_symbol__ON_PROPERTYmessage: ฦ’, __zone_symbol__ON_PROPERTYclose: ฦ’, โ€ฆ}
target: WebSocket {__zone_symbol__openfalse: Array(1), __zone_symbol__messagefalse: Array(1), __zone_symbol__ON_PROPERTYopen: ฦ’, __zone_symbol__ON_PROPERTYmessage: ฦ’, __zone_symbol__ON_PROPERTYclose: ฦ’, โ€ฆ}
timeStamp: 1177278.1400000094
type: "close"
wasClean: false
__proto__: CloseEvent

์›น ์†Œ์ผ“ ์‹œ์ฆŒ์ด ์˜ค๋ฅ˜ ์ฝ”๋“œ 1006์œผ๋กœ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

ํฌํ•จ๋œ ์„œ๋ฒ„ ๋กœ๊ทธ๋Š” ์‹ค์ œ๋กœ $#$ -ws -ui $ ํฌ๋“œ์˜ ๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ์ฝ”๋“œ 1006์€ ์›น ์†Œ์ผ“์ด ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ๋น„์ •์ƒ์ ์œผ๋กœ ๋‹ซํ˜”์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. :( ๊ทธ๋ฆฌ๊ณ  ์Šฌํ”„๊ฒŒ๋„ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋‹น์‹ ์—๊ฒŒ ์ด์œ ๋ฅผ ์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ์ •๋ณด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

https://stackoverflow.com/questions/19304157/getting-the-reason-why-websockets-closed-with-close-code-1006

๋‹น์‹ ์ด ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์ผ์ข…์˜ ์›น ์†Œ์ผ“ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ์ฐพ์•„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ง„๋‹จ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์œผ๋กœ ๊ฒ€์ƒ‰๋œ ๋กœ๊ทธ

kubectl logs apicurio-studio-ws-7c458cf8d8-cgscc

๋‚ด๊ฐ€ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ํŠน์ • ๋กœ๊ทธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์›น ์†Œ์ผ“ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

https://websocket.org/echo.html ๋ฅผ ํ†ตํ•ด ์›น ์†Œ์ผ“์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

๋‚ด ์ปดํ“จํ„ฐ์— ws ์—ฐ๊ฒฐ ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์œ„์— ๊ฒŒ์‹œํ•œ ์ถœ๋ ฅ์ด config.js ๋ฐ version.js ์— ๋Œ€ํ•œ ์š”์ฒญ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ keycloak ์ธ์ฆ ๋ฆฌ๋””๋ ‰์…˜ ๋ฐ ๊ธฐํƒ€ keycloak ๊ด€๋ จ ์ถœ๋ ฅ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ง ์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ UI๊ฐ€ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. websocket ๊ตฌ์„ฑ ์š”์†Œ์—๋Š” Keycloak์ด ์ „ํ˜€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ธ ๊ฐœ์˜ ํŒŸ(Pod) ๋ชจ๋‘ ์—์„œ ๋กœ๊ทธ ์ถœ๋ ฅ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ํฅ๋ฏธ๋กœ์šธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์‹ค์ œ๋กœ ํฌ๋“œ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

์›น ์†Œ์ผ“ ํ…Œ์ŠคํŠธ์— ๊ด€ํ•ด์„œ. ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๊ณ  ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๋Š”์ง€ ๋ณด์‹ญ์‹œ์˜ค. ์ž‘๋™ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

image

"์—ฐ๊ฒฐ" ๋‹จ๊ณ„์—์„œ ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๋ฉด ์ดˆ๊ธฐ ์—ฐ๊ฒฐ์ด ์‹คํŒจํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

websocket.org์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ websocket์„ ํ…Œ์ŠคํŠธํ•˜๊ณ  ํ•˜๋“œ ๋“œ๋ผ์ด๋ธŒ์— websocket.html๋กœ ์ €์žฅํ•˜์—ฌ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์—์„œ ws ํฌ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์—์„œ ws์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ณต๊ฐœ ์›น ์†Œ์ผ“์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
wss://studio-ws.apicur.io/designs . ๋”ฐ๋ผ์„œ ์›น ์†Œ์ผ“ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.

์ฒจ๋ถ€ ํŒŒ์ผ์— ์žˆ๋Š” ๋ชจ๋“  ๋กœ๊ทธ๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

kubectl ๋กœ๊ทธ apicurio-studio-ui-5c6f5df485-lcdxp > apicurio-studio-ui.log
kubectl ๋กœ๊ทธ apicurio-studio-ws-77dc7f7b87-57dcs > apicurio-studio-ws.log
kubectl ๋กœ๊ทธ apicurio-studio-api-79d9d799cb-mgsmx > apicurio-studio-api.log

apicurio-studio-api.log
apicurio-studio-ui.log
apicurio-studio-ws.log

๋“œ๋””์–ด ์ž‘๋™ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค! NodePort๋ฅผ ํ†ตํ•ด ws ํฌ๋“œ๋ฅผ ์ง์ ‘ ๋…ธ์ถœํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋ฌธ์ œ๊ฐ€ ์ˆ˜์‹  ๊ตฌ์„ฑ์— ์žˆ์Œ์„ ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค.

์—„์ฒญ๋‚œ!! (ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ ) ์ถ”์ง„ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋” ๋งŽ์€ ๋„์›€์„ ๋“œ๋ฆฌ์ง€ ๋ชปํ•ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋‚ด kubernetes ์ง€์‹ ์ˆ˜์ค€์ด ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์ž‘๋™ํ•˜๋„๋ก ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ YAML ๊ตฌ์„ฑ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ๊ฒฐ๊ตญ Apicurio Studio๋ฅผ ์œ„ํ•œ ์˜คํผ๋ ˆ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์ด ์–ธ์ œ ์ผ์–ด๋‚ ์ง€ ์ €๋Š” ์ •ํ™•ํžˆ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

์†”์งํžˆ ๋งํ•ด์„œ ํŠน์ • yaml ๊ตฌ์„ฑ์„ ๋งŒ๋“ค์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

ws pods 8080 ํฌํŠธ๊ฐ€ ์ž„์˜ ํฌํŠธ์˜ ๋จธ์‹  IP์— ๋…ธ์ถœ๋จ์„ ์˜๋ฏธํ•˜๋Š” NodePort ์„œ๋น„์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ NodePort๋ฅผ ๋งŒ๋“  ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
kubectl expose deployment apicurio-studio-ws --type NodePort --name test

์ปดํ“จํ„ฐ IP:32204๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ์ž„์˜์˜ ํฌํŠธ 32204๋ฅผ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค.

kubectl์€ svc๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.

NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
test                           NodePort    10.152.183.2     <none>        8080:32204/TCP   10h

๋‚˜๋Š” ์—ฌ์ „ํžˆ NodePort ํฌํŠธ๊ฐ€ ๋ฌด์ž‘์œ„์ด๊ณ  apicurio-configmap.yaml ์—์„œ ๋ฏธ๋ฆฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ingress nginx๊ฐ€ websocket์„ ๋…ธ์ถœํ•˜๋Š” ๋ฐ ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ๋ฒ•์ด์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ฒฝ์šฐ์—๋Š”

apicurio-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: apicurio-configmap
data:
  apicurio-db-connection-url: jdbc:mysql://apicuriodb:3306/apicuriodb
  apicurio-kc-client-id: apicurio-studio
  apicurio-kc-realm: Apicurio
  apicurio-microcks-api-url: http://microcks-microcks.192.168.1.5.nip.io/api
  apicurio-microcks-client-id: microcks-serviceaccount
  apicurio-ui-editing-url: ws://192.168.1.5:32204/
  apicurio-ui-feature-microcks: "true"
  apicurio-ui-feature-share-with-everyone: "true"
  apicurio-ui-hub-api-url: http://apicurio.192.168.1.5.nip.io/studio-api
  apicurio-ui-logout-redirect-uri: /
  keycloak-url: http://keycloak-microcks.192.168.1.5.nip.io/auth

์•„์ฃผ ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. nginx ์ ‘๊ทผ ๋ฐฉ์‹์ด ํšจ๊ณผ๊ฐ€ ์—†๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. :( ํ•˜์ง€๋งŒ ๋‹น์‹ ์ด ๋ญ”๊ฐ€ ์ž‘๋™ํ•˜๊ฒŒ ๋˜์–ด์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

ingress๋ฅผ ํ†ตํ•ด ws pod๋ฅผ ๋…ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด ์†”๋ฃจ์…˜์€ ํ›จ์”ฌ ๋” ๊ตฌ์„ฑ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Screen Shot 2020-06-19 at 1 40 21 AM

์ด ์†”๋ฃจ์…˜์—์„œ๋Š” ์ˆ˜์‹ ์„ ํ†ตํ•ด WS ํฌ๋“œ์— ๋Œ€ํ•œ ๋ณ„๋„์˜ URL์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

ํ‰๊ฐ€๋ฅผ ์œ„ํ•œ PR์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ด, ํŒŒํ‹ฐ์— ๋Šฆ์–ด์„œ ๋ฏธ์•ˆํ•ด.

@cemnura ์–ด๋–ค ์ธ๊ทธ๋ ˆ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์–ด๋–ค ๋ฒ„์ „์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

nginx-ingress-controller๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋งŽ์€ ์ˆ˜์ •๊ณผ ๋ณ€๊ฒฝ์ด ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ๊ฐ€์ง€ ์ด์ƒํ•œ ์ ์€ ์›น ์†Œ์ผ“ ๋™์ž‘, ํŠนํžˆ http/https ๊ฐ„์— ์ „ํ™˜ํ•˜๋ ค๊ณ  ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค.

@EricWittmann ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํŒจ์น˜ ๋ฒ„์ „์ด ์ž‘๋™ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(nginx-ingress-version์ด ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ๋จ).

์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. @t-rap

์•ˆ๋…•ํ•˜์„ธ์š” @t-rap ์ œ๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ nginx-ingress-controller-amd64 ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” microk8s Kubernetes๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Name:         nginx-ingress-microk8s-controller-nd8vb
Namespace:    ingress
Priority:     0
Node:         mccloud/192.168.1.5
Start Time:   Tue, 02 Jun 2020 23:12:28 +0300
Labels:       controller-revision-hash=59cb5dd586
              name=nginx-ingress-microk8s
              pod-template-generation=1
Annotations:  <none>
Status:       Running
IP:           192.168.1.5
IPs:
  IP:           192.168.1.5
Controlled By:  DaemonSet/nginx-ingress-microk8s-controller
Containers:
  nginx-ingress-microk8s:
    Container ID:  containerd://3219d168e8fbb190acd214ab651f781f6adf51adcc2302891636a5ff250ef15f
    Image:         quay.io/kubernetes-ingress-controller/nginx-ingress-controller-amd64:0.25.1
    Image ID:      sha256:2b8ed1f2046d4b37c18cca2ecc4f435b6618d2d198c0c8bf617954e863cc5832
    Ports:         80/TCP, 443/TCP
    Host Ports:    80/TCP, 443/TCP
    Args:
      /nginx-ingress-controller
      --configmap=$(POD_NAMESPACE)/nginx-load-balancer-microk8s-conf
      --publish-status-address=127.0.0.1
    State:          Running
      Started:      Fri, 12 Jun 2020 15:08:07 +0300
    Last State:     Terminated
      Reason:       Completed
      Exit Code:    0
      Started:      Wed, 10 Jun 2020 23:37:02 +0300
      Finished:     Fri, 12 Jun 2020 15:08:03 +0300
    Ready:          True
    Restart Count:  187
    Liveness:       http-get http://:10254/healthz delay=30s timeout=5s period=10s #success=1 #failure=3
    Environment:
      POD_NAME:       nginx-ingress-microk8s-controller-nd8vb (v1:metadata.name)
      POD_NAMESPACE:  ingress (v1:metadata.namespace)
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from nginx-ingress-microk8s-serviceaccount-token-r6md6 (ro)
Conditions:
  Type              Status
  Initialized       True 
  Ready             True 
  ContainersReady   True 
  PodScheduled      True 
Volumes:
  nginx-ingress-microk8s-serviceaccount-token-r6md6:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  nginx-ingress-microk8s-serviceaccount-token-r6md6
    Optional:    false
QoS Class:       BestEffort
Node-Selectors:  <none>
Tolerations:     node.kubernetes.io/disk-pressure:NoSchedule
                 node.kubernetes.io/memory-pressure:NoSchedule
                 node.kubernetes.io/network-unavailable:NoSchedule
                 node.kubernetes.io/not-ready:NoExecute
                 node.kubernetes.io/pid-pressure:NoSchedule
                 node.kubernetes.io/unreachable:NoExecute
                 node.kubernetes.io/unschedulable:NoSchedule
Events:          <none>

@cemnura ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.
๋‚ด๊ฐ€ ๋งŒ๋“  ํฌํฌ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ(์•„๋ž˜ ์ฐธ์กฐ)? (๋‹ค์‹œ) ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

๋‚˜๋Š” ingress-nginx-controller ๋ฒ„์ „ 0.24.1 ๋ฐ apicurio-studio 0.2.44.Final์„ ์‚ฌ์šฉํ•˜์—ฌ https://github.com/t-rap/apicurio-studio-981/ ์—์„œ ๊ตฌ์„ฑ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ws์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํ•˜์œ„ ๊ฒฝ๋กœ์ด๊ธฐ ๋•Œ๋ฌธ์— ingress apicurio-studio-ws์— ํ•˜์œ„ ๊ฒฝ๋กœ "/designs"๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ingress-controller 0.25.1๊ณผ apicurio-studio 0.2.46.Final์— ๋Œ€ํ•œ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์ฃผ๋ง์— ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ธ๊ทธ๋ ˆ์Šค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ kubernetes์— ์˜ํ•ด ์œ ์ง€ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ธ์‹ํ•ด์•ผ ํ•  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ตฌ์„ฑ ์Šค๋‹ˆํŽซ๋„ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

์™„๋ฃŒ๋˜๋ฉด ์—…๋ฐ์ดํŠธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

ํ•ด๋ณผ๊ฒŒ @t-rap ๐Ÿ‘

์ œ๊ณต๋œ Kubernetes ๋งค๋‹ˆํŽ˜์ŠคํŠธ @t-rap์„ ์‚ฌ์šฉํ•˜์—ฌ ui ํฌ๋“œ์™€ ๋™์ผํ•œ URL์— ws ํฌ๋“œ๋ฅผ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ช‡ ๊ฐ€์ง€ ์‚ฌ์†Œํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ws pod ์ˆ˜์‹  ์ด๋ฆ„์„ apicurio-studio-ws ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/Apicurio/apicurio-studio/blob/17a8e6bc21cae5a90aebb1a7a0e64350aeb30f57/distro/kubernetes/apicurio-studio-ingresses.yaml#L38 -L41

apicurio-ui-editing-url ํ‚ค์˜ apicurio-configmap.yaml ์—์„œ /ws ์ ‘๋ฏธ์‚ฌ๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/Apicurio/apicurio-studio/blob/17a8e6bc21cae5a90aebb1a7a0e64350aeb30f57/distro/kubernetes/apicurio-configmap.yaml#L9

apicurio-studio-ingresses.yaml ์˜ ์ˆ˜์‹  ๊ตฌ์„ฑ์—์„œ /ws ๊ฒฝ๋กœ๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ๋‚ด ๊ตฌ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค

apicurio-configmap.yaml

apiVersion: v1
kind: ConfigMap
metadata:
  name: apicurio-configmap
data:
  apicurio-db-connection-url: jdbc:mysql://apicuriodb:3306/apicuriodb
  apicurio-kc-client-id: apicurio-studio
  apicurio-kc-realm: Apicurio
  apicurio-microcks-api-url: http://microcks-microcks.192.168.1.5.nip.io/api
  apicurio-microcks-client-id: microcks-serviceaccount
  apicurio-ui-editing-url: ws://apicurio.192.168.1.5.nip.io
  apicurio-ui-feature-microcks: "true"
  apicurio-ui-feature-share-with-everyone: "true"
  apicurio-ui-hub-api-url: http://apicurio.192.168.1.5.nip.io/studio-api
  apicurio-ui-logout-redirect-uri: /
  keycloak-url: http://keycloak-microcks.192.168.1.5.nip.io/auth

apicurio-studio-ingresses.yaml

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: apicurio-studio-api
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /$1
  labels:
    module: apicurio-studio-api
spec:
  rules:
  - host: apicurio.192.168.1.5.nip.io
    http:
      paths:
      - backend:
          serviceName: "apicurio-studio-api"
          servicePort: 8091
        path: /studio-api/?(.*)
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: apicurio-studio-ui
  labels:
    module: apicurio-studio-ui
spec:
  rules:
    - host: apicurio.192.168.1.5.nip.io
      http:
        paths:
          - backend:
              serviceName: "apicurio-studio-ui"
              servicePort: 8093
            path: /
---
kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: apicurio-studio-ws
  annotations:
  labels:
    module: apicurio-studio-ws
spec:
  rules:
    - host: apicurio.192.168.1.5.nip.io
      http:
        paths:
          - backend:
              serviceName: "apicurio-studio-ws"
              servicePort: 8092
            path: /designs

์ข‹์€ ์†Œ์‹! ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ PR์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๊นŒ? @t-rap๊ณผ @jsenko ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰