Helm Chart를 통한 간단한 nginx 배포를 위해 repo에서 nginx를 검색합니다.
helm search repo nginx
출력 결과 예시
helm search repo nginx
NAME CHART VERSION APP VERSION DESCRIPTION
stable/nginx-ingress 1.41.3 v0.34.1 DEPRECATED! An nginx Ingress controller that us...
stable/nginx-ldapauth-proxy 0.1.6 1.13.5 DEPRECATED - nginx proxy with ldapauth
stable/nginx-lego 0.3.1 Chart for nginx-ingress-controller and kube-lego
stable/gcloud-endpoints 0.1.2 1 DEPRECATED Develop, deploy, protect and monitor...
간단한 웹서비스 배포를 위해 nginx를 추가해서 구동해 봅니다. 배포도구로 인기 있는 bitnami repo를 추가해서 nginx를 설치해 봅니다.
helm search repo bitnami/nginx
NAME CHART VERSION APP VERSION DESCRIPTION
bitnami/nginx 9.5.8 1.21.3 Chart for the nginx server
bitnami/nginx-ingress-controller 8.0.9 1.0.4 Chart for the nginx Ingress controller
$ helm install helm-nginx bitnami/nginx --namespace helm-test
NAME: helm-nginx
LAST DEPLOYED: Wed Oct 20 11:37:15 2021
NAMESPACE: helm-test
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
** Please be patient while the chart is being deployed **
NGINX can be accessed through the following DNS name from within your cluster:
helm-nginx.helm-test.svc.cluster.local (port 80)
To access NGINX from outside the cluster, follow the steps below:
1. Get the NGINX URL by running these commands:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
Watch the status with: 'kubectl get svc --namespace helm-test -w helm-nginx'
export SERVICE_PORT=$(kubectl get --namespace helm-test -o jsonpath="{.spec.ports[0].port}" services helm-nginx)
export SERVICE_IP=$(kubectl get svc --namespace helm-test helm-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
echo "http://${SERVICE_IP}:${SERVICE_PORT}"
Pod와 서비스 배포를 확인합니다.
kubectl -n helm-test get service
$ kubectl -n helm-test get service
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
helm-nginx LoadBalancer 172.20.141.34 adeb84a799b4046689bec6ed2b120c51-272707121.ap-northeast-2.elb.amazonaws.com 80:32303/TCP 50s
ELB 주소를 확인합니다.
export SERVICE_IP=$(kubectl get svc --namespace helm-test helm-nginx --template "{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}")
echo "NGINX URL: http://$SERVICE_IP/"
해당 주소로 접속해 봅니다.
EC2 대시보드에서 ELB가 정상적으로 생성된 것을 확인 할 수 있습니다.
설치된 helm list를 확인합니다.
helm list -n helm-test
출력 예시
$ helm list -n helm-test
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
helm-nginx helm-test 1 2021-10-20 11:37:15.991941399 +0000 UTC deployed nginx-9.5.8 1.21.3
앞서 git에서 복제한 파일들 중에서 helm-chart-demo 폴더의 파일을 복사합니다.
# 각 템플릿 타입을 위한 서브 폴더 생성
mkdir -p ~/environment/helm-chart-demo/templates/deployment
mkdir -p ~/environment/helm-chart-demo/templates/service
# helm chart pod deploy용 manifest 파일 복사
cp ~/environment/myeks/helm-chart-demo/ecsdemo-frontend-deployment.yaml ~/environment/helm-chart-demo/templates/deployment/frontend.yaml
cp ~/environment/myeks/helm-chart-demo/ecsdemo-crystal-deployment.yaml ~/environment/helm-chart-demo/templates/deployment/crystal.yaml
cp ~/environment/myeks/helm-chart-demo/ecsdemo-nodejs-deployment.yaml ~/environment/helm-chart-demo/templates/deployment/nodejs.yaml
# helm chart pod service용 manifest 파일 복사
cp ~/environment/myeks/helm-chart-demo/ecsdemo-frontend-service.yaml ~/environment/helm-chart-demo/templates/service/frontend.yaml
cp ~/environment/myeks/helm-chart-demo/ecsdemo-crystal-service.yaml ~/environment/helm-chart-demo/templates/service/crystal.yaml
cp ~/environment/myeks/helm-chart-demo/ecsdemo-nodejs-service.yaml ~/environment/helm-chart-demo/templates/service/nodejs.yaml
아래 deploy용 yaml manifest 파일은 replica와 image 값이 helm chart의 value를 참조하도록 선언되어 있습니다. 각 파일에서 확인해 봅니다. (ecsdemo-frontend-deployment.yaml, ecsdemo-crystal-deployment.yaml, ecsdemo-nodejs-deployment.yaml)
cat <<EoF > ~/environment/helm-chart-demo/values.yaml
# Default values for eksdemo.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
# Release-wide Values
namespace: 'helm-chart-demo'
replicas: 3
version: 'latest'
# Service Specific Values
nodejs:
image: brentley/ecsdemo-nodejs
crystal:
image: brentley/ecsdemo-crystal
frontend:
image: brentley/ecsdemo-frontend
EoF
helmdemo에 사용할 namespace를 생성합니다.
kubectl create namespace helm-chart-demo
8. Chart 배포
Helm chart는 실제 배포하지 않고 "--dry-run" 플래그를 사용하여, 랜더링 된 템플릿을 빌드하고 출력할 수 있습니다.
아래 명령을 통해 service loadbalancer(ELB) 의 DNS name을 확인합니다.
kubectl -n helm-chart-demo get svc ecsdemo-frontend
출력 결과 예시
$ kubectl -n helm-chart-demo get svc ecsdemo-frontend
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ecsdemo-frontend LoadBalancer 172.20.185.71 a79963b6877134227a0c6e5760d57bd5-1823214377.ap-northeast-2.elb.amazonaws.com 80:31678/TCP 3m30s
정상적으로 서비스에 접속되는 것을 확인 할 수 있습니다.
helm list에도 정상적으로 등록되어 있는지 확인합니다.
helm list -n helm-chart-demo
출력 결과 예
$ helm list -n helm-chart-demo
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
rollingback-app helm-chart-demo 1 2021-10-20 13:36:51.965888237 +0000 UTC deployed helm-chart-demo-0.1.0 1
10. Rolling Back 구성
배포 중에 이슈가 발생하더라도, Helm을 사용하면 손쉽게 이전 배포 버전으로 Rolling back 할 수 있습니다. 앞서 출력결과에서 "Revision" 값이 "1"인 것을 확인했습니다. 이제 helm Chart를 변경하고 업데이트 한 이후 , 다시 Rollback 하는 과정을 수행하겠습니다.
먼저 Helm Chart로 배포한 내용을 확인합니다. REVISON:1 으로 구성된 것을 확인 할 수 있습니다.
helm history -n helm-chart-demo rollingback-app
$ helm history -n helm-chart-demo rollingback-app
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed Oct 20 13:36:51 2021 deployed helm-chart-demo-0.1.0 1 Install complete
Rolling Back 시험을 위해, 먼저 helm Chart의 Value를 변경합니다. ~/environment/helm-chart-demo/values.yaml 파을 다시 열고, Cloud9 IDE 편집기에서 replicat의 값을 아래와 같이 수정합니다.
replicas: 1
변경 후 File 내용 확인 (values.yaml)
# Default values for eksdemo.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
# Release-wide Values
namespace: 'helm-chart-demo'
## replicas를 3에서 1로 변경합니다
replicas: 1
version: 'latest'
d아래와 같이 REVISON 3은 DESCRIPTION 에 자동으로 Rollback 되었고, REVISION 1번으로 복귀하였음을 알려줍니다.
$ helm history -n helm-chart-demo rollingback-app
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed Oct 20 13:36:51 2021 superseded helm-chart-demo-0.1.0 1 Install complete
2 Wed Oct 20 13:45:18 2021 superseded helm-chart-demo-0.1.0 1 Upgrade complete
3 Wed Oct 20 13:47:51 2021 deployed helm-chart-demo-0.1.0 1 Rollback to 1
~/environment/helm-chart-demo/values.yaml 파을 다시 열고, Cloud9 IDE 편집기에서 replicat의 값을 아래와 같이 수정합니다.해 value.yaml 파일 다시 정상적으로 수정합니다.
replicas: 3
생성했던 helmdemo를 삭제합니다. 아래 ChartMuseum 구성과 배포를 위해서 반드시 삭제합니다.
helm uninstall -n helm-chart-demo rollingback-app
ChartMuseum 구성과 배포.
ChartMuseum은 Amazon S3,Google Cloud Storage, , Microsoft Azure Blob Storage, Alibaba Cloud OSS Storage, Openstack Object Storage, Oracle Cloud Infrastructure Object를 포함한 클라우드 스토리지 백엔드를 지원하는 Go (Golang)로 작성된 오픈 소스 Helm Chart Repository 서버입니다.
이 랩에서는 ChartMuseum을 구성하여, S3에 Helm Chart를 위한 로컬 레포지토리를 만들어 보겠습니다.
1.ChartMuseum 설치.
먼저 ChartMuseum을 설치합니다.
cd ~/environment
curl -LO https://s3.amazonaws.com/chartmuseum/release/latest/bin/linux/amd64/chartmuseum
chmod +x ./chartmuseum
Cloud9 IDE를 이용해서 Chartmuseum을 구동합니다. 스토리지 저장소는 S3를 사용합니다.
사전에 s3 bucket을 AWS CLI 또는 Console 에서 생성합니다.
S3를 CLI로 생성합니다.
##S3 Bucket 생성합니다.
##Bucket name은 고유해야 합니다.
export s3chartmuseum=usernamechartmuseum
echo "export s3chartmuseum=${s3chartmuseum}" | tee -a ~/.bash_profile
aws s3 mb s3://${s3chartmuseum}
whchoi98:~/environment $ helm repo add chartmuseum http://localhost:8888
2021-04-06T08:19:36.368Z DEBUG [3] Incoming request: /index.yaml {"reqID": "572624a5-6e8e-4566-a071-1828c7aafeb7"}
2021-04-06T08:19:36.368Z DEBUG [3] Entry found in cache store {"repo": "", "reqID": "572624a5-6e8e-4566-a071-1828c7aafeb7"}
2021-04-06T08:19:36.368Z DEBUG [3] Fetching chart list from storage {"repo": "", "reqID": "572624a5-6e8e-4566-a071-1828c7aafeb7"}
2021-04-06T08:19:36.424Z DEBUG [3] No change detected between cache and storage {"repo": "", "reqID": "572624a5-6e8e-4566-a071-1828c7aafeb7"}
2021-04-06T08:19:36.424Z INFO [3] Request served {"path": "/index.yaml", "comment": "", "clientIP": "127.0.0.1", "method": "GET", "statusCode": 200, "latency": "56.032676ms", "reqID": "572624a5-6e8e-4566-a071-1828c7aafeb7"}
"chartmuseum" has been added to your repositories
이제 앞서 생성한 eksdemo helm chart 패키징 합니다.
cd ~/environment/helm-chart-demo/
helm package ./
출력 결과 예시
~/environment/helm-chart-demo $ helm package ./
Successfully packaged chart and saved it to: /home/ec2-user/environment/helm-chart-demo/eksdemo-0.1.0.tgz
aws s3 ls s3://${s3chartmuseumt}
2022-02-14 14:28:03 1400 helm-chart-demo-0.1.0.tgz
이제 등록된 Repo를 업데이트하고, Chartmuseum 로컬 레포지토리를 검색해 봅니다.
helm repo update
helm search repo chartmuseum
출력결과 예제
whchoi98:~/environment/helm-chart-demo $ helm search repo chartmuseum
NAME CHART VERSION APP VERSION DESCRIPTION
stable/chartmuseum 2.14.2 0.12.0 DEPRECATED Host your own Helm Chart Repository
chartmuseum/helm-chart-demo 0.1.0 1 A Helm chart for EKS Workshop Microservices app...