百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

K8S实战-构建Django项目-05-EFK日志方案和Weave监控方案(战术小队op控制台代码)

toyiye 2024-04-04 11:41 20 浏览 0 评论

前言

又到周五了,现在我们一起来填坑,把之前埋下的雷都给排了~~同时,我们的实战课程也将接近尾声。今天我将带着大家解决上节课留下的问题,还将带大家实现EFK日志方案和Weave监控方案。

每日解析(11.14 每日一题解析)

问:k8s 跨主机网络如何实现?你的各个节点是否可以访问各个节点上的Pod,各个Pod直接能否互相访问?

跨主机网络的实现,肯定要使用跨主机网络,常用的跨主机网络模式有Calico、Canal、Flannel、Kube-router。篇幅有限就不一一阐释,只选择Calico和Flannel来解决跨主机网络的bug。

跨主机网络的bug,是指不同节点上的pod之间无法互相访问,按照官方解释按照官方文档配置的跨主机网络是可以实现,Pod和各node之间的通信,Pod和各节点上的Pod之间的通信。但是实际上由于我们的iptable规则,导致不同节点上的pod之间无法互相访问。你没听错,是iptable规则,明明没有设置iptable规则是从哪来的,是kubernetes 跨主机网络模式自己创建的,你即使临时删除了iptable规则,使得各Pod间可以通信,但是一段时间过后,iptable规则又死灰复燃。好了,让我们彻底解决这烦人的iptable规则吧~~

Calico

calico 网络消灭iptable规则引起的不同节点上的pod之间无法互相访问bug,百度谷歌之后发现很多人建议默认选择的网段最好不要使用192.168.0.0/16,说是会和自己物理机的网段产生冲突~~,宁可信其有,咋们还是选一个没人使用的网段作为pod的网段吧。例如我选择的是172.13.0.0/16。 除此之外还有很多国内的博主说,docker1.13之后iptable规则做了修改,阻碍了kuberentes pod间的通信,需要开放通信,实际操作了下,完全扯淡,随着时间的推移这个问题早解决了,但是搬运工们不停的搬运,浪费了我很多时间。

上面说的都是废话,其实calico网络,修复不同节点上的pod之间无法互相访问,你只需要禁用ipip模式即可。正式启用了ipip模式才导致你的iptable规则在跨节点pod通信时丢弃信号。

让我们calico.yaml文件

kubeadm init --kubernetes-version v1.12.0 --pod-network-cidr=172.13.0.0/16
# 初始化之后,修改calico.yaml
vim calico.yaml
```
 - name: CALICO_IPV4POOL_CIDR
 value: 172.13.0.0/16
 - name: CALICO_IPV4POOL_IPIP
 value: "false"
 - name: FELIX_IPINIPENABLED
 value: "false"
```
kubectl apply -f calico.yaml
?
# 如果你的网络已经创建好了,可以动态修改calilo
kubectl edit -n kube-system daemonset.extensions/calico-node
?
# 如果你是在vm中进行k8s练习,还是添加禁用swap
echo "vm.swappiness=0" >> /etc/sysctl.d/k8s.conf
sysctl --system

Flannel

flannel网络消灭iptable规则引起的不同节点上的pod之间无法互相访问bug,百度谷歌之后发现很多人建议直接清除iptable规则即可,唯一需要注意的是每个节点都需要清理~~~

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F
iptables -L -n

现在你的跨节点的pod间可以自由的通信啦~~

EFK

日志进行采集、查询和分析的方案有很多,常见的是ELK,我们之前的教程中有ELK,所以这次我们换成EFK架构。

这里的F是指Filebeat,它是基于原先 logstash-forwarder 的源码改造出来的,无需依赖 Java 环境就能运行,安装包10M不到。如果日志的量很大,Logstash 会遇到资源占用高的问题,为解决这个问题,我们引入了Filebeat。Filebeat 是基于 logstash-forwarder 的源码改造而成,用 Golang 编写,无需依赖 Java 环境,效率高,占用内存和 CPU 比较少,非常适合作为 Agent 跑在服务器上。

创建dashboard用户

serviceaccount.yaml

?
apiVersion: v1
kind: ServiceAccount
metadata:
 name: dashboard
 namespace: kube-system
?
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
 name: dashboard
roleRef:
 kind: ClusterRole
 name: view
 apiGroup: rbac.authorization.k8s.io
subjects:
 - kind: ServiceAccount
 name: dashboard
 namespace: kube-system

创建PersistentVolume

创建PersistentVolume用作Elasticsearch存储所用的磁盘

persistentvolume.yaml

apiVersion: v1
kind: PersistentVolume
metadata:
 name: elk-log-pv
spec:
 capacity:
 storage: 5Gi
 accessModes:
 - ReadWriteMany
 nfs:
 path: /nfs-share
 server: 172.16.2.237
 readOnly: false

fluentd的配置(configmap)

configmap.yaml

piVersion: v1
kind: ConfigMap
metadata:
 name: fluentd-conf
 namespace: kube-system
data:
 td-agent.conf: |
 <match fluent.**>
 type null
 </match>
 # Example:
 # {"log":"[info:2016-02-16T16:04:05.930-08:00] Some log text here\n","stream":"stdout","time":"2016-02-17T00:04:05.931087621Z"}
 <source>
 type tail
 path /var/log/containers/*.log
 pos_file /var/log/es-containers.log.pos
 time_format %Y-%m-%dT%H:%M:%S.%NZ
 tag kubernetes.*
 format json
 read_from_head true
 </source>
 <filter kubernetes.**>
 type kubernetes_metadata
 verify_ssl false
 </filter>
 <source>
 type tail
 format syslog
 path /var/log/messages
 pos_file /var/log/messages.pos
 tag system
 </source>
 <match **>
 type elasticsearch
 user "#{ENV['FLUENT_ELASTICSEARCH_USER']}"
 password "#{ENV['FLUENT_ELASTICSEARCH_PASSWORD']}"
 log_level info
 include_tag_key true
 host elasticsearch-logging
 port 9200
 logstash_format true
 # Set the chunk limit the same as for fluentd-gcp.
 buffer_chunk_limit 2M
 # Cap buffer memory usage to 2MiB/chunk * 32 chunks = 64 MiB
 buffer_queue_limit 32
 flush_interval 5s
 # Never wait longer than 5 minutes between retries.
 max_retry_wait 30
 # Disable the limit on the number of retries (retry forever).
 disable_retry_limit
 # Use multiple threads for processing.
 num_threads 8
 </match>

整体配置

logging.yaml

apiVersion: v1
kind: ReplicationController
metadata:
 name: elasticsearch-logging-v1
 namespace: kube-system
 labels:
 k8s-app: elasticsearch-logging
 version: v1
 kubernetes.io/cluster-service: "true"
spec:
 replicas: 2
 selector:
 k8s-app: elasticsearch-logging
 version: v1
 template:
 metadata:
 labels:
 k8s-app: elasticsearch-logging
 version: v1
 kubernetes.io/cluster-service: "true"
 spec:
 serviceAccount: dashboard
 containers:
 - image: registry.cn-hangzhou.aliyuncs.com/google-containers/elasticsearch:v2.4.1-1
 name: elasticsearch-logging
 resources:
 # need more cpu upon initialization, therefore burstable class
 limits:
 cpu: 1000m
 requests:
 cpu: 100m
 ports:
 - containerPort: 9200
 name: db
 protocol: TCP
 - containerPort: 9300
 name: transport
 protocol: TCP
 volumeMounts:
 - name: es-persistent-storage
 mountPath: /data
 env:
 - name: "NAMESPACE"
 valueFrom:
 fieldRef:
 fieldPath: metadata.namespace
 volumes:
 - name: es-persistent-storage
 persistentVolumeClaim:
 claimName: elk-log
?
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: elk-log
 namespace: kube-system
spec:
 accessModes:
 - ReadWriteMany
 resources:
 requests:
 storage: 5Gi
 #selector:
 # matchLabels:
 # release: "stable"
 # matchExpressions:
 # - {key: environment, operator: In, values: [dev]}
?
---
apiVersion: v1
kind: Service
metadata:
 name: elasticsearch-logging
 namespace: kube-system
 labels:
 k8s-app: elasticsearch-logging
 kubernetes.io/cluster-service: "true"
 kubernetes.io/name: "Elasticsearch"
spec:
 ports:
 - port: 9200
 protocol: TCP
 targetPort: db
 selector:
 k8s-app: elasticsearch-logging
?
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
 name: fluentd-es-v1.22
 namespace: kube-system
 labels:
 k8s-app: fluentd-es
 kubernetes.io/cluster-service: "true"
 version: v1.22
spec:
 template:
 metadata:
 labels:
 k8s-app: fluentd-es
 kubernetes.io/cluster-service: "true"
 version: v1.22
 # This annotation ensures that fluentd does not get evicted if the node
 # supports critical pod annotation based priority scheme.
 # Note that this does not guarantee admission on the nodes (#40573).
 annotations:
 scheduler.alpha.kubernetes.io/critical-pod: ''
 scheduler.alpha.kubernetes.io/tolerations: '[{"key": "node.alpha.kubernetes.io/ismaster", "effect": "NoSchedule"}]'
 spec:
 serviceAccount: dashboard
 containers:
 - name: fluentd-es
 image: registry.cn-hangzhou.aliyuncs.com/google-containers/fluentd-elasticsearch:1.22
 command:
 - '/bin/sh'
 - '-c'
 - '/usr/sbin/td-agent 2>&1 >> /var/log/fluentd.log'
 resources:
 limits:
 memory: 200Mi
 requests:
 cpu: 100m
 memory: 200Mi
 volumeMounts:
 - name: varlog
 mountPath: /var/log
 - name: varlibdockercontainers
 mountPath: /var/lib/docker/containers
 - name: config-volume
 mountPath: /etc/td-agent/
 readOnly: true
 #nodeSelector:
 # alpha.kubernetes.io/fluentd-ds-ready: "true"
 terminationGracePeriodSeconds: 30
 volumes:
 - name: varlog
 hostPath:
 path: /var/log
 - name: varlibdockercontainers
 hostPath:
 path: /var/lib/docker/containers
 - name: config-volume
 configMap:
 name: fluentd-conf
?
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: kibana-logging
 namespace: kube-system
 labels:
 k8s-app: kibana-logging
 kubernetes.io/cluster-service: "true"
spec:
 replicas: 1
 selector:
 matchLabels:
 k8s-app: kibana-logging
 template:
 metadata:
 labels:
 k8s-app: kibana-logging
 spec:
 containers:
 - name: kibana-logging
 image: registry.cn-hangzhou.aliyuncs.com/google-containers/kibana:v4.6.1-1
 resources:
 # keep request = limit to keep this container in guaranteed class
 limits:
 cpu: 100m
 requests:
 cpu: 100m
 env:
 - name: "ELASTICSEARCH_URL"
 value: "http://elasticsearch-logging:9200"
 #- name: "KIBANA_BASE_URL"
 # value: "/api/v1/proxy/namespaces/kube-system/services/kibana-logging"
 ports:
 - containerPort: 5601
 name: ui
 protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
 name: kibana-logging
 namespace: kube-system
 labels:
 k8s-app: kibana-logging
 kubernetes.io/cluster-service: "true"
 kubernetes.io/name: "Kibana"
spec:
 type: NodePort
 ports:
 - nodePort: 30005
 port: 5601
 protocol: TCP
 targetPort: ui
 selector:
 k8s-app: kibana-logging
 #type: ClusterIP

执行部署

kubectl apply -f serviceaccount.yaml
kubectl apply -f configmap.yaml
kubectl apply -f persistentvolume.yaml
kubectl apply -f logging.yaml

修复bug

我们打开浏览器,访问http://localhost:30005,我们得到了如下结果:

{"statusCode":404,"error":"Not Found","message":"Not Found"}

这是因为将/api/v1/namespaces/kube-system/services/kibana-logging/proxy/app/kibana这个url path也传递给后面的kibana了,导致kibana却无法处理。 这是由于我们错误配置的env,其实我已经在上面的logging.yaml修复了~~

现在访问http://172.16.2.237:30005/app/kibana

Weave

Weave Scope 是 Docker 和 Kubernetes 可视化监控工具。Scope 提供了至上而下的集群基础设施和应用的完整视图,用户可以轻松对分布式的容器化应用进行实时监控和问题诊断。

安装

kubectl apply --namespace weave -f "https://cloud.weave.works/k8s/scope.yaml?k8s-version=$(kubectl version | base64 | tr -d '\n')"
kubectl get service -n weave
kubectl edit servie <service_name> -n weave
```
#修改访问方式为nodePort
```
kubectl get pod -n weave

  1. DaemonSet weave-scope-agent,集群每个节点上都会运行的 scope agent 程序,负责收集数据。
  2. Deployment weave-scope-app,scope 应用,从 agent 获取数据,通过 Web UI 展示并与用户交互。
  3. Service weave-scope-app,默认是 ClusterIP 类型,为了方便已通过 kubectl edit 修改为 NodePort。

最后我们直接访问weave ui

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码