K8S 通过statefulset部署 elasticsearch 集群 v7.17.15
k8s部署es集群 statefulset v7.17.15
·
link: k8s 部署NFS Provisioner设置动态存储-CSDN博客
link: K8s 部署filebeat 并收集 nginx 日志-CSDN博客
一、部署ES集群
1、创建es命名空间
[root@k8s-master elk]# cat elk-ns.yaml
apiVersion: v1
kind: Namespace
metadata:
name: elk-ns
2、创建es configmap
vi es-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: elastic-config
namespace: elk-ns
data:
elasticsearch.yml: |-
cluster.name: es-cluster #设置集群的名称
node.name: ${HOSTNAME} #设置节点的名称,无法为每个POD单独设置配置文件,因此采用POD环境变量来设置
path.data: /data/elastic/data #数据存储路径
http.port: 9200
network.host: 0.0.0.0
discovery.zen.ping.unicast.hosts: ["es-cluster-0.es-cluster.elk-ns.svc.cluster.local", "es-cluster-1.es-cluster.elk-ns.svc.cluster.local","es-cluster-2.es-cluster.elk-ns.svc.cluster.local"] #集群节点列表,我们利用k8s的coredns通过域名来找到对应的pod
cluster.initial_master_nodes: ["es-cluster-0","es-cluster-1","es-cluster-2"]
transport.tcp.port: 9300
node.data: true
node.master: true
node.max_local_storage_nodes: 3
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s
http.cors.enabled: true
http.cors.allow-origin: "*"
3、创建ES statefulset
vi es-sts.yaml
apiVersion: apps/v1 #api版本号
kind: StatefulSet #控制器类型为statfulset
metadata: #定义元数据
labels: #定义标签
k8s-app: es-cluster
version: v7.17.15
name: es-cluster #指定控制器名称
namespace: elk-ns #指定资源所在的命名空间
spec: #定义属性
replicas: 3 #设置副本数
selector: #定义标签选择器,指定去管理哪些pod
matchLabels:
k8s-app: es-cluster
version: v7.17.15
serviceName: es-cluster #指定servicename,也就是容器的主机名,第一个pod就是es-cluster-0以此类推
template: #定义pod模板信息
metadata: #定义元数据
labels: #定义标签
k8s-app: es-cluster
version: v7.17.15
spec: #定义pod的属性
containers: #定义容器
- name: es-cluster #容器的名称
image: 192.168.178.137/elastic/elasticsearch:7.17.15 #镜像的版本号
ports: #定义容器开放的端口号
- containerPort: 9200
name: db
protocol: TCP
- containerPort: 9300
name: transport
protocol: TCP
env: #定义环境变量
- name: ES_JAVA_OPTS #ES_JAVA_OPTS变量会替换对应配置文件中的内容
value: "-Xms512m -Xmx512m"
volumeMounts: #定义存储卷挂载
- name: es-cluster-data #挂载卷的名称
mountPath: /data/elastic/data # 挂载到容器的指定路径
- name: elastic-config #挂载卷的名称
mountPath: /usr/share/elasticsearch/config/elasticsearch.yml #挂载到容器的指定路径
subPath: elasticsearch.yml #由于是只挂载一个文件,而不是覆盖整个目录,因此需要声明挂载的文件名称
initContainers: #定义初始化容器,初始化容器在主容器启动执行进行系统调优
- name: es-cluster-init #初始化容器的名称
image: 192.168.178.137/elastic/alpine:v1 #初始化容器的版本号
command: ["/sbin/sysctl","-w","vm.max_map_count=262144"] #初始化容器执行的命令,整个目录就是调整一个内核参数
securityContext: #开启特权模式,如果不开启特权模式,容器将无权限执行命令
privileged: true
- name: es-cluster-permissions #定义第二个初始化容器的名称
image: 192.168.178.137/elastic/alpine:v1 #初始化容器的版本号
command: ["sh", "-c", "chown -R 1000:1000 /usr/share/elasticsearch/data"] #执行命令,这个命令主要是将主容器挂载的数据路径权限进行调整,否则主容器启动后无权限在里面写入数据
securityContext: #开启特权模式
privileged: true
volumeMounts: #定义存储卷挂载,这里主要是将主容器挂载的存储首先挂载到初始化容器,权限调整后,主容器方可使用
- name: es-cluster-data
mountPath: /usr/share/elasticsearch/data
volumes: #定义存储卷
- name: elastic-config #定义存储卷的名称
configMap: #存储卷的类型为configMap
name: elastic-config #指定的configMap名称
volumeClaimTemplates: #定义pvc模板,由于es是有状态的服务,每个pod都需要单独存储数据,因此需要使用StorageClass动态创建pv
- metadata: #定义元数据
name: es-cluster-data #定义pvc的名称,容器挂载pvc的名称要与这里的名称保持一致
spec: #定义属性
storageClassName: "managed-nfs-storage"
#指定使用哪个StorageClass动态创建pv
accessModes: #访问模式为多主机可读可写
- ReadWriteMany
resources: #设置存储卷的容量
requests:
storage: 10Gi
4、创建svc NodePort
vi es-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: es-cluster
name: es-cluster
namespace: elk-ns
spec:
ports:
- port: 9200
targetPort: 9200
name: outer
nodePort: 30001
selector:
k8s-app: es-cluster
type: NodePort
检验集群
# 检验集群
[root@k8s-master elk]# curl 192.168.178.129:30001/_cat/nodes
10.244.1.67 29 65 1 0.79 0.63 0.42 cdfhilmrstw - es-cluster-0
10.244.2.105 59 73 3 0.41 0.47 0.38 cdfhilmrstw * es-cluster-1
10.244.0.56 39 96 6 1.08 1.11 0.95 cdfhilmrstw - es-cluster-2
二、部署kibana
1. kibana的配置文件
[root@k8s-master elk]# cat kibana.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: kibana-config
namespace: elk-ns
data:
kibana.yml: |-
server.port: 5601
server.host: ${POD_IP}
i18n.locale: "zh-CN"
elasticsearch.hosts: ["http://192.168.178.129:30001","http://192.168.178.130:30001","http://192.168.178.131:30001"] # 因为ES svc是 NodePort的方式 所以选择了主机加端口的 如果用cluster方式 这里可以写为 svc-name.svc-namespace
2. deployment部署kibana
[root@k8s-master elk]# cat kibana-deploy.yaml
apiVersion: apps/v1 #api版本号
kind: Deployment #控制器类型为depolyment
metadata: #定义元数据
labels: #定义标签
k8s-app: es-kibana
version: v7.17.15
name: es-kibana #指定控制器名称
namespace: elk-ns #指定资源所在的命名空间
spec: #定义属性
replicas: 1 #设置副本数
selector: #定义标签选择器,指定去管理哪些pod
matchLabels:
k8s-app: es-kibana
version: v7.17.15
template: #定义pod模板信息
metadata: #定义元数据
labels: #定义标签
k8s-app: es-kibana
version: v7.17.15
spec: #定义pod的属性
containers: #定义容器
- name: es-kibana #容器的名称
image: 192.168.178.137/elastic/kibana:7.17.15 #镜像的版本号
# command: ["/bin/bash","-ce","tail -f /dev/null"]
ports: #定义容器开放的端口号
- containerPort: 5601
name: kibana
protocol: TCP
env:
- name: POD_IP #定义一个PODIP的环境变量,用于configmap调用
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts: #定义存储卷挂载
- name: kibana-config #挂载卷的名称
mountPath: /usr/share/kibana/config/kibana.yml #挂载到容器的指定路径
subPath: kibana.yml #由于是只挂载一个文件,而不是覆盖整个目录,因此需要声明挂载的文件名称
volumes: #定义存储卷
- name: kibana-config #定义存储卷的名称
configMap: #存储卷的类型为configMap
name: kibana-config #指定的configMap名称
3. kibana的svc
[root@k8s-master elk]# cat kibana-svc.yaml
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: es-kibana
name: es-kibana
namespace: elk-ns
spec:
ports:
- port: 5601
targetPort: 5601
name: outer
nodePort: 30002
selector:
k8s-app: es-kibana
type: NodePort
更多推荐
已为社区贡献2条内容
所有评论(0)