- 인쇄
- PDF
Helm 이용 가이드
- 인쇄
- PDF
Classic 환경에서 이용 가능합니다.
Helm은 kubernetes Package Manager로 클라이언트인 Helm과 cluster 내에 설치되는 tiller 서버로 구성되어 있습니다.
이 가이드는 Helm v2를 기준으로 작성되었습니다.
Helm 설치하기
Helm을 사용하기 위해서는 kubectl 설치 및 kubeconfig 설정이 선행돼야 합니다.
Helm 설치는 OS Platform에 맞게 다음 페이지의 안내에 따라 진행합니다.
- https://v2.helm.sh/docs/using_helm/#installing-helm
예시: macOS
$ brew install helm@2
Helm를 사용하기 위해서는 tiller 배포를 진행해야 하는데 배포 전에 tiller의 clusterrolebinding 권한을 부여해야 합니다.
Cluster role binding 추가
$ kubectl --kubeconfig=$KUBE_CONFIG create clusterrolebinding tiller-cluster-admin \
--clusterrole=cluster-admin \
--serviceaccount=kube-system:default
clusterrolebinding.rbac.authorization.k8s.io/tiller-cluster-admin created
clusterrolebinding 권한을 추가 후 Helm 초기화로 tiller를 배포합니다.
Helm 초기화
$ helm --kubeconfig=$KUBE_CONFIG init
...
Tiller (the Helm server-side component) has been installed into your Kubernetes Cluster.
Please note: by default, Tiller is deployed with an insecure 'allow unauthenticated users' policy.
To prevent this, run `helm init` with the --tiller-tls-verify flag.
For more information on securing your installation see: https://docs.helm.sh/using_helm/#securing-your-helm-installation
Happy Helming!
초기화 명령 실행 후 tiller-deploy Pod가 배포 완료되는 것을 확인할 수 있고 STATUS가 Running 상태이면 Helm을 사용할 수 있는 상태가 됩니다.
tiller-deploy pod 확인하기
$ kubectl --kubeconfig=$KUBE_CONFIG get pods -n kube-system -w
NAME READY STATUS RESTARTS AGE
...
tiller-deploy-845cffcd48-llds2 1/1 Running 0 18h
...
Helm으로 NFS Client Provisioner를 설치하여 NAS 연동하기
Helm v3는 아래 링크의 가이드를 참조하시기 바랍니다.
클러스터에 기본적으로 BlockStorage CSI가 설치되어있기 때문에 StorageClass도 자동으로 생성되지만
Helm nfs-client-provisioner chart를 이용하여 NAS를 연동한 StorageClass를 생성할 수도 있습니다.
먼저 NAS에서 NFS 프로토콜로 볼륨 생성이 필요합니다.
NAS 생성 시 클러스터 내의 워커 노드 서버를 ACL에 모두 등록해야 합니다.
NAS 볼륨이 생성되면 마운트 정보의 IP 및 PATH 정보를 확인합니다.
IP와 PATH 정보는 Helm chart를 설치할 때 설정값으로 사용됩니다.
예시
- NAS_IP: 10.250.48.16
- NAS_PATH: /n000075_nkstest3
nfs-client-provisioner 설치하기
다음 명령의 NAS_IP, NAS_PATH 값은 위의 예시를 참고하여 설정값을 지정합니다.
$ helm --kubeconfig=$KUBE_CONFIG --name storage install stable/nfs-client-provisioner \
--set nfs.server=__NAS_IP__ \
--set nfs.path=__NAS_PATH__
NAME: storage
LAST DEPLOYED: Tue Feb 19 16:56:50 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/ClusterRole
NAME AGE
storage-nfs-client-provisioner-runner 1s
==> v1/ClusterRoleBinding
run-storage-nfs-client-provisioner 0s
==> v1/Role
leader-locking-storage-nfs-client-provisioner 0s
==> v1/RoleBinding
leader-locking-storage-nfs-client-provisioner 0s
==> v1/Deployment
storage-nfs-client-provisioner 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
storage-nfs-client-provisioner-6f4b47749d-x9cn2 0/1 ContainerCreating 0 0s
==> v1/StorageClass
NAME AGE
nfs-client 1s
==> v1/ServiceAccount
storage-nfs-client-provisioner 1s
Storageclass 확인하기
$ kubectl --kubeconfig=$KUBE_CONFIG get storageclass
NAME PROVISIONER AGE
nfs-client (default) cluster.local/storage-nfs-client-provisioner 16s
위 패키지가 설치되면 이제 Helm 패키지 중 PVC가 있는 경우 연동된 NAS에 자동으로 PV를 생성합니다.
nfs-client-provisioner를 통해 NAS에 마운트 된 Worker Node를 정지하는 경우 정지실패 상태가 될 수 있습니다.
이는 OS의 버그로, Mount 된 NAS에 대해 I/O가 존재할 경우 발생합니다.
따라서 정지하기 전에 노드 유지보수 가이드를 참조하여 종료할 Node를 미리 Drain 후 정지하는 것을 권장해 드립니다.
Helm을 이용한 애플리케이션 설치하기
이 가이드에서는 Helm을 이용하여 Jenkins 애플리케이션 설치 및 접속할 수 있는 방법을 설명합니다.
다음 명령을 통해 Jenkins 설치를 진행합니다.
제약사항
- 애플리케이션을 설치하기 전에 PersistentVolume 생성을 위해 StorageClass가 필요합니다.
- 클러스터에 기본적으로 CSI가 설치되어있기 때문에 StorageClass도 자동으로 생성되지만, nfs-client-provisioner의 StorageClass를 사용하고자 한다면 아래의 링크를 참고하여 nfs-client-provisioner 설치 후 Default StorageClass를 nfs-client로 변경해야 합니다.
- Helm으로 NFS Client Provisioner를 설치하여 NAS 연동하기
- Default StorageClass 변경하기
Jenkins 설치하기
$ helm --kubeconfig=$KUBE_CONFIG install --name=ci stable/jenkins
NAME: ci
LAST DEPLOYED: Wed Feb 20 15:38:07 2019
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/ConfigMap
NAME AGE
ci-jenkins 0s
ci-jenkins-tests 0s
==> v1/PersistentVolumeClaim
ci-jenkins 0s
==> v1/Service
ci-jenkins-agent 0s
ci-jenkins 0s
==> v1/Deployment
ci-jenkins 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
ci-jenkins-7fb57bf7bb-t8dd9 0/1 Pending 0 0s
==> v1/Secret
NAME AGE
ci-jenkins 0s
NOTES:
1. Get your 'admin' user password by running:
printf $(kubectl get secret --namespace default ci-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode);echo
2. Get the Jenkins URL to visit by running these commands in the same shell:
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get svc --namespace default -w ci-jenkins'
export SERVICE_IP=$(kubectl get svc --namespace default ci-jenkins --template "{{ range (index .status.loadBalancer.ingress 0) }}{{ . }}{{ end }}")
echo http://$SERVICE_IP:8080/login
3. Login with the password from step 1 and the username: admin
For more information on running Jenkins on Kubernetes, visit:
https://cloud.google.com/solutions/jenkins-on-container-engine
- 사용자명: admin
- 비밀번호: secret을 통해 확인
Jenkins 설치가 완료되면 결과 화면에서 계정 정보를 확인할 수 있는 가이드를 제공하고, PV 정보를 확인할 수 있습니다.
PVC, PV 확인하기
$ kubectl --kubeconfig=$KUBE_CONFIG get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
ci-jenkins Bound pvc-1548887b-34da-11e9-89a3-f220cd2fe758 10Gi RWO nfs-client 23s
$ kubectl --kubeconfig=$KUBE_CONFIG get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pvc-1548887b-34da-11e9-89a3-f220cd2fe758 10Gi RWO Delete Bound default/ci-jenkins nfs-client 23s
Secret을 통해 Jenkins 접속 계정의 비밀번호 확인하기
$ kubectl --kubeconfig=$KUBE_CONFIG get secret --namespace default ci-jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 --decode;echo
Oq307Rj2Yu
이제 로컬머신에서 kubectl 명령 중 port-forward를 이용하여 설치된 Jenkins에 접속할 수 있습니다.
로컬머신에서 Jenkins 접속하기
$ export POD_NAME=$(kubectl --kubeconfig=$KUBE_CONFIG get pods -l "app.kubernetes.io/name=jenkins" -o jsonpath="{.items[0].metadata.name}"); echo $POD_NAME; kubectl --kubeconfig=$KUBE_CONFIG port-forward $POD_NAME 18080:8080
Forwarding from [::1]:18080 -> 8080
Forwarding from 127.0.0.1:18080 -> 8080
위 명령을 실행 후 브라우저에서 다음 링크로 접속하면 Jenkins 로그인 화면을 확인할 수 있습니다.
- http://localhost:18080
Jenkins 계정 정보를 입력 후 로그인하면 Jenkins 초기 화면에 접속할 수 있습니다.
Helm을 이용한 Prometheus/Grafana 설치 및 클러스터 모니터링하기
이 가이드에서는 모니터링 시스템인 Prometheus와 분석 플랫폼인 Grafana를 연동하여 클러스터를 모니터링하는 방법을 설명합니다.
Prometheus와 Grafana에 대한 자세한 내용은 아래 공식홈페이지에서 확인 가능합니다.
- https://prometheus.io/
- https://grafana.com/
제약사항
- 애플리케이션을 설치하기 전에 PersistentVolume 생성을 위해 StorageClass가 필요합니다.
- 클러스터에 기본적으로 CSI가 설치되어있기 때문에 StorageClass도 자동으로 생성되지만, nfs-client-provisioner의 StorageClass를 사용하고자 한다면 아래의 링크를 참고하여 nfs-client-provisioner 설치 후 Default StorageClass를 nfs-client로 변경해야 합니다.
- Helm으로 NFS Client Provisioner를 설치하여 NAS 연동하기
- Default StorageClass 변경하기
Prometheus 설치
먼저 모니터링을 위한 별도의 Namespace를 생성합니다.
네임스페이스 생성
$ kubectl --kubeconfig=$KUBE_CONFIG create namespace pg
Helm 명령을 이용하여 Prometheus를 설치합니다.
Helm으로 Prometheus 설치
$ helm --kubeconfig=$KUBE_CONFIG install --name prometheus stable/prometheus --version 6.7.4 --namespace pg
NAME: prometheus
LAST DEPLOYED: Thu Feb 28 11:24:30 2019
NAMESPACE: pg
STATUS: DEPLOYED
RESOURCES:
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
prometheus-node-exporter-pdrq7 0/1 ContainerCreating 0 1s
prometheus-alertmanager-7b945bb544-87knh 0/2 ContainerCreating 0 1s
prometheus-kube-state-metrics-86996f7fff-tfm92 0/1 Pending 0 1s
prometheus-pushgateway-b9477487f-42bhh 0/1 Pending 0 1s
prometheus-server-6f9d569489-q75mx 0/2 Pending 0 1s
==> v1/PersistentVolumeClaim
NAME AGE
prometheus-alertmanager 1s
prometheus-server 1s
==> v1beta1/ClusterRole
prometheus-kube-state-metrics 1s
prometheus-server 1s
==> v1beta1/ClusterRoleBinding
prometheus-kube-state-metrics 1s
prometheus-server 1s
==> v1/Service
prometheus-alertmanager 1s
prometheus-kube-state-metrics 1s
prometheus-node-exporter 1s
prometheus-pushgateway 1s
prometheus-server 1s
==> v1beta1/DaemonSet
prometheus-node-exporter 1s
==> v1/ConfigMap
prometheus-alertmanager 1s
prometheus-server 1s
==> v1/ServiceAccount
prometheus-alertmanager 1s
prometheus-kube-state-metrics 1s
prometheus-node-exporter 1s
prometheus-pushgateway 1s
prometheus-server 1s
==> v1beta1/Deployment
prometheus-alertmanager 1s
prometheus-kube-state-metrics 1s
prometheus-pushgateway 1s
prometheus-server 1s
NOTES:
The Prometheus server can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-server.pg.svc.cluster.local
Get the Prometheus server URL by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace pg -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace pg port-forward $POD_NAME 9090
The Prometheus alertmanager can be accessed via port 80 on the following DNS name from within your cluster:
prometheus-alertmanager.pg.svc.cluster.local
Get the Alertmanager URL by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace pg -l "app=prometheus,component=alertmanager" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace pg port-forward $POD_NAME 9093
The Prometheus PushGateway can be accessed via port 9091 on the following DNS name from within your cluster:
prometheus-pushgateway.pg.svc.cluster.local
Get the PushGateway URL by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace pg -l "app=prometheus,component=pushgateway" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace pg port-forward $POD_NAME 9091
For more information on running Prometheus, visit:
https://prometheus.io/
로컬머신에서 Prometheus 접속하기
$ export POD_NAME=$(kubectl --kubeconfig=$KUBE_CONFIG get pods --namespace pg -l "app=prometheus,component=server" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --kubeconfig=$KUBE_CONFIG --namespace pg port-forward $POD_NAME 9090
위 명령 실행 후 브라우저에서 다음 링크로 Prometheus에 접속할 수 있습니다.
- http://localhost:9090
Grafana 설치
Grafana를 설치하기 전에 Prometheus와 연동을 설정하기 위해 아래 values.yml을 먼저 작성합니다.
datasources.url의 값은 http://<prometheus-server-name>입니다. 위 가이드대로 진행했다면 <prometheus-server-name>은 prometheus-server이므로 http://prometheus-server로 설정합니다.
values.yml
persistence:
enabled: true
accessModes:
- ReadWriteOnce
size: 5Gi
datasources:
datasources.yaml:
apiVersion: 1
datasources:
- name: Prometheus
type: prometheus
url: http://prometheus-server
access: proxy
isDefault: true
dashboards:
kube-dash:
gnetId: 6663
revision: 1
datasource: Prometheus
kube-official-dash:
gnetId: 2
revision: 1
datasource: Prometheus
dashboardProviders:
dashboardproviders.yaml:
apiVersion: 1
providers:
- name: 'default'
orgId: 1
folder: ''
type: file
disableDeletion: false
editable: true
options:
path: /var/lib/grafana/dashboards
위 파일 작성 후 -f values.yml 옵션과 함께 Helm을 이용하여 Grafana를 설치합니다.
Helm으로 Grafana 설치
$ helm --kubeconfig=$KUBE_CONFIG install --name grafana stable/grafana --version 1.11.6 -f values.yml --namespace pg
NAME: grafana
LAST DEPLOYED: Thu Feb 28 14:38:24 2019
NAMESPACE: pg
STATUS: DEPLOYED
RESOURCES:
==> v1beta1/RoleBinding
NAME AGE
grafana 0s
==> v1/Service
grafana 0s
==> v1beta2/Deployment
grafana 0s
==> v1/Pod(related)
NAME READY STATUS RESTARTS AGE
grafana-76dbd66b77-d2dkl 0/1 Pending 0 0s
==> v1beta1/PodSecurityPolicy
NAME AGE
grafana 0s
==> v1/Secret
grafana 0s
==> v1/ConfigMap
grafana 0s
grafana-dashboards-json 0s
==> v1/ClusterRole
grafana-clusterrole 0s
==> v1/PersistentVolumeClaim
grafana 0s
==> v1/ServiceAccount
grafana 0s
==> v1/ClusterRoleBinding
grafana-clusterrolebinding 0s
==> v1beta1/Role
grafana 0s
NOTES:
1. Get your 'admin' user password by running:
kubectl get secret --namespace pg grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
2. The Grafana server can be accessed via port 80 on the following DNS name from within your cluster:
grafana.pg.svc.cluster.local
Get the Grafana URL to visit by running these commands in the same shell:
export POD_NAME=$(kubectl get pods --namespace pg -l "app=grafana,component=" -o jsonpath="{.items[0].metadata.name}")
kubectl --namespace pg port-forward $POD_NAME 3000
3. Login with the password from step 1 and the username: admin
Secret을 통해 Grafana 접속 계정의 비밀번호 확인하기
$ kubectl --kubeconfig=$KUBE_CONFIG get secret --namespace pg grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
로컬머신에서 Grafana 접속하기
$ export POD_NAME=$(kubectl --kubeconfig=$KUBE_CONFIG get pods --namespace pg -l "app=grafana" -o jsonpath="{.items[0].metadata.name}")
$ kubectl --kubeconfig=$KUBE_CONFIG --namespace pg port-forward $POD_NAME 3000
위 명령을 실행 후 Secret을 통해 얻은 비밀번호로 아래 링크에서 Grafana 대시보드에 접속할 수 있습니다.
- http://localhost:3000
- 사용자명: admin
- 비밀번호: secret을 통해 확인
대시보드 추가하기
연동된 Prometheus의 data를 이용해 모니터링하기 위해서는 아래 두 개의 Kubernetes용 대시보드를 추가해야 합니다.
- https://grafana.com/dashboards/8588
- https://grafana.com/dashboards/1621
Grafana의 좌측 메뉴에서 Create > import를 클릭합니다.
위의 대시보드 링크를 입력 후 Load를 클릭합니다.
data source로 Prometheus를 선택한 후 import를 클릭합니다.
import가 완료되면 대시보드를 확인할 수 있습니다.
다른 대시보드도 동일한 방법으로 추가합니다.