Kubernetes基于ECK部署elasticsearch8.8集群
基于k8s部署es集群
Kubernetes基于ECK部署elasticsearch8.8集群
主机名:
jcymaster1 (master)
jcynode1 (worker)
jcynode2 (worker)
1. 部署operator
kubectl apply -f https://download.elastic.co/downloads/eck/2.8.0/operator.yaml
2. 创建pv
采用宿主机目录映射的方式,有条件可以上分布式存储
先在每个worker节点创建数据目录
mkdir -p /opt/es-data
chmod 777 /opt/es-data
- no-provisioner.yaml
cat > no-provisioner.yaml <<EOF
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-prosistoner
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
EOF
- es-pv.yaml
cat > es-pv.yaml <<EOF
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: es-data1
namespace: default
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /opt/es-data
storageClassName: local-storage
persistentVolumeReclaimPolicy: Delete
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- jcynode1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: es-data2
namespace: default
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
hostPath:
path: /opt/es-data
storageClassName: local-storage
persistentVolumeReclaimPolicy: Delete
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- jcynode2
EOF
不开启安全认证的版本
- es.yaml
cat > es.yaml <<EOF
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
spec:
version: 8.8.0
nodeSets:
- name: master-nodes
count: 2
config:
cluster.name: elasticsearch
node.store.allow_mmap: false
http.cors.enabled: true
http.cors.allow-origin: "*"
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
podTemplate:
spec:
nodeSelector:
app: elasticsearch
containers:
- name: elasticsearch
env:
- name: ES_JAVA_OPTS
value: -Xms2g -Xmx2g
- name: READINESS_PROBE_PROTOCOL
value: http
resources:
requests:
memory: 3Gi
limits:
memory: 3Gi
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-storage
EOF
开启安全认证的版本
- es.yaml
cat > es.yaml <<EOF
apiVersion: elasticsearch.k8s.elastic.co/v1
kind: Elasticsearch
metadata:
name: quickstart
namespace: elastic-system
spec:
version: 8.8.0
nodeSets:
- name: master-nodes
count: 2
config:
cluster.name: elasticsearch
node.store.allow_mmap: false
podTemplate:
spec:
nodeSelector:
app: elasticsearch
containers:
- name: elasticsearch
env:
- name: ES_JAVA_OPTS
value: -Xms2g -Xmx2g
- name: READINESS_PROBE_PROTOCOL
value: https
resources:
requests:
memory: 3Gi
limits:
memory: 3Gi
volumeClaimTemplates:
- metadata:
name: elasticsearch-data
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 5Gi
storageClassName: local-storage
EOF
这里有个坑要注意!
elasticsearch8默认时开启安全认证的,如果要取消安全认证,你除了像裸机部署那样修改elasticsearch.yml里的
xpack.security.enabled: false
xpack.security.http.ssl.enabled: false
你还要修改就绪探针的请求协议,不然k8s仍使用https协议去请求http端口,自然没有结果,pod无法就绪也就无法对外提供服务
创建存储类
kubectl apply -f no-provisioner.yaml
创建pv
kubectl apply -f es-pv.yaml
创建es集群
kubectl apply -f es.yaml
以上步骤做完,会创建es集群的pod,service, secret等资源,默认名称空间在default下,你可以在es.yaml的metadata下通过namespace设置成你自己的名称空间
查看集群资源创建情况
注意
显示集群状态时unknown,
kubectl describe elasticsearch quickstart -n elastic-system
通过查看quickstart发现是因为我们禁用了https,导致集群状态无法获取,实际上不影响使用。
另外,生成的service为ClusterIP类型,而为了测试api,需要能从集群外部访问
创建Nodeport类型的service(用于接口测试,生产环境elasticsearch不对外开放)
- es-svc.yaml
cat > es-svc.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
name: es-outer
namespace: elastic-system
labels:
app: es-outer
spec:
ports:
- port: 9200
targetPort: 9200
name: es-outer-port
nodePort: 32080
selector:
elasticsearch.k8s.elastic.co/cluster-name: quickstart
type: NodePort
EOF
其他的需求
①集群增加新的节点
修改es.yaml里spec.nodeSets[0].count,之后kubectl apply -f es.yaml使更改生效
②没有elasticsearch.yml怎么修改集群配置
elasticsearch.yml下的所有配置项都可以写在spec.config下
下面我将介绍开启与不开启安全认证时的集群使用方法
不开启安全认证:
可以直接通过http协议访问
如果你安装了es的图形化工具可以直接在浏览器查看集群详细状态
开启安全认证:
开启安全认证后,要请求接口,配置相对复杂,在浏览器请求要使用https协议,且需要输入用户名和密码
elasticsearch提供了一个超级管理员账户elastic, 密码在集群创建时会随机生成
可以通过以下方式查看
PASSWORD=$(kubectl get secret quickstart-es-elastic-user -o go-template='{{.data.elastic | base64decode}}')
echo $PASSWORD
此时使用postman工具在Authorization 的Type里选择Basic Auth 输入用户名再通过https协议请求,可以看到能请求成功
由于密码过于复杂,笔者尝试修改,按官网给出的方法进行如下请求
发现并不能修改elastic的密码,但集群每次部署时生成的初始密码会变,因此我们需要一个固定密码的用户
elasticsearch集群创建用户
根据官网的方法,我们添加一个用户test,密码设为12345678
响应返回created: true表示添加成功
查看用户test
我们修改Basic Auth 的用户名和密码再次请求api
此时会返回403,并不是认证失败而是没有对集群api的调用权限
注意我们开始创建用户时提交的json里用户的roles是空的,我们再次切换回超管elastic获取系统里所有角色看看
响应内容较多,但我们注意到其中一个角色superuser
这个角色具有和elastic一样的权限
因此我们回到之前添加用户那一步,这次我们不是要添加而是要修改,使用PUT请求
此时我们再查看test用户发现roles已经添加上了superuser
我们再在Basic Auth使用test的用户名和密码访问集群
至此,大功告成,我们可以使用自定义的用户访问集群了,该用户可以修改密码
返回{}表示修改成功
使用新的账户密码依然能调用接口
更多推荐
所有评论(0)