This executes nodetool repair -pr
inside every annotated Cassandra container.
When run, this application will:
- Connect to the Kubernetes API within the cluster.
- List the pods annotated with
cassandra-repair.jmkeyes.ca/autorepair
. - Run
nodetool repair -pr
on each pod sequentially.
This avoids having to expose a raw JMX connector from each Cassandra container.
To apply it to the Pod template of a StatefulSet named cassandra
:
$ kubectl patch sts/cassandra --patch-file=/dev/stdin <<EOF
{
"spec": {
"template": {
"metadata": {
"annotations": {
"cassandra-repair.jmkeyes.ca/autorepair": "true"
}
}
}
}
}
$ kubectl apply -f <<EOF
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: cassandra-repair
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: cassandra-repair-role
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
- apiGroups: [""]
resources: ["pods/exec"]
verbs: ["create"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: cassandra-repair-role-binding
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: cassandra-repair-role
subjects:
- kind: ServiceAccount
name: cassandra-repair
---
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: cassandra-repair
spec:
# Run at midnight UTC every day.
schedule: "00 0 * * *"
jobTemplate:
spec:
template:
spec:
serviceAccountName: cassandra-repair
restartPolicy: OnFailure
containers:
- name: cassandra-repair
image: cassandra-repair:1.0.0
env:
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
EOF