이전에 로컬에서 mwaa airflow를 띄워보았다.
직접 테스트해보고 구축해본 내용은 아래의 글 참고^^
https://pearlluck.tistory.com/791
이번에는 로컬에서 쿠버네티스 환경을 구축해보려고 한다.
사실 가장 큰 목적은 이 로컬에서 띄운 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)
kind는 kubernetes in docker의 줄임말로 (난 또 친절하단줄 알았네..ㅎㅎ)
기존에 사용하던 도커만 있으면 로컬에서 쿠버네티스를 사용할 수 있게 해주는 툴이다.
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하는 배치작업인것이다..!
사실 이게 진짜 최종 목표다....!
'🌿 Data Engineering > Data PipeLine (Airflow)' 카테고리의 다른 글
KubernetesPodOperator으로 로컬 k8s에서 airflow 배치작업 만들기 (0) | 2024.01.21 |
---|---|
[로컬 환경에서] AWS MWAA (ariflow) 구축하기 (1) | 2024.01.07 |
Airflow DAG작성하고, webUI 살펴보기 (OpenWeather ETL) (0) | 2021.09.11 |
AWS ec2(Ubuntu)에 Airflow2.0 설치하기 (0) | 2021.09.03 |
Airflow 한번 맛보기 | Apache Airflow란? (0) | 2021.04.16 |
데이터파이프라인(datapipeline)이란? (0) | 2021.03.10 |