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

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐