Docker Desktop for Windows에서 DockerDesktopVM 기반의 Kubernetes 구성
Docker Desktop for Windows 환경에서 k8s 클러스터를 구성하는 것은 다음의 단계만으로 쉽게 이뤄질 수 있습니다.
- docker desktop for window 설치
- "Use the WSL 2 based engine" 옵션은 (기본값 Off) 끄고,
- "Enable Kubernetes" 옵션을 활성화
이렇게 구성하면 docker와 k8s가 Hyper-V에 생성된 DockerDesktopVM에 구성되고, 윈도우 측에는 위의 인스턴스로 kubectl.exe로 접근이 가능하도록 %USERPROFILE%\.kube 디렉터리에 다음의 내용으로 config 파일이 생성됩니다.
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=
따라서, 이후 윈도우 측에서 kubectl.exe를 실행해도 config 파일의 내용에 따라 자연스럽게 DockerDesktopVM에 실행 중인 k8s API 서버와 연동하게 됩니다.
k8s 기본 Dashboard 구성은 이전 글에서 설명했고,
Docker for Windows를 위한 k8s 대시보드 활성화
; https://www.sysnet.pe.kr/2/0/12567
REST API 통신 방법도 설명했었습니다.
Kubernetes - kube-apiserver와 REST API 통신하는 방법 (Docker Desktop for Windows 환경)
; https://www.sysnet.pe.kr/2/0/12566
아울러, 처음 구성했을 때의 기본 상태를 대략 다음과 같은 명령어로 확인할 수 있습니다.
c:\temp> kubectl config view
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
c:\temp> kubectl get pods --all-namespaces
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
C:\temp> kubectl get nodes -o wide
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
c:\temp> kubectl get namespace
NAME STATUS AGE
kube-node-lease Active 50d
kube-public Active 50d
kube-system Active 50d
c:\temp> kubectl describe nodes
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>
아울러 클러스터 사용을 위한 간단한 명령어 실습을 다음과 같이 할 수 있습니다.
C:\temp> kubectl run nginx-app --image nginx --port=80
pod/nginx-app created
C:\temp> kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app 0/1 ContainerCreating 0 24s
c:\temp> kubectl get namespace
NAME STATUS AGE
default Active 50d
kube-node-lease Active 50d
kube-public Active 50d
kube-system Active 50d
C:\temp> kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-app 1/1 Running 0 111s
C:\temp> kubectl expose pod nginx-app --type=NodePort
service/nginx-app exposed
C:\temp> kubectl get service
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:30486/TCP 11s
정상적으로 서비스가 올라갔다면 다음과 같이 nginx로의 요청을 테스트할 수 있고,
c:\temp> curl localhost:30486
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...[생략]...
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
이후 정리는 이렇게!
c:\temp> kubectl delete pod nginx-app
pod "nginx-app" deleted
c:\temp> kubectl delete svc nginx-app
service "nginx-app" deleted
그외 docker-compose와 유사하게 yaml을 이용한 k8s의 서비스 관리가 가능합니다. 아래는 별도의 namespace 생성을 yaml을 이용하고, 이후 새로운 네임스페이스 하에 pod 구성하는 것을 보여줍니다.
c:\temp> type rndtest-namespace.yml
apiVersion: v1
kind: Namespace
metadata:
name: rndtest
c:\temp> kubectl apply -f rndtest-namespace.yml
namespace/rndtest created
c:\temp> kubectl get namespace
NAME STATUS AGE
default Active 50d
kube-node-lease Active 50d
kube-public Active 50d
kube-system Active 50d
rndtest Active 4s
c:\temp> kubectl run nginx-app --image nginx --namespace=rndtest
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> kubectl delete pod nginx-app -n rndtest
pod "nginx-app" deleted
c:\temp> kubectl delete namespace rndtest
namespace "rndtest" deleted
[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]