Always-Try(정보보안 및 일상)

EKS Starter - 3. Helm Package Manager 본문

AWS

EKS Starter - 3. Helm Package Manager

Always-Try 2021. 9. 1. 23:26
https://www.udemy.com/course/amazon-eks-starter-kubernetes-on-aws/ 참고


Helm은 쿠버네티스 어플리케이션을 관리하는 데에 도움을 주는 툴이며, Chart라는 패키징 포맷을 사용하는데 이 포맷으로 쿠버네티스 어플리케이션을 정의/설치/업그레이드/삭제하실 수 있다. 예를 들어 여러분이 서비스하는 웹 서비스 하나에 대한 Deployment, Service가 정의되어야 하고 필요한 Role이 있다고 할 때 이를 한꺼번에 묶어서 패키지처럼 관리하는 것이다. 여러분이 만든 것 뿐 아니라 metrics-server나, prometheus 등 다른 사람들이 만든 소프트웨어도 Helm 을 이용해서 쉽게 다운 받아 이용할 수 있다. 한마디로 하자면, Helm이란 Kubernetes Package manage tool로 Mac의 brew와 비슷하다고 볼 수 있다.

Helm을 설치해보자. Helm 버전은 3 버전이 최신에 나왔으며 어느정도 안정화되었다고 보기 때문에 Helm3을 설치한다.
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash


이후 Helm 공식 repository를 참조하여 stable repository를 생성한다.
helm repo add stable https://charts.helm.sh/stable

helm repo list 로 repository 리스트 확인


repository를 업데이트 해보자
helm repo update


helm search repo 를 통해 다양한 패키지들을 확인할 수 있다.


helm으로 간단한 redis 패키지 차트를 하나 받아보자.
helm install redis-test stable/redis (여기서 redis-test는 임의로 정한 내가 받을 redis application을 이름을 지정한 것)
아래와 같은 Error가 발생한다.
The connection to the server localhost:8080 was refused
kubctl get pod를 쳐봐도 비슷한 메시지가 발생한다. 구글링 해보니 아래와 같이 해결방법이 나오긴한다.
https://twofootdog.tistory.com/82

 

The connection to the server localhost:8080 was refused 해결방법

kubectl을 통해서 쿠버네티스 클러스터에 접속하려 할 때 다음과 같은 에러 메시지가 발생하는 경우가 종종 있다. The connection to the server localhost:8080 was refused - did you specify the ..

twofootdog.tistory.com

하지만 곰곰히 생각해보니 어제 테스트 하고 자기 전에 AWS 비용을 절감하려고 생상한 클러스터를 모드 삭제했었다는게 떠올랐다.

클러스터가 없으니 접근이 안되었던 것이다. 부랴부랴 다시 가장 기본적인 ng-1 클러스터를 생성한다.
time eksctl create cluster -f /home/ubuntu/eksctl/eks-course.yaml

그리고 kubectl을 단축시키기 위해 아래와 같이 입력
alias k=kubectl

클러스터를 새로 생성한 상태에서 다시 helm search repo 를 했더니 repository가 없다고 한다. 다시 세팅해준다.

helm repo add stable https://charts.helm.sh/stable

helm search repo

helm repo update

이후는 강의보다 마스터 서 님의 브런치에 더 자세한 사항이 있는 것 같아서 참고했다.
https://brunch.co.kr/@topasvga/1706

 

3-3. AWS EKS- Helm으로 nginx설치

Helm은 리눅스의 yum과 같은 패키지 관리 툴이다. Helm으로 nginx 설치해 보자 1 alias k=kubectl complete -F __start_kubectl k k get ns,no,po,svc,deploy,rs,ing $ k get ns,no,po,svc,deploy,rs,ing Warning: extensions/v1beta1 Ing

brunch.co.kr


helm search repo nginx


로컬 목록에 비트나미를 추가한다.
helm repo add bitnami https://charts.bitnami.com/bitnami

외부에서 비트나미 repo를 받아와서 내부에 bitnami 라는 곳에 저장하는 것으로 보인다.

repository에서 bitnami/nginx를 찾아본다.
helm search repo bitnami/nginx


helm install mywebserver bitnami/nginx
이 명령어를 치면 NGINX가 배포되며 접근할 수 있는 Commnad도 상세하게 나온다.

kubctl로 정보를 얻어와서 환경변수에 넣는 작업인데, 어떤 항목들이 환경변수에 들어가는지 보고 싶어서 아래와 같은 명령어를 입력해서 좀 살펴봤다.

k get ns,no,po,svc,deploy,rs,ing

kubectl describe service/mywebserver-nginx


deployment에 대한 정보를 상세하게 보려면 아래 명령어를 입력한다.
kubectl describe deployment mywebserver


kubectl get pods -l app.kubernetes.io/name=nginx


외부 접속 IP를 확인하기 위해 kubectl get service mywebserver-nginx -o wide (지금보니 외부 IP 주소는 위에 kubectl describe service/mywebserver-nginx 시 나왔던 Loadbalancer Ingress IP이다.)

 


이제 삭제해보자
먼저 helm 패키지 리스트 확인
helm list


helm uninstall mywebserver


kubectl get pods -l app.kubernetes.io/name=nginx


k get ns,no,po,svc,deploy,rs,ing
서비스에 mywebserver가 삭제되었다.


갑자기 궁금증이 생겼다.
helm으로 nginx 배포 시 LB가 생겼는데, 콘솔상에서도 보일까?
다시 해보자.


그리고 EKS 부분에서 클러스터 -> 노드 -> 파드 순으로 찾아보자.







끝내려고 했는데, LB 쪽 콘솔 아래에 아래와 같은 경고? 비슷한 문구가 적혀있다.

파드가 삭제되고 생성됨에 따라 IP가 바뀔 수 있음을 나타내는 것으로 보인다.






-----------------------------------------

기타1.

파드 배포
kubectl apply -f nginx-deployment.yaml

파드 삭제
kubectl delete -f nginx-deployment.yaml

----------------------------------------

기타2.

실행중인 파드 접속
kubectl get pods로 파드 이름 확인 후 파드 이름을 파라미터로 아래와 같이 실행
kubectl exec -it mywebserver-nginx-7bf65d6f8c-cnpdh /bin/bash

주의!! 빠져나올때 exit 로 나오면 container 가 멈출수 있으니, Ctrl을 누르고 있는 상태에서 p와 q를 누르면 container 멈추지 않고 나올 수 있다.

일단 들어갔으니 어떤게 있는지 확인해보자. 필자는 nginx 기본 패키지를 배포했으므로 배포앱이름/apps/ 폴더에 index.html 파일이 있는 것을 볼 수 있다. (vi 명령어는 먹히지 않는다.)


음 touch와 sudo 명령어도 먹히지 않는다.



cd ..를 통해 상위 디렉토리로 이동해보자. bin 폴더가 보인다. 여기 들어가면 사용할 수 있는 명령어가 나올 것이다.
dd도 있고 mountr도 있고 여러가지가 있다.

touch도 있는데 권한문제로 실행이 안된다. other 까지 실행할 수 있도록 되어 있긴한데, 실행이 안된다. 이유를 모르겠고 현재 어떤 권한인지 알고 싶은데 whoami도 안먹힌다.


일단 이것저것 계속해보자.
curl www.naver.com

curl http://example.com/resource

응답을 받아온다.
pod도 외부 통신이 가능하구나. 그럼 어떻게 제어할 수 있을까?
일단 파드가 올라간 노드(인스턴스)의 보안 그룹에서 아웃바운드를 막아보자.


/etc/password 파일을 확인해본다.


근데 뭐만하면 퍼미션 디나이다...
루트로 들어갈 수 없을까? 방법이 있다.

http://www.kwangsiklee.com/2018/12/kubernetes%EC%97%90%EC%84%9C-%ED%8A%B9%EC%A0%95-pod-root%EA%B6%8C%ED%95%9C%EC%9C%BC%EB%A1%9C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B8%B0/


먼저 파드가 어떤 노드에 있는지 파악한다.
kubectl describe pod

해당 노드의 IP는 사설 IP이며, 접근하려고 하는 서버(eks 설치된) 서브넷과 다른 서브넷이므로 콘솔에서 공인 IP를 찾아서 접근한다.


ssh를 통해 접속하려고 했더니 키가 안맞다고 한다. 노드도 키페이에 있는 pem 파일로 비밀번호를 생성했는데 그 정보가 없어서 그런 것 같다. 그냥 putty에 해당 키를 줘서 해당 노드로 바로 붙어보자.
접근이 가능하다. putty 입력 시에는 공인 IP로 입력했는데, 연결된 창을 보면 사설 IP로 나온다.



docker ps 로 원하는 이미지를 찾는다.


docker exec -it -u root 757dea5c6210 /bin/bash


드디어 컨테이너 내부에 진입했다.
curl 명령어로 외부에서 받은 파일을 저장도 가능하다는 것도 확인했다.

그리고 컨테이너에서 빠져나와 다시 노드 인스턴스에서 방금 다운로드 받은 파일이 어디에 있는지 찾아본다.
find / -name "test.txt"

권한도 살펴보자. 이동도 해보자.


둘 다 잘된다. 컨테이너라서 외부에서 파일을 넣거나 내부 파일을 밖으로 못 빼내는 구조인줄 알았는데 충분히 내/외부자 침입자가 컨테이너를 통한 감염 및 정보유출을 할 수 있는 것으로  판단되어진다.
흠.. 그럼 다음번엔 컨테이너 및 파드들에 대한 안티 바이러스 제품 동작을 테스트 해보도록 하겠다.






--------------------------------------
기타3.

Pod 외부에서 접속하게 설정하기

https://velog.io/@dojun527/Pod-%EC%99%B8%EB%B6%80%EC%97%90%EC%84%9C-%EC%A0%91%EC%86%8D%ED%95%98%EA%B2%8C-%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0

 

Pod 외부에서 접속하게 설정하기

생성한 Pod를 외부에 노출시켜본다.앞서 배포한 Pod의 ip 주소로 외부에서 접속하려하면 접속할 수 없다는 창이 뜬다. 이는 쿠버네티스 내부에서 사용하는 네트워크가 외부와 격리되었기 때문이

velog.io


-----------------------------------------------
기타4.

파드 IP를 콘솔에서 보려면

----------------------

Comments