k8s部署ELK高可用集群(一)

一、ELK的简单介绍
ELK是一个应用套件,由Elasticsearch、Logstash和Kibana三部分组成,简称ELK。它是一套开源免费、功能强大的日志分析管理系统。ELK可以将我们的系统日志、网站日志、应用系统日志等各种日志进行收集、过滤、清洗,然后进行集中存放并可用于实时检索 。
然而,随着技术的发展,从 ELK 转变为 EFK 的应用架构正在逐渐受到欢迎。在EFK中,Filebeat或Fluentd取代了Logstash的角色。其中,Filebeat是Elastic Stack的一部分,被设计用来帮助用户收集和发送日志文件到Elasticsearch。而Fluentd是一个流行的开源数据收集器,用于获取容器日志文件、过滤和转换日志数据,然后将数据传递到Elasticsearch集群,在该集群中对其进行索引和存储。此外,结合Logstash具有基于磁盘的自适应缓冲系统,可以吸收传入的吞吐量,从而减轻Elasticsearch持续写入数据的压力。
随着各企业对大量日志的采集,为了获得更好的吞吐和更好的性能,ELK也变得越来越庞大,最终如下图:
在这里插入图片描述
二、k8s部署ELK
本次使用的k8s版本是v1.21版本。
部署使用statefullset控制器,当然,你也可用deployment控制器。
2.1 创建statefullset的依赖,空的svc
创建名称空间

kubectl   create ns  kube-logging

创建elastic.yaml

kind: Service
apiVersion: v1
metadata:
  name: elasticsearch
  namespace: kube-logging
  labels:
    app: elasticsearch
spec:
  selector:
    app: elasticsearch
  clusterIP: None
  ports:
    - port: 9200
      name: rest
    - port: 9300
      name: inter-node

查看是否成功

[root@master elk]# kubectl get svc -n kube-logging
NAME            TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)             AGE
elasticsearch   ClusterIP   None         <none>        9200/TCP,9300/TCP   54s

2.2.创建存储类,用于es数据的持久化处理
这里使用的是NFS的存储类动态创建,要使用静态的可以看前面的mysql那节。
所有节点安装下nfs,确保驱动

 yum install nfs-utils -y
 systemctl start nfs
 systemctl enable  nfs

在master创建共享目录

[root@master elk]# mkdir /data/elk -p
vim /etc/exports
/data/v1 *(rw,no_root_squash)
exportfs -arv

创建sa,对这个sa进行rbac授权,使得存储类能和k8s的api-server通信

apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-provisioner
[root@master elk]# kubectl apply -f serviceaccount.yaml 
serviceaccount/nfs-provisioner created

给刚创建的sa授权,使用ClusterRoleBinding将run-nfs-provisioner绑定到 ClusterRole

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: nfs-provisioner-runner
rules:
  - apiGroups: [""]
    resources: ["persistentvolumes"]
    verbs: ["get", "list", "watch", "create", "delete"]
  - apiGroups: [""]
    resources: ["persistentvolumeclaims"]
    verbs: ["get", "list", "watch", "update"]
  - apiGroups: ["storage.k8s.io"]
    resources: ["storageclasses"]
    verbs: ["get", "list", "watch"]
  - apiGroups: [""]
    resources: ["events"]
    verbs: ["create", "update", "patch"]
  - apiGroups: [""]
    resources: ["services", "endpoints"]
    verbs: ["get"]
  - apiGroups: ["extensions"]
    resources: ["podsecuritypolicies"]
    resourceNames: ["nfs-provisioner"]
    verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: run-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: ClusterRole
  name: nfs-provisioner-runner
  apiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-provisioner
rules:
  - apiGroups: [""]
    resources: ["endpoints"]
    verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: leader-locking-nfs-provisioner
subjects:
  - kind: ServiceAccount
    name: nfs-provisioner
    namespace: default
roleRef:
  kind: Role
  name: leader-locking-nfs-provisioner
  apiGroup: rbac.authorization.k8s.io

kubectl apply -f rbac.yaml

部署nfs存储动态供应商

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-provisioner
spec:
  selector:
    matchLabels:
      app: nfs-provisioner
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-provisioner
    spec:
      serviceAccount: nfs-provisioner
      containers:
        - name: nfs-provisioner
          image: nfs-client-provisioner
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: example.com/nfs
            - name: NFS_SERVER
              value: 172.17.100.150
            - name: NFS_PATH
              value: /data/elk
      volumes:
        - name: nfs-client-root
          nfs:
            server: 172.17.100.150
            path: /data/elk

kubectl apply -f nfs-deployment.yaml 

查看状态

[root@master elk]# kubectl get pod  -owide 
NAME                               READY   STATUS    RESTARTS   AGE   IP                NODE    NOMINATED NODE   READINESS GATES
nfs-provisioner-57cdd589d4-gfstc   1/1     Running   0          52s   192.168.166.134   node1   <none> 

使用存储类动态分配存储

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: do-block-storage
provisioner: example.com/nfs
root@master elk]# kubectl apply -f es_class.yaml 

查看

[root@master elk]# kubectl get storageclass
NAME               PROVISIONER       RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
do-block-storage   example.com/nfs   Delete          Immediate           false                  18s

注意:provisioner 的值要和上面创建的值对应value: example.com/nfs

下面的在后面文档。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
k8s(Kubernetes)是一个开源的容器编排系统,它可以自动化地部署、扩展和操作容器化的应用程序。k8s二进制可用集群部署是指在生产环境中使用k8s二进制文件手动部署可用的k8s集群。 首先,需要准备三台或以上的服务器,并为每台服务器安装好操作系统(如Ubuntu、CentOS等)。然后,从kubernetes官网下载对应版本的k8s二进制文件,并在每台服务器上进行解压和配置。在配置过程中,需要为每个节点创建和配置kubelet、kube-controller-manager、kube-scheduler和kube-apiserver等组件,同时配置etcd集群用于存储集群的元数据。 接下来,需要配置网络插件(如Flannel或Calico)用于实现容器之间的通信和网络隔离。此外,还需要配置负载均衡器(如Nginx、HAProxy)来将流量均衡到k8s集群中的各个节点上。 在部署完集群后,需要进行一系列的测试和验证工作,确保集群的可用性和稳定性。这包括检查节点之间的通信、集群中各组件的健康状态、容器的调度和网络连接等方面。 最后,需要配置监控和日志系统(如Prometheus、Grafana、ELK等)来实时监控和收集集群的运行状态和日志信息。此外,还可以考虑配置自动化运维工具(如Ansible、Terraform)来简化集群的管理和维护工作。 通过以上步骤,就可以实现k8s二进制可用集群的部署和运维工作。这样就可以保证在生产环境中,k8s集群能够实现可用性、稳定性和可扩展性,满足企业应用程序的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值