deploy/skoopbundle.yaml (699 lines of code) (raw):
apiVersion: v1
kind: Namespace
metadata:
name: kubeskoop
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kubeskoop-exporter
namespace: kubeskoop
labels:
app: kubeskoop-exporter
spec:
selector:
matchLabels:
app: kubeskoop-exporter
template:
metadata:
labels:
app: kubeskoop-exporter
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "9102"
prometheus.io/scheme: http
prometheus.io/scrape: "true"
name: kubeskoop-exporter
spec:
hostNetwork: true
hostPID: true
automountServiceAccountToken: false
dnsPolicy: ClusterFirstWithHostNet
initContainers:
- name: inspector-prepare
image: kubeskoop/agent:v1.0.0
volumeMounts:
- name: btf-rawdata
mountPath: /etc/net-exporter/btf
- mountPath: /boot/
name: boot
command: [btfhack, discover, -p, /etc/net-exporter/btf/]
containers:
- image: kubeskoop/agent:v1.0.0
name: inspector
ports:
- name: http
containerPort: 9102
env:
- name: INSPECTOR_NODENAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
volumeMounts:
- name: config-volume
mountPath: /etc/config/
- name: btf-rawdata
mountPath: /etc/net-exporter/btf
- name: proc
mountPath: /proc
- mountPath: /run/containerd/
name: containerd
- mountPath: /var/run/
name: dockershim
- mountPath: /sys/fs/bpf
name: bpf-maps
mountPropagation: HostToContainer
- mountPath: /sys/fs/cgroup
name: cgroup
mountPropagation: HostToContainer
- mountPath: /sys/kernel/debug
name: bpf-events
mountPropagation: HostToContainer
- mountPath: /etc/node-hostname
name: hostname
command: [/bin/inspector,server,-d]
securityContext:
capabilities:
add:
- NET_ADMIN
- SYS_PTRACE
- SYS_ADMIN
- SYS_RESOURCE
- DAC_OVERRIDE
drop:
- ALL
resources:
requests:
cpu: 1000m
memory: 1000Mi
limits:
cpu: 1000m
memory: 2000Mi
volumes:
- name: proc
hostPath:
path: /proc
- name: containerd
hostPath:
path: /run/containerd/
- name: dockershim
hostPath:
path: /var/run/
- hostPath:
path: /sys/fs/bpf
type: DirectoryOrCreate
name: bpf-maps
- name: boot
hostPath:
path: /boot
type: DirectoryOrCreate
- hostPath:
path: /sys/fs/cgroup
type: DirectoryOrCreate
name: cgroup
- hostPath:
path: /sys/kernel/debug
name: bpf-events
- name: hostname
hostPath:
path: /etc/hostname
type: FileOrCreate
- name: config-volume
configMap:
name: kubeskoop-config
- name: btf-rawdata
emptyDir: {}
---
apiVersion: v1
data:
config.yaml: |-
debugMode: true
port: 9102
enableController: true
metrics:
probes:
- name: conntrack
- name: qdisc
- name: netdev
- name: io
- name: sock
- name: tcpsummary
- name: tcp
- name: tcpext
- name: udp
- name: socketlatency
- name: packetloss
- name: flow
args:
enablePortInLabel: false
- name: tcpretrans
event:
probes:
- name: tcpreset
- name: packetloss
args:
enableStack: false
- name: tcpretrans
sinks:
- name: stderr
- name: loki
args:
addr: loki-service
kind: ConfigMap
metadata:
name: kubeskoop-config
namespace: kubeskoop
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: prometheus
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- pods
verbs: ["get", "list", "watch"]
- apiGroups:
- extensions
resources:
- ingresses
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources:
- namespaces
- pods
- pods/exec
verbs: ["create", "delete"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: prometheus
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: prometheus
subjects:
- kind: ServiceAccount
name: default
namespace: kubeskoop
---
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-server-conf
labels:
name: prometheus-server-conf
namespace: kubeskoop
data:
prometheus.rules: |-
groups:
- name: devopscube demo alert
rules:
- alert: High Pod Memory
expr: sum(container_memory_usage_bytes) > 1
for: 1m
labels:
severity: slack
annotations:
summary: High Memory Usage
prometheus.yml: |-
global:
scrape_interval: 5s
evaluation_interval: 5s
scrape_configs:
- job_name: 'net-exporter'
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_endpoints_name]
regex: 'net-exporter'
action: keep
- job_name: 'kubernetes-pods'
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape]
action: keep
regex: true
- source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path]
action: replace
target_label: __metrics_path__
regex: (.+)
- source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port]
action: replace
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
target_label: __address__
- action: labelmap
regex: __meta_kubernetes_pod_label_(.+)
- source_labels: [__meta_kubernetes_namespace]
action: replace
target_label: kubernetes_namespace
- source_labels: [__meta_kubernetes_pod_name]
action: replace
target_label: kubernetes_pod_name
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: prometheus-deployment
namespace: kubeskoop
labels:
app: prometheus-server
spec:
replicas: 1
selector:
matchLabels:
app: prometheus-server
template:
metadata:
labels:
app: prometheus-server
spec:
containers:
- name: prometheus
image: prom/prometheus
args:
- "--storage.tsdb.retention.time=12h"
- "--config.file=/etc/prometheus/prometheus.yml"
- "--storage.tsdb.path=/prometheus/"
ports:
- containerPort: 9090
resources:
requests:
cpu: 500m
memory: 500M
limits:
cpu: 1000m
memory: 1Gi
volumeMounts:
- name: prometheus-config-volume
mountPath: /etc/prometheus/
- name: prometheus-storage-volume
mountPath: /prometheus/
volumes:
- name: prometheus-config-volume
configMap:
defaultMode: 420
name: prometheus-server-conf
- name: prometheus-storage-volume
emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
name: prometheus-service
namespace: kubeskoop
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '9090'
spec:
selector:
app: prometheus-server
type: NodePort
ports:
- port: 80
targetPort: 9090
---
apiVersion: v1
kind: Service
metadata:
name: loki-service
namespace: kubeskoop
spec:
selector:
app: grafana-loki
type: ClusterIP
ports:
- port: 3100
targetPort: 3100
---
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-datasources
namespace: kubeskoop
data:
prometheus.yaml: |-
{
"apiVersion": 1,
"datasources": [
{
"access":"proxy",
"editable": true,
"name": "prometheus",
"orgId": 1,
"type": "prometheus",
"url": "http://prometheus-service",
"version": 1
}
]
}
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
namespace: kubeskoop
spec:
replicas: 1
selector:
matchLabels:
app: grafana
template:
metadata:
name: grafana
labels:
app: grafana
spec:
containers:
- name: grafana
image: grafana/grafana:latest
ports:
- name: grafana
containerPort: 3000
env:
- name: GF_SECURITY_ADMIN_PASSWORD
value: "kubeskoop"
- name: GF_SECURITY_ALLOW_EMBEDDING
value: "true"
- name: GF_SERVER_SERVE_FROM_SUB_PATH
value: "true"
- name: GF_SERVER_ROOT_URL
value: "/grafana"
resources:
limits:
memory: "1Gi"
cpu: "1000m"
requests:
memory: 500M
cpu: "500m"
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage
- mountPath: /etc/grafana/provisioning/datasources
name: grafana-datasources
readOnly: false
- name: register-dashboard
image: kubeskoop/controller:v1.0.0
env:
- name: GRAFANA_PASSWORD
value: "kubeskoop"
command: ["/bin/grafana_dashboard.sh"]
volumes:
- name: grafana-storage
emptyDir: {}
- name: grafana-datasources
configMap:
defaultMode: 420
name: grafana-datasources
---
apiVersion: v1
kind: Service
metadata:
name: grafana
namespace: kubeskoop
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '3000'
spec:
selector:
app: grafana
type: NodePort
ports:
- port: 80
targetPort: 3000
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana-loki
namespace: kubeskoop
spec:
replicas: 1
selector:
matchLabels:
app: grafana-loki
template:
metadata:
name: grafana-loki
labels:
app: grafana-loki
spec:
containers:
- name: grafana-loki
image: grafana/loki:2.7.0
ports:
- name: grafana-loki
containerPort: 3100
resources:
limits:
memory: "1Gi"
cpu: "1000m"
requests:
memory: 500M
cpu: "500m"
volumeMounts:
- mountPath: /var/lib/grafana
name: grafana-storage
- mountPath: /mnt/config/
name: grafana-loki-config
readOnly: false
volumes:
- name: grafana-storage
emptyDir: {}
- name: grafana-loki-config
configMap:
defaultMode: 420
name: grafana-loki-config
---
apiVersion: v1
kind: ConfigMap
metadata:
name: grafana-loki-config
namespace: kubeskoop
data:
loki-config.yaml: |-
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
path_prefix: /tmp/loki
storage:
filesystem:
chunks_directory: /tmp/loki/chunks
rules_directory: /tmp/loki/rules
replication_factor: 1
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
analytics:
reporting_enabled: false
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: kubeskoop-controller
rules:
- apiGroups: [""]
resources:
- nodes
- nodes/proxy
- services
- endpoints
- configmaps
- namespaces
verbs: ["get", "list", "watch"]
- apiGroups: ["apps"]
resources: ["daemonsets"]
verbs: ["get", "list"]
- apiGroups: ["networking.k8s.io"]
resources: ["networkpolicies"]
verbs: ["get", "list"]
- apiGroups: ["projectcalico.org", "crd.projectcalico.org"]
resources: ["ippools"]
verbs: ["get", "list"]
- nonResourceURLs: ["/metrics"]
verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeskoop-controller
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: kubeskoop-controller
subjects:
- kind: ServiceAccount
name: default
namespace: kubeskoop
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: controller
namespace: kubeskoop
rules:
- apiGroups: [""]
resources: ["configmaps"]
resourceNames: ["kubeskoop-config"]
verbs: ["get", "update"]
- apiGroups: [""]
resources:
- pods
verbs: ["get", "list", "watch", "delete", "create"]
- apiGroups: [""]
resources: ["pods/exec", "pods/attach", "pods/portforward"]
verbs: ["create", "get", "list", "update", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: controller
namespace: kubeskoop
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: controller
subjects:
- kind: ServiceAccount
name: default
namespace: kubeskoop
---
apiVersion: v1
data:
controller.yaml: |-
logLevel: debug
server:
httpPort: 10264
agentPort: 10263
controller:
prometheus: http://prometheus-service
database:
type: sqlite3
loki: http://loki-service:3100
diagnose: {}
kind: ConfigMap
metadata:
name: kubeskoop-controller-config
namespace: kubeskoop
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: controller
namespace: kubeskoop
spec:
replicas: 1
selector:
matchLabels:
app: controller
template:
metadata:
name: controller
labels:
app: controller
spec:
containers:
- name: controller
image: kubeskoop/controller:v1.0.0
command: ["/bin/controller"]
volumeMounts:
- name: lib
mountPath: /var/lib/kubeskoop
- name: config
mountPath: /etc/kubeskoop
volumes:
- name: lib
emptyDir: {}
- name: config
configMap:
name: kubeskoop-controller-config
---
apiVersion: v1
kind: Service
metadata:
name: controller
namespace: kubeskoop
spec:
selector:
app: controller
ports:
- name: grpc
port: 10263
targetPort: 10263
- name: http
port: 10264
targetPort: 10264
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: webconsole
namespace: kubeskoop
spec:
replicas: 1
selector:
matchLabels:
app: webconsole
template:
metadata:
name: webconsole
labels:
app: webconsole
spec:
containers:
- name: controller
image: kubeskoop/controller:v1.0.0
command: ["/bin/webconsole"]
env:
- name: CONTROLLER_ENDPOINT
value: "http://controller:10264"
- name: GRAFANA_PROXY
value: "true"
- name: GRAFANA_ENDPOINT
value: "http://grafana/grafana"
- name: GRAFANA_USERNAME
value: "admin"
- name: GRAFANA_PASSWORD
value: "kubeskoop"
- name: AUTH_USERNAME
value: "admin"
- name: AUTH_PASSWORD
value: "kubeskoop"
ports:
- name: http
containerPort: 8080
protocol: TCP
---
apiVersion: v1
kind: Service
metadata:
name: webconsole
namespace: kubeskoop
spec:
selector:
app: webconsole
ports:
- name: http
port: 80
targetPort: 8080