共计 4101 个字符,预计需要花费 11 分钟才能阅读完成。
导读 | Kubernetes 已经成为容器编排的事实上的王者,连 Docker 都已经向 K8s 女王大人低头。对于 Kubernetes 的 cluster 的数据收集和监控已经成为 IT 运维的一个重要话题。我们今天来看一看如何利用 Splunk 最新的 Metrics Store 来对 Kubernetes 的集群进行性能监控。 |
下图是该方案的部署架构,主要包括:
利用 Heapster 收集 K8s 的性能数据,包含 CPU,Memory,Network,File System 等
利用 Heapster 的 Statsd Sink,发送数据到 Splunk 的 Metrics Store
利用 Splunk 的搜索命令和仪表盘功能对性能数据进行监控
前期主要要准备好两件事:
编译最新的 Heapster 的镜像,并上传到某个公共的 Docker 镜像仓库,例如 docker hub
在 Splunk 中配置 Metrics Store 和对应的网络输入(Network Input UDP/TCP)
这里主要要做的选择是 Statsd 的传输协议用 UDP 还是 TCP。这里我推荐使用 TCP。最新的 Heapster 代码支持不同的 Backend,包含了 log, influxdb, stackdriver, gcp monitoring, gcp logging, statsd, hawkular-metrics, wavefront, openTSDB, kafka, riemann, elasticsearch 等等。因为 Splunk 的 Metrics Store 支持 statsd 协议,所以可以很容易的和 Heapster 集成。
首先我们需要利用最新的 heapster 代码,编译一个容器镜像,因为 docker hub 上的 heapsterd 的官方镜像的版本比较旧,并不支持 statsd。所以需要自己编译。
mkdir myheapster
mkdir myheapster/src
export GOPATH=myheapster
cd myheapster/src
git clone https://github.com/kubernetes/heapster.git
cd heapster
make container
运行以上的命令来编译最新的 heapster 镜像。
注意,heapster 缺省使用 udp 协议,如果想要使用 tcp,需要修改代码
https://github.com/kubernetes/heapster/blob/master/metrics/sinks/statsd/statsd_client.go
func (client *statsdClientImpl) open() error {
var err error
client.conn, err = net.Dial("udp", client.host)
if err != nil {glog.Errorf("Failed to open statsd client connection : %v", err)
} else {glog.V(2).Infof("statsd client connection opened : %+v", client.conn)
}
return err
}
把 udp 改成 tcp。
我在 docker hub 上放了两个镜像,分别对应 udp 版本的 tcp 版本,大家可以直接使用
naughtytao/heapster-amd64:v1.5.0-beta.3 udp
naughtytao/heapster-amd64:v1.5.0-beta.4 tcp
然后需要在 Splunk 中配置 Metrics Store,参考这个文档
在 K8s 上部署 heapster 比较容易,创建对应的 yaml 配置文件,然后用 kubectl 命令行创建就好了。
以下是 Deployment 和 Service 的配置文件:
deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: heapster
namespace: kube-system
spec:
replicas: 1
template:
metadata:
labels:
task: monitoring
k8s-app: heapster
version: v6
spec:
containers:
- name: heapster
image: naughtytao/heapster-amd64:v1.5.0-beta.3
imagePullPolicy: Always
command:
- /heapster
- --source=kubernetes:https://kubernetes.default
- --sink=statsd:udp://ip:port?numMetricsPerMsg=1
service.yaml
apiVersion: v1
kind: Service
metadata:
labels:
task: monitoring
# For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
# If you are NOT using this as an addon, you should comment out this line.
kubernetes.io/cluster-service: 'true'
kubernetes.io/name: Heapster
name: heapster
namespace: kube-system
spec:
ports:
- port: 80
targetPort: 8082
selector:
k8s-app: heapster
注意这里 deployment 的 –sink 的配置,ip 是 Splunk 的 IP 或者主机名,port 的对应的 Splunk 的 data input 的端口号。当使用 udp 协议的时候,需要配置的 numMetricsPerMsg 的值比较小,当这个值比较大的时候,会出 message too long 的 error。当使用 tcp 的时候可以配置较大的数值。
运行 kubectl apply -f *.yaml 来部署 heapster
如果正常运行,对应的 heapster pod 的日志如下
I0117 18:10:56.054746 1 heapster.go:78] /heapster --source=kubernetes:https://kubernetes.default --sink=statsd:udp://ec2-34-203-25-154.compute-1.amazonaws.com:8124?numMetricsPerMsg=10
I0117 18:10:56.054776 1 heapster.go:79] Heapster version v1.5.0-beta.4
I0117 18:10:56.054963 1 configs.go:61] Using Kubernetes client with master "https://kubernetes.default" and version v1
I0117 18:10:56.054978 1 configs.go:62] Using kubelet port 10255
I0117 18:10:56.076200 1 driver.go:104] statsd metrics sink using configuration : {host:ec2-34-203-25-154.compute-1.amazonaws.com:8124 prefix: numMetricsPerMsg:10 protocolType:etsystatsd renameLabels:map[] allowedLabels:map[] customizeLabel:0x15fc8c0}
I0117 18:10:56.076248 1 driver.go:104] statsd metrics sink using configuration : {host:ec2-34-203-25-154.compute-1.amazonaws.com:8124 prefix: numMetricsPerMsg:10 protocolType:etsystatsd renameLabels:map[] allowedLabels:map[] customizeLabel:0x15fc8c0}
I0117 18:10:56.076272 1 heapster.go:202] Starting with StatsD Sink
I0117 18:10:56.076281 1 heapster.go:202] Starting with Metric Sink
I0117 18:10:56.090229 1 heapster.go:112] Starting heapster on port 8082
好了如果一切正常的化,heapster 会用 statsd 的协议和格式发送 metrics 到 Splunk 的 metrics store。
然后就可以用利用 SPL 的 mstats 和 mcatalog 命令来分析,监控 metrics 数据了。
以下搜索语句列出所有的 Metrics
| mcatalog values(metric_name)
以下搜索语句列出整个 cluster 的 CPU 使用,我们可以用 Area 或者 Line Chart 来可视化搜索结果。
| mstats avg(_value) WHERE metric_name=cluster.cpu/usage_rate span=30m
kube-system namespace 的对应内存使用情况
| mstats avg(_value) WHERE metric_name=namespace.kube-system.memory/usage span=30m
大家可以把自己感兴趣的分析结果放在 Dashboard 中,利用 Realtime 设置进行监控。
好了,更多的分析选项可以参考 Splunk 文档。
![post-qrcode](https://www.xgss.net/wp-content/uploads/2023/07/二维码-微信公众号256x256.jpg)