Skip to content

Commit

Permalink
Adding kraken containerization with readme instructions
Browse files Browse the repository at this point in the history
  • Loading branch information
paigerube14 authored and chaitanyaenr committed Jul 7, 2020
1 parent 44e7538 commit 58b51eb
Show file tree
Hide file tree
Showing 4 changed files with 116 additions and 0 deletions.
18 changes: 18 additions & 0 deletions containers/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,21 @@ Container image gets automatically built by quay.io at [Kraken image](https://qu

### Run containerized version
Refer [instructions](https://github.com/openshift-scale/kraken#Run-containerized-version) for information on how to run the containerized version of kraken.


### Kraken as a KubeApp

To run containerized Kraken as a Kubernetes/OpenShift Deployment, follow these steps:
1. Configure the [config.yaml](https://github.com/openshift-scale/kraken/tree/master/config/config.yaml) file according to your requirements.
2. Create a namespace under which you want to run the kraken pod using `kubectl create ns <namespace>`.
3. Switch to `<namespace>` namespace:
- In Kubernetes, use `kubectl config set-context --current --namespace=<namespace>`
- In OpenShift, use `oc project <namespace>`
4. Create a ConfigMap named kube-config using `kubectl create configmap kube-config --from-file=<path_to_kubeconfig>`
5. Create a ConfigMap named kraken-config using `kubectl create configmap kraken-config --from-file=<path_to_kraken_config>`
6. Create a ConfigMap named scenarios-config using `kubectl create configmap scenarios-config --from-file=<path_to_scenarios_folder>`
7. Create a serviceaccount to run the kraken pod `kubectl create serviceaccount useroot`.
8. In Openshift, add privileges to service account and execute `oc adm policy add-scc-to-user privileged -z useroot`.
9. Create a Deployment and a NodePort Service using `kubectl apply -f kraken.yml`

NOTE: It is not recommended to run Kraken internal to the cluster as the pod which is running Kraken might get disrupted.
42 changes: 42 additions & 0 deletions containers/kraken.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: kraken-deployment
spec:
replicas: 1
selector:
matchLabels:
tool: Kraken
template:
metadata:
labels:
tool: Kraken
spec:
serviceAccountName: useroot
containers:
- name: kraken
securityContext:
privileged: true
image: quay.io/openshift-scale/kraken
command: ["/bin/sh", "-c"]
args: ["python3 run_kraken.py -c config/config.yaml"]
ports:
- containerPort: 8080
volumeMounts:
- mountPath: "/root/.kube"
name: config
- mountPath: "/root/kraken/config"
name: kraken-config
- mountPath: "/root/kraken/scenarios"
name: scenarios-config
volumes:
- name: config
configMap:
name: kube-config
- name: kraken-config
configMap:
name: kraken-config
- name: scenarios-config
configMap:
name: scenarios-config
53 changes: 53 additions & 0 deletions kraken/kubernetes/client.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from kubernetes import client, config
from kubernetes.client.rest import ApiException
import logging
import kraken.invoke.command as runcommand
import json

kraken_node_name = ""


# Load kubeconfig and initialize kubernetes python client
Expand All @@ -22,6 +26,21 @@ def list_nodes():
return nodes


# List nodes in the cluster that can be killed
def list_killable_nodes():
nodes = []
try:
ret = cli.list_node(pretty=True)
except ApiException as e:
logging.error("Exception when calling CoreV1Api->list_node: %s\n" % e)
for node in ret.items:
if kraken_node_name != node.metadata.name:
for cond in node.status.conditions:
if str(cond.type) == "Ready" and str(cond.status) == "True":
nodes.append(node.metadata.name)
return nodes


# List pods in the given namespace
def list_pods(namespace):
pods = []
Expand All @@ -35,6 +54,14 @@ def list_pods(namespace):
return pods


def get_all_pods():
pods = []
ret = cli.list_pod_for_all_namespaces(pretty=True)
for pod in ret.items:
pods.append([pod.metadata.name, pod.metadata.namespace])
return pods


# Monitor the status of the cluster nodes and set the status to true or false
def monitor_nodes():
nodes = list_nodes()
Expand Down Expand Up @@ -96,3 +123,29 @@ def monitor_component(iteration, component_namespace):
logging.info("Iteration %s: %s: %s"
% (iteration, component_namespace, watch_component_status))
return watch_component_status, failed_component_pods


# Find the node kraken is deployed on
# Set global kraken node to not delete
def find_kraken_node():
pods = get_all_pods()
kraken_pod_name = None
for pod in pods:
if "kraken-deployment" in pod[0]:
kraken_pod_name = pod[0]
kraken_project = pod[1]
break
# have to switch to proper project

if kraken_pod_name:
# get kraken-deployment pod, find node name
runcommand.invoke("kubectl config set-context --current --namespace=" + str(kraken_project))
pod_json_str = runcommand.invoke("kubectl get pods/" + str(kraken_pod_name) + " -o json")
pod_json = json.loads(pod_json_str)
node_name = pod_json['spec']['nodeName']

# Reset to the default project
runcommand.invoke("kubectl config set-context --current --namespace=default")

global kraken_node_name
kraken_node_name = node_name
3 changes: 3 additions & 0 deletions run_kraken.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,9 @@ def main(cfg):
logging.info("Initializing client to talk to the Kubernetes cluster")
kubecli.initialize_clients(kubeconfig_path)

# find node kraken might be running on
kubecli.find_kraken_node()

# Cluster info
logging.info("Fetching cluster info")
cluster_version = runcommand.invoke("kubectl get clusterversion")
Expand Down

0 comments on commit 58b51eb

Please sign in to comment.