使用Linode Kubernetes Engine (LKE)以Elastic Cloud on Kubernetes (ECK)的方式搭建,并可视化Akamai的日志数据

弹性Kubernetes云(ECK)是什么

弹性云原生在Kubernetes上(ECK)是一个开源软件,旨在通过利用Kubernetes的本地能力来提高Elasticsearch和Kibana在Kubernetes上的部署和管理效率。它最大化了Elastic Stack的可伸缩性、弹性和灵活性。通过自动化的运维管理,可以大大降低Elastic Stack的运营成本和复杂性。
本文将介绍如何使用Linode Kubernetes Engine(LKE)来构建ECK。

构成如下所示。

image.png

创建Linode Kubernetes Engine (LKE)

在Linode云管理器中创建LKE,并下载kubeconfig文件。

本次设置了3台 Linode 8GB 的配置。
请注意,如果使用的是低于 Linode 8GB 的规格,资源将不足以启动,请留意。

image.png

在运行kubectl命令的终端中导出config设置。

export KUBECONFIG=./elasticcloud-kubeconfig.yaml

确保显示节点列表。

kubectl get nodes

NAME                            STATUS   ROLES    AGE   VERSION
lke116066-172974-649c6380580d   Ready    <none>   42h   v1.26.3
lke116066-172974-649c6380c34c   Ready    <none>   94m   v1.26.3
lke116066-172974-649c63812a91   Ready    <none>   42h   v1.26.3

构建cert-manager

我会为在Kibana和Elasticsearch中使用的证书进行颁发。

这次我们将使用DNS认证。并且我们会使用Akamai Edge DNS。

关于步骤,我们将参考以下内容。

 

apiVersion: v1
kind: Secret
metadata:
  name: akamai-secret
type: Opaque
stringData:
  clientSecret: <Clinet Secret>
  accessToken: <Access Token>
  clientToken: <Clinet Token>
---
apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-akamai-dns
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: example@mail.com
    privateKeySecretRef:
      name: letsencrypt-akamai-issuer-account-key
    solvers:
    - dns01:
        akamai:
          serviceConsumerDomain: <Hostname>
          clientTokenSecretRef:
            name: akamai-secret
            key: clientToken
          clientSecretSecretRef:
            name: akamai-secret
            key: clientSecret
          accessTokenSecretRef:
            name: akamai-secret
            key: accessToken
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: eck-zone
spec:
  secretName: akamai-crt-secret
  dnsNames:
  - 'elasticsearch.example.com'
  - 'kibana.example.com'
  issuerRef:
    name: letsencrypt-akamai-dns
    kind: Issuer

我要安装cert-manager。

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.0/cert-manager.yaml

确保 pod 的状态为 Running。

(Translation: Ensure that the status of the pod is Running.)

kubectl get pods --namespace cert-manager

NAME                                       READY   STATUS    RESTARTS   AGE
cert-manager-579d48dff8-84nw9              1/1     Running   3          1m
cert-manager-cainjector-789955d9b7-jfskr   1/1     Running   3          1m
cert-manager-webhook-64869c4997-hnx6n      1/1     Running   0          1m

创建资源。

kubectl apply -f cert.yaml

确认正在制作的证书的进展情况。
创建DNS记录并进行认证可能需要几分钟的时间。

kubectl describe certificate eck-zone

Name:         eck-zone
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  cert-manager.io/v1
Kind:         Certificate
Metadata:
  Creation Timestamp:  2023-06-26T17:20:56Z
  Generation:          1
  Managed Fields:
    API Version:  cert-manager.io/v1
    Fields Type:  FieldsV1
~~~~~~~

如果认证未能成功完成,将会检查日志以确定问题。

kubectl logs --namespace cert-manager cert-manager-74654c4948-qhzng

确认所创建的证书。

kubectl get certificate --all-namespaces


NAMESPACE   NAME           READY   SECRET              AGE
default     eck-zone   True    akamai-crt-secret   34h

准备证书工作已经完成。

弹性云上的Kubernetes(ECK)安装

请参考以下步骤来进行ECK的构建。

 

安装ECK。

kubectl create -f https://download.elastic.co/downloads/eck/2.8.0/crds.yaml

部署操作员。

kubectl apply -f https://download.elastic.co/downloads/eck/2.8.0/operator.yaml

建立Elasticsearch集群

我要搭建Elasticsearch。
這次,我們設定3個Pod,分配300GB的磁碟並進行證書設定。

 

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 8.8.1
  nodeSets:
  - name: master-nodes
    count: 3
    config:
      node.roles: ["master"]
      node.store.allow_mmap: false
  - name: data-nodes
    count: 3
    config:
      node.roles: ["data", "ingest", "ml", "transform"]
      node.store.allow_mmap: false
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 300Gi
  http:
    tls:
      certificate:
         secretName: akamai-crt-secret

应用已创建的文件。

kubectl apply -f elasticsearch.yaml

我将确认Pod是否已启动。

kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=quickstart'

NAME                           READY   STATUS    RESTARTS   AGE
quickstart-es-data-nodes-0     1/1     Running   0          34m
quickstart-es-data-nodes-1     1/1     Running   0          34m
quickstart-es-data-nodes-2     1/1     Running   0          34m
quickstart-es-master-nodes-0   1/1     Running   0          34m
quickstart-es-master-nodes-1   1/1     Running   0          34m
quickstart-es-master-nodes-2   1/1     Running   0          34m

使用Linode节点负载均衡器,使其可以从外部访问。

apiVersion: v1
kind: Service
metadata:
  name: elasticsearch-loadbalancer
spec:
  selector:
    common.k8s.elastic.co/type: elasticsearch
    elasticsearch.k8s.elastic.co/cluster-name: quickstart
  type: LoadBalancer
  ports:
    - name: http
      protocol: TCP
      port: 9200
      targetPort: 9200

展开已创建的设置。

kubectl apply -f elasticsearch-service.yaml

确认负载均衡器已创建。

kubectl get svc elasticsearch-loadbalancer
NAME                         TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)          AGE
elasticsearch-loadbalancer   LoadBalancer   10.128.69.96   xxx.xxx.xxx.xxx   9200:32334/TCP   46h

我会在Akamai EdgeDNS中添加记录,以便能够进行名称解析。

dig elasticsearch.example.com +noall +ans

; <<>> DiG 9.10.6 <<>> elasticsearch.example.com +noall +ans
;; global options: +cmd
elasticsearch.example.com 1748 IN	CNAME	xxx-xxx-xxx-xxx.ip.linodeusercontent.com.
xxx-xxx-xxx-xxx.ip.linodeusercontent.com. 86348 IN A xxx.xxx.xxx.xxx

建立 Kibana

根据以下网站的参考,构建Kibana。

我們將與 Elasticsearch 關聯並進行證書設定。

 

apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
  name: quickstart
spec:
  version: 8.8.1
  count: 3
  elasticsearchRef:
    name: quickstart
  http:
    tls:
      certificate:
         secretName: akamai-crt-secret

展开已创建的yaml文件。

kubectl apply -f kibana.yaml

确认Kibana已经启动。

kubectl get kibana

NAME         HEALTH   NODES   VERSION   AGE
quickstart   green    3       8.8.1     41h

我們將確認 pod 的狀態是否正常。

kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart'

NAME                             READY   STATUS    RESTARTS   AGE
quickstart-kb-694658999d-hmwzz   1/1     Running   0          41h
quickstart-kb-694658999d-vbtwv   1/1     Running   0          41h
quickstart-kb-694658999d-z6x8h   1/1     Running   0          41h

为Linode添加NodeBalancer,以便可以从外部访问。

apiVersion: v1
kind: Service
metadata:
  name: kibana-loadbalancer
spec:
  selector:
    common.k8s.elastic.co/type: kibana
    kibana.k8s.elastic.co/name: quickstart
  type: LoadBalancer
  ports:
    - name: http
      protocol: TCP
      port: 5601
      targetPort: 5601

解压已创建的文件。

kubectl apply -f kibana-service.yaml

确认负载均衡器已被创建。

kubectl get svc kibana-loadbalancer
NAME                  TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
kibana-loadbalancer   LoadBalancer   10.128.192.34   xxx.xxx.xxx.xxx   5601:30541/TCP   2d2h

我们将在Akamai EdgeDNS中添加记录,以便进行名称解析。

dig kibana.example.com +noall +ans

; <<>> DiG 9.10.6 <<>> kibana.example.com +noall +ans
;; global options: +cmd
elasticsearch.example.com 1748 IN	CNAME	xxx-xxx-xxx-xxx.ip.linodeusercontent.com.
xxx-xxx-xxx-xxx.ip.linodeusercontent.com. 86348 IN A xxx.xxx.xxx.xxx

添加Elasticsearch的配置

我們將根據這篇文章的參考進行設定的添加。

 

将连接到Kibana和Elasticsearch时所需的密码存储在变量中。

export PASSWORD=`kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode; echo`

创建索引。
正在为Elasticsearch的索引模板定义字段的类型。

curl -u elastic:$PASSWORD -X POST -H 'Content-Type: application/json' -d "$(curl -s https://raw.githubusercontent.com/isss802/stackscripts/main/elasticsearch-kibana/elasticsearch_index_template.json)" https://elasticsearch.example.com:9200/_index_template/logs-akamai.datastream2

创建三个管道。
对于Elasticsearch的Ingest Pipeline,这是用于处理传入的DS2字段的部分加工定义。

curl -u elastic:$PASSWORD -X PUT -H 'Content-Type: application/json' -d "$(curl -s https://raw.githubusercontent.com/isss802/stackscripts/main/elasticsearch-kibana/elasticsearch_ingest_pipeline.json)" https://elasticsearch.example.com:9200/_ingest/pipeline/datastream2-ingest-pipeline
curl -u elastic:$PASSWORD -X PUT -H 'Content-Type: application/json' -d "$(curl -s https://raw.githubusercontent.com/isss802/stackscripts/main/elasticsearch-kibana/elasticsearch_ingest_pipeline_breadcrumbs.json)" https://elasticsearch.example.com:9200/_ingest/pipeline/datastream2-ingest-pipeline-breadcrumbs
curl -u elastic:$PASSWORD -X PUT -H 'Content-Type: application/json' -d "$(curl -s https://raw.githubusercontent.com/isss802/stackscripts/main/elasticsearch-kibana/elasticsearch_ingest_pipeline_cmcd.json)" https://elasticsearch.example.com:9200/_ingest/pipeline/datastream2-ingest-pipeline-cmcd

以上是Elasticsearch配置完成。

增加Kibana配置

为了配置Kibana仪表板,我们需要使用POST方法将Saved Objects文件上传。

 curl -o kibana.ndjson https://raw.githubusercontent.com/hokamoto/stackscripts/main/elasticsearch-kibana/kibana_saved_objects.ndjson && curl -u elastic:$PASSWORD -X POST "https://elasticsearch.example.com:5601/api/saved_objects/_import" -H 'kbn-xsrf: reporting' --form file=@./kibana.ndjson

以上是Kibana設定的完成。

DataStream2的设置

根据以下文章的参考,配置DataStream2并检查日志。

 

当从仪表板上能够确认到图表时,表示构建已经完成了。

image.png

Elasticsearch的磁盘扩展

随着使用的增加,可能会需要扩展磁盘的情况。 de , huì de .)

这次,我们试试将大小从300GB扩展到350GB。

在这种情况下,首先需要更改存储的值。

apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
  name: quickstart
spec:
  version: 8.8.1
  nodeSets:
  - name: master-nodes
    count: 3
    config:
      node.roles: ["master"]
      node.store.allow_mmap: false
  - name: data-nodes
    count: 3
    config:
      node.roles: ["data", "ingest", "ml", "transform"]
      node.store.allow_mmap: false
    volumeClaimTemplates:
    - metadata:
        name: elasticsearch-data
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            #容量追加 
            storage: 350Gi
  http:
    tls:
      certificate:
         secretName: akamai-crt-secret

将设置应用。

kubectl apply -f elasticsearch.yaml

确认容量已增强。

kubectl get pvc
NAME                                              STATUS   VOLUME                 CAPACITY   ACCESS MODES   STORAGECLASS                  AGE
elasticsearch-data-quickstart-es-data-nodes-0     Bound    pvc-d39ec344188f4155   350Gi      RWO            linode-block-storage-retain   41h
elasticsearch-data-quickstart-es-data-nodes-1     Bound    pvc-b68538a685fe4cbf   350Gi      RWO            linode-block-storage-retain   41h
elasticsearch-data-quickstart-es-data-nodes-2     Bound    pvc-4459f647a6d3415b   350Gi      RWO            linode-block-storage-retain   41h
elasticsearch-data-quickstart-es-master-nodes-0   Bound    pvc-e17373e2b5044f2b   10Gi       RWO            linode-block-storage-retain   41h
elasticsearch-data-quickstart-es-master-nodes-1   Bound    pvc-40bf519cece641df   10Gi       RWO            linode-block-storage-retain   41h
elasticsearch-data-quickstart-es-master-nodes-2   Bound    pvc-cc30b10ff06141ea   10Gi       RWO            linode-block-storage-retain   41h

为了重新启动目标节点,需要进行排空操作。

kubectl drain lke116066-172974-649c63812a91 --ignore-daemonsets --delete-emptydir-data

从 Linode Cloud Manager 上重新启动目标实例。
为了将服务恢复正常,解除限制 (uncordon)。

kubectl uncordon lke116066-172974-649c63812a91

由于需要使用resize2fs扩展磁盘,所以我们将使用kubectl-node-shell连接到节点上。

 

kubectl get node
NAME                            STATUS   ROLES    AGE   VERSION
lke116066-172974-649c6380580d   Ready    <none>   40h   v1.26.3
lke116066-172974-649c6380c34c   Ready    <none>   13m   v1.26.3
lke116066-172974-649c63812a91   Ready    <none>   40h   v1.26.3

连接到指定的节点。

kubectl node-shell lke116066-172974-649c6380c34c

我要检查一下光盘。

df -h

调整尺寸。

resize2fs /dev/disk/by-id/scsi-0Linode_Volume_pvcd39ec344188f4155

如果磁盘可以扩展,则任务完成。

df -h /dev/disk/by-id/scsi-0Linode_Volume_pvc4459f647a6d3415b
Filesystem                                               Size  Used Avail Use% Mounted on
/dev/disk/by-id/scsi-0Linode_Volume_pvc4459f647a6d3415b  344G   21M  344G   1% /var/lib/kubelet/pods/bf2e34e2-cec6-4eed-aff0-f02164737084/volumes/kubernetes.io~csi/pvc-4459f647a6d3415b/mount
root@lke116066-172974-649c6380c34c:/#

我认为在关注到 Pod 偏向的情况下,可以考虑使用 Descheduler 等工具来解决。

 

总结

通过使用Linode Kubernetes Engine (LKE) ,我们能够构建容易扩展的Elastic Cloud on Kubernetes (ECK)。我们希望您能在各种系统中充分利用LKE。

相关文章

在Qiita上,Akamai Technologies合作社发布了一些针对开发者的文章,涉及到Akamai的云计算服务等内容。

 

bannerAds