使用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。
构成如下所示。

创建Linode Kubernetes Engine (LKE)
在Linode云管理器中创建LKE,并下载kubeconfig文件。
本次设置了3台 Linode 8GB 的配置。
请注意,如果使用的是低于 Linode 8GB 的规格,资源将不足以启动,请留意。

在运行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并检查日志。
当从仪表板上能够确认到图表时,表示构建已经完成了。

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的云计算服务等内容。