Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents
minLevel1
maxLevel6
outlinefalse
typelist
printablefalse

Github

아래 예제들에 대한 전체 helm chart는 https://github.com/snetsystems/K8s-Objects/tree/master/helm-charts 에서 볼 수 있다.

Walkthrough overview

Code Block
languagenone
[Telegraf] ---8086--> [InfluxDB] <---8086--- [CH Srv] <---443--- [External]
                          /\                    /\
                       8086|                     |
                           |9094                 |2379
                           \/                   \/
                      [Kapacitor]          [ETCD Cluster]

...

필자 생각에는 참고 삼아 배포하거나 show values 등의 명령을 사용하여 리서치할 용도가 아니라, 본인의 K8s에 배포를 목적으로 한다면, 위 1번이 버전을 따로 관리하기에도 편하고 charts 구조 및 내용을 탐색하기에도 편한 듯 하다.
캐바캐이니, 편한대로 하여도 좋으나, 여기서는 1번 방식으로 배포하도록 하겠다.

Values override

influxdata/influxdb 내부의 values를 상황에 맞게 override 하자.

...

따라서, 아래와 같이 upgrade 를 통해 influxdb_customoverride.yaml의 내용을 적용하도록 하겠다.

Code Block
languagebash
# helm upgrade -n helm-test influxdb-1688227557 -f influxdb_customoverride.yaml ./influxdb
Release "influxdb-1688227557" has been upgraded. Happy Helming!
NAME: influxdb-1688227557
LAST DEPLOYED: Mon Jul  3 13:50:43 2023
NAMESPACE: helm-test
STATUS: deployed
REVISION: 6
TEST SUITE: None
NOTES:
InfluxDB can be accessed via port 8086 on the following DNS name from within your cluster:

  http://influxdb-1688227557.helm-test:8086

You can connect to the remote instance with the influx CLI. To forward the API port to localhost:8086, run the following:

  kubectl port-forward --namespace helm-test $(kubectl get pods --namespace helm-test -l app=influxdb-1688227557 -o jsonpath='{ .items[0].metadata.name }') 8086:8086

You can also connect to the influx CLI from inside the container. To open a shell session in the InfluxDB pod, run the following:

  kubectl exec -i -t --namespace helm-test $(kubectl get pods --namespace helm-test -l app=influxdb-1688227557 -o jsonpath='{.items[0].metadata.name}') /bin/sh

To view the logs for the InfluxDB pod, run the following:

  kubectl logs -f --namespace helm-test $(kubectl get pods --namespace helm-test -l app=influxdb-1688227557 -o jsonpath='{ .items[0].metadata.name }')

[root@test-k8s-master-centos8 helm]# kubectl get svc -n helm-test
NAME                  TYPE        CLUSTER-IP      EXTERNAL-IP               PORT(S)             AGE
influxdb-1688227557   ClusterIP   10.97.73.25     10.20.2.235,10.20.2.236   8086/TCP,8088/TCP   36h
nginx-1688100975      NodePort    10.106.11.197   <none>                    80:30117/TCP        2d23h

...

여기까지 성공적으로 수행이 되었다면, http://10.20.2.235:8086 으로 CloudHub의 data source로 추가도 가능할 것이다.

...

To do

위에서 언급한 것처럼 StatefulSet을 위한 persistence volume claim을 생성하여 production 환경과 유사한 배포를 해볼 것이다.

...

To do

위에서 언급한 것처럼 StatefulSet을 위한 persistence volume claim을 생성하여 production 환경과 유사한 배포를 해볼 것이다.

Deploy Kapacitor

.

Deploy Kapacitor

Info

여기에서는 편의상 Headless Service로 생성하지 않을 것이나, 사실 kapacitor의 경우 stateless하며 k8s 클러스터 내부 통신만 허용하면 되고, 더구나 CloudHub에서는 굳이 로드밸런싱할 이유가 (현재까지 상황으로는) 별로 없기 때문에 Headless Service가 더 적합하다.
https://seversky.atlassian.net/wiki/spaces/CHT/pages/2114289730/Service+Discovery#Headless-Service 참조.

만일 외부의 telegraf 등에서 직접 kapacitor로 데이터를 전송해야 한다면, Headless Service를 사용하면 곤란해 질 것이다.

InfluxDB의 배포가 정상 가동되면, 이제 Kapacitor를 배포하여 보자.

...

  1. Etcd cluster 개수의 최소 요구 조건은 3개 이므로, replicaCount는 3개로 주었다.

  2. persistence는 InfluxDB와 마찬가지로 PersistentVolume 부터 따로 다룬 후 적용할 것이다.
    지금은 enabled: false.

  3. 현재 테스트 베드 구성 상, worker 노드를 2개만 생성하였다. 1번의 제약으로 인해 control plane에도 생성되게 하기 위해 tolerations를 적용하였다.
    물론 Production에서는 worker node에만 생성되게 하는 것을 권장한다.

  4. Sevice는 Etcd의 경우 CloudHub 서버에서만 접속 가능하면 되므로, 별도 외부에서 접속할 일이 없을 듯 하여 default values로 두었다override하지 않았다.

아래와 같이 배포한 후, 정상 배포되면 접속 방법 등의 간략한 가이드가 출력될텐데, 어떤 것들이 있는지 눈여겨 봐두면 이후 작업(CloudHub 설정 작업 등)에 도움이 될 수 있을 것이다.

Code Block
languagebash
# helm install -n helm-test -g -f etcd_override.yaml ./etcd
NAME: etcd-1688819715
LAST DEPLOYED: Sat Jul  8 21:35:15 2023
NAMESPACE: helm-test
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
CHART NAME: etcd
CHART VERSION: 9.0.2
APP VERSION: 3.5.9

** Please be patient while the chart is being deployed **

etcd can be accessed via port 2379 on the following DNS name from within your cluster:

    etcd-1688819715.helm-test.svc.cluster.local

To create a pod that you can use as a etcd client run the following command:

    kubectl run etcd-1688819715-client --restart='Never' --image docker.io/bitnami/etcd:3.5.9-debian-11-r18 --env ROOT_PASSWORD=$(kubectl get secret --namespace helm-test etcd-1688819715 -o jsonpath="{.data.etcd-root-password}" | base64 -d) --env ETCDCTL_ENDPOINTS="etcd-1688819715.helm-test.svc.cluster.local:2379" --namespace helm-test --command -- sleep infinity

Then, you can set/get a key using the commands below:

    kubectl exec --namespace helm-test -it etcd-1688819715-client -- bash
    etcdctl --user root:$ROOT_PASSWORD put /message Hello
    etcdctl --user root:$ROOT_PASSWORD get /message

To connect to your etcd server from outside the cluster execute the following commands:

    kubectl port-forward --namespace helm-test svc/etcd-1688819715 2379:2379 &
    echo "etcd URL: http://127.0.0.1:2379"

 * As rbac is enabled you should add the flag `--user root:$ETCD_ROOT_PASSWORD` to the etcdctl commands. Use the command below to export the password:

    export ETCD_ROOT_PASSWORD=$(kubectl get secret --namespace helm-test etcd-1688819715 -o jsonpath="{.data.etcd-root-password}" | base64 -d)

Deploy CloudHub

위의 예제들과 기본적 개념은 유사하므로, https://github.com/snetsystems/K8s-Objects/tree/master/helm-charts 를 참고하도록 한다.