diff --git a/metricbeat/docker-compose.yml b/metricbeat/docker-compose.yml index 2bef8c262cc0..a951792fe9fd 100644 --- a/metricbeat/docker-compose.yml +++ b/metricbeat/docker-compose.yml @@ -53,6 +53,7 @@ services: kafka: { condition: service_healthy } kibana: { condition: service_healthy } kubernetes: { condition: service_healthy } + kube-state: { condition: service_started } memcached: { condition: service_healthy } mongodb: { condition: service_healthy } mysql: { condition: service_healthy } @@ -109,6 +110,11 @@ services: - /var/lib/docker:/var/lib/docker - /var/run:/var/run + kube-state: + build: + context: ${PWD}/module/kubernetes/_meta/ + dockerfile: Dockerfile.kube-state + memcached: build: ${PWD}/module/memcached/_meta diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 4e083641c3d6..1dc65a348aff 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -6361,15 +6361,15 @@ kubernetes container metrics [float] -== resource Fields - -Kubernetes container resource requests and limits +=== kubernetes.container.id +type: keyword +Container id [float] -=== kubernetes.container.resource.status.phase +=== kubernetes.container.status.phase type: keyword @@ -6377,7 +6377,7 @@ Container phase (running, waiting, terminated) [float] -=== kubernetes.container.resource.status.ready +=== kubernetes.container.status.ready type: boolean @@ -6385,7 +6385,7 @@ Container ready status [float] -=== kubernetes.container.resource.status.restarts +=== kubernetes.container.status.restarts type: integer @@ -6394,7 +6394,7 @@ Container restarts count [float] -=== kubernetes.container.resource.cpu.limit.nanocores +=== kubernetes.container.cpu.limit.nanocores type: long @@ -6402,7 +6402,7 @@ Container CPU nanocores limit [float] -=== kubernetes.container.resource.cpu.request.nanocores +=== kubernetes.container.cpu.request.nanocores type: long @@ -6411,7 +6411,7 @@ Container CPU requested nanocores [float] -=== kubernetes.container.resource.memory.limit.bytes +=== kubernetes.container.memory.limit.bytes type: long @@ -6421,7 +6421,7 @@ Container memory limit in bytes [float] -=== kubernetes.container.resource.memory.request.bytes +=== kubernetes.container.memory.request.bytes type: long diff --git a/metricbeat/module/kubernetes/_meta/Dockerfile.kube-state b/metricbeat/module/kubernetes/_meta/Dockerfile.kube-state new file mode 100644 index 000000000000..e9c086f912dd --- /dev/null +++ b/metricbeat/module/kubernetes/_meta/Dockerfile.kube-state @@ -0,0 +1,6 @@ +FROM gcr.io/google_containers/kube-state-metrics:v0.5.0 + +ADD kubeconfig / + +ENTRYPOINT ["/kube-state-metrics"] +CMD ["--port=8080", "--in-cluster=false", "--apiserver=http://172.17.0.1:8080", "--kubeconfig=/kubeconfig"] diff --git a/metricbeat/module/kubernetes/_meta/env b/metricbeat/module/kubernetes/_meta/env index 848bc6d68330..b8fa8ca0a057 100644 --- a/metricbeat/module/kubernetes/_meta/env +++ b/metricbeat/module/kubernetes/_meta/env @@ -1,2 +1,4 @@ KUBELET_HOST=172.17.0.1 KUBELET_PORT=10255 +KUBE_STATE_METRICS_HOST=kube-state +KUBE_STATE_METRICS_PORT=8080 diff --git a/metricbeat/module/kubernetes/_meta/kubeconfig b/metricbeat/module/kubernetes/_meta/kubeconfig new file mode 100644 index 000000000000..cad24101463c --- /dev/null +++ b/metricbeat/module/kubernetes/_meta/kubeconfig @@ -0,0 +1,18 @@ +apiVersion: v1 +clusters: +- cluster: + server: http://172.17.0.1:8080 + name: kubernetes +contexts: +- context: + cluster: kubernetes + user: kubernetes + name: kubernetes +current-context: kubernetes +kind: Config +preferences: {} +users: +- name: kubernetes + user: + client-certificate: + client-key: diff --git a/metricbeat/module/kubernetes/state_container/_meta/fields.yml b/metricbeat/module/kubernetes/state_container/_meta/fields.yml index 1d4f4903eec7..2d26be2b360e 100644 --- a/metricbeat/module/kubernetes/state_container/_meta/fields.yml +++ b/metricbeat/module/kubernetes/state_container/_meta/fields.yml @@ -3,47 +3,46 @@ description: > kubernetes container metrics fields: - - name: resource + - name: id + type: keyword + description: + Container id + - name: status type: group - description: > - Kubernetes container resource requests and limits fields: - - name: status - type: group - fields: - - name: phase - type: keyword - description: > + - name: phase + type: keyword + description: > Container phase (running, waiting, terminated) - - name: ready - type: boolean - description: > - Container ready status - - name: restarts - type: integer - description: > - Container restarts count - - name: cpu - type: group - fields: - - name: limit.nanocores - type: long - description: > - Container CPU nanocores limit - - name: request.nanocores - type: long - description: > - Container CPU requested nanocores - - name: memory - type: group - fields: - - name: limit.bytes - type: long - format: bytes - description: > - Container memory limit in bytes - - name: request.bytes - type: long - format: bytes - description: > - Container requested memory in bytes + - name: ready + type: boolean + description: > + Container ready status + - name: restarts + type: integer + description: > + Container restarts count + - name: cpu + type: group + fields: + - name: limit.nanocores + type: long + description: > + Container CPU nanocores limit + - name: request.nanocores + type: long + description: > + Container CPU requested nanocores + - name: memory + type: group + fields: + - name: limit.bytes + type: long + format: bytes + description: > + Container memory limit in bytes + - name: request.bytes + type: long + format: bytes + description: > + Container requested memory in bytes diff --git a/metricbeat/tests/system/test_kubernetes.py b/metricbeat/tests/system/test_kubernetes.py index a9e6122b9da8..f70971dadca4 100644 --- a/metricbeat/tests/system/test_kubernetes.py +++ b/metricbeat/tests/system/test_kubernetes.py @@ -27,6 +27,21 @@ def test_kubelet_container(self): """ Kubernetes kubelet container metricset tests """ self._test_metricset('container', 1, self.get_kubelet_hosts()) + @unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test") + def test_state_node(self): + """ Kubernetes state node metricset tests """ + self._test_metricset('state_node', 1, self.get_kube_state_hosts()) + + @unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test") + def test_state_pod(self): + """ Kubernetes state pod metricset tests """ + self._test_metricset('state_pod', 1, self.get_kube_state_hosts()) + + @unittest.skipUnless(metricbeat.INTEGRATION_TESTS, "integration test") + def test_state_container(self): + """ Kubernetes state container metricset tests """ + self._test_metricset('state_container', 1, self.get_kube_state_hosts()) + def _test_metricset(self, metricset, expected_events, hosts): self.render_config_template(modules=[{ "name": "kubernetes", @@ -59,3 +74,11 @@ def get_kubelet_hosts(cls): os.getenv('KUBELET_HOST', 'localhost') + ':' + os.getenv('KUBELET_PORT', '10255') ] + + @classmethod + def get_kube_state_hosts(cls): + return [ + "http://" + + os.getenv('KUBE_STATE_METRICS_HOST', 'localhost') + ':' + + os.getenv('KUBE_STATE_METRICS_PORT', '18080') + ]