因為Elasticsearch需要保持?jǐn)?shù)據(jù)在固定的磁盤上,屬于有狀態(tài)的應(yīng)用服務(wù)怀吻,因此采用k8s的StatefulSet模式部署瞬浓。
創(chuàng)建PersistentVolumes和Claim
#es-persistent-volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: es-nfs-pv
labels:
pv: es-nfs-pv
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /data/nfs/es/
server: 192.168.1.1 #要掛載卷的所在機(jī)器
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: es-nfs-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs
selector:
matchLabels:
pv: "es-nfs-pv"
deployment-es.yaml文件內(nèi)容:
kind: StatefulSet
metadata:
name: elasticsearch-sts
spec:
selector:
matchLabels:
app: es # has to match .spec.template.metadata.labels
serviceName: "elasticsearch-svc" #聲明它屬于哪個Headless Service.
replicas: 1 # by default is 1
template:
metadata:
labels:
app: es # has to match .spec.selector.matchLabels
spec:
terminationGracePeriodSeconds: 10
volumes:
- name: data-storage
persistentVolumeClaim:
claimName: es-nfs-pvc #和之前的PersistentVolumeClaim的name一致
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.2
ports:
- containerPort: 9200
name: es-cli
- containerPort: 9300
name: es-iner
env:
- name: discovery.type
value: single-node
- name: http.cors.enabled
value: "true"
- name: http.cors.allow-origin
value: "*"
volumeMounts:
- mountPath: "/tmp/data"
name: data-storage
---
apiVersion: v1
kind: Service
metadata:
name: elasticsearch-svc
labels:
app: elasticsearch-svc
spec:
type: NodePort
ports:
- port: 9200
nodePort: 30920 #對外暴露的訪問端口,需要在30000~32727范圍內(nèi)蓬坡。
name: clientport
selector:
app: es
master節(jié)點上執(zhí)行:
kubectl apply -f es-persistent-volume.yaml
kubectl apply -f deployment-es.yaml
看看執(zhí)行后的結(jié)果:
#查看部署的statefulset
$ kubectl get sts
NAME READY AGE
elasticsearch-sts 1/1 1m
#查看service
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elasticsearch-svc NodePort 10.101.52.134 <none> 9200:30920/TCP 1m
#查看啟動的pod
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
elasticsearch-sts-0 1/1 Running 0 1m
這樣部署好之后就可以通過masterIp+nodePort的方式訪問Elasticsearch服務(wù)了.
- 插入數(shù)據(jù):
$ curl -X PUT 127.0.0.1:30920/test/_doc/1?pretty -H 'Content-Type: application/json' -d '{"id":1, "msg":"test"}'
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_version" : 4,
"result" : "updated",
"_shards" : {
"total" : 2,
"successful" : 1,
"failed" : 0
},
"_seq_no" : 3,
"_primary_term" : 1
}
- 查詢:
$ curl -X GET 127.0.0.1:30920/test/_doc/1?pretty
{
"_index" : "test",
"_type" : "_doc",
"_id" : "1",
"_version" : 4,
"_seq_no" : 3,
"_primary_term" : 1,
"found" : true,
"_source" : {
"id" : 1,
"msg" : "test"
}
}
解決掛載遇到的錯誤
- nfs掛載錯誤“mount: wrong fs type, bad option, bad superblock on ...”猿棉,需要在掛載的服務(wù)機(jī)上啟動nfs服務(wù)。
安裝nfs-utils:
yum install nfs-utils
(各個node節(jié)點也要安裝nfs-utils渣窜,不然也會mount失斊谈)。
啟動nfs服務(wù):
service nfs start
- “mount.nfs: access denied by server while mounting”的錯誤乔宿,要export對應(yīng)的掛載點位迂。
在/etc/exports添加如下內(nèi)容:
/home/nfs/data *(insecure,rw,sync,no_root_squash)
#這里最好不要用async,不然可能會失敗
- 要有對掛載目錄的讀寫權(quán)限
4.額外的详瑞,掛載命令示例: sudo mount -t nfs 192.168.1.1:/data/nfs /mnt/nfs