Skip to content

Commit 3853bf1

Browse files
committed
delete pod entegration
1 parent e14bd75 commit 3853bf1

9 files changed

+583
-8
lines changed

go.mod

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
module github.com/developer-guy/kubernetes-response-engine-based-on-event-driven-workflow
2+
3+
go 1.16
4+
5+
require (
6+
k8s.io/apimachinery v0.21.0
7+
k8s.io/client-go v0.21.0
8+
)

go.sum

+428
Large diffs are not rendered by default.

hacks/delete-pod-rbac.yaml

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
apiVersion: v1
2+
kind: ServiceAccount
3+
metadata:
4+
name: falco-pod-delete
5+
namespace: argo
6+
---
7+
kind: ClusterRole
8+
apiVersion: rbac.authorization.k8s.io/v1
9+
metadata:
10+
name: falco-pod-delete-cluster-role
11+
rules:
12+
- apiGroups: [""]
13+
resources: ["pods"]
14+
verbs: ["get", "list", "delete"]
15+
---
16+
kind: ClusterRoleBinding
17+
apiVersion: rbac.authorization.k8s.io/v1
18+
metadata:
19+
name: falco-pod-delete-cluster-role-binding
20+
roleRef:
21+
kind: ClusterRole
22+
name: falco-pod-delete-cluster-role
23+
apiGroup: rbac.authorization.k8s.io
24+
subjects:
25+
- kind: ServiceAccount
26+
name: falco-pod-delete
27+
namespace: argo
File renamed without changes.

values.yaml renamed to hacks/values.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ customRules:
1111
- macro: user_known_contact_k8s_api_server_activities
1212
condition: >
1313
(container.image.repository = "gcr.io/tekton-releases/github.com/tektoncd/triggers/cmd/eventlistenersink") or
14-
(container.image.repository = "quay.io/nissessenap/poddeleter") or (container.image.repository = "argoproj/sensor")
14+
(container.image.repository = "devopps/kubernetes-response-engine-based-on-event-driven-workflow") or (container.image.repository = "argoproj/sensor")
File renamed without changes.

main.go

+110
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"encoding/base64"
6+
"encoding/json"
7+
"log"
8+
"os"
9+
"time"
10+
metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
11+
"k8s.io/client-go/kubernetes"
12+
"k8s.io/client-go/rest"
13+
)
14+
15+
// Alert falco data structure
16+
type Alert struct {
17+
Output string `json:"output"`
18+
Priority string `json:"priority"`
19+
Rule string `json:"rule"`
20+
Time time.Time `json:"time"`
21+
OutputFields struct {
22+
ContainerID string `json:"container.id"`
23+
ContainerImageRepository interface{} `json:"container.image.repository"`
24+
ContainerImageTag interface{} `json:"container.image.tag"`
25+
EvtTime int64 `json:"evt.time"`
26+
FdName string `json:"fd.name"`
27+
K8SNsName string `json:"k8s.ns.name"`
28+
K8SPodName string `json:"k8s.pod.name"`
29+
ProcCmdline string `json:"proc.cmdline"`
30+
} `json:"output_fields"`
31+
}
32+
33+
func main() {
34+
criticalNamespaces := map[string]bool{
35+
"kube-system": true,
36+
"kube-public": true,
37+
"kube-node-lease": true,
38+
"falco": true,
39+
}
40+
41+
var falcoEvent Alert
42+
43+
bodyReq := os.Getenv("BODY")
44+
log.Println("Body", bodyReq)
45+
var data map[string]interface{}
46+
_ = json.Unmarshal([]byte(bodyReq), &data)
47+
48+
bodyReqDecoded , _:= base64.StdEncoding.DecodeString(data["data"].(string))
49+
if bodyReq == "" {
50+
log.Fatalf("Need to get environment variable BODY")
51+
}
52+
53+
log.Println("Decoded:", string(bodyReqDecoded))
54+
55+
var body map[string]interface{}
56+
_ = json.Unmarshal(bodyReqDecoded, &body)
57+
58+
59+
bodyReqByte, _ := json.Marshal(body["body"])
60+
61+
err := json.Unmarshal(bodyReqByte, &falcoEvent)
62+
if err != nil {
63+
log.Fatalf("The data doesent match the struct %v", err)
64+
}
65+
66+
kubeClient, err := setupKubeClient()
67+
if err != nil {
68+
log.Fatalf("Unable to create in-cluster config: %v", err)
69+
}
70+
71+
err = deletePod(kubeClient, falcoEvent, criticalNamespaces)
72+
if err != nil {
73+
log.Fatalf("Unable to delete pod due to err %v", err)
74+
}
75+
}
76+
77+
// setupKubeClient
78+
func setupKubeClient() (*kubernetes.Clientset, error) {
79+
config, err := rest.InClusterConfig()
80+
if err != nil {
81+
return nil, err
82+
}
83+
84+
// creates the clientset
85+
kubeClient, err := kubernetes.NewForConfig(config)
86+
if err != nil {
87+
return nil, err
88+
}
89+
return kubeClient, nil
90+
}
91+
92+
// deletePod, if not part of the criticalNamespaces the pod will be deleted
93+
func deletePod(kubeClient *kubernetes.Clientset, falcoEvent Alert, criticalNamespaces map[string]bool) error {
94+
podName := falcoEvent.OutputFields.K8SPodName
95+
namespace := falcoEvent.OutputFields.K8SNsName
96+
log.Printf("PodName: %v & Namespace: %v", podName, namespace)
97+
98+
log.Printf("Rule: %v", falcoEvent.Rule)
99+
if criticalNamespaces[namespace] {
100+
log.Printf("The pod %v won't be deleted due to it's part of the critical ns list: %v ", podName, namespace)
101+
return nil
102+
}
103+
104+
log.Printf("Deleting pod %s from namespace %s", podName, namespace)
105+
err := kubeClient.CoreV1().Pods(namespace).Delete(context.Background(), podName, metaV1.DeleteOptions{})
106+
if err != nil {
107+
return err
108+
}
109+
return nil
110+
}

sensors-workflow.yaml renamed to sensors/sensors-workflow.yaml

+9-7
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,23 @@ spec:
2525
name: special-trigger
2626
namespace: argo
2727
spec:
28-
entrypoint: whalesay
28+
serviceAccountName: falco-pod-delete
29+
entrypoint: delete-pod
2930
arguments:
3031
parameters:
31-
- name: body
32+
- name: falco_event
3233
# the value will get overridden by event payload from test-dep
3334
value: "{}"
3435
templates:
35-
- name: whalesay
36+
- name: delete-pod
3637
inputs:
3738
parameters:
38-
- name: body
39+
- name: falco_event
3940
container:
40-
image: docker/whalesay:latest
41-
command: [cowsay]
42-
args: ["{{inputs.parameters.body}}"]
41+
image: devopps/kubernetes-response-engine-based-on-event-driven-workflow@sha256:22ee203a33fe88f0f99968daebdcea0ca52c8a3d6f7af4c823ed78ac15b7c5db
42+
env:
43+
- name: BODY
44+
value: "{{inputs.parameters.falco_event}}"
4345
parameters:
4446
- src:
4547
dependencyName: test-dep
File renamed without changes.

0 commit comments

Comments
 (0)