Kubernetes+EFK日志分析系统部署
Kubernetes+EFK日志分析系统部署资源列表操作系统配置主机名/IpCentOS7.32C2Gk8sinit/172.16.10.10CentOS7.32C2Gk8smaster1/172.16.10.11CentOS7.32C2Gk8snode1/172.16.10.12CentOS7.32C2Gk8snode2/172.16.10.13一、基础环境所有节点都要执行
·
Kubernetes+EFK日志分析系统部署
资源列表
操作系统 | 配置 | 主机名/Ip |
---|---|---|
CentOS7.3 | 2C2G | k8sinit/172.16.10.10 |
CentOS7.3 | 2C2G | k8smaster1/172.16.10.11 |
CentOS7.3 | 2C2G | k8snode1/172.16.10.12 |
CentOS7.3 | 2C2G | k8snode2/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
更多推荐
已为社区贡献1条内容
所有评论(0)