kubernetes

minikube로 로컬 환경을 구축해보자 (feat. Kubernetes Java Client 도입)

downfa11 2025. 2. 11. 19:33

https://kubernetes.io/ko/docs/tutorials/hello-minikube/

 

Hello Minikube

이 튜토리얼에서는 Minikube와 Katacoda를 이용하여 쿠버네티스에서 샘플 애플리케이션을 어떻게 실행하는지 살펴본다. Katacode는 무료로 브라우저에서 쿠버네티스 환경을 제공한다. 참고:로컬에서 M

kubernetes.io

 

 

관리형 k8s나 IaaS 클러스터에서 테스트하기 부담스러웠다.

그래서 로컬 환경에서 쉽게 클러스터를 구성할 수 있는 Minikube나 k3s 같은 로컬 쿠버네티스 도구를 알아봤다.

WSL2 리소스 설정

Windows의 경우, .wslconfig 파일을 통해 도커에 할당할 리소스를 지정할 수 있다.

 

검색 : %UserProfile%

[wsl2]
processors=8
memory=6GB

 

wsl -shutdown 이후 재실행

 

Minikube 설치(windows)

https://minikube.sigs.k8s.io/docs/start/

 

minikube start

minikube is local Kubernetes, focusing on making it easy to learn and develop for Kubernetes. All you need is Docker (or similarly compatible) container or a Virtual Machine environment, and Kubernetes is a single command away: minikube start What you’ll

minikube.sigs.k8s.io

 

New-Item -Path 'c:\' -Name 'minikube' -ItemType Directory -Force
Invoke-WebRequest -OutFile 'c:\minikube\minikube.exe' -Uri 'https://github.com/kubernetes/minikube/releases/latest/download/minikube-windows-amd64.exe' -UseBasicParsing

 

 

$env:Path += ";C:\minikube"
[Environment]::SetEnvironmentVariable("Path", $env:Path, [EnvironmentVariableTarget]::Machine)

 

 

> minikube version
> minikube start –cpus=4 –memory 5943 –disk-size 32g

 

각각 클러스터에 할당할 CPU 수, 메모리 용량, 디스크 용량을 뜻한다.

 

 

 

kubectl이 동봉된 패키지로, kubectl get pod -n kube-system 등의 명령어를 사용 가능

 

 

 

 

포트포워딩

> kubectl port-forward deployment/frontend 8080

 

 

종료와 삭제

minikube stop
minikube delete

 

 

로컬 Minikube 환경 연결

~/.kube/config 파일을 기준으로 클러스터에 연결된다.

ls ~/.kube/config

 

kubectl config use-context minikube

 

 

 

 

 

KuberConfig 파일을 로컬로 가져오기

AWS CLI와 kubeconfig를 통해 EKS 클러스터의 인증 정보를 가져오면, Kubernetes Java Client는 ~/.kube/config 파일을 사용하여 클러스터에 연결할 수 있다.

 

Config.defaultClient()는 ~/.kube/config 파일을 사용하여 클러스터에 연결

KuberConfig는 클러스터에 접속하기 위한 설정 파일로 인증 및 연결 정보를 포함한다.

  • aws configure로 입력하거나 aws configure list로 확인하기
  • aws eks --region ap-northeast-2 update-kubeconfig --name <cluster-name>

 

    //Kubernetes Java Client
    implementation 'io.kubernetes:client-java:18.0.0'

    //Docker Java Client
    implementation 'com.github.docker-java:docker-java:3.3.0'
    implementation 'com.github.docker-java:docker-java-transport-okhttp:3.3.0'
    implementation 'javax.ws.rs:javax.ws.rs-api:2.1.1'

    // JGit
    implementation group: 'org.eclipse.jgit', name: 'org.eclipse.jgit', version: '4.4.1.201607150455-r'
    implementation 'software.amazon.awssdk:ecr:2.20.5'

 

Git 주소를 입력하면 해당 레포를 빌드하고, minkube 상에서 실행하도록 할거다.

 

알고리즘이나 과제 전형, 워게임 문제 풀고 관리하기 위한 컨테이너풀로 서비스를 제공하는 프로젝트를 기획중이다.

 

 

 

이제 다시 원하는 이미지를 Pod로 실행하는 로직을 실행해보자.

 

 

바로 ECR registry에 있는 nginx를 입력해서 진행해봤는데 잘 된다.

 

 

 

 

 

 

 

Error creating Pod: Content type "text/html;charset=UTF-8" is not supported for type: class io.kubernetes.client.openapi.models.V1Pod 오류

POST: /api/k8s/create-pod 엔드포인트로 접속해서 nginx ECR를 생성해봤다.

  • public.ecr.aws/nginx/nginx:stable-perl
PS C:\Users\jks83> kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:61361
CoreDNS is running at https://127.0.0.1:61361/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.


PS C:\Users\jks83> kubectl get --raw /api
{"kind":"APIVersions","versions":["v1"],"serverAddressByClientCIDRs":[{"clientCIDR":"0.0.0.0/0","serverAddress":"..:8443"}]}

 

 

Error creating Pod in Service: {"timestamp":"2024-12-12T12:10:18.054+00:00","status":404,"error":"Not Found","path":"/api/v1/namespaces/default/pods"} 오류

좀 더 정확한 내용을 디버깅하기 위해 로그를 추가해봤다.

 

Error creating Pod in Service: {"timestamp":"2024-12-12T13:00:13.390+00:00","status":404,"error":"Not Found","path":"/api/v1/namespaces/default/pods"}
HTTP Status Code: 404
Response Headers: {cache-control=[no-cache, no-store, max-age=0, must-revalidate], connection=[keep-alive], content-type=[application/json], date=[Thu, 12 Dec 2024 13:00:13 GMT], expires=[0], keep-alive=[timeout=60], pragma=[no-cache], transfer-encoding=[chunked], vary=[Origin, Access-Control-Request-Method, Access-Control-Request-Headers], x-content-type-options=[nosniff], x-frame-options=[DENY], x-xss-protection=[0]}

 

아하…

 

평소처럼 애플리케이션을 도커 이미지로 만들어서 실행하는데, 생각해보니 KuberConfig는 로컬에 둬놓고 도커 이미지 안에 없는걸 탓하고 있었다..

 

도커 이미지로 만들지 않고 애플리케이션을 로컬에서 가동하니 정상적으로 kubeConfig를 읽어온다.