[Kubernetes] 쿠버네티스 훑어보기
What is kubernetes?
쿠버네티스는 다음을 기능들을 제공한다.
- 서비스 디스커버리와 로드 밸런싱
- 스토리지 오케스트레이션
- 자동화된 롤아웃과 롤백
- 자동화된 빈 패킹
- 자동화된 복구
- 시크릿과 구성 관리
자세한 정보는 공식 문서에서 잘 설명해주니 공식 문서를 참조하자.
쿠버네티스를 실행할 수 있는 방법에는 여러가지가 있지만 공식 사이트에서는 minikube 를 사용하여 진행한다. 이 글에서는 Docker desktop 을 사용하여 쿠버네티스를 활용하는 방법을 정리하고 있다. minikube 를 사용하는 방법을 알고 싶다면, 공식 사이트를 참고하시면 되겠다.
minikube 는 일단 간단하게 짚어보고 넘어가자.
minikube
Install
brew install minikube
Usage
사용 방법 설명이 필요없을 정도로 명령어가 직관적이다.
minikube start
minikube dashboard
minikube stop
# 사용이 끝난 리소스 정리
minikube delete --all
장점
Secret 등 세부설정이 필요하지 않고 간단하게 개발 용도로 쓰기에 적합하다.
단점
dashboard 를 보기 위한 명령어를 실행하면 가끔씩 hang 이 걸려버리는 문제가 있다. 사실 이게 가장 큰 이유고 이 글을 쓰면서 minikube 를 사용하지 않는 이유이기도 하다.
Docker desktop
Install
Docker desktop 의 메뉴에서 kubernetes 를 활성화해주면 끝.
Dashboard
쿠버네티스 대쉬보드는 기본적으로 활성화되어 있지 않다.
다음 명령어를 통해 활성화할 수 있다.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.5.0/aio/deploy/recommended.yaml
Dashboard start
kubectl proxy
이제 link 를 통해 dashboard 에 접근할 수 있다.
로그인을 위해 token 이 필요하다. 다음은 생성 방법을 확인해보자.
Secrets
우선 관련 파일을 따로 보관하기 위해서 kubernetes
폴더를 만들어준다.
mkdir kubernetes && cd kubernetes
dashboard 계정이 admin 권한을 갖는 것은 보안상 위험할 수 있으므로 실제 운영시에는 본인의 행동을 명확하게 인지해야 한다.
dashboard-adminuser.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f dashboard-adminuser.yaml
cluster-role-binding.yml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
kubectl apply -f cluster-role-binding.yaml
create token
kubectl -n kubernetes-dashboard create token admin-user
eyJhbGciOiJSUzI1NiIsImtpZCI6IjVjQjhWQVdpeWdLTlJYeXVKSUpxZndQUkoxdzU3eXFvM2dtMHJQZGY4TUkifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjLmNsdXN0ZXIubG9jYWwiXSwiZXhwIjox7jU4NTA3NTY1LCJpYXQiOjE2NTg1MDM5NjUsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2Yy5jbHVzdGVyLmxvY2FsIiwia3ViZXJuZXRlcy5pbyI6eyJuYW4lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsInNlcnZpY2VhY2NvdW55Ijp7Im5hbWUiOiJhZG1pbi11c2VyIiwidWlkIjoiZTRkODM5NjQtZWE2MC00ZWI0LTk1NDgtZjFjNWQ3YWM4ZGQ3In19LCJuYmYiOjE2NTg1MDM5NjUsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDphZG1pbi11c2VyIn1.RjoUaQnhTVKvzpAx_rToItI8HTZsr-6brMHWL63ca1_D4QIMCxU-zz7HFK04tCvOwyOTWw603XPDCv-ovjs1lM6A3tdgncqs8z1oTRamM4E-Sum8oi7cKnmVFSLjfLKqQxapBvZF5x-SxJ8Myla-izQxYkCtbWIlc6JfShxCSBJvfwSGW8c6kKdYdJv1QQdU1BfPY1sVz__cLNPA70_OpoosHevfVV86hsMvxCwVkNQHIpGlBX-NPog4nLY4gfuCMxKqjdVh8wLT7yS-E3sUJiXCcPJ2-BFSen4y-RIDbg18qbCtE3hQBr033Mfuly1Wc12UkU4bQeiF5SerODDn-g
생성된 token 을 사용하여 로그인한다.
접속 성공!
deployment 생성
image 를 사용하여 deployment 를 생성한다. 이 글을 위해 golang 을 사용한 웹서버를 미리 만들어놨다.
kubectl create deployment rest-server --image=songkg7/rest-server
명령이 성공적으로 수행되면 dashboard 에 바로 변화가 생기기 때문에 쉽게 모니터링할 수 있다.
deployment 를 생성하면 dashboard 에 바로 변화가 생긴다.
하지만 CLI(근본...!) 를 통해서 확인하는 법 또한 알아보자.
상태 확인
kubectl get deployments
deployment 의 생성과 동시에 pod 또한 생성된다.
kubectl get pods -o wide
정상적으로 실행되고 있음을 확인했으니 이제 우리의 웹서버에 요청을 보내보자.
명령은 curl
대신 httpie
1 를 사용하는데, curl
이 더 익숙하다면 curl
을 사용해도 무방하다.
http localhost:8080/ping
분명히 정상동작 중인데 왜 응답을 받을 수 없을까? 🤔
아직 우리 서비스는 외부에 노출되어 있지 않기 때문이다. 쿠버네티스의 pods 는 기본적으로 내부에서만 통신이 가능하다. 이제 우리 서비스를 외부와 통신이 가능하도록 변경해보자.
service 외부 노출
kubectl expose deployment rest-server --type=LoadBalancer --port=8080
우리 서비스는 8080 을 사용하고 있기 때문에 8080 port 를 열어준다. 다른 포트를 사용하면 접속되지 않을 수 있다.
이제 다시 요청을 보내보자.
http localhost:8080/ping
성공적으로 응답을 받을 수 있는 것을 확인할 수 있다.