借助 Kubernetes 上的 Elastic Cloud(ECK),你可以扩展基本的Kubernetes编排功能,以轻松地部署,保护,升级 Elasticsearch 集群等。在今天的文章中,我们简单地介绍如何在我们自己的电脑上部署你的 ECK。如果有条件的开发者,你可以到 AWS,GCP 等云端去部署你自己的 ECK。
在我今天的练习中,我使用我的 MacOS Catalina 来部署。
Elastic Cloud Kubernetes.mp4
准备工作
安装VM
在今天的安装中,我选择使用 virtualbox 来部署我们的 ECK。我们也可以选择 Docker 及其它的容器来进行。关于如何在 Mac 上安装 Virtualbox,在今天的教程中,我不再累述。你可以参考网站 Oracle VirtualBox 来进行安装。你可以使用如下的命令
brew cask install virtualbox
安装Minikube及kubectl
针对不同版本的 MasOS,安装的方法可能不能。对于有些版本的 MacOS 来说,你需要打入如下的命令:
brew cask install minikube
或者:
brew install minikube
一般来说在安装 minikube 的过程中,它也会同时帮我们安装 kubectl。如果kubectl命令不能正常被执行,那么你可以尝试使用如下的命令来进行安装:
brew install kubernetes-cli
当我们把 minikube 及 kubectl 完全进行安装后,我们可以通过打入如下的命令来检查安装是否已经完成:
$ minikube version
minikube version: v1.9.0
commit: 48fefd43444d2f8852f527c78f0141b377b1e42a
如果你能看到上面的信息,则表明我们的 minikube 的安装时正确的。同样:
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.5", GitCommit:"20c265fef0741dd71a66480e35bd69f18351daea", GitTreeState:"clean", BuildDate:"2019-10-15T19:16:51Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.0", GitCommit:"2bd9643cee5b3b3a5ecbd3af49d09018f0773c77", GitTreeState:"clean", BuildDate:"2019-09-18T14:27:17Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
我们可以打入上面的命令来检查 kubectl 的版本信息。
目前 ECK 对于 kubernetes 的要求是:
- kubectl 1.11+
- Kubernetes 1.12+ or OpenShift 3.11+
- Elastic Stack: 6.8+, 7.1+
一旦 minikube 安装好后,我可以通过如下的命令来检查哪些 plugin 已经被加载:
minikube addons list
我们可以通过如下的命令来 enable 一个 plugin:
minikube addons enable dashboard
或者使用如下的命令来 disable 一个 plugin:
minikube addons disable dashboard
一旦完成我们们上面的安装后,我们也就可以开始来部署我们的 ECK 了。
安装 ECK
首先我们启动 minikube。在启动 minikube 之前,我们需要对 minikube 的启动参数来进行配置。我是这样来启动我的 minikube 的:
minikube start --driver=virtualbox --cpus 4 --memory 10240 --kubernetes-version 1.16.0
在上面,我使用 virtualbox 来作为驱动。你也可以使用 docker 来启动。在这里我配置了 cpu 的个数是 4,内存是 10G。同时由于一个一致的 bug,目前 minikube不 能和最新的 kubernetes 一起进行安装工作。在上面我特别指出了 kubernetes 的版本信息为 1.16.0。
上面的命令的输出为:
对于中国的开发者来说,由于网路的限制,那么在使用上面的命令时,可能会出现 k8s.gcr.io 网址不能被访问的情况。那么我们怎么解决这个问题呢?答案是我们可以使用使用阿里云服务器。我们可以尝试使用如下的命令:
$ minikube start --help |grep repo
--image-repository='': Alternative image repository to pull docker images from. This can be used when you have limited access to gcr.io. Set it to "auto" to let minikube decide one for you. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers
根据上面的提示,我们可以修改我们上面的命令为:
$ minikube start --driver=virtualbox --cpus 4 --memory 10240 --kubernetes-version 1.16.0 --image-repository='registry.cn-hangzhou.aliyuncs.com/google_containers'
那么根据上面的命令运行后的结果为:
对高级 Kuberenetes 版本的支持
如果你想使用最新版本的 Kubernetes 的话,也就是在安装的时候,不指定 Kubernetes 的版本,那么在安装下面的 Elastic Stack 时候,它会出现错误信息。当我们在使用 kubectl get pods 时,它会显示 “pending” 状态,表明创建不成功:
如果我们使用命令:
kubectl describe pods/quickstart-es-default-0
它将会显示:
这个时候,我们需要建立另外一个 pvc.yaml 的文件:
pvc.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: data-pv0
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 3Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
claimRef:
namespace: default
name: elasticsearch-data-quickstart-es-default-0
hostPath:
path: "/mnt/data"
然后再使用如下的命令即可:
kubectl apply -f pvc.yaml
Dashboard
一旦 minikube 被成功启动起来,我们可以使用如下的命令:
minikube dashboard
当上面的命令执行后,它就会启动一个 web 的接口让我们来对 kubernetes 监控和管理:
我们可以通过如下的指令来获得 minikube 的 IP:
minikube ip
$ minikube ip
192.168.99.112
也可以通过如下的指令来获得 minikube 的状态:
minikube status
$ minikube status
m01
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
接下来,我们参照 Elastic 的官方文档 “Quick Start”。我们首先运行如下的命令来启动 ECK 的 operator:
kubectl apply -f https://download.elastic.co/downloads/eck/1.0.1/all-in-one.yaml
我们可以通过如下的命令来启动对 operator 的命令的监控,尽管我们不太必要:
kubectl -n elastic-system logs -f statefulset.apps/elastic-operator
安装 Elasticsearch 集群
在今天的练习中,我们来创建一个单节点的 Elasticsearch 集群。我们在 terminal 中打入如下的命令:
cat <<EOF | kubectl apply -f -
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 7.6.2
nodeSets:
- name: default
count: 1
config:
node.master: true
node.data: true
node.ingest: true
node.store.allow_mmap: false
EOF
一旦打入上面的命令,带一会儿,我们可以使用如下的命令来查看已经被创建的 pod:
kubectl get pods
它将显示信息如下:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 0/1 Init:0/1 0 10s
从上面我们可以看到我们的集群已经被成功地创建了。它显示的状态是Init。我们可以打入如下的命令:
$ kubectl get pods -w
这样我们可以看到这个集群的创建的情况,而不用一直重复上面的命令。
我们也可以使用如下的命令来查看这个集群的创建进度:
$ kubectl describe pod quickstart-es-default-0
在上面,quickstart-es-default-0 是我们的 pod 的名称。在上面的 kubectl get pods 命令中可以得到。上名的命令显示:
从上面我们可以看出来正在下载 docker的image。
等现在完后,我们重新运行上面的命令,我们可以看到:
上面显示我们的集群已经被成功地运行起来了。我们再次使用如下的命令:
kubectl get pods
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 0 16m
上面显示我们的 pod 正在运行中。
监控集群的监控及创建过程
我们可以通过如下的命令来查看一下我们的 Elasticsearch 的运行状态,包括健康,版本信息及多少个节点:
kubectl get elasticsearch
$ kubectl get elasticsearch
NAME HEALTH NODES VERSION PHASE AGE
quickstart green 1 7.6.2 Ready 18m
上面显示我们的 quickstart 状态良好。健康状态为绿色,版本信息为目前最新的 7.6.2。
如果你想得到某个具体的 cluster 名称的信息,你可以通过如下的指令:
kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=quickstart'
在上面,我们通过 selector 来指定 cluster-name 为 quickstart:
$ kubectl get pods --selector='elasticsearch.k8s.elastic.co/cluster-name=quickstart'
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 0 19m
我们可以通过如下的方式来检查 quickstart 的 log:
kubectl logs -f quickstart-es-default-0
请求 Elasticsearch 访问权限
在上面的创建过程中,它将自动为你的集群创建一个 ClusterIP 服务:
kubectl get service quickstart-es-http
$ kubectl get service quickstart-es-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quickstart-es-http ClusterIP 10.110.117.195 <none> 9200/TCP 23m
我们可以通过如下的方式来得到密码。在创建集群的过程中,它自动创建一个名为 elastic 的默认用户:
PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
$ PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o=jsonpath='{.data.elastic}' | base64 --decode)
liuxg:kube liuxg$ echo $PASSWORD
qzn5w2c5q9s7sx5lx62ssxzc
在上面的命令中,它把我们的集群的密码存储到一个叫做 PASSWORD 的变量中。
我们可以通过如下的方式来访问我们的集群:
- 在 Kubernetes 集群里,我们可以直接通过如下的方式来进行访问:
curl -u "elastic:$PASSWORD" -k "https://quickstart-es-http:9200"
- 在我们的本机里,我们想访问集群的话,我们必须通过 port-forward 的方法把端口地址映射出来。在另外一个 terminal 中打入如下的命令:
kubectl port-forward service/quickstart-es-http 9200
然后,在上面的命令运行的情况下,在刚才取密码的那个 terminal 中打入命令:
curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
$ curl -u "elastic:$PASSWORD" -k "https://localhost:9200"
{
"name" : "quickstart-es-default-0",
"cluster_name" : "quickstart",
"cluster_uuid" : "1_0m0hLYTCWqSCLX9qBzgA",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
上面显示我们的 Elasticsearch 是正常运行的。我们也可以在我们的 Chrome 浏览器中,打入地址 https://localhost:9200/。我们可以看到如下的画面:
我们可以在键盘上输入 thisisunsafe,然后我们可以看到如下的画面:
我们可以把刚才我们得到的密码输入上面的对话框中:
从上面的信息中,我们可以看到 Elasticsearch 运行正常。
安装 Kibana
安装 Kibaba 的过程和 Elasticsearch 的几乎是一样的。我们在 terminal 中打入如下的命令:
cat <<EOF | kubectl apply -f -
apiVersion: kibana.k8s.elastic.co/v1
kind: Kibana
metadata:
name: quickstart
spec:
version: 7.6.2
count: 1
elasticsearchRef:
name: quickstart
EOF
在上面我们指定我们的 Elasticsearch 是 quickstart,这样它将自动连接到我们的 quickstart 集群。同样地,我们可以根据如下的命令:
$ kubectl get pods
来查看我们的 pods:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 0 40m
quickstart-kb-686d668b44-bwz8c 0/1 ContainerCreating 0 12s
我们查看进度:
kubectl describe pod quickstart-kb-686d668b44-bwz8c
上面现在正在下载 image。等下载完 image 后,我们再次查看:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
quickstart-es-default-0 1/1 Running 0 43m
quickstart-kb-686d668b44-bwz8c 1/1 Running 0 3m33s
上面显示我们的 Kibana pod 已经在成功运行了。
我们可以通过如下的命令来检查 Kibana 的健康情况:
kubectl get kibana
$ kubectl get kibana
NAME HEALTH NODES VERSION AGE
quickstart green 1 7.6.2 5m10s
通过 selector 的方式,可以查看到相应的 pod 的情况:
kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart'
$ kubectl get pod --selector='kibana.k8s.elastic.co/name=quickstart'
NAME READY STATUS RESTARTS AGE
quickstart-kb-686d668b44-bwz8c 1/1 Running 0 6m44s
访问 Kibana
上面的创建过程自动为 Kibana 创建一个 ClusterIP 服务:
kubectl get service quickstart-kb-http
$ kubectl get service quickstart-kb-http
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
quickstart-kb-http ClusterIP 10.110.231.16 <none> 5601/TCP 8m59s
使用 kubectl port-forward 从本地工作站访问 Kibana:
kubectl port-forward service/quickstart-kb-http 5601
$ kubectl port-forward service/quickstart-kb-http 5601
Forwarding from 127.0.0.1:5601 -> 5601
Forwarding from [::1]:5601 -> 5601
在一个 terminal 中打入上面的命令。然后我们在我们的浏览器中输入地址 https://localhost:5601。和上面 Elasticsearch 一样的方法,记得输入上面的用户名 elastic 及获得的密码:
点击 Login。这样我们就可以进入到 Kibana 界面了:
至此,我们已经完成了 ECK 的部署。
如果你想删除你这个部署,你可以使用如下的命令来删除 elasticsearch:
kubectl delete elasticsearch quickstart
参考:
【1】https://www.youtube.com/watch?v=t4WyD4AE0q4
【2】https://minikube.sigs.k8s.io/docs/start/macos/
【3】Setting up Elasticsearch cluster on Kubernetes - Part 1 - Single Node Cluster | Chekkan’s Blog
【4】安装Minikube无法访问k8s.gcr.io的简单解决办法 - pack27 - 博客园
【5】Manage compute resources | Elastic Cloud on Kubernetes [2.16] | Elastic
【6】本地分布式开发环境搭建(使用 Vagrant 和 Virtualbox) · Kubernetes 中文指南——云原生应用架构实战手册
【7】Getting started with Elastic Cloud on Kubernetes: Deployment | Elastic Blog