성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] The Windows Registry Adventure #1: ...
[정성태] systemd for Developers I ; https:/...
[정성태] 엄밀히 object 타입의 인스턴스가 다른 타입으로 형변환 가능...
[정성태] 아래의 글에서 나오는 "Windows Application Pa...
[정성태] The history of calling conventions,...
[정성태] Secure and Deploy .NET Windows Form...
[정성태] Get Started with Milvus Vector DB i...
[정성태] cyberark/PipeViewer - A tool that...
[정성태] WinForms in a 64-Bit world – our st...
[정성태] 예제에서 SELECT_SQL도 내부적으로는 SqlCommand/...
글쓰기
제목
이름
암호
전자우편
HTML
홈페이지
유형
제니퍼 .NET
닷넷
COM 개체 관련
스크립트
VC++
VS.NET IDE
Windows
Team Foundation Server
디버깅 기술
오류 유형
개발 환경 구성
웹
기타
Linux
Java
DDK
Math
Phone
Graphics
사물인터넷
부모글 보이기/감추기
내용
<div style='display: inline'> <h1 style='font-family: Malgun Gothic, Consolas; font-size: 20pt; color: #006699; text-align: center; font-weight: bold'>Docker Desktop for Windows 기반의 Kubernetes 구성 - WSL 2 인스턴스에 kind 도구로 k8s 클러스터 구성</h1> <p> 이전 글을 통해 "Docker Desktop for Windows" 환경에서 쉽게 k8s 구성을 실습할 수 있었는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Docker Desktop for Windows에서 DockerDesktopVM 기반의 Kubernetes 구성 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12575'>https://www.sysnet.pe.kr/2/0/12575</a> </pre> <br /> 위의 글은 DockerDesktopVM 기반이었지만, 새롭게 WSL 2로의 통합 환경에서 k8s를 구성하는 것도 가능합니다.<br /> <br /> 하지만 아쉽게도 제 경우에 아래의 이유로 실패를 했는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > WSL 2 기반으로 "Enable Kubernetes" 활성화 시 초기화 실패 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12571'>https://www.sysnet.pe.kr/2/0/12571</a> </pre> <br /> ^^ 상관없습니다. 그냥 k8s를 구성해도 되기 때문입니다. (아마도 저 문제가 해결되면 저 방법으로 하는 것이 더 좋겠지만!) 어차피 Docker Desktop for Windows의 목적 자체가 로컬 개발 환경인데다, k8s 클러스터를 그런 환경으로 빠르게 구축해 주는 <a target='tab' href='https://github.com/kubernetes-sigs/kind'>kind</a>라는 도구가 있으므로 환경 구성이 매우 쉽습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > WSL+Docker: Kubernetes on the Windows Desktop ; <a target='tab' href='https://kubernetes.io/blog/2020/05/21/wsl-docker-kubernetes-on-the-windows-desktop/'>https://kubernetes.io/blog/2020/05/21/wsl-docker-kubernetes-on-the-windows-desktop/</a> Kind를 이용한 쿠버네티스 클러스터 만들기 ; <a target='tab' href='https://jupilhwang.github.io/post/kind%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0/'>https://jupilhwang.github.io/post/kind%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4-%ED%81%B4%EB%9F%AC%EC%8A%A4%ED%84%B0-%EB%A7%8C%EB%93%A4%EA%B8%B0/</a> </pre> <br /> kind를 이용해 직접 WSL 2 환경에서 k8s를 운영하면 좋은 한 가지 이점이라면, Hyper-V에서 더 이상 "DockerDesktopVM" 인스턴스가 (필요가 없으므로) 올라오지 않는다는 점입니다.<br /> <br /> 반면 kind를 이용해 k8s를 구성할 때 한 가지 단점이라면 DockerDesktopVM을 사용할 때와는 달리 WSL 2를 사용하는 경우 약간 혼란스러울 수 있다는 점입니다. DockerDesktopVM을 사용하면 해당 VM에 설치된 리눅스 인스턴스에 (공식적으로) 접근할 수 있는 방법이 없으므로 모든 구성을 윈도우 측의 kubectl.exe, docker.exe를 이용해 통합/구성하게 됩니다. 반면 WSL 2를 이용해 docker/k8s + kind로 구성하면 docker/kubectl 명령을 WSL 2와 윈도우 호스트 측 모두에서 사용 가능하다는 차이점이 발생합니다.<br /> <br /> 여기서 문제는, docker의 경우 "Use the WSL 2 based engine" 옵션 덕분에 잘 통합이 되어서 WSL 2와 윈도우 호스트 측에서 실행할 때 단일한 docker 인스턴스로 작업을 하는 반면, kind의 경우에는 WSL 2와 윈도우 호스트 측에서 실행할 때 각기 별개의 k8s 클러스터를 생성한다는 것입니다.<br /> <br /> 이게 어떤 상황인지 좀 더 자세하게 살펴보겠습니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> 이미 언급한 대로 kind 구성은, 1) WSL 2 인스턴스 내에서 할 수도 있고, 2) 윈도우 호스트 측에서 실행하는 것도 가능합니다. 우선, WSL 2 내에서 kind를 실행해 k8s 클러스터를 구성해 보겠습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > /* kind 실행 모듈 다운로드 */ $ <span style='color: blue; font-weight: bold'>curl -Lo ./kind https://github.com/kubernetes-sigs/kind/releases/download/v0.10.0/kind-linux-amd64</span> $ <span style='color: blue; font-weight: bold'>chmod +x ./kind</span> $ <span style='color: blue; font-weight: bold'>sudo mv ./kind /usr/local/bin/</span> /* kind로 클러스터 구성 */ $ <span style='color: blue; font-weight: bold'>kind create cluster --name mycluster1</span> Creating cluster "mycluster1" ... ✓ Ensuring node image (kindest/node:v1.17.0) 🖼 ✓ Preparing nodes 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 Set kubectl context to "kind-mycluster1" You can now use your cluster with: kubectl cluster-info --context mycluster1 Not sure what to do next? 😅 Check out https://kind.sigs.k8s.io/docs/user/quick-start/ </pre> <br /> 저게 끝입니다. kind는 "create cluster ..." 명령어로 이미 k8s 클러스터 관련한 모든 구성을 완료합니다. 이렇게 구성한 "mycluster1" 클러스터에 대한 정보는 이렇게 알아낼 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>kubectl cluster-info</span> Kubernetes master is running at https://127.0.0.1:39339 KubeDNS is running at https://127.0.0.1:39339/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. $ <span style='color: blue; font-weight: bold'>kubectl config view</span> apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://127.0.0.1:39339 name: kind-mycluster1 contexts: - context: cluster: kind-mycluster1 user: kind-mycluster1 name: kind-mycluster1 current-context: kind-mycluster1 kind: Config preferences: {} users: - name: kind-mycluster1 user: client-certificate-data: REDACTED client-key-data: REDACTED </pre> <br /> 즉, kind가 하는 일은 k8s 클러스터를 위한 모든 서비스를 구성하고, 현재 사용자의 프로파일 디렉터리(<span class="tex2jax_ignore">$</span>HOME/.kube)에 config 파일을 만들어 해당 클러스터에 대한 연결 정보를 구성합니다. <br /> <br /> 참고로, WSL 2에서 실행한 kind는 윈도우 호스트 환경을 인식하지는 않으므로 kubectl.exe 명령을 윈도우 호스트 측에서 실행하면 다음과 같은 출력이 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\knd> <span style='color: blue; font-weight: bold'>kubectl config view</span> apiVersion: v1 clusters: null contexts: null current-context: "" kind: Config preferences: {} users: null c:\temp\knd> <span style='color: blue; font-weight: bold'>kubectl get pods</span> Unable to connect to the server: dial tcp [::1]:<span style='color: blue; font-weight: bold'>8080</span>: connectex: No connection could be made because the target machine actively refused it. </pre> <br /> 그래서 이런 경우에는 WSL 2 인스턴스 측에서 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12566#kubectl_proxy'>kubectl proxy</a>를 실행해 두면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>kubectl proxy -p=8080</span> Starting to serve on 127.0.0.1:8080 </pre> <br /> (<a target='tab' href='https://www.sysnet.pe.kr/2/0/12347'>WSL 2의 네트워크 구성의 특징에 따라</a>) 윈도우 호스트 측에서 kubectl이 정상적으로 실행됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > C:\temp> <span style='color: blue; font-weight: bold'>kubectl run nginx-app --image nginx --port=80</span> pod/nginx-app created C:\temp> <span style='color: blue; font-weight: bold'>kubectl get pods</span> NAME READY STATUS RESTARTS AGE nginx-app 1/1 Running 0 16s C:\temp> <span style='color: blue; font-weight: bold'>kubectl expose pod nginx-app --type=NodePort</span> service/nginx-app exposed C:\temp> <span style='color: blue; font-weight: bold'>kubectl get svc</span> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 16h nginx-app NodePort 10.96.199.21 <none> 80:32539/TCP 6s /* 삭제 kubectl delete svc nginx-app kubectl delete pod nginx-app kind delete cluster --name mycluster1 */ </pre> <br /> <hr style='width: 50%' /><br /> <br /> 위에서는 WSL 2 인스턴스 환경 내에서 kind를 실행해 클러스터를 생성했지만, 윈도우 호스트 측에서 하는 것도 가능합니다. 이를 위해 PowerShell을 이용해 chocolatey 패키지 관리자를 먼저 설치한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Running kind in Windows ; <a target='tab' href='https://blog.nillsf.com/index.php/2020/08/28/running-kind-in-windows/'>https://blog.nillsf.com/index.php/2020/08/28/running-kind-in-windows/</a> </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) </pre> <br /> 이것을 이용해 kind 도구를 구성할 수 있습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > choco install kind -y </pre> <br /> 이후 클러스터 생성 방법은 WSL 2에서의 실행과 동일합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>kind create cluster --name cluster2</span> c:\temp> <span style='color: blue; font-weight: bold'>kubectl cluster-info</span> Kubernetes master is running at https://127.0.0.1:43574 KubeDNS is running at https://127.0.0.1:43574/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy </pre> <br /> 위의 출력 결과에서 볼 수 있듯이, kind는 WSL 2 환경을 인식하지 않으므로 윈도우 명령행에서 실행하면 또다시 새롭게 k8s 클러스터를 만듭니다. 그리고, 역시 윈도우 사용자의 프로파일 디렉터리(%USERPROFILE%\.kube)에 새롭게 생성한 k8s 클러스터를 바라보는 config 파일을 구성하게 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <a name='cluster_per'></a> <br /> 이런 식으로 따로 구성을 하기 때문에 혼란스러운 점이 하나 있는데요.<br /> <br /> WSL 2에서 구성했을 때는 이후 윈도우 호스트 측에서 WSL 2로 kubectl proxy를 이용해 접속하는 것이 가능했지만, 그 반대인 이번 경우에는 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12347#wsl2host'>WSL 2에서 호스트 측으로의 "localhost"를 이용한 통신이 안 되므로</a>, 윈도우 호스트 환경 내에서만 kubectl로 해당 클러스터를 사용할 수 있다는 차이가 있습니다. (물론, kubectl proxy를 이용한 방법은 안 되지만 "<a target='tab' href='https://www.sysnet.pe.kr/2/0/12583'>kubectl 수행 시 다른 k8s 클러스터로 접속하는 방법</a>"를 이용하면 WSL 2 측의 kubectl로 윈도우 호스트에 구성한 클러스터를 접근하는 것이 가능합니다.)<br /> <br /> 개인적인 의견인데, 저렇게 2개의 클러스터를 사용하면 자칫 실수를 할 수 있기 때문에 제 생각에는 (docker desktop for windows에서 "Use the WSL 2 based engine" 옵션을 켜고 kind를 이용해 구성할 때는) 어느 한 쪽에서 클러스터를 만든 다음 .kube 디렉터리에 생성한 config 파일을,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > [WSL 2] $HOME/.kube/config [윈도우] %USERPROFILE\.kube\config </pre> <br /> 다른 한 쪽에 복사하는 것을 권장합니다. 그럼 같은 클러스터를 바라보게 되므로 사용 중의 혼란을 없앨 수 있습니다. (아마도 이 부분은 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12571'>"Enable Kubernetes" 옵션이 WSL 2와의 문제</a>없이 잘 실행이 되었다면 config 파일을 양쪽 모두 동일한 클러스터를 바라보도록 공유하지 않았을까... 추측해 봅니다.)<br /> <br /> <hr style='width: 50%' /><br /> <a name='test_nginx'></a> <br /> 그런데, Docker Desktop for Windows 구성을 DockerDesktopVM에 하는 경우와는 달리 WSL 2에 kind를 이용해 구성하면 불편한 점이 하나 더 있습니다. 일례로 다음과 같이 서비스를 생성한 경우,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\knd> <span style='color: blue; font-weight: bold'>kubectl run nginx-app --image nginx --port=80</span> pod/nginx-app created c:\temp\knd> <span style='color: blue; font-weight: bold'>kubectl expose pod nginx-app --type=NodePort</span> service/nginx-app exposed c:\temp\knd> <span style='color: blue; font-weight: bold'>kubectl get svc</span> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 8m45s nginx-app NodePort 10.96.56.220 <none> <span style='color: blue; font-weight: bold'>80:30814/TCP</span> 9s </pre> <br /> 기존에 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12575#curl_test'>DockerDesktopVM을 이용해 구성한 k8s 환경</a>의 경우 curl을 이용해 저 서비스로 곧바로 접속할 수 있었습니다. 하지만, ("Use the WSL 2 based engine" 옵션을 켜고) kind로 구성한 경우에는 curl로 접속이 안 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\knd> <span style='color: blue; font-weight: bold'>curl localhost:31739</span> curl: (7) Failed to connect to localhost port 30814: Connection refused </pre> <br /> 이에 대해서는 다음의 문서에서 다루고 있는데요,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Accessing a Kubernetes Service running in WSL2 ; <a target='tab' href='https://kind.sigs.k8s.io/docs/user/using-wsl2/#accessing-a-kubernetes-service-running-in-wsl2'>https://kind.sigs.k8s.io/docs/user/using-wsl2/#accessing-a-kubernetes-service-running-in-wsl2</a> </pre> <br /> 실습을 위해 이전에 생성해 둔 클러스터를 삭제하고, 새롭게 다음의 config으로 클러스터를 생성한 후,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > # cluster-config.yml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraPortMappings: - containerPort: 30000 hostPort: 30000 protocol: TCP </pre> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>kind create cluster --config=cluster-config.yml</span> </pre> <br /> nginx 서비스를 deployment를 이용해 구성하면,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>kubectl create deployment nginx --image=nginx --port=80</span> c:\temp> <span style='color: blue; font-weight: bold'>kubectl create service nodeport nginx --tcp=80:80 --node-port=30000</span> </pre> <br /> curl 명령어로 nginx로의 접근이 가능합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp> <span style='color: blue; font-weight: bold'>curl localhost:30000</span> </pre> <br /> (왜 이런 차이가 발생하는지에 대한 자세한 설명은 <a target='tab' href='https://www.sysnet.pe.kr/2/0/12578#kind_wsl2_network'>"Docker Desktop for Windows 기반의 Kubernetes 구성 (2) - WSL 2 인스턴스에 kind가 구성한 k8s 서비스 위치</a>" 글을 참고하세요.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> WSL 2 인스턴스 내에서 kind로 클러스터 생성 시 다음과 같은 오류가 발생한다면?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>kind create cluster --name wslkind</span> ERROR: failed to list clusters: command "docker ps -q -a --no-trunc --filter label=io.x-k8s.kind.cluster=wslkind --format '{{.Names}}'" failed with error: exit status 1 </pre> <br /> 실제로 문제가 되는 명령어를 직접 실행해 보면 답이 나옵니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > $ <span style='color: blue; font-weight: bold'>docker ps -q -a --no-trunc --filter label=io.x-k8s.kind.cluster-wslkind --format '{{.Names}}'</span> Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22io.x-k8s.kind.cluster-wslkind%22%3Atrue%7D%7D: dial unix /var/run/docker.sock: connect: permission denied </pre> <br /> 따라서, <a target='tab' href='https://www.sysnet.pe.kr/2/0/12348#group_add'>docker 그룹에 현재 로그인 사용자를 등록</a>해 주면 됩니다. (혹은, 권한에 걸리지 않는 root 계정으로 전환 후 실행해도 됩니다.)<br /> <br /> <hr style='width: 50%' /><br /> <br /> 간혹, kubectl run 했을 때 다음과 같은 오류가 발생한다면?<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\knd> <span style='color: blue; font-weight: bold'>kubectl run nginx-app --image nginx --port=80</span> Error from server (Forbidden): pods "nginx-app" is forbidden: error looking up service account default/default: serviceaccount "default" not found </pre> <br /> 오류 메시지의 의미는, default 네임스페이스에 default 서비스 계정이 없다는 것입니다. 이에 대한 확인은 다음과 같이 할 수 있는데,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > c:\temp\knd> <span style='color: blue; font-weight: bold'>kubectl get serviceaccount -n default</span> NAME SECRETS AGE <span style='color: blue; font-weight: bold'>default</span> 1 3m50s </pre> <br /> 저렇게 나오면 다시 "kubectl run ..."을 실행해 보면 됩니다. (만약 실제로 서비스 계정이 없다면 오류가 발생하는 것이 맞습니다.)<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
8469
(왼쪽의 숫자를 입력해야 합니다.)