Helm 사용 가이드

Helm은 kubernetes Package Manager로 클라이언트인 Helm과 cluster 내에 설치되는 tiller 서버로 구성되어 있습니다.

이 가이드는 Helm v2를 기준으로 작성되었습니다.

Helm 설치하기

Helm을 사용하기 위해서는 kubectl 설치 및 kubeconfig 설정이 선행돼야 합니다.

Helm 설치는 OS Platform에 맞게 다음 페이지의 안내에 따라 진행합니다.

예시: 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 프로토콜로 볼륨 생성이 필요합니다.

NOTE
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 설치를 진행합니다.

제약사항

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 로그인 화면을 확인할 수 있습니다.

Jenkins 계정 정보를 입력 후 로그인하면 Jenkins 초기 화면에 접속할 수 있습니다.

Helm을 이용한 Prometheus/Grafana 설치 및 클러스터 모니터링하기

이 가이드에서는 모니터링 시스템인 Prometheus와 분석 플랫폼인 Grafana를 연동하여 클러스터를 모니터링하는 방법을 설명합니다. Prometheus와 Grafana에 대한 자세한 내용은 아래 공식홈페이지에서 확인 가능합니다.

제약사항

Prometheus 설치

먼저 모니터링을 위한 별도의 Namespace를 생성합니다.

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에 접속할 수 있습니다.

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 대시보드에 접속할 수 있습니다.

대시보드 추가하기

연동된 Prometheus의 data를 이용해 모니터링하기 위해서는 아래 두 개의 Kubernetes용 대시보드를 추가해야 합니다.

  1. Grafana의 좌측 메뉴에서 Create > import를 클릭합니다.

  2. 위의 대시보드 링크를 입력 후 Load를 클릭합니다.

  3. data source로 Prometheus를 선택한 후 import를 클릭합니다.

  4. import가 완료되면 대시보드를 확인할 수 있습니다.

  5. 다른 대시보드도 동일한 방법으로 추가합니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...