성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
MathJax 입력기
최근 덧글
[정성태] Java - How to use the Foreign Funct...
[정성태] 제가 큰 실수를 했군요. ^^; Delegate를 통한 Bein...
[정성태] Working with Rust Libraries from C#...
[정성태] Detecting blocking calls using asyn...
[정성태] 아쉽게도, 커뮤니티는 아니고 개인 블로그입니다. ^^
[정성태] 질문이 잘 이해가 안 됩니다. 우선, 해당 소스코드에서 ILis...
[양승조
] var대신 dinamic으로 선언해서 해결은 했습니다. 맞는 해...
[양승조
] 또 막혔습니다. ㅠㅠ var list = props[i].Ge...
[양승조
] 아. 감사합니다. 어제는 안됐던것 같은데....정신을 차려야겠네...
[정성태] "props[i].GetValue(props[i])" 코드에서 ...
글쓰기
제목
이름
암호
전자우편
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에서 DockerDesktopVM 기반의 Kubernetes 구성</h1> <p> Docker Desktop for Windows 환경에서 k8s 클러스터를 구성하는 것은 다음의 단계만으로 쉽게 이뤄질 수 있습니다.<br /> <br /> <ol> <li>docker desktop for window 설치</li> <li><a target='tab' href='https://www.sysnet.pe.kr/2/0/12571'>"Use the WSL 2 based engine" 옵션은 (기본값 Off) 끄고</a>,</li> <li>"Enable Kubernetes" 옵션을 활성화</li> </ol> <br /> 이렇게 구성하면 docker와 k8s가 Hyper-V에 생성된 DockerDesktopVM에 구성되고, 윈도우 측에는 위의 인스턴스로 kubectl.exe로 접근이 가능하도록 %USERPROFILE%\.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;' > apiVersion: v1 clusters: - cluster: certificate-authority-data: LS0...[생략]...LQo= server: https://kubernetes.docker.internal:6443 name: docker-desktop contexts: - context: cluster: docker-desktop user: docker-desktop name: docker-desktop current-context: docker-desktop kind: Config preferences: {} users: - name: docker-desktop user: client-certificate-data: LS0tLS...[생략]...LS0K client-key-data: LS0tL...[생략]...LQo= </pre> <br /> 따라서, 이후 윈도우 측에서 kubectl.exe를 실행해도 config 파일의 내용에 따라 자연스럽게 DockerDesktopVM에 실행 중인 k8s API 서버와 연동하게 됩니다.<br /> <br /> <hr style='width: 50%' /><br /> <br /> k8s 기본 Dashboard 구성은 이전 글에서 설명했고,<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Docker for Windows를 위한 k8s 대시보드 활성화 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12567'>https://www.sysnet.pe.kr/2/0/12567</a> </pre> <br /> REST API 통신 방법도 설명했었습니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > Kubernetes - kube-apiserver와 REST API 통신하는 방법 (Docker Desktop for Windows 환경) ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12566'>https://www.sysnet.pe.kr/2/0/12566</a> </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;' > c:\temp> <span style='color: blue; font-weight: bold'>kubectl config view</span> apiVersion: v1 clusters: - cluster: certificate-authority-data: DATA+OMITTED server: https://kubernetes.docker.internal:6443 name: docker-desktop contexts: - context: cluster: docker-desktop user: docker-desktop name: docker-desktop current-context: docker-desktop kind: Config preferences: {} users: - name: docker-desktop user: client-certificate-data: REDACTED client-key-data: REDACTED </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'>kubectl get pods --all-namespaces</span> NAMESPACE NAME READY STATUS RESTARTS AGE kube-system coredns-f9fd979d6-bqvqp 1/1 Running 7 50d kube-system coredns-f9fd979d6-nxl7x 1/1 Running 7 50d kube-system etcd-docker-desktop 1/1 Running 7 50d kube-system kube-apiserver-docker-desktop 1/1 Running 9 50d kube-system kube-controller-manager-docker-desktop 1/1 Running 7 50d kube-system kube-proxy-52sck 1/1 Running 7 50d kube-system kube-scheduler-docker-desktop 1/1 Running 59 50d kube-system storage-provisioner 1/1 Running 58 50d kube-system vpnkit-controller 1/1 Running 7 50d </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'>kubectl get nodes -o wide</span> NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME docker-desktop Ready master 50d v1.19.3 192.168.65.4 <none> Docker Desktop 4.19.121-linuxkit docker://20.10.5 </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'>kubectl get namespace</span> NAME STATUS AGE kube-node-lease Active 50d kube-public Active 50d kube-system Active 50d </pre> <br /> <pre style='height: 400px; 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 describe nodes</span> Name: docker-desktop Roles: master Labels: beta.kubernetes.io/arch=amd64 beta.kubernetes.io/os=linux kubernetes.io/arch=amd64 kubernetes.io/hostname=docker-desktop kubernetes.io/os=linux node-role.kubernetes.io/master= Annotations: kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock node.alpha.kubernetes.io/ttl: 0 volumes.kubernetes.io/controller-managed-attach-detach: true CreationTimestamp: Mon, 25 Jan 2021 15:01:42 +0900 Taints: <none> Unschedulable: false Lease: HolderIdentity: docker-desktop AcquireTime: <unset> RenewTime: Tue, 16 Mar 2021 23:43:14 +0900 Conditions: Type Status LastHeartbeatTime LastTransitionTime Reason Message ---- ------ ----------------- ------------------ ------ ------- MemoryPressure False Tue, 16 Mar 2021 23:43:12 +0900 Mon, 25 Jan 2021 15:01:42 +0900 KubeletHasSufficientMemory kubelet has sufficient memory available DiskPressure False Tue, 16 Mar 2021 23:43:12 +0900 Mon, 25 Jan 2021 15:01:42 +0900 KubeletHasNoDiskPressure kubelet has no disk pressure PIDPressure False Tue, 16 Mar 2021 23:43:12 +0900 Mon, 25 Jan 2021 15:01:42 +0900 KubeletHasSufficientPID kubelet has sufficient PID available Ready True Tue, 16 Mar 2021 23:43:12 +0900 Mon, 25 Jan 2021 15:02:13 +0900 KubeletReady kubelet is posting ready status Addresses: InternalIP: 192.168.65.4 Hostname: docker-desktop Capacity: cpu: 2 ephemeral-storage: 61255652Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 2036632Ki pods: 110 Allocatable: cpu: 2 ephemeral-storage: 56453208790 hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 1934232Ki pods: 110 System Info: Machine ID: 397443a7-b161-4423-bee8-724eb7dd7ae5 System UUID: 9f4fbf1d-b728-49c2-94b2-79e01d3bf8d2 Boot ID: d193b323-269a-44a8-a188-a56022ed91e3 Kernel Version: 4.19.121-linuxkit OS Image: Docker Desktop Operating System: linux Architecture: amd64 Container Runtime Version: docker://20.10.5 Kubelet Version: v1.19.3 Kube-Proxy Version: v1.19.3 Non-terminated Pods: (10 in total) Namespace Name CPU Requests CPU Limits Memory Requests Memory Limits AGE --------- ---- ------------ ---------- --------------- ------------- --- kube-system coredns-f9fd979d6-bqvqp 100m (5%) 0 (0%) 70Mi (3%) 170Mi (8%) 50d kube-system coredns-f9fd979d6-nxl7x 100m (5%) 0 (0%) 70Mi (3%) 170Mi (8%) 50d kube-system etcd-docker-desktop 0 (0%) 0 (0%) 0 (0%) 0 (0%) 50d kube-system kube-apiserver-docker-desktop 250m (12%) 0 (0%) 0 (0%) 0 (0%) 50d kube-system kube-controller-manager-docker-desktop 200m (10%) 0 (0%) 0 (0%) 0 (0%) 50d kube-system kube-proxy-52sck 0 (0%) 0 (0%) 0 (0%) 0 (0%) 50d kube-system kube-scheduler-docker-desktop 100m (5%) 0 (0%) 0 (0%) 0 (0%) 50d kube-system storage-provisioner 0 (0%) 0 (0%) 0 (0%) 0 (0%) 50d kube-system vpnkit-controller 0 (0%) 0 (0%) 0 (0%) 0 (0%) 50d Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 750m (37%) 0 (0%) memory 140Mi (7%) 340Mi (17%) ephemeral-storage 0 (0%) 0 (0%) hugepages-1Gi 0 (0%) 0 (0%) hugepages-2Mi 0 (0%) 0 (0%) Events: <none> </pre> <br /> <hr style='width: 50%' /><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;' > 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 0/1 ContainerCreating 0 24s c:\temp> <span style='color: blue; font-weight: bold'>kubectl get namespace</span> NAME STATUS AGE default Active 50d kube-node-lease Active 50d kube-public Active 50d kube-system Active 50d C:\temp> <span style='color: blue; font-weight: bold'>kubectl get pods</span> NAME READY STATUS RESTARTS AGE nginx-app 1/1 Running 0 111s 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 service</span> NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 50d nginx-app NodePort 10.99.8.202 <none> 80:<span style='color: blue; font-weight: bold'>30486</span>/TCP 11s </pre> <a name='curl_test'></a> <br /> 정상적으로 서비스가 올라갔다면 다음과 같이 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:30486</span> <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> ...[생략]... <p><em>Thank you for using nginx.</em></p> </body> </html> </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;' > c:\temp> <span style='color: blue; font-weight: bold'>kubectl delete pod nginx-app</span> pod "nginx-app" deleted c:\temp> <span style='color: blue; font-weight: bold'>kubectl delete svc nginx-app</span> service "nginx-app" deleted </pre> <br /> <hr style='width: 50%' /><br /> <br /> 그외 docker-compose와 유사하게 yaml을 이용한 k8s의 서비스 관리가 가능합니다. 아래는 별도의 namespace 생성을 yaml을 이용하고, 이후 새로운 네임스페이스 하에 pod 구성하는 것을 보여줍니다.<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'>type rndtest-namespace.yml</span> apiVersion: v1 kind: Namespace metadata: name: rndtest c:\temp> <span style='color: blue; font-weight: bold'>kubectl apply -f rndtest-namespace.yml</span> namespace/rndtest created c:\temp> <span style='color: blue; font-weight: bold'>kubectl get namespace</span> NAME STATUS AGE default Active 50d kube-node-lease Active 50d kube-public Active 50d kube-system Active 50d rndtest Active 4s c:\temp> <span style='color: blue; font-weight: bold'>kubectl run nginx-app --image nginx --namespace=rndtest</span> pod/nginx-app created c:\temp> kubectl get pod -n rndtest NAME READY STATUS RESTARTS AGE nginx-app 1/1 Running 0 12s c:\temp> <span style='color: blue; font-weight: bold'>kubectl delete pod nginx-app -n rndtest</span> pod "nginx-app" deleted c:\temp> <span style='color: blue; font-weight: bold'>kubectl delete namespace rndtest</span> namespace "rndtest" deleted </pre> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
1752
(왼쪽의 숫자를 입력해야 합니다.)