Kubernetes+EFK日志分析系统部署

4 篇文章 0 订阅
1 篇文章 0 订阅

Kubernetes+EFK日志分析系统部署

资源列表

操作系统配置主机名/Ip
CentOS7.32C2Gk8sinit/172.16.10.10
CentOS7.32C2Gk8smaster1/172.16.10.11
CentOS7.32C2Gk8snode1/172.16.10.12
CentOS7.32C2Gk8snode2/172.16.10.13

一、基础环境

  • 所有节点都要执行

1.1 设置主机名

 hostnamectl set-hostname k8sinit
 hostnamectl set-hostname k8smaster1
 hostnamectl set-hostname k8snode1
 hostnamectl set-hostname k8snode2

1.2 添加hosts

 cat >> /etc/hosts << EOF
 172.16.10.10 k8sinit
 172.16.10.11 k8smaster1
 172.16.10.12 k8snode1
 172.16.10.13 k8snode2
 EOF

1.3 关闭防火墙

 systemctl stop firewalld
 systemctl disable firewalld

1.4 关闭内核安全机制

 sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
 reboot

1.5 关闭 swap

 # 关闭swap分区
 swapoff -a
 # 关闭开启自启
 sed -i 's/\/dev\/mapper\/cl-swap/\#\/dev\/mapper\/cl-swap/g' /etc/fstab

1.6 修改内核参数

 cat > /etc/sysctl.d/k8s.conf << EOF
 net.bridge.bridge-nf-call-ip6tables = 1
 net.bridge.bridge-nf-call-iptables = 1
 net.ipv4.ip_forward=1
 EOF
 ​
 modprobe br_netfilter
 sysctl -p /etc/sysctl.d/k8s.conf
 ​
 # 加载 ipvs 模块
 # ip_vs模块
 # ip_vs_rr轮询模块
 # ip_vs_wrr加权轮询模块
 # ip_vs_sh最少连接模块
 # nf_conntrack_ipv4用于跟踪一个连接的状态的模块
 cat > /etc/sysconfig/modules/ipvs.modules << EOF
 #!/bin/bash
 modprobe -- ip_vs
 modprobe -- ip_vs_rr
 modprobe -- ip_vs_wrr
 modprobe -- ip_vs_sh
 modprobe -- nf_conntrack_ipv4
 EOF
 chmod 755 /etc/sysconfig/modules/ipvs.modules
 bash /etc/sysconfig/modules/ipvs.modules

1.7 时间同步

 yum -y install chrony
 systemctl start chronyd
 systemctl enable chronyd
 chronyc sources -v

二、部署k8sinit节点

2.1 准备部署相关资源包

  • 只在 k8s-init 节点执行

 # 上传k8s-installer.zip安装包,将安装包拷贝到/opt 目录
 mv k8s-installer.zip /opt
 yum -y install vim lrzsz unzip
 cd /opt
 unzip k8s-installer.zip
 ls -l k8s-installer

2.2 部署依赖组件,部署http服务

  • 只在 k8s-init 节点执行

# 配置本地 repo 文件
cat > /etc/yum.repos.d/local.repo << EOF
[local]
name=local
baseurl=file:///opt/k8s-installer/docker-ce
gpgcheck=0
enabled=1
EOF
yum clean all && yum makecache

# 安装并配置 httpd 服务
yum -y install httpd --disablerepo=* --enablerepo=local
# httpd 默认使用 80 端口,为避免端口冲突,修改为 60080
sed -i 's/Listen 80/Listen 60080/g' /etc/httpd/conf/httpd.conf

# 将安装包内“docker-ce”目录拷贝到 Apache 默认的网站服务目录/var/www/html 中,启 动 httpd 服务。
cp -r /opt/k8s-installer/docker-ce/ /var/www/html/
systemctl enable httpd && systemctl start httpd

2.3 安装并配置 Docker

  • 所有节点都要操作

# 配置yum源
cat > /etc/yum.repos.d/local-http.repo << EOF
[local-http]
name=local-http
baseurl=http://172.16.10.10:60080/docker-ce
gpgcheck=0
enabled=1
EOF
yum clean all && yum makecache

# 配置 docker daemon 文件
mkdir /etc/docker
# storage-driver是存储驱动
cat > /etc/docker/daemon.json << EOF
{
  "insecure-registries": [
    "172.16.10.10:65000"
  ],
  "storage-driver": "overlay2"
}
EOF

# 安装并启动 docker 服务
yum -y install docker-ce docker-ce-cli containerd.io --disablerepo=* --enablerepo=local-http
systemctl enable docker
systemctl start docker

2.4 部署镜像仓库

  • 只在 k8s-init 节点执行

# Docker 的镜像仓库中存储了部署 K8S 所需的 kube-apiserver 、 kube-controller-manager、kube-scheduler、etcd、flannel、coredns 等组件的镜像。镜像仓库使用 docker run 的方式部署,默认开放主机的 65000 端口提供服务

# 加载镜像到本地
docker load -i /opt/k8s-installer/registry-image.tar
# 启动 registry 镜像仓库服务
docker run -d --restart=always --name pkg-registry -p 65000:5000 -v /opt/k8s-installer/registry/:/var/lib/registry index.alauda.cn/alaudaorg/distribution:latest

三、部署 Kubernetes

3.1 安装 Kubeadm、 Kubelet 和 Kubectl

  • 所有的 Master 和 Node 节点均需要执行

# 需要安装依赖包,这个是用于连接跟踪的
rpm -Uvh http://172.16.10.10:60080/docker-ce/libnetfilter_conntrack-1.0.6-1.el7_3.x86_64.rpm
yum -y install kubeadm kubectl kubelet --disablerepo=* --enablerepo=local-http

# 配置 Kubelet
systemctl enable kubelet
# 备份配置文件/etc/systemd/system/kubelet.service
cp /etc/systemd/system/kubelet.service /etc/systemd/system/kubelet.service_bak

cat > /etc/systemd/system/kubelet.service << 'EOF'
[Unit]
Description=kubelet: The Kubernetes Node Agent
Documentation=https://kubernetes.io/docs/

[Service]
Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"
Environment="KUBELET_INFRA_CONTAINER_IMAGE=--pod-infra-container-image=172.16.10.10:60080/k8s/pause:3.1"
ExecStart=/usr/bin/kubelet $KUBELET_SYSTEM_PODS_ARGS $KUBELET_INFRA_CONTAINER_IMAGE
Restart=always
StartLimitInterval=0
RestartSec=10

[Install]
WantedBy=multi-user.target
EOF

3.2 配置 Kubeadm 初始化文件,并初始化master

  • 在 Master 节点执行

# 生成初始化配置文件
kubeadm config print init-defaults > /opt/kubeadm.conf
vim /opt/kubeadm.conf  # 修改刚才所提到的内容
apiVersion: kubeadm.k8s.io/v1beta1
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 172.16.10.11
  bindPort: 6443
nodeRegistration:
  criSocket: /var/run/dockershim.sock
  name: k8smaster1
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta1
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controlPlaneEndpoint: "172.16.10.11"  
controllerManager: {}
dns:
  type: CoreDNS
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: 172.16.10.10:65000/k8s 
kind: ClusterConfiguration
kubernetesVersion: v1.13.3  
networking:
  dnsDomain: cluster.local
  podSubnet: "10.244.0.0/16" 
  serviceSubnet: 10.96.0.0/12
scheduler: {}


# 提前下载镜像
##列出镜像资源
kubeadm config images list --config /opt/kubeadm.conf
##下载镜像资源
kubeadm config images pull --config /opt/kubeadm.conf

# 初始化 Master1 节点
kubeadm init --config /opt/kubeadm.conf

# 配置 Kubectl 认证,初始化以后操作,初始化以后也会有提示
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 打印k8s集群节点加入命令
kubeadm token create --print-join-command

3.3 添加 Node 节点到集群

  • node节点执行

# 在 kubeadm init 命令执行结果的提示信息中打印出来了 Node 节点添加命令,需要替换成实际打印出的命令。
kubeadm join 172.16.10.11:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:66eb166d76a2ac73afbc496cb9911f91e8ee67dbc4c7c629b53f675aa64cc530

3.4 安装 Flannel 网络插件

  • 只在第一台 Master 节点(k8smaster1)执行

# 拷贝 kube-flannel.yml 文件,把 kube-flannel.yml 从 k8s-init 节点拷贝到 Master 节点的/opt 目录
scp root@k8sinit:/opt/k8s-installer/kube-flannel.yml /opt

# 替换 Flannel 镜像地址
sed -i "s#quay.io/coreos#172.16.10.10:65000/k8s#g" /opt/kube-flannel.yml

# 创建 Flannel 相关资源
kubectl apply -f /opt/kube-flannel.yml

# 查看群集状态
kubectl get cs
# 查看节点
kubectl get nodes
# 查看 pod
kubectl get nodes --all-namespaces

四、部署EFK

4.1 导入 EFK 镜像

  • 在master1 上执行

# 离线部署 Kubernetes 集群的时候,在本地启动一个镜像仓库,默认安装在 k8sinit 节点,镜像仓库地址为 172.16.10.10:65000,在进行 EFK 相关实验之前需要先把 EFK 镜像导入到该仓库中

# 上传并解压 efk.tar 压缩包
# 将压缩包拷贝到 k8smaster1 节点的/opt 目录,执行如下解压缩命令
tar xvf efk.tar
cd /opt/efk

# 导入 Elasticsearch 镜像
docker load -i elasticsearch-7.4.2.tar
docker tag b1179d 172.16.10.10:65000/efk/elasticsearch:7.4.2
docker push 172.16.10.10:65000/efk/elasticsearch:7.4.2

# 导入 Fluentd 镜像
docker load -i fluentd-es.tar
docker tag 636f3d 172.16.10.10:65000/efk/fluentd-es-root:v2.5.2
docker push 172.16.10.10:65000/efk/fluentd-es-root:v2.5.2

# 导入 Kibana 镜像
docker load -i kibana-7.4.2.tar
docker tag 230d3d 172.16.10.10:65000/efk/kibana:7.4.2
docker push 172.16.10.10:65000/efk/kibana:7.4.2

# 导入 alpine 镜像
docker load -i alpine-3.6.tar
docker tag 43773d 172.16.10.10:65000/efk/alpine:3.6
docker push 172.16.10.10:65000/efk/alpine:3.6

4.2 修改 Yaml 文件

  • 为了快速创建 efk 组件,已经将各组件的 yaml 文件打到压缩包中,其中有几个 yaml 文件需要修改,主要涉及到两处:镜像地址和 nodeSelector 选择器。

# 修改 elasticsearch.yaml
vim /opt/efk/elasticsearch.yaml
# 将image镜像下载改为以部署的 172.16.10.10:6500 镜像仓库地址
image: 172.16.10.10:6500/efk/elasticsearch:7.4.2
image: 172.16.10.10:6500/efk/alpine:3.6
image: 172.16.10.10:6500/efk/alpine:3.6
# NodeSelector 节点选择器的修改,实际作用是决定将服务部署到哪个节点。可根据实际负载情况进行调整,在选择节点时务必确保节点有足够的资源。
# 设定 Elasticsearch 服务部署在node1节点
nodeSelector: 
  kubernetes.io/hostname: k8snode1  # 设定将 Elasticsearch 服务部署在node1节点


# 修改 kibana.yaml
vim /opt/efk/kibana.yaml
# 将image镜像下载改为以部署的 172.16.10.10:6500 镜像仓库地址
image: 172.16.10.10:6500/efk/kibana:7.4.2
# 设定 kibana 服务部署在node2节点
nodeSelector: 
  kubernetes.io/hostname: k8snode2  # 设定将 kibana 服务部署在node2节点


# 修改 fluentd.yaml
vim /opt/efk/fluentd.yaml
# 将image镜像下载改为以部署的 172.16.10.10:6500 镜像仓库地址
image: 172.16.10.10:6500/efk/fluentd-es-root:v2.5.2


# 修改 test-pod.yaml
vim /opt/efk/test-pod.yaml
# 将image镜像下载改为以部署的 172.16.10.10:6500 镜像仓库地址
image: 172.16.10.10:6500/efk/alpine:3.6

4.3 创建安装EFK

# 创建命名空间
kubectl apply -f namespace.yaml
# 创建 es 数据存储目录,Elasticsearch 服务通常可以简写为 es。到 k8snode1 节点创建数据目录/esdata
mkdir /esdata

# 部署 es 容器
kubectl apply -f /opt/efk/elasticsearch.yaml

# 部署 kibana
kubectl apply -f /opt/efk/kibana.yaml

# 部署 Fluentd
# 给集群节点打标签,为了自由控制需要采集集群中节点上业务容器的服务日志。因此,需要给 k8snode1 和 k8snode2 节点打上 fluentd=true 的标签 label
kubectl label node k8snode1 fluentd=true
kubectl label node k8snode2 fluentd=true
# k8snode1 和 k8snode2 已经打上了 fluentd=true 的 label,那么 Fluentd 服务就会启 动到这两个节点,也就意味着运行在这两个节点的 Pod 日志会被收集起来

# 启动 Fluentd 服务
kubectl apply -f /opt/efk/fluentd-es-config-main.yaml
kubectl apply -f /opt/efk/fluentd-configmap.yaml
kubectl apply -f /opt/efk/fluentd.yaml
  • 查看集群

kubectl get pod --all-namespaces
kubectl get svc -n logging
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
elasticsearch   ClusterIP   10.101.0.192    <none>        9200/TCP         3m22s
kibana          NodePort    10.97.156.227   <none>        5601:31754/TCP   3m12s
  • 浏览器 访问 ”集群节点:kibana端口 “ ,登录kibana 界面

  • 验证容器日志收集

# 创建测试容器

kubectl apply -f /opt/efk/test-pod.yaml

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值