본문 바로가기
🌿 Data Engineering/Data PipeLine (Airflow)

[로컬 환경에서] 쿠버네티스 구축하기 (kind, docker-desktop)

by 카프리썬_ 2024. 1. 15.
728x90
728x90

 

이전에 로컬에서 mwaa airflow를 띄워보았다.

직접 테스트해보고 구축해본 내용은 아래의 글 참고^^ 

https://pearlluck.tistory.com/791

 

 

AWS MWAA local runner로 로컬에서 MWAA 사용해보기

airflow DAG를 테스트해보는 환경이 없었다. 물론 DAG 코드가 간단해서 다행이지만 돌려보지도 않고 바로 staging에 반영을 해야하는 상황이였다. 심지어 나는 staging에 바로 머지할 권한도 없어서 매

pearlluck.tistory.com

 

이번에는 로컬에서 쿠버네티스 환경을 구축해보려고 한다. 

사실 가장 큰 목적은 이 로컬에서 띄운 mwaa airflow를 로컬 쿠버네티스 환경에서 사용해보는 것이다.

 

앞으로 아래와 같은 질문에 대한 답을 하나하나씩 찾아가보려고 한다. 

 

  • 어떻게 쿠버네티스 환경을 만들지? 로컬에서? 
  • 어떻게 로컬에서 띄운 mwaa와 쿠버네티스를 연결하지?
  • 어떻게 로그와 진행결과를 확인하지? 대시보드가 있으려나? 

그 중에 이번 글에서는 첫번째 질문에 대한 답을 찾아볼 예정이다. 

 

 

사실 결론부터 답을 말하자면, 두가지 방법(?)으로 쿠버네티스 환경을 만들었다.

linux 로컬환경에서는 Kind로, mac 로컬환경에서는 docker-desktop으로 클러스터를 구축했다.

또한 kubectl로 cluster-info, node부터 kube_config까지 각 구성환경의 정보도 확인해보았다.


 

사실 로컬에서 쿠버네티스를 구축하는 방법은 kind, minikube,vagrant 등 생각보다 다양했다.

그 중 kind를 사용해서 쿠버네티스를 구축해보았다. 

그런데 docker-desktop으로도 간단하게 쿠버네티스를 사용할수 있었다..! 

 

+ 참고로 kind로 세팅한 곳은 ec2 amazon linux 로컬 환경이고, 

docker-desktop으로 세팅한 곳은 그냥 내 macOs 로컬 환경이다. 

 

로컬 k8s 환경세팅 (kind)

kindkubernetes in docker의 줄임말로 (난 또 친절하단줄 알았네..ㅎㅎ)

기존에 사용하던 도커만 있으면 로컬에서 쿠버네티스를 사용할 수 있게 해주는 툴이다. 

https://kind.sigs.k8s.io/

 

kind

kind is a tool for running local Kubernetes clusters using Docker container “nodes”. kind was primarily designed for testing Kubernetes itself, but may be used for local development or CI. If you have go 1.16+ and docker or podman installed go install

kind.sigs.k8s.io

 

kind 설치 

kind 설치는 brew로 간단하게 설치할 수 있다. (macOs기준)

brew install kind

 

참고로 AWS EC2의 Amazon Linux (AMD64 / x86_64) 에선 아래처럼 설치했다.

[root@node1 ~]# curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64

[root@node1 ~]# chmod +x ./kind
[root@node1 ~]# mv ./kind /usr/local/bin
[root@node1 ~]# which kind
/usr/local/bin/kind

[root@node1 ~]# kind version
kind v0.11.1 go1.16.4 linux/amd64

 

kind 설치 공식문서 : https://kind.sigs.k8s.io/docs/user/quick-start

 

클러스터 생성

kind-k8s-kind-cluster1 라는 이름의 클러스터를 생성했다. 

kind create cluster --name k8s-kind-cluster1

 

kind 미리 생성된 kindest/node 도커 이미지를 사용한다.

이렇게 이미지를 조회해보면  kindest/node 를 확인해볼 수 있다. 

(base) [root@ip-172-31-163-193 bin]$ sudo docker images | grep kind
kindest/node             <none>      32b8b755dee8   2 years ago     1.12GB

 

kind-k8s-kind-cluster1 라는 디폴트 이름으로 잘 생성이 되었다. 

(base) [root@ip-172-31-163-193 bin]$ kind get cluster
k8s-kind-cluster1

 

 kind 클러스터 생성 공식문서  : https://kind.sigs.k8s.io/docs/user/quick-start#creating-a-cluster

 

로컬 쿠버네티스 구축 확인 - kubectl 

kubectl은 쿠버네티스 command line 툴이다. 

macOs기준 brew로 간단하게 설치해서 사용할 수 있다. 

brew install kubectl

 

kubectl 설치 확인

(base) [root@ip-172-31-163-193 bin]$ kubectl version
Client Version: v1.29.0
Kustomize Version: v5.0.4-0.20230601165947-6ce0bf390ce3
Server Version: v1.21.1
WARNING: version difference between client (1.29) and server (1.21) exceeds the supported minor version skew of +/-1

 

kubectl 공식문서 : https://kubernetes.io/docs/reference/kubectl/ 

 

그리고 몇가지 명령어로 로컬 쿠버네티스의 관련 정보를 확인해볼 수 있다. 

  • kubectl cluster-info
  • kubectl config get-contexts
  • kubectl get services 
  • kubectl get nodes
  • kubectl get namespaces 
  • kubectl get pods
(base) [root@ip-172-31-163-193 bin]$ kubectl cluster-info
Kubernetes control plane is running at https://127.0.0.1:38209
CoreDNS is running at https://127.0.0.1:38209/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
(base) [root@ip-172-31-163-193 bin]$ kubectl config get-contexts
CURRENT   NAME                     CLUSTER                  AUTHINFO                 NAMESPACE
*         kind-k8s-kind-cluster1   kind-k8s-kind-cluster1   kind-k8s-kind-cluster1
(base) [root@ip-172-31-163-193 bin]$ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   4d3h
(base) [root@ip-172-31-163-193 bin]$ kubectl get nodes
NAME                              STATUS   ROLES                  AGE    VERSION
k8s-kind-cluster1-control-plane   Ready    control-plane,master   4d3h   v1.21.1
(base) [root@ip-172-31-163-193 bin]$ kubectl get namespaces
NAME                   STATUS   AGE
default                Active   4d3h
kube-node-lease        Active   4d3h
kube-public            Active   4d3h
kube-system            Active   4d3h
kubernetes-dashboard   Active   4d2h
local-path-storage     Active   4d3h
(base) [root@ip-172-31-163-193 bin]$ kubectl get pods
No resources found in default namespace.

 

그리고 이렇게 config도 확인해볼 수 있다. 

  • kubectl config view 

여기보면 cluster name이 아까 생성한 kind-k8s-kind-cluster1임을 확인할 수 있다.

(base) [root@ip-172-31-163-193 bin]$ kubectl config view
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://127.0.0.1:38209
  name: kind-k8s-kind-cluster1
contexts:
- context:
    cluster: kind-k8s-kind-cluster1
    user: kind-k8s-kind-cluster1
  name: kind-k8s-kind-cluster1
current-context: kind-k8s-kind-cluster1
kind: Config
preferences: {}
users:
- name: kind-k8s-kind-cluster1
  user:
    client-certificate-data: DATA+OMITTED
    client-key-data: DATA+OMITTED

 

그런데 DATA+OMITTED 라는 값들이 있다.

사실 처음엔 흐린눈하고 그냥 secret key 같은 문자값인줄 알았다. 

 

그래서 이 값을 그대로 썼는데 아래와 같은 오류들을 만났다. 

certificate-authority-data, client-certificate-data, client-key-data 값은 ca 인증서 값인데 잘못됐단 뜻이다.

 

알고보니 해당 값들은 단지 config view 명령어로 보여주기 위해 (read-only 느낌) 가려진 값이였다.

인증서 값으로 DATA+OMITTED를 넣었으니 잘못됐지 그럼..(지금 생각해보니까 글자 못 읽는 사람 같네..)

Traceback (most recent call last):
  File "/usr/local/airflow/.local/lib/python3.7/site-packages/urllib3/util/ssl_.py", line 402, in ssl_wrap_socket
    context.load_verify_locations(ca_certs, ca_cert_dir, ca_cert_data)
ssl.SSLError: unknown error (_ssl.c:4140)

 

실제 인증서 값은 아래의 경로에서 확인할 수 있다. 

sudo vi ~/.kube/config

 

그러면 LS0tLS1.. 로 시작하는 진짜 secret key값들을 확인할 수 있다. 

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1......실제 값
    server: https://127.0.0.1:38209
  name: kind-k8s-kind-cluster1
contexts:
- context:
    cluster: kind-k8s-kind-cluster1
    user: kind-k8s-kind-cluster1
  name: kind-k8s-kind-cluster1
current-context: kind-k8s-kind-cluster1
kind: Config
preferences: {}
users:
- name: kind-k8s-kind-cluster1
  user:
    client-certificate-data: LS0tLS1.....실제 값

 

요 config 파일을 잘 기억해둬야한다...! 

나중에 mwaa airflow와 연결하기 위한 key이기 때문이다. 

 

이상 여기까진 kind로 로컬 쿠버네티스 클러스터 환경 구축하기 완료! 

 

 

그런데 사실 더 간단한 방법이 있었다...

단일 클러스터로 간단하게 쿠버네티스만 이용해볼꺼라면 아래의 방법을 개인적으로 추천한다. 

 

로컬 k8s 환경세팅 (docker-desktop)

나는 이미 docker desktop이 설치되어 있는 상태였다. 

도커 데스크탑 설치 공식문서 : https://www.docker.com/products/docker-desktop/

 

Preferences에 요런 kubernetes 메뉴가 있었다.

요걸 enable 시키고, apply & restart를 누르면 쿠버네티스가 설치된다.

 

그리고 마찬가지로 kubectl로 로컬 쿠버네티스의 관련 정보를 확인해보았다. 

 

kind에서는 직접 이름을 지정한 클러스터를 생성했는데, 

이번엔 디폴트로 docker-desktop 이라고 이름이 지정된다.

(base) ➜ ~ kubectl cluster-info
Kubernetes control plane is running at https://kubernetes.docker.internal:6443
CoreDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
(base) ➜ ~ kubectl config get-contexts
CURRENT   NAME              CLUSTER           AUTHINFO          NAMESPACE
*         docker-desktop    docker-desktop    docker-desktop
(base) ➜ ~ kubectl get services
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   12d
(base) ➜ ~ kubectl get nodes
NAME             STATUS   ROLES           AGE   VERSION
docker-desktop   Ready    control-plane   12d   v1.24.0
(base) ➜ ~ kubectl get namespaces
NAME                   STATUS   AGE
default                Active   12d
kube-node-lease        Active   12d
kube-public            Active   12d
kube-system            Active   12d
kubernetes-dashboard   Active   12d

 

마찬가지로 kubectl config view를 통해 config도 이렇게 확인해볼 수 있다. 

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: DATA+OMITTED
    client-key-data: DATA+OMITTED

 

마찬가지로 가려진값으로, 실제 인증서 값은 아래의 경로에서 확인할 수 있다.

vi ~/.kube/config

 

다시한번 강조하지만 ca 인증서 키값을 가지고 있는 요 파일을 잘 기억해두고 있어야한다! 

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1......실제 값
    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: LS0tLS1.....실제 값

 

그럼 이렇게 로컬환경에서 docker-desktop을 사용해서 간단한 쿠버네티스 환경 만들기 완료!


 

다음글에서는 이전글에서 구축한 로컬 mwaa의 배치작업을 로컬 쿠버네티스 환경 위에서 동작하도록 구성해볼 것이다.

 

KubernetesPodOperator하는 배치작업인것이다..!

사실 이게 진짜 최종 목표다....!

 

 

728x90
반응형