diff --git a/knowledge base/kubernetes/README.md b/knowledge base/kubernetes/README.md index 443b87e..6fed72c 100644 --- a/knowledge base/kubernetes/README.md +++ b/knowledge base/kubernetes/README.md @@ -3,23 +3,32 @@ Open source container orchestration engine for containerized applications.
Hosted by the [Cloud Native Computing Foundation][cncf]. -1. [Basics](#basics) -1. [Control plane](#control-plane) - 1. [API server](#api-server) - 1. [`kube-scheduler`](#kube-scheduler) - 1. [`kube-controller-manager`](#kube-controller-manager) - 1. [`cloud-controller-manager`](#cloud-controller-manager) -1. [Worker nodes](#worker-nodes) - 1. [`kubelet`](#kubelet) - 1. [`kube-proxy`](#kube-proxy) - 1. [Container runtime](#container-runtime) - 1. [Addons](#addons) -1. [Workloads](#workloads) - 1. [Pods](#pods) +1. [Concepts](#concepts) + 1. [Control plane](#control-plane) + 1. [API server](#api-server) + 1. [`kube-scheduler`](#kube-scheduler) + 1. [`kube-controller-manager`](#kube-controller-manager) + 1. [`cloud-controller-manager`](#cloud-controller-manager) + 1. [Worker nodes](#worker-nodes) + 1. [`kubelet`](#kubelet) + 1. [`kube-proxy`](#kube-proxy) + 1. [Container runtime](#container-runtime) + 1. [Addons](#addons) + 1. [Workloads](#workloads) + 1. [Pods](#pods) +1. [Best practices](#best-practices) +1. [Volumes](#volumes) + 1. [hostPaths](#hostpaths) + 1. [emptyDirs](#emptydirs) + 1. [configMaps](#configmaps) + 1. [secrets](#secrets) + 1. [nfs](#nfs) + 1. [downwardAPI](#downwardapi) + 1. [PersistentVolumes](#persistentvolumes) + 1. [Resize PersistentVolumes](#resize-persistentvolumes) 1. [Autoscaling](#autoscaling) 1. [Pod scaling](#pod-scaling) 1. [Node scaling](#node-scaling) -1. [Best practices](#best-practices) 1. [Quality of service](#quality-of-service) 1. [Containers with high privileges](#containers-with-high-privileges) 1. [Capabilities](#capabilities) @@ -27,7 +36,7 @@ Hosted by the [Cloud Native Computing Foundation][cncf]. 1. [Sysctl settings](#sysctl-settings) 1. [Backup and restore](#backup-and-restore) 1. [Managed Kubernetes Services](#managed-kubernetes-services) - 1. [Best practices in cloud environments](#best-practices-in-cloud-environments) + 1. [Best practices in cloud environments](#best-practices-in-cloud-environments) 1. [Edge computing](#edge-computing) 1. [Troubleshooting](#troubleshooting) 1. [Dedicate Nodes to specific workloads](#dedicate-nodes-to-specific-workloads) @@ -40,7 +49,7 @@ Hosted by the [Cloud Native Computing Foundation][cncf]. 1. [Further readings](#further-readings) 1. [Sources](#sources) -## Basics +## Concepts When using Kubernetes, one is using a cluster. @@ -56,7 +65,7 @@ fault-tolerance and high availability. ![Cluster components](components.svg) -## Control plane +### Control plane Makes global decisions about the cluster (like scheduling).
Detects and responds to cluster events (like starting up a new pod when a deployment has less replicas then it requests). @@ -74,7 +83,7 @@ Control plane components run on one or more cluster nodes.
For ease of use, setup scripts typically start all control plane components on the **same** host and avoid **running** other workloads on it. -### API server +#### API server Exposes the Kubernetes API. It is the front end for, and the core of, the Kubernetes control plane.
`kube-apiserver` is the main implementation of the Kubernetes API server, and is designed to scale horizontally (by @@ -108,7 +117,7 @@ The Kubernetes API can be extended: - using _custom resources_ to declaratively define how the API server should provide your chosen resource API, or - extending the Kubernetes API by implementing an aggregation layer. -### `kube-scheduler` +#### `kube-scheduler` Detects newly created pods with no assigned node, and selects one for them to run on. @@ -121,7 +130,7 @@ Scheduling decisions take into account: - inter-workload interference; - deadlines. -### `kube-controller-manager` +#### `kube-controller-manager` Runs _controller_ processes.
Each controller is a separate process logically speaking; they are all compiled into a single binary and run in a single @@ -136,7 +145,7 @@ Examples of these controllers are: - the EndpointSlice controller, which populates _EndpointSlice_ objects providing a link between services and pods; - the ServiceAccount controller, which creates default ServiceAccounts for new namespaces. -### `cloud-controller-manager` +#### `cloud-controller-manager` Embeds cloud-specific control logic, linking clusters to one's cloud provider's API and separating the components that interact with that cloud platform from the components that only interact with clusters. @@ -156,19 +165,19 @@ The following controllers can have cloud provider dependencies: - the route controller, which sets up routes in the underlying cloud infrastructure; - the service controller, which creates, updates and deletes cloud provider load balancers. -## Worker nodes +### Worker nodes Each and every node runs components providing a runtime environment for the cluster, and syncing with the control plane to maintain workloads running as requested. -### `kubelet` +#### `kubelet` A `kubelet` runs as an agent on each and every node in the cluster, making sure that containers are run in a pod. It takes a set of _PodSpecs_ and ensures that the containers described in them are running and healthy.
It only manages containers created by Kubernetes. -### `kube-proxy` +#### `kube-proxy` Network proxy running on each node and implementing part of the Kubernetes Service concept. @@ -178,21 +187,21 @@ or outside of one's cluster. It uses the operating system's packet filtering layer, if there is one and it's available; if not, it just forwards the traffic itself. -### Container runtime +#### Container runtime The software responsible for running containers. Kubernetes supports container runtimes like `containerd`, `CRI-O`, and any other implementation of the Kubernetes CRI (Container Runtime Interface). -### Addons +#### Addons Addons use Kubernetes resources (_DaemonSet_, _Deployment_, etc) to implement cluster features.
As such, namespaced resources for addons belong within the `kube-system` namespace. See [addons] for an extended list of the available addons. -## Workloads +### Workloads Workloads consist of groups of containers ([_pods_][pods]) and a specification for how to run them (_manifest_).
Configuration files are written in YAML (preferred) or JSON format and are composed of: @@ -201,7 +210,7 @@ Configuration files are written in YAML (preferred) or JSON format and are compo - resource specifications, with attributes specific to the kind of resource they are describing, and - status, automatically generated and edited by the control plane. -### Pods +#### Pods The smallest deployable unit of computing that one can create and manage in Kubernetes.
Pods contain one or more relatively tightly coupled application containers; they are always co-located (executed on the @@ -218,38 +227,6 @@ Gotchas: - If a Container specifies a memory or CPU `limit` but does **not** specify a memory or CPU `request`, Kubernetes automatically assigns it a resource `request` spec equal to the given `limit`. -## Autoscaling - -Controllers are available to scale Pods or Nodes automatically, both in number or size. - -Automatic scaling of Pods is done in number by the HorizontalPodAutoscaler, and in size by the VerticalPodAutoscaler.
-Automatic scaling of Nodes is done in number by the Cluster Autoscaler, and in size by add-ons like [Karpenter]. - -> Be aware of mix-and-matching autoscalers for the same kind of resource.
-> One can easily defy the work done by the other and make that resource behave unexpectedly. - -K8S only comes with the HorizontalPodAutoscaler by default.
-Managed K8S usually also comes with the [Cluster Autoscaler] if autoscaling is enabled on the cluster resource. - -### Pod scaling - -Autoscaling of Pods by number requires the use of the Horizontal Pod Autoscaler.
-Autoscaling of Pods by size requires the use of the Vertical Pod Autoscaler. - -### Node scaling - -Autoscaling of Nodes by number requires the [Cluster Autoscaler]. - -1. The Cluster Autoscaler routinely checks for pending Pods. -1. Pods fill up the available Nodes. -1. When Pods start to fail for lack of available resources, Nodes are added to the cluster. -1. When Pods are not failing due to lack of available resources and one or more Nodes are underused, the Autoscaler - tries to fit the existing Pods in less Nodes. -1. If one or more Nodes can result unused from the previous step (DaemonSets are usually not taken into consideration), - the Autoscaler will terminate them. - -Autoscaling of Nodes by size requires add-ons like [Karpenter]. - ## Best practices Also see [configuration best practices] and the [production best practices checklist]. @@ -298,6 +275,374 @@ Also see [configuration best practices] and the [production best practices check - Protect the cluster's ingress points.
Firewalls, web application firewalls, application gateways. +## Volumes + +Refer [volumes]. + +Sources to mount directories from. + +They go by the `volumes` key in Pods' `spec`.
+E.g., in a Deployment they are declared in its `spec.template.spec.volumes`: + +```yaml +apiVersion: apps/v1 +kind: Deployment +spec: + template: + spec: + volumes: + - + - +``` + +Mount volumes in containers by using the `volumesMount`: + +```yaml +apiVersion: apps/v1 +kind: Pod +spec: + containers: + - name: some-container + volumeMounts: + - name: my-volume-source + mountPath: /path/to/mount + readOnly: false + subPath: dir/in/volume +``` + +### hostPaths + +Mount files or directories from the host node's filesystem into Pods. + +**Not** something most Pods will need, but powerful escape hatches for some applications. + +Use cases: + +- Containers needing access to node-level system components
+ E.g., containers transferring system logs to a central location and needing access to those logs using a read-only + mount of `/var/log`. +- Making configuration files stored on the host system available read-only to _static_ Pods. + This because static Pods **cannot** access ConfigMaps. + +If mounted files or directories on the host are only accessible to `root`: + +- Either the process needs to run as `root` in a privileged container, +- Or the files' permissions on the host need to be changed to allow the process to read from (or write to) the volume. + +```yaml +apiVersion: apps/v1 +kind: Pod +volumes: + - name: example-volume + # Mount '/data/foo' only if that directory already exists + hostPath: + path: /data/foo # location on host + type: Directory # optional +``` + +### emptyDirs + +Scrape disks for **temporary** Pod data. + +**Not** shared between Pods.
+All data is **destroyed** once the Pod is removed, but stays intact when Pods restart. + +Use cases: + +- Provide directories to create pid/lock or other special files for 3rd-party software when it's inconvenient or + impossible to disable them.
+ E.g., Java Hazelcast creates lockfiles in the user's home directory and there's no way to disable this behaviour. +- Store intermediate calculations which can be lost
+ E.g., external sorting, buffering of big responses to save memory. +- Improve startup time after application crashes if the application in question pre-computes something before or during + startup.
+ E.g., compressed assets in the application's image, decompressing data into temporary directory. + +```yaml +apiVersion: apps/v1 +kind: Pod +volumes: + - name: my-emptydir + emptyDir: + # Omit the 'medium' field to use disk storage. + # The 'Memory' medium will create tmpfs to store data. + medium: Memory + sizeLimit: 1Gi +``` + +### configMaps + +Inject configuration data into Pods. + +When referencing a ConfigMap: + +- Provide the name of the ConfigMap in the volume. +- Optionally customize the path to use for a specific entry in the ConfigMap. + +```yaml +apiVersion: apps/v1 +kind: Pod +spec: + containers: + - name: test + volumeMounts: + - name: config-vol + mountPath: /etc/config + volumes: + - name: config-vol + configMap: + name: log-config + items: + - key: log_level + path: log_level + - name: my-configmap-volume + configMap: + name: my-configmap + defaultMode: 0644 # posix access mode, set it to the most restricted value + optional: true # allow pods to start with this configmap missing, resulting in an empty directory +``` + +ConfigMaps **must** be created before they can be mounted. + +One ConfigMap can be mounted into any number of Pods. + +ConfigMaps are always mounted `readOnly`. + +Containers using ConfigMaps as `subPath` volume mounts will **not** receive ConfigMap updates. + +Text data is exposed as files using the UTF-8 character encoding.
+Use `binaryData` For any other character encoding. + +### secrets + +Used to pass sensitive information to Pods.
+E.g., passwords. + +They behave like ConfigMaps but are backed by `tmpfs`, so they are never written to non-volatile storage. + +Secrets **must** be created before they can be mounted. + +Secrets are always mounted `readOnly`. + +Containers using Secrets as `subPath` volume mounts will **not** receive Secret updates. + +```yaml +apiVersion: apps/v1 +kind: Pod +spec: + volumes: + - name: my-secret-volume + secret: + secretName: my-secret + defaultMode: 0644 + optional: false +``` + +### nfs + +mount **existing** NFS shares into Pods. + +The contents of NFS volumes are preserved after Pods are removed and the volume is merely unmounted.
+This means that NFS volumes can be pre-populated with data, and that data can be shared between Pods. + +NFS can be mounted by multiple writers simultaneously. + +One **cannot** specify NFS mount options in a Pod spec.
+Either set mount options server-side or use `/etc/nfsmount.conf`.
+Alternatively, mount NFS volumes via PersistentVolumes as they do allow to set mount options. + +```yaml +apiVersion: v1 +kind: Pod +spec: + containers: + - image: registry.k8s.io/test-webserver + name: test-container + volumeMounts: + - mountPath: /my-nfs-data + name: test-volume + volumes: + - name: test-volume + nfs: + server: my-nfs-server.example.com + path: /my-nfs-volume + readOnly: true +``` + +### downwardAPI + +Downward APIs expose Pods' and containers' resource declaration or status field values.
+Refer [Expose Pod information to Containers through files]. + +Downward API volumes make downward API data available to applications as read-only files in plain text format. + +Containers using the downward API as `subPath` volume mounts will **not** receive updates when field values change. + +```yaml +apiVersion: v1 +kind: Pod +metadata: + labels: + cluster: test-cluster1 + rack: rack-22 + zone: us-east-coast +spec: + volumes: + - name: my-downwardapi-volume + downwardAPI: + defaultMode: 0644 + items: + - path: labels + fieldRef: + fieldPath: metadata.labels + +# Mounting this volume results in a file with contents similar to the following: +# ```plaintext +# cluster="test-cluster1" +# rack="rack-22" +# zone="us-east-coast" +# ``` +``` + +### PersistentVolumes + +#### Resize PersistentVolumes + +1. Check the `StorageClass` is set with `allowVolumeExpansion: true`: + + ```sh + kubectl get storageClass 'storage-class-name' -o jsonpath='{.allowVolumeExpansion}' + ``` + +1. Edit the PersistentVolumeClaim's `spec.resources.requests.storage` field.
+ This will take care of the underlying PersistentVolume's size automagically. + + ```sh + kubectl edit persistentVolumeClaim 'my-pvc' + ``` + +1. Verify the change by checking the PVC's `status.capacity` field: + + ```sh + kubectl get pvc 'my-pvc' -o jsonpath='{.status}' + ``` + + Should one see the message + + > Waiting for user to (re-)start a pod to finish file system resize of volume on node + + under the `status.conditions` field, just wait some time.
+ It should **not** be necessary to restart the Pods, and the capacity should change soon to the requested one. + +Gotchas: + +- It's possible to recreate StatefulSets **without** the need of killing the Pods it controls.
+ Reapply the STS' declaration with a new PersistentVolume size, and start new pods to resize the underlying filesystem. + +
+ If deploying the STS via Helm + + 1. Change the size of the PersistentVolumeClaims used by the STS: + + ```sh + kubectl edit persistentVolumeClaims 'my-pvc' + ``` + + 1. Delete the STS **without killing its pods**: + + ```sh + kubectl delete statefulsets.apps 'my-sts' --cascade 'orphan' + ``` + + 1. Redeploy the STS with the changed size. + It will retake ownership of existing Pods. + + 1. Delete the STS' pods one-by-one.
+ During Pod restart, the Kubelet will resize the filesystem to match new block device size. + + ```sh + kubectl delete pod 'my-sts-pod' + ``` + +
+
+ If managing the STS manually + + 1. Change the size of the PersistentVolumeClaims used by the STS: + + ```sh + kubectl edit persistentVolumeClaims 'my-pvc' + ``` + + 1. Note down the names of PVs for specific PVCs and their sizes: + + ```sh + kubectl get persistentVolume 'my-pv' + ``` + + 1. Dump the STS to disk: + + ```sh + kubectl get sts 'my-sts' -o yaml > 'my-sts.yaml' + ``` + + 1. Remove any extra field (like `metadata.{selfLink,resourceVersion,creationTimestamp,generation,uid}` and `status`) + and set the template's PVC size to the value you want. + + 1. Delete the STS **without killing its pods**: + + ```sh + kubectl delete sts 'my-sts' --cascade 'orphan' + ``` + + 1. Reapply the STS.
+ It will retake ownership of existing Pods. + + ```sh + kubectl apply -f 'my-sts.yaml' + ``` + + 1. Delete the STS' pods one-by-one.
+ During Pod restart, the Kubelet will resize the filesystem to match new block device size. + + ```sh + kubectl delete pod 'my-sts-pod' + ``` + +
+ +## Autoscaling + +Controllers are available to scale Pods or Nodes automatically, both in number or size. + +Automatic scaling of Pods is done in number by the HorizontalPodAutoscaler, and in size by the VerticalPodAutoscaler.
+Automatic scaling of Nodes is done in number by the Cluster Autoscaler, and in size by add-ons like [Karpenter]. + +> Be aware of mix-and-matching autoscalers for the same kind of resource.
+> One can easily defy the work done by the other and make that resource behave unexpectedly. + +K8S only comes with the HorizontalPodAutoscaler by default.
+Managed K8S usually also comes with the [Cluster Autoscaler] if autoscaling is enabled on the cluster resource. + +### Pod scaling + +Autoscaling of Pods by number requires the use of the Horizontal Pod Autoscaler.
+Autoscaling of Pods by size requires the use of the Vertical Pod Autoscaler. + +### Node scaling + +Autoscaling of Nodes by number requires the [Cluster Autoscaler]. + +1. The Cluster Autoscaler routinely checks for pending Pods. +1. Pods fill up the available Nodes. +1. When Pods start to fail for lack of available resources, Nodes are added to the cluster. +1. When Pods are not failing due to lack of available resources and one or more Nodes are underused, the Autoscaler + tries to fit the existing Pods in less Nodes. +1. If one or more Nodes can result unused from the previous step (DaemonSets are usually not taken into consideration), + the Autoscaler will terminate them. + +Autoscaling of Nodes by size requires add-ons like [Karpenter]. + ## Quality of service See [Configure Quality of Service for Pods] for more information. @@ -694,6 +1039,7 @@ Others: - [Common labels] - [What is Kubernetes?] - [Using RBAC Authorization] +- [Expose Pod information to Containers through files] [best practices for pod security in azure kubernetes service (aks)]: https://learn.microsoft.com/en-us/azure/aks/developer-best-practices-pod-security diff --git a/knowledge base/pandoc.md b/knowledge base/pandoc.md index c1ea308..6f88e14 100644 --- a/knowledge base/pandoc.md +++ b/knowledge base/pandoc.md @@ -1,11 +1,54 @@ # Pandoc +Haskell library for converting from one markup format to another.
+The command-line tool uses this library. + +Pandoc's enhanced version of Markdown includes syntax for tables, definition lists, metadata blocks, footnotes, +citations, math, and more. + 1. [TL;DR](#tldr) 1. [Further readings](#further-readings) -1. [Sources](#sources) + 1. [Sources](#sources) ## TL;DR +Pandoc consists of a set of readers.
+Those readers parse text in a given format, and produce: + +- A native representation of the document (an abstract syntax tree or AST), and +- A set of writers. + +The writers convert the document's native representation into the target format. + +Adding an input or output format requires only adding a reader or writer. + +Users can run custom pandoc filters to modify the intermediate AST. + +> Pandoc's intermediate representation of a document is less expressive than many of the formats it converts +> between.
+> As such, one should **not** expect perfect conversions between every format and every other. +> +> Pandoc attempts to preserve the structural elements of a document, but not formatting details such as margin +> size.
+> Some document elements (i.e., complex tables) may **not** fit into pandoc's simple document model. + +If no input files are specified, input is read from `stdin`. + +The output goes to `stdout` by default. + +If the input or output format is not specified explicitly, pandoc will attempt to guess it from the extensions of the +filenames.
+If no input file is specified or if the input files' extensions are unknown, the input format will be assumed to be +Markdown.
+If no output file is specified or if the output file's extension is unknown, the output format will default to HTML. + +Pandoc uses the UTF-8 character encoding for both input and output.
+If one's local character encoding is **not** UTF-8, one should pipe input and output through `iconv`: + +```sh +iconv -t 'utf-8' 'input.txt' | pandoc | iconv -f 'utf-8' +``` + ```sh # Install. apt install 'pandoc' @@ -14,6 +57,10 @@ dnf install 'pandoc' yum install 'pandoc' zypper install 'pandoc-cli' +# Print the lists of supported formats. +pandoc --list-input-formats +pandoc --list-output-formats + # Convert between formats. # If the format is not specified, it will try to guess. pandoc -f 'html' -t 'markdown' 'input.html' @@ -21,33 +68,41 @@ pandoc -r 'html' -w 'markdown' 'https://www.fsf.org' pandoc --from 'markdown' --write 'docx' 'input.md' pandoc --read 'markdown' --to 'rtf' 'input.md' pandoc -o 'output.tex' 'input.txt' + +# By default, pandoc produces document fragments. +# Use the '-s', '--standalone' option to produce a standalone document. pandoc -s --output 'output.pdf' 'input.html' +# If multiple input files are given at once, pandoc will concatenate them all with blank lines between them before +# parsing. +# Use `--file-scope` to parse files individually. + # Convert to PDF. # The default way leverages LaTeX, requiring a LaTeX engine to be installed. -# Alternative engines allow ConTeXt, roff ms or HTML as intermediate formats. +# Alternative engines allow 'ConTeXt', 'roff ms' or 'HTML' as intermediate formats. pandoc … 'input.html' pandoc … --pdf-engine 'context' 'https://www.fsf.org' pandoc … --pdf-engine 'html' -c 'style.css' 'input.html' + +# Render markdown documents and show them in `links`. +pandoc --standalone 'docs/pandoc.md' | links ``` ## Further readings - [Website] +- [Manual] -## Sources - -All the references in the [further readings] section, plus the following: +### Sources - [Creating a PDF] - -[further readings]: #further-readings - [creating a pdf]: https://pandoc.org/MANUAL.html#creating-a-pdf +[manual]: https://pandoc.org/MANUAL.html [website]: https://pandoc.org/ diff --git a/knowledge base/polkit.md b/knowledge base/polkit.md new file mode 100644 index 0000000..cd4cc23 --- /dev/null +++ b/knowledge base/polkit.md @@ -0,0 +1,43 @@ +# Polkit + +Provides an authorization API
. +Those are intended to be used by privileged programs (A.K.A. _mechanisms_) that offer services to unprivileged programs +(A.K.A. _subjects_). + +Mechanisms typically treat subjects as **untrusted**.
+For every request from subjects, mechanisms need to determine if the request is authorized or if they should refuse +to service the subject; mechanisms can offload this decision to **the polkit authority** using the polkit APIs. + +The system architecture of polkit is comprised of the _Authority_ and an _Authentication Agent_ per user session.
+_Actions_ are defined by applications. Vendors, sites and system administrators can control the authorization policy +using _Authorization Rules_. + +The Authentication Agent provided and started by the user's graphical environment + +The Authority is implemented as a system daemon (`polkitd`)
+The daemon itself runs as the `polkitd` system user to have little privilege. + +Mechanisms, subjects and authentication agents communicate with the authority using the system message bus. + +In addition to acting as an authority, polkit allows users to obtain temporary authorization through authenticating +either an administrative user or the owner of the session the client belongs to.
+This is useful for scenarios where mechanisms needs to verify that the operator of the system really is the user or an +administrative user. + +## Sources + +- Arch Linux's [Wiki page][arch wiki page] +- Polkit's [documentation] +- Polkit's [`man` page][man page] + + + + +[documentation]: https://www.freedesktop.org/software/polkit/docs/latest/ +[man page]: https://www.freedesktop.org/software/polkit/docs/latest/polkit.8.html + + +[arch wiki page]: https://wiki.archlinux.org/index.php/Polkit diff --git a/knowledge base/prometheus.md b/knowledge base/prometheus.md index 8ecc5ed..c5cc0ca 100644 --- a/knowledge base/prometheus.md +++ b/knowledge base/prometheus.md @@ -21,7 +21,7 @@ security policy. 1. [Management API](#management-api) 1. [Take snapshots of the data](#take-snapshots-of-the-data) 1. [Further readings](#further-readings) -1. [Sources](#sources) + 1. [Sources](#sources) ## TL;DR @@ -201,6 +201,20 @@ calculates the **per-second rate of change** based on the last two data points o To calculate the overall CPU usage, the idle mode of the metric is used. Since idle percent of a processor is the opposite of a busy processor, the irate value is subtracted from 1. To make it a percentage, it is multiplied by 100. +
+ Examples + +```promql +# Get all allocatable CPU cores where the 'node' attribute matches regex ".*-runners-.*" grouped by node +sum(kube_node_status_allocatable_cpu_cores{node=~".*-runners-.*"}) BY (node) + +# FIXME +sum(rate(container_cpu_usage_seconds_total{namespace="gitlab-runners",container="build",pod_name=~"runner.*"}[30s])) by (pod_name,container) / +sum(container_spec_cpu_quota{namespace="gitlab-runners",pod_name=~"runner.*"}/container_spec_cpu_period{namespace="gitlab-runners",pod_name=~"runner.*"}) by (pod_name,container) +``` + +
+ ## Storage Refer [Storage]. @@ -377,9 +391,7 @@ The snapshot now exists at `/snapshots/20171210T211224Z-2be650b6d019eb - [`ordaa/boinc_exporter`][ordaa/boinc_exporter] - [Grafana] -## Sources - -All the references in the [further readings] section, plus the following: +### Sources - [Getting started with Prometheus] - [Node exporter guide] @@ -395,15 +407,15 @@ All the references in the [further readings] section, plus the following: - [How to integrate Prometheus and Grafana on Kubernetes using Helm] - [node-exporter's helm chart's values] - [How to set up and experiment with Prometheus remote-write] +- [Install Prometheus and Grafana by Helm] +- [Prometheus and Grafana setup in Minikube] +- [I need to know about the below kube_state_metrics description. Exactly looking is what the particular metrics doing] - -[further readings]: #further-readings - [grafana]: grafana.md [node exporter]: node%20exporter.md @@ -434,8 +446,11 @@ All the references in the [further readings] section, plus the following: [how relabeling in prometheus works]: https://grafana.com/blog/2022/03/21/how-relabeling-in-prometheus-works/ [how to integrate prometheus and grafana on kubernetes using helm]: https://semaphoreci.com/blog/prometheus-grafana-kubernetes-helm [how to set up and experiment with prometheus remote-write]: https://developers.redhat.com/articles/2023/11/30/how-set-and-experiment-prometheus-remote-write +[i need to know about the below kube_state_metrics description. exactly looking is what the particular metrics doing]: https://stackoverflow.com/questions/60440847/i-need-to-know-about-the-below-kube-state-metrics-description-exactly-looking-i#60449570 +[install prometheus and grafana by helm]: https://medium.com/@at_ishikawa/install-prometheus-and-grafana-by-helm-9784c73a3e97 [install prometheus and grafana with helm 3 on a local machine vm]: https://dev.to/ko_kamlesh/install-prometheus-grafana-with-helm-3-on-local-machine-vm-1kgj [ordaa/boinc_exporter]: https://gitlab.com/ordaa/boinc_exporter +[prometheus and grafana setup in minikube]: http://blog.marcnuri.com/prometheus-grafana-setup-minikube/ [scrape selective metrics in prometheus]: https://docs.last9.io/docs/how-to-scrape-only-selective-metrics-in-prometheus [set up prometheus and ingress on kubernetes]: https://blog.gojekengineering.com/diy-how-to-set-up-prometheus-and-ingress-on-kubernetes-d395248e2ba [snmp monitoring and easing it with prometheus]: https://medium.com/@openmohan/snmp-monitoring-and-easing-it-with-prometheus-b157c0a42c0c diff --git a/knowledge base/raspberry pi os.md b/knowledge base/raspberry pi os.md index 9b019be..9b4bd8e 100644 --- a/knowledge base/raspberry pi os.md +++ b/knowledge base/raspberry pi os.md @@ -3,6 +3,8 @@ ## Table of contents 1. [First boot](#first-boot) +1. [Boot from USB](#boot-from-usb) + 1. [Raspberry Pi 4B](#raspberry-pi-4b) 1. [Repositories](#repositories) 1. [Privilege escalation](#privilege-escalation) 1. [Disable WiFi and Bluetooth](#disable-wifi-and-bluetooth) @@ -30,12 +32,37 @@ 1. [LED warning flash codes](#led-warning-flash-codes) 1. [Issues connecting to WiFi network using roaming features or WPA3](#issues-connecting-to-wifi-network-using-roaming-features-or-wpa3) 1. [Further readings](#further-readings) -1. [Sources](#sources) + 1. [Sources](#sources) ## First boot Unless manually set from the Imager, on first boot the system will ask to create a new initial user. +## Boot from USB + +Available on Raspberry Pi 2B v1.2, 3A+, 3B, 3B+, 4B, 400, Compute Module 3, Compute Module 3+ and Compute Module 4 only. + +### Raspberry Pi 4B + +The bootloader EEPROM may need to be updated to enable booting from USB mass storage devices. + +To check this, power the Pi up with no SD card inserted and a display attached to one of the HDMI ports.
+It will display a diagnostic screen which includes the bootloader EEPROM version at the top. + +The bootloader must be dated **_Sep 3 2020_** or later to support USB mass storage boot.
+If the diagnostic screen reports a date earlier than _Sep 3 2020_, or there is no diagnostic screen shown, one will need +to update the bootloader EEPROM first to enable USB mass storage boot. + +To update it: + +1. use the _Misc Utility Images_ option in Raspberry Pi Imager to create an SD card with the latest + _Raspberry Pi 4 EEPROM boot recovery_ image +1. boot the Pi using this SD card +1. the bootloader EEPROM will be updated to the latest factory version +1. the Pi will flash its green ACT light rapidly and display green on the HDMI outputs to indicate success + +USB mass storage boot on the Pi 4B requires Raspberry Pi OS 2020-08-20 or later. + ## Repositories [Repositories], [Mirrors]. @@ -239,6 +266,11 @@ sudo nano '/etc/init.d/raspi-config' See [Timely tips for speeding up your Raspberry Pi]. +```sh +# Run benchmarks. +curl -L https://raw.githubusercontent.com/aikoncwd/rpi-benchmark/master/rpi-benchmark.sh | sudo bash +``` + ## Headless boot Manual procedure: @@ -296,7 +328,7 @@ network={ Use `wpa_passphrase`: -``` +```plaintext usage: wpa_passphrase [passphrase] If passphrase is left out, it will be read from stdin ``` @@ -404,10 +436,9 @@ Long term solution: none currently known. - [Country code search] - [`k3s`][k3s] - [Configuration] +- [os documentation] -## Sources - -All the references in the [further readings] section, plus the following: +### Sources - [Prepare SD card for WiFi on headless Pi] - [Run Kubernetes on a Raspberry Pi with k3s] @@ -416,27 +447,43 @@ All the references in the [further readings] section, plus the following: - [Timely tips for speeding up your Raspberry Pi] - [Repositories] - [Mirrors] +- [disabling bluetooth on raspberry pi] +- [ghollingworth/overlayfs] +- [how to disable onboard wifi and bluetooth on raspberry pi 3] +- [how to disable wi-fi on raspberry pi] +- [how to disable your raspberry pi's wi-fi] +- [how to make your raspberry pi 4 faster with a 64 bit kernel] +- [re: raspbian jessie linux 4.4.9 severe performance degradati] +- [rp automatic updates] +- [sd card power failure resilience ideas] +- [alpine linux headless installation] +- [alpine linux] +- [benchmark] +- [preventing filesystem corruption in embedded linux] +- [usb mass storage boot] [/boot/config.txt]: https://www.raspberrypi.org/documentation/configuration/config-txt/README.md [configuration]: https://www.raspberrypi.com/documentation/computers/configuration.html [mirrors]: https://www.raspbian.org/RaspbianMirrors +[os documentation]: https://www.raspberrypi.org/documentation/computers/os.html [overclocking]: https://www.raspberrypi.org/documentation/configuration/config-txt/overclocking.md [repositories]: https://www.raspbian.org/RaspbianRepository [vcgencmd]: https://www.raspberrypi.com/documentation/computers/os.html#vcgencmd - -[further readings]: #further-readings - [k3s]: kubernetes/k3s.md [rfkill]: rfkill.md +[alpine linux headless installation]: https://wiki.alpinelinux.org/wiki/Raspberry_Pi_-_Headless_Installation +[alpine linux]: https://wiki.alpinelinux.org/wiki/Raspberry_Pi +[benchmark]: https://github.com/aikoncwd/rpi-benchmark [country code search]: https://www.iso.org/obp/ui/#search/code/ [disabling bluetooth on raspberry pi]: https://di-marco.net/blog/it/2020-04-18-tips-disabling_bluetooth_on_raspberry_pi/ [ghollingworth/overlayfs]: https://github.com/ghollingworth/overlayfs @@ -445,8 +492,8 @@ All the references in the [further readings] section, plus the following: [how to disable your raspberry pi's wi-fi]: https://pimylifeup.com/raspberry-pi-disable-wifi/ [how to make your raspberry pi 4 faster with a 64 bit kernel]: https://medium.com/for-linux-users/how-to-make-your-raspberry-pi-4-faster-with-a-64-bit-kernel-77028c47d653 [issue 2067]: https://github.com/k3s-io/k3s/issues/2067#issuecomment-664052806 -[os documentation]: https://www.raspberrypi.org/documentation/computers/os.html [prepare sd card for wifi on headless pi]: https://raspberrypi.stackexchange.com/questions/10251/prepare-sd-card-for-wifi-on-headless-pi +[preventing filesystem corruption in embedded linux]: https://www.embeddedarm.com/assets/preventing-filesystem-corruption-in-embedded-linux [raspbian bug 1929746]: https://bugs.launchpad.net/raspbian/+bug/1929746 [re: how to make sure the rpi cpu is not throttled down?]: https://www.raspberrypi.org/forums/viewtopic.php?t=152549#p999931 [re: raspbian jessie linux 4.4.9 severe performance degradati]: https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=147781&start=50#p972790 @@ -454,3 +501,4 @@ All the references in the [further readings] section, plus the following: [run kubernetes on a raspberry pi with k3s]: https://opensource.com/article/20/3/kubernetes-raspberry-pi-k3s [sd card power failure resilience ideas]: https://www.raspberrypi.org/forums/viewtopic.php?f=63&t=253104&p=1549229#p1549117 [timely tips for speeding up your raspberry pi]: https://www.raspberry-pi-geek.com/Archive/2013/01/Timely-tips-for-speeding-up-your-Raspberry-Pi +[usb mass storage boot]: https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/msd.md diff --git a/knowledge base/shell.md b/knowledge base/shell.md new file mode 100644 index 0000000..66cd4c3 --- /dev/null +++ b/knowledge base/shell.md @@ -0,0 +1,45 @@ +# Shell + +```shell +$ cat /etc/locale.conf +LANG=en_US.UTF-8 +LC_NUMERIC=en_GB.UTF-8 +LC_TIME=en_GB.UTF-8 +LC_MONETARY=en_GB.UTF-8 +LC_PAPER=en_GB.UTF-8 +LC_MEASUREMENT=en_GB.UTF-8 + +$ locale +LANG=en_US.UTF-8 +LC_CTYPE="en_US.UTF-8" +LC_NUMERIC=en_GB.UTF-8 +LC_TIME=en_GB.UTF-8 +LC_COLLATE="en_US.UTF-8" +LC_MONETARY=en_GB.UTF-8 +LC_MESSAGES="en_US.UTF-8" +LC_PAPER=en_GB.UTF-8 +LC_NAME="en_US.UTF-8" +LC_ADDRESS="en_US.UTF-8" +LC_TELEPHONE="en_US.UTF-8" +LC_MEASUREMENT=en_GB.UTF-8 +LC_IDENTIFICATION="en_US.UTF-8" +LC_ALL= +``` + +## See also + +- [Shellcheck] + +[shellcheck]: https://www.shellcheck.net/ + +## Further readings + +- [How can I declare and use boolean variables in a shell script]? +- [What does LC_ALL=C do]? +- [Exit Codes With Special Meanings] +- [How to check if running as root in a bash script] + +[exit codes with special meanings]: https://tldp.org/LDP/abs/html/exitcodes.html +[how can i declare and use boolean variables in a shell script]: https://stackoverflow.com/questions/2953646/how-can-i-declare-and-use-boolean-variables-in-a-shell-script#21210966 +[how to check if running as root in a bash script]: https://stackoverflow.com/questions/18215973/how-to-check-if-running-as-root-in-a-bash-script#21622456 +[what does lc_all=c do]: https://unix.stackexchange.com/questions/87745/what-does-lc-all-c-do#87763 diff --git a/knowledge base/tmux.md b/knowledge base/tmux.md index 736e4b0..3dca6f3 100644 --- a/knowledge base/tmux.md +++ b/knowledge base/tmux.md @@ -28,7 +28,15 @@ See usage for details. Installation and configuration ```sh +# Install. brew install 'tmux' + +# Get the default settings. +# Might need to run from inside a sessions. +# Specify a null configuration file so that tmux ends up printing whatever is hard-coded in its source. +tmux -f '/dev/null' show-options -s +tmux -f '/dev/null' show-options -g +tmux -f '/dev/null' list-keys ``` The configuration file is `$HOME/.tmux.conf` or `$XDG_CONFIG_HOME/tmux/tmux.conf`. @@ -120,6 +128,9 @@ tmux kill-session -t 'session-name' - [Tmux has forever changed the way I write code] - [Sending simulated keystrokes in Bash] - [Is it possible to send input to a tmux session without connecting to it?] +- [devhints.io] +- [hamvocke/dotfiles] +- [Default Tmux config] +[default tmux config]: https://unix.stackexchange.com/questions/175421/default-tmux-config#342975 +[devhints.io]: https://devhints.io/tmux +[hamvocke/dotfiles]: https://github.com/hamvocke/dotfiles/blob/master/tmux/.tmux.conf [is it possible to send input to a tmux session without connecting to it?]: https://unix.stackexchange.com/questions/409861/is-it-possible-to-send-input-to-a-tmux-session-without-connecting-to-it#409863 [sending simulated keystrokes in bash]: https://superuser.com/questions/585398/sending-simulated-keystrokes-in-bash#1606615 [tmux cheat sheet & quick reference]: https://tmuxcheatsheet.com/ diff --git a/knowledge base/vscodium.md b/knowledge base/vscodium.md new file mode 100644 index 0000000..9bc299f --- /dev/null +++ b/knowledge base/vscodium.md @@ -0,0 +1,84 @@ +# VSCodium + +## Troubleshooting + +### Zsh terminal icons are not getting displayed in the terminal + +Change font to `NotoSansMono Nerd Font` in the _Terminal_ > _Integrated_ > _Font Family_ settings. +See [Why Zsh terminal icons are not getting displayed in Atom Platformio Ide Terminal?] + +## Flatpak version + +In case you missed, the README file is at `/app/share/codium/README.md` + +### FAQ + +This version is running inside a _container_ and is therefore __not able__ +to access SDKs on your host system! + +#### To execute commands on the host system, run inside the sandbox + +```bash +flatpak-spawn --host +``` + +#### Host Shell + +To make the Integrated Terminal automatically use the host system's shell, +you can add this to the settings of vscodium: + +```json +{ + "terminal.integrated.shell.linux": "/usr/bin/env", + "terminal.integrated.shellArgs.linux": ["--", "flatpak-spawn", "--host", "bash"] +} +``` + +#### SDKs + +This flatpak provides a standard development environment (gcc, python, etc). +To see what's available: + +```bash +flatpak run --command=sh com.vscodium.codium +ls /usr/bin (shared runtime) +ls /app/bin (bundled with this flatpak) +``` + +To get support for additional languages, you have to install SDK extensions, e.g. + +```bash +flatpak install flathub org.freedesktop.Sdk.Extension.dotnet +flatpak install flathub org.freedesktop.Sdk.Extension.golang +FLATPAK_ENABLE_SDK_EXT=dotnet,golang flatpak run com.vscodium.codium +``` + +You can use + +```bash +flatpak search +``` + +to find others. + +#### Run flatpak codium from host terminal + +If you want to run `codium /path/to/file` from the host terminal just add this to your shell's rc file + +```bash +alias codium="flatpak run com.vscodium.codium" +``` + +then reload sources, now you could try: + +```bash +$ codium /path/to/ +# or +$ FLATPAK_ENABLE_SDK_EXT=dotnet,golang codium /path/to/ +``` + +## Sources + +- [Why Zsh terminal icons are not getting displayed in Atom Platformio Ide Terminal?] + +[why zsh terminal icons are not getting displayed in atom platformio ide terminal?]: https://forum.manjaro.org/t/why-zsh-terminal-icons-are-not-getting-displayed-in-atom-platformio-ide-terminal/64885/2 diff --git a/knowledge base/zram.md b/knowledge base/zram.md new file mode 100644 index 0000000..32de6d4 --- /dev/null +++ b/knowledge base/zram.md @@ -0,0 +1,44 @@ +# ZRAM + +TODO + +1. [TL;DR](#tldr) +1. [Further readings](#further-readings) + 1. [Sources](#sources) + +## TL;DR + +```sh +$ grep 'swap' /etc/fstab +/dev/zram0 none swap sw 0 0 + +$ cat /etc/modules-load.d/zram.conf +zram + +# Create a zram block device with total capacity of 2x the total RAM. +# Size is determined by the 'echo ...' part. +$ cat /etc/udev/rules.d/10-zram.rules +KERNEL=="zram0", \ +SUBSYSTEM=="block", \ +ACTION=="add", \ +ATTR{initstate}=="0", \ +PROGRAM="/bin/sh -c 'echo $(($(LANG=C free --kilo | sed --silent --regexp-extended s/^Mem:\ (0-9+)\ +.$/\1/p)*2))KiB'", \ +ATTR{disksize}="$result", \ +RUN+="/sbin/mkswap $env{DEVNAME}", \ +TAG+="systemd" +``` + +## Further readings + +### Sources + + + + + + + +