Skip to content

Commit

Permalink
docs(kubectl): getting started with kubectl profefe
Browse files Browse the repository at this point in the history
Signed-off-by: Gianluca Arbezzano <gianarb92@gmail.com>
  • Loading branch information
Gianluca Arbezzano committed Mar 22, 2020
1 parent 1c709b4 commit 1fd016e
Show file tree
Hide file tree
Showing 3 changed files with 211 additions and 2 deletions.
5 changes: 3 additions & 2 deletions docs/content/docs/getting-started-with-kprofefe.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,9 @@ bref = ""

## Goal

The end goal here is to deploy everything in kubernetes, and to get profiles
pushed from our pod into [profefe](https://github.com/profefe/profefe).
The end goal here is to deploy a continuous profiling infrastructure in
kubernetes, and to get profiles from our pod into
[profefe](https://github.com/profefe/profefe) via kprofefe.

## Prerequisites

Expand Down
197 changes: 197 additions & 0 deletions docs/content/docs/getting-started.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,197 @@
+++
title = "Getting Started"
description = "The easiest way to start with kube profefe"
weight = 12
draft = false
toc = true
bref = ""
+++
## Goal

The goal for this tutorial is to gather our first profile from a running pod via
kubectl profefe plugin. We will store the profile locally, and we will push one
to profefe

## Prerequisites

If you have those things already done move to the chapter "getting started"

1. Have a Kubernetes cluster up and running
2. Deploy profefe inside or outside your Kubernetes cluster. But it has to be
reachable from the Kubernetes cluster network. I will assume that the URL for
it is `https://profefe.internal.company.com:10100`
3. You should have the kubectl profefe plugin already installed (checkout the
installation doc)

### Deploy kubernetes cluster with KinD

```
$ kind create cluster
Creating cluster "kind" ...
✓ Ensuring node image (kindest/node:v1.15.3) 🖼
✓ Preparing nodes 📦
✓ Creating kubeadm config 📜
✓ Starting control-plane 🕹️
✓ Installing CNI 🔌
✓ Installing StorageClass 💾
Cluster creation complete. You can now use the cluster with:
export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info
$ export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
✔ ~/git/kube-profefe [docs/getting-start L|✚ 1…1]
$ kubectl cluster-info
Kubernetes master is running at https://127.0.0.1:42659
KubeDNS is running at https://127.0.0.1:42659/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

### Deploy profefe

Apply this spec via `kubectl apply -f <path file.yaml>`. It will create a
profefe namespace, and it will deploy the
[profefe](https://github.com/profefe/profefe) as a deployment with its service.

This installation it's not for production.

```yaml
apiVersion: v1
kind: Namespace
metadata:
name: profefe
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
labels:
component: profefe
name: profefe
namespace: profefe
spec:
replicas: 1
selector:
matchLabels:
component: profefe
template:
metadata:
labels:
component: profefe
spec:
containers:
- args:
- -badger.dir
- /tmp/profefe-data
image: profefe/profefe:git-668a19d
imagePullPolicy: IfNotPresent
name: profefe
ports:
- containerPort: 10100
---
apiVersion: v1
kind: Service
metadata:
labels:
component: profefe
name: profefe-collector
namespace: profefe
spec:
ports:
- name: collector
port: 10100
protocol: TCP
targetPort: 10100
selector:
component: profefe
type: ClusterIP
```

### Getting Started

Do you have the kubectl plugin? Check it out with:

```
$ kubectl profefe --help
It is a kubectl plugin that you can use to retrieve and manage profiles in Go.
Usage:
kubectl-profefe [flags]
kubectl-profefe [command]
Available Commands:
capture Capture gathers profiles for a pod or a set of them. If can filter by namespace and via label selector.
get Display one or many resources
help Help about any command
load Load a profile you have locally to profefe
Flags:
-A, --all-namespaces If present, list the requested object(s) across all namespaces. Namespace in current context is ignored even if specified with --namespace.
--as string Username to impersonate for the operation
--as-group stringArray Group to impersonate for the operation, this flag can be repeated to specify multiple groups.
--cache-dir string Default HTTP cache directory (default "/home/gianarb/.kube/http-cache")
--certificate-authority string Path to a cert file for the certificate authority
--client-certificate string Path to a client certificate file for TLS
--client-key string Path to a client key file for TLS
--cluster string The name of the kubeconfig cluster to use
--context string The name of the kubeconfig context to use
-f, --filename strings identifying the resource.
-h, --help help for kubectl-profefe
--insecure-skip-tls-verify If true, the server's certificate will not be checked for validity. This will make your HTTPS connections insecure
--kubeconfig string Path to the kubeconfig file to use for CLI requests.
-n, --namespace string If present, the namespace scope for this CLI request
-R, --recursive Process the directory used in -f, --filename recursively. Useful when you want to manage related manifests organized within the same directory. (default true)
--request-timeout string The length of time to wait before giving up on a single server request. Non-zero values should contain a corresponding time unit (e.g. 1s, 2m, 3h). A value of zero means don't timeout requests. (default "0")
-l, --selector string Selector (label query) to filter on, supports '=', '==', and '!='.(e.g. -l key1=value1,key2=value2)
-s, --server string The address and port of the Kubernetes API server
--token string Bearer token for authentication to the API server
--user string The name of the kubeconfig user to use
Use "kubectl-profefe [command] --help" for more information about a command.
```

Deploy InfluxDB v2 pod, it is a test one. That's the one we will take profile from

```yaml
apiVersion: v1
kind: Pod
metadata:
name: influxdb-v2
annotations:
"profefe.com/enable": "true"
"profefe.com/port": "9999"
spec:
containers:
- name: influxdb
image: quay.io/influxdb/influxdb:2.0.0-alpha
ports:
- containerPort: 9999
```

Now you can capture the profiles:

```bash
kubectl profefe capture influxdb-v2
```

The profiles are stored inside your `/tmp` directory (you can change it with
`--output-dir`), so you can read it with `go tool pprof`:

```bash
go tool pprof /tmp/profile-goroutine-influxdb-v2-1575552135.pb.gz
```

If you have a profefe up and running you can push your profiles there other than
locally:

```bash
kubectl profefe capture influxdb-v2 --profefe-hostport http://localhost:10100
```

If you used kind as explained above, in order to have profefe reachable you have
to use port forwarding:

```bash
$ kubectl port-forward -n profefe svc/profefe-collector 10100
```
11 changes: 11 additions & 0 deletions docs/themes/kube-profefe/layouts/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,17 @@
{{ define "header"}} {{ partial "header" .}} {{end}}
{{ define "main"}}

<!-- Global site tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-161556326-1"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());

gtag('config', 'UA-161556326-1');
</script>


<div id="main">
<div id="hero">
<h1>{{.Site.Params.claim}}</h1>
Expand Down

0 comments on commit 1fd016e

Please sign in to comment.