Helm 이용 가이드
    • PDF

    Helm 이용 가이드

    • PDF

    Article Summary

    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 정보를 확인합니다.

    nks-1-2-4_ko

    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가 필요합니다.

    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

    nks-1-2-5_ko

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

    nks-1-2-6_ko

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

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

    • https://prometheus.io/
    • https://grafana.com/

    제약사항

    • 애플리케이션을 설치하기 전에 PersistentVolume 생성을 위해 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
    1. Grafana의 좌측 메뉴에서 Create > import를 클릭합니다.
      nks-1-2-10_ko

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

    3. data source로 Prometheus를 선택한 후 import를 클릭합니다.
      nks-1-2-12_ko

    4. import가 완료되면 대시보드를 확인할 수 있습니다.
      nks-1-2-13_ko

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


    이 문서가 도움이 되었습니까?

    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.