おうちk8sにElastic Cloud on Kubernetesを構築する

用意するもの

やったこと

QNAPにPVとなるストレージ領域の作成とk8sへの登録

QNAP の iSCSI Storage を自宅 Kubernetes の PersistentVolume にする この記事のとおり。LUNのサイズは10Giにした。記事と違って、nodeのOSがubuntuなのでiSCSI : iSCSI イニシエーターの設定を参考にする。私の環境では、open-iscsi はすでにインストール済みだった。

apiVersion: v1
kind: Secret
metadata:
  name: iscsi-chap-secret
type: "kubernetes.io/iscsi-chap"
data:
  node.session.auth.username: "hoge"
  node.session.auth.password: "hoge"
apiVersion: v1
kind: PersistentVolume
metadata:
  name: iscsi-pv01
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: standard
  iscsi:
    targetPortal: hogeip:3260
    iqn: hogeiqn
    lun: 0
    readOnly: false
    chapAuthDiscovery: true
    chapAuthSession: true
    secretRef:
      name: iscsi-chap-secret

ECKのデプロイ

ECK(Elastic Cloud on Kubernetes) オンプレ動作確認

argoCDをつかってデプロイする。まず、オペレータ用のネームスペースと、アプリケーション群用のネームスペースを作る。

kubectl create namespace elastic-system
kubectl create namespace elastic-stack

argoCDのプロジェクトelastic-systemを作る。https://kubernetes.default.svcのelastic-stack, elastic-systemをdestinationに入れる。CLUSTER RESOURCE ALLOW LISTNAMESPACE RESOURCE ALLOW LISTに*,*を設定するのが必要みたい。

argoCDのappをつくる。Helmをつかう。repository: https://helm.elastic.co chart: eck-operator バージョンはとりあえず1.8.xにしてみた。valuesはネームスペースだけ変更してやってみる。 managedNamespaces: ["elastic-stack", "elastic-system"]

権限とかで詰まったけどなんかいけた。argoCD上では、何回syncしてもoutOfSyncになっている。設定をすればこのdiffを無視できるらしいが、後でやることにしていったん放置する。

elasticserchのデプロイ

iSCSIが正常に動作していることを確認する必要がある。各k8sノードのsshに入り、open-iscsisystemctl status open-iscsiして正常に動作していることを確認する。動作していなければ、sudo iscsiadm -m discovery -lして、QNAPのip:3260 via sendtargetsが表示されるか確認する、表示されなければ、sudo iscsiadm -m discovery -t st -p QNAPのIP -o newをして、追加して、sudo systemctl restart open-iscsiで再起動をする。このあと再度discoveryをして、登録されているか確認する。これを全ノードに行う。

elasticsearchのkustomizeをつくる。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: elastic-stack
commonLabels:
  app: elasticsearch-log

resources:
- elasticsearch.yaml
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: elasticsearch-log
spec:
  version: 7.15.1
  transport:
    service:
      spec:
        type: LoadBalancer
  nodeSets:
  - name: default
    count: 1
    config:
      node.master: true
      node.data: true
      node.ingest: true
      node.store.allow_mmap: false
    podTemplate:
      spec:
        securityContext:
          runAsUser: 1234 
          fsGroup: 1234
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 10Gi
        storageClassName: standard

CRI-O環境下で建てる場合、securityContextの設定がないと、chrootが失敗して起動しない。

argoCDからappをつくり、つくったkustomizeのレポジトリを指定する。kibanaもあとでつくるので、REPOSITORY_ROOT/elasticsearch/baseにつくっておくと、同じレポジトリでkibanaもおけるのでべんり。argoCDのprojectで新しく作ったrepositoryもsource repositoryとして許可しておく必要がある。しばらく待ったら完了した。

kibanaのデプロイ

elasticsearchと同じくkustomizeを書く。

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: elastic-stack
commonLabels:
  app: kibana-log

resources:
- kibana.yaml
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: kibana-log
spec:
  version: 7.15.1
  http:
    service:
      spec:
        type: LoadBalancer
  count: 1
  elasticsearchRef:
    name: elasticsearch-log

適当にargoCDで設定して、起動。しばらく待ってgreennになったら、kubectl get svc -A で割り当てられたIPを確認。192.168.2.53だった。curl https://192.168.2.53:5601/login --insecureしてみる。みれた。ブラウザでhttps://192.168.2.53:5601/loginを開くとログイン画面が見れた。kubectl get secret -n elastic-stack elasticsearch-log-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echoでパスワードを入手したら、ユーザー名elasticでログイン。ログインできた。

おわりに

今回は、elasticsearch, kibanaの構築を行いました。実際にログを追加して活用するところは、別の記事にしたいと思います。お疲れさまでした。