성태의 닷넷 이야기
홈 주인
모아 놓은 자료
프로그래밍
질문/답변
사용자 관리
사용자
메뉴
아티클
외부 아티클
유용한 코드
온라인 기능
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 구성 (2) - k8s 서비스 위치</h1> <p> 지난 글에서 설명한 환경에서는,<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 /> Docker Desktop for Windows의 경우 실질적인 docker 서비스는 Hyper-V의 DockerDesktopVM에 설치됩니다. 그리고 당연히 k8s도 DockerDesktopVM에 설치됩니다. 이것을 한 번 확인해 볼까요? ^^<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;' > DockerDesktopVM의 파일 시스템 접근 ; <a target='tab' href='https://www.sysnet.pe.kr/2/0/12174'>https://www.sysnet.pe.kr/2/0/12174</a> </pre> <br /> 방법으로 alpine container를 실행시키면 DockerDesktopVM에 어떤 식으로 k8s가 구성되었는지 파헤쳐 볼 수 있습니다.<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'>docker run --net=host --ipc=host --uts=host --pid=host -it --security-opt=seccomp=unconfined --privileged --rm -v /:/host alpine /bin/sh</span> / # </pre> <br /> 일례로, docker 및 k8s의 여러 서비스들(예: kube-apiserver)이 다음과 같이 DockerDesktopVM 내에 프로세스로 실행 중임을 알 수 있고,<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'>ps aux | grep docker</span> 1015 root 0:06 /usr/bin/containerd-shim-runc-v2 -namespace services.linuxkit -id docker -address /run/containerd/containerd.sock 1037 root 0:03 /usr/bin/docker-init /usr/bin/entrypoint.sh 1361 root 0:00 /usr/bin/trim-after-delete -- /sbin/fstrim /var/lib/docker 1443 root 0:54 /usr/bin/logwrite -n dockerd /usr/local/bin/dockerd --containerd /var/run/desktop-containerd/containerd.sock --pidfile /run/desktop/docker.pid --config-file /run/config/docker/daemon.json --swarm-default-advertise-addr=eth0 --host-gateway-ip 192.168.65.1 1449 root 46:39 /usr/local/bin/dockerd --containerd /var/run/desktop-containerd/containerd.sock --pidfile /run/desktop/docker.pid --config-file /run/config/docker/daemon.json --swarm-default-advertise-addr=eth0 --host-gateway-ip 192.168.65.1 1985 root 1h54 ...[생략]... 3522 root 1h02 etcd --advertise-client-urls=https://192.168.65.3:2379 --cert-file=/run/config/pki/etcd/server.crt --client-cert-auth=true --data-dir=/var/lib/etcd --initial-advertise-peer-urls=https://192.168.65.3:2380 --initial-cluster=docker-desktop=https://192.168.65.3:2380 --key-file=/run/config/pki/etcd/server.key --listen-client-urls=https://127.0.0.1:2379,https://192.168.65.3:2379 --listen-metrics-urls=http://127.0.0.1:2381 --listen-peer-urls=https://192.168.65.3:2380 --name=docker-desktop --peer-cert-file=/run/config/pki/etcd/peer.crt --peer-client-cert-auth=true --peer-key-file=/run/config/pki/etcd/peer.key --peer-trusted-ca-file=/run/config/pki/etcd/ca.crt --snapshot-count=10000 --trusted-ca-file=/run/config/pki/etcd/ca.crt 4934 root 0:28 ...[생략]... 29844 root 0:00 ...[생략]... / # <span style='color: blue; font-weight: bold'>ps aux | grep kube</span> 1981 root 0:00 /usr/bin/logwrite -n kubelet /usr/bin/kubelet.sh 1985 root 1h49 kubelet --kubeconfig=/etc/kubernetes/kubelet.conf --config /etc/kubeadm/kubelet.yaml --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/var/lib/cni-plugins/bin --kube-reserved-cgroup=podruntime --system-reserved-cgroup=systemreserved --cgroup-root=kubepods --hostname-override=docker-desktop 3477 root 1h37 kube-apiserver --advertise-address=192.168.65.3 --allow-privileged=true --authorization-mode=Node,RBAC --client-ca-file=/run/config/pki/ca.crt --enable-admission-plugins=NodeRestriction --enable-bootstrap-token-auth=true --etcd-cafile=/run/config/pki/etcd/ca.crt --etcd-certfile=/run/config/pki/apiserver-etcd-client.crt --etcd-keyfile=/run/config/pki/apiserver-etcd-client.key --etcd-servers=https://127.0.0.1:2379 --insecure-port=0 --kubelet-client-certificate=/run/config/pki/apiserver-kubelet-client.crt --kubelet-client-key=/run/config/pki/apiserver-kubelet-client.key --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname --proxy-client-cert-file=/run/config/pki/front-proxy-client.crt --proxy-client-key-file=/run/config/pki/front-proxy-client.key --requestheader-allowed-names=front-proxy-client --requestheader-client-ca-file=/run/config/pki/front-proxy-ca.crt --requestheader-extra-headers-prefix=X-Remote-Extra- --requestheader-group-headers=X-Remote-Group --requestheader-username-headers=X-Remote-User --secure-port=6443 --service-account-key-file=/run/config/pki/sa.pub --service-cluster-ip-range=10.96.0.0/12 --tls-cert-file=/run/config/pki/apiserver.crt --tls-private-key-file=/run/config/pki/apiserver.key --watch-cache=false 4934 root 0:26 /usr/local/bin/kube-proxy --config=/var/lib/kube-proxy/config.conf --hostname-override=docker-desktop 5019 root 0:26 /kube-vpnkit-forwarder -path /run/host-services/backend.sock 5336 root 54:46 kube-controller-manager --authentication-kubeconfig=/etc/kubernetes/controller-manager.conf --authorization-kubeconfig=/etc/kubernetes/controller-manager.conf --bind-address=127.0.0.1 --client-ca-file=/run/config/pki/ca.crt --cluster-name=kubernetes --cluster-signing-cert-file=/run/config/pki/ca.crt --cluster-signing-key-file=/run/config/pki/ca.key --controllers=*,bootstrapsigner,tokencleaner --horizontal-pod-autoscaler-sync-period=60s --kubeconfig=/etc/kubernetes/controller-manager.conf --leader-elect=false --node-monitor-grace-period=180s --node-monitor-period=30s --port=0 --pvclaimbinder-sync-period=60s --requestheader-client-ca-file=/run/config/pki/front-proxy-ca.crt --root-ca-file=/run/config/pki/ca.crt --service-account-private-key-file=/run/config/pki/sa.key --use-service-account-credentials=true 5595 1001 1:47 /dashboard --insecure-bind-address=0.0.0.0 --bind-address=0.0.0.0 --auto-generate-certificates --namespace=kubernetes-dashboard 25659 root 0:40 kube-scheduler --authentication-kubeconfig=/etc/kubernetes/scheduler.conf --authorization-kubeconfig=/etc/kubernetes/scheduler.conf --bind-address=127.0.0.1 --kubeconfig=/etc/kubernetes/scheduler.conf --leader-elect=true --port=0 80497 root 0:00 ...[생략]... /* pstree -p | grep kube */ </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;' > Installing kubeadm - Check required ports ; <a target='tab' href='https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports'>https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#check-required-ports</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;' > / # <span style='color: blue; font-weight: bold'>netstat -atp | grep LISTEN</span> tcp 0 0 localhost:10248 0.0.0.0:* LISTEN 1985/kubelet tcp 0 0 localhost:10249 0.0.0.0:* LISTEN 4934/kube-proxy tcp 0 0 192.168.65.3:2379 0.0.0.0:* LISTEN 3522/etcd tcp 0 0 localhost:2379 0.0.0.0:* LISTEN 3522/etcd tcp 0 0 192.168.65.3:2380 0.0.0.0:* LISTEN 3522/etcd tcp 0 0 localhost:2381 0.0.0.0:* LISTEN 3522/etcd tcp 0 0 localhost:59117 0.0.0.0:* LISTEN 1985/kubelet ...[생략]... tcp 0 0 localhost:10257 0.0.0.0:* LISTEN 5336/kube-controlle tcp 0 0 localhost:10259 0.0.0.0:* LISTEN 25659/kube-schedule ...[생략]... tcp 0 0 :::10250 :::* LISTEN 1985/kubelet tcp 0 0 :::6443 :::* LISTEN 3477/kube-apiserver ...[생략]... tcp 0 0 :::10256 :::* LISTEN 4934/kube-proxy </pre> <br /> 나아가서 명령행 인자를 통해 kubernetes의 바이너리와,<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'>ls /host/usr/bin/kube* -l</span> -rwxr-xr-x 1 root root 959 Mar 16 08:56 /host/usr/bin/kube-pull.sh -rwxr-xr-x 1 root root 508 Mar 16 08:56 /host/usr/bin/kube-reset.sh -rwxr-xr-x 1 root root 106 Mar 16 08:56 /host/usr/bin/kube-restart.sh -rwxr-xr-x 1 root root 198 Mar 16 08:56 /host/usr/bin/kube-start.sh -rwxr-xr-x 1 root root 685 Mar 16 08:56 /host/usr/bin/kube-stop.sh lrwxrwxrwx 1 root root 41 Mar 20 00:19 /host/usr/bin/kubeadm -> /var/lib/kube-binary-cache-debian/kubeadm -rwxr-xr-x 1 root root 710 Mar 16 08:56 /host/usr/bin/kubeadm-init.sh lrwxrwxrwx 1 root root 41 Mar 20 00:19 /host/usr/bin/kubectl -> /var/lib/kube-binary-cache-debian/kubectl lrwxrwxrwx 1 root root 41 Mar 20 00:19 /host/usr/bin/kubelet -> /var/lib/kube-binary-cache-debian/kubelet -rwxr-xr-x 1 root root 2408 Mar 16 08:56 /host/usr/bin/kubelet.sh </pre> <a name='cert'></a> <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'>ls /host/run/config/pki -l</span> total 56 -rw-r--r-- 1 root root 1090 Mar 20 09:19 apiserver-etcd-client.crt -rw-r--r-- 1 root root 1675 Mar 20 09:19 apiserver-etcd-client.key -rw-r--r-- 1 root root 1099 Mar 20 09:19 apiserver-kubelet-client.crt -rw-r--r-- 1 root root 1679 Mar 20 09:19 apiserver-kubelet-client.key -rw-r--r-- 1 root root 1334 Mar 20 09:19 apiserver.crt -rw-r--r-- 1 root root 1675 Mar 20 09:19 apiserver.key -rw-r--r-- 1 root root 1025 Mar 20 09:19 ca.crt -rw-r--r-- 1 root root 1679 Mar 20 09:19 ca.key drwxr-xr-x 2 root root 200 Mar 20 09:19 etcd -rw-r--r-- 1 root root 1038 Mar 20 09:19 front-proxy-ca.crt -rw-r--r-- 1 root root 1679 Mar 20 09:19 front-proxy-ca.key -rw-r--r-- 1 root root 1058 Mar 20 09:19 front-proxy-client.crt -rw-r--r-- 1 root root 1679 Mar 20 09:19 front-proxy-client.key -rw-r--r-- 1 root root 1679 Mar 20 09:19 sa.key -rw-r--r-- 1 root root 451 Mar 20 09:19 sa.pub </pre> <br /> 그리고 여기 있는 인증서들은 윈도우 호스트 측의 "%LOCALAPPDATA%\Docker\pki" 폴더 목록과 일치합니다. 실제로, 인증서 내용도 완전히 동일합니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > /host/run/config/pki # <span style='color: blue; font-weight: bold'>cat ca.crt</span> -----BEGIN CERTIFICATE----- MIICyDCCAbCgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl ...[생략]... 8FBcTBqYAlRJRiDWefzIy7tEPiSkOnLqtoVhBqL8WK6Xu15xzHJ5yO2yHTs= -----END CERTIFICATE----- </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'>type "%LOCALAPPDATA%\Docker\pki\ca.crt"</span> -----BEGIN CERTIFICATE----- MIICyDCCAbCgAwIBAgIBADANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDEwprdWJl ...[생략]... 8FBcTBqYAlRJRiDWefzIy7tEPiSkOnLqtoVhBqL8WK6Xu15xzHJ5yO2yHTs= -----END CERTIFICATE----- </pre> <br /> <hr style='width: 50%' /><br /> <a name='network'></a> <br /> 그나저나, 정작 신기한 것은 DockerDesktopVM의 네트워크 구조입니다. Hyper-V에서 해당 VM의 설정을 보면 가상 네트워크 어댑터가 존재하지 않는데요, 정확히는 알 수 없지만 보이지 않는 것일 뿐 내부적으로는 존재하는 것으로 예상이 됩니다.<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'>ifconfig | grep "inet addr"</span> inet addr:10.1.0.1 Bcast:10.1.255.255 Mask:255.255.0.0 inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0 inet addr:192.168.65.3 Bcast:192.168.65.15 Mask:255.255.255.0 inet addr:127.0.0.1 Mask:255.0.0.0 inet addr:192.168.65.4 Bcast:0.0.0.0 Mask:255.255.255.255 / # <span style='color: blue; font-weight: bold'>cat /etc/resolv.conf</span> # DNS requests are forwarded to the host. DHCP DNS options are ignored. nameserver 192.168.65.5 </pre> <br /> 또한, DockerDesktopVM 측에서 윈도우 호스트 측으로의 통신은 모든 Hyper-V의 Internal Network Switch(Default Switch, WSL)에 대해 (따라서 당연히 External 유형의 스위치에 대해서도) 통신이 됩니다.<br /> <br /> <pre style='margin: 10px 0px 10px 10px; padding: 10px 0px 10px 10px; background-color: #fbedbb; overflow: auto; font-family: Consolas, Verdana;' > /* 아래의 모든 IP를 DockerDesktopVM 측에서 ping으로 확인 가능 */ c:\temp> <span style='color: blue; font-weight: bold'>ipconfig | findstr IPv4</span> Autoconfiguration IPv4 Address. . : 169.254.215.170 IPv4 Address. . . . . . . . . . . : ...[공용 IP]... IPv4 Address. . . . . . . . . . . : 192.168.240.1 IPv4 Address. . . . . . . . . . . : 172.19.64.1 </pre> <br /> 이제서야 생각해 보면, 마이크로소프트가 DockerDesktopVM을 어쩌면 버리고 싶은 것이 아닌가 생각됩니다. 그동안의 마이크로소프트 자세를 보면, 개발자들이 가능한 이용할 수 있는 쪽으로 자료 공개를 많이 해왔던 것에 비하면 유독 DockerDesktopVM은 관련 자료가 거의 전무한 상태입니다. 어차피 WSL 2도 나왔고 docker와 k8s도 포팅을 했으니 DockerDesktopVM을 더 이상 지원하고 싶지 않아 개발자들로 하여금 그 내부에서 뭔가를 하지 않기를 바라는 듯한 느낌이 드는군요. ^^<br /> </p><br /> <br /><hr /><span style='color: Maroon'>[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]</span> </div>
첨부파일
스팸 방지용 인증 번호
7543
(왼쪽의 숫자를 입력해야 합니다.)