mirror of
https://github.com/siderolabs/talos.git
synced 2025-10-09 22:51:12 +02:00
docs: document controller runtime, resources and talosctl get
This is more of a in-depth guide explaining internals. Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com> Co-authored-by: Spencer Smith <rsmitty@users.noreply.github.com>
This commit is contained in:
parent
c2e353d6af
commit
d3798cd7a8
234
website/content/docs/v0.9/Learn More/controllers-resources.md
Normal file
234
website/content/docs/v0.9/Learn More/controllers-resources.md
Normal file
@ -0,0 +1,234 @@
|
|||||||
|
---
|
||||||
|
title: "Controllers and Resources"
|
||||||
|
weight: 8
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- markdownlint-disable MD038 -->
|
||||||
|
|
||||||
|
Talos implements concepts of *resources* and *controllers* to facilitate internal operations of the
|
||||||
|
operating system. Talos resources and controllers are very similar to Kubernetes resources and controllers,
|
||||||
|
but there are some differences. The content of this document is not required to operate Talos, but it is
|
||||||
|
useful for troubleshooting.
|
||||||
|
|
||||||
|
Starting with Talos 0.9, most of the Kubernetes control plane boostrapping and operations is implemented
|
||||||
|
via controllers and resources which allows Talos to be reactive to configuration changes, environment
|
||||||
|
changes (e.g. time sync).
|
||||||
|
|
||||||
|
## Resources
|
||||||
|
|
||||||
|
A resource captures a piece of system state. Each resource belongs to a "Type" which defines resource contents.
|
||||||
|
Resource state can be split in two parts:
|
||||||
|
|
||||||
|
* metadata: fixed set of fields describing resource - namespace, type, ID, etc.
|
||||||
|
* spec: contents of the resource (depends on resource type).
|
||||||
|
|
||||||
|
Resource is uniquely identified by (`namespace`, `type`, `id`). Namespaces provide a way to avoid conflicts on
|
||||||
|
duplicate resource IDs.
|
||||||
|
|
||||||
|
At the moment of this writing, all resources are local to the node and stored in memory. So on every reboot
|
||||||
|
resource state is rebuilt from scratch (the only exception is `MachineConfig` resource which reflects current
|
||||||
|
machine config).
|
||||||
|
|
||||||
|
## Controllers
|
||||||
|
|
||||||
|
Controllers run as independent lightweight threads in Talos. The goal of the controller is to reconcile
|
||||||
|
the state based on inputs and eventually update outputs.
|
||||||
|
|
||||||
|
A controller can have any number of resource types (and namespaces) as inputs. In other words, it watches
|
||||||
|
specified resources for changes and reconciles when these changes occur. A controller might also have additional
|
||||||
|
inputs: running reconcile on schedule, watching `etcd` keys, etc.
|
||||||
|
|
||||||
|
A controller has a single output: a set of resources of fixed type in a fixed namespace. Only one controller
|
||||||
|
can manage resource type in the namespace, so conflicts are avoided.
|
||||||
|
|
||||||
|
## Querying Resources
|
||||||
|
|
||||||
|
Talos CLI tool `talosctl` provides read-only access to the resource API which includes getting specific resource,
|
||||||
|
listing resources and watching for changes.
|
||||||
|
|
||||||
|
Talos stores resources describing resource types and namespaces in `meta` namespace:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get resourcedefinitions
|
||||||
|
NODE NAMESPACE TYPE ID VERSION
|
||||||
|
172.20.0.2 meta ResourceDefinition bootstrapstatuses.v1alpha1.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition etcdsecrets.secrets.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition kubernetescontrolplaneconfigs.config.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition kubernetessecrets.secrets.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition machineconfigs.config.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition machinetypes.config.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition manifests.kubernetes.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition manifeststatuses.kubernetes.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition namespaces.meta.cosi.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition resourcedefinitions.meta.cosi.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition rootsecrets.secrets.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition secretstatuses.kubernetes.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition services.v1alpha1.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition staticpods.kubernetes.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition staticpodstatuses.kubernetes.talos.dev 1
|
||||||
|
172.20.0.2 meta ResourceDefinition timestatuses.v1alpha1.talos.dev 1
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get namespaces
|
||||||
|
NODE NAMESPACE TYPE ID VERSION
|
||||||
|
172.20.0.2 meta Namespace config 1
|
||||||
|
172.20.0.2 meta Namespace controlplane 1
|
||||||
|
172.20.0.2 meta Namespace extras 1
|
||||||
|
172.20.0.2 meta Namespace meta 1
|
||||||
|
172.20.0.2 meta Namespace runtime 1
|
||||||
|
172.20.0.2 meta Namespace secrets 1
|
||||||
|
```
|
||||||
|
|
||||||
|
Most of the time namespace flag (`--namespace`) can be omitted, as `ResourceDefinition` contains default
|
||||||
|
namespace which is used if no namespace is given:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get resourcedefinitions resourcedefinitions.meta.cosi.dev -o yaml
|
||||||
|
node: 172.20.0.2
|
||||||
|
metadata:
|
||||||
|
namespace: meta
|
||||||
|
type: ResourceDefinitions.meta.cosi.dev
|
||||||
|
id: resourcedefinitions.meta.cosi.dev
|
||||||
|
version: 1
|
||||||
|
phase: running
|
||||||
|
spec:
|
||||||
|
type: ResourceDefinitions.meta.cosi.dev
|
||||||
|
displayType: ResourceDefinition
|
||||||
|
aliases:
|
||||||
|
- resourcedefinitions
|
||||||
|
- resourcedefinition
|
||||||
|
- resourcedefinitions.meta
|
||||||
|
- resourcedefinitions.meta.cosi
|
||||||
|
- rd
|
||||||
|
- rds
|
||||||
|
printColumns: []
|
||||||
|
defaultNamespace: meta
|
||||||
|
```
|
||||||
|
|
||||||
|
Resource definition also contains type aliases which can be used interchangeably with canonical resource name:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get ns config
|
||||||
|
NODE NAMESPACE TYPE ID VERSION
|
||||||
|
172.20.0.2 meta Namespace config 1
|
||||||
|
```
|
||||||
|
|
||||||
|
### Output
|
||||||
|
|
||||||
|
Command `talosctl get` supports following output modes:
|
||||||
|
|
||||||
|
* `table` (default) prints resource list as a table
|
||||||
|
* `yaml` prints pretty formatted resources with details, including full metadata spec. This format carries most
|
||||||
|
details from the backend resource (e.g. comments in `MachineConfig` resource)
|
||||||
|
* `json` prints same information as `yaml`, some additional details (e.g. comments) might be lost.
|
||||||
|
This format is useful for automated processing with tools like `jq`.
|
||||||
|
|
||||||
|
### Watching Changes
|
||||||
|
|
||||||
|
If flag `--watch` is appended to the `talosctl get` command, the command switches to watch mode. If list of resources
|
||||||
|
was requested, `talosctl` prints initial contents of the list and then appends resource information
|
||||||
|
for every change:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get svc -w
|
||||||
|
NODE * NAMESPACE TYPE ID VERSION RUNNING HEALTHY
|
||||||
|
172.20.0.2 + runtime Service timed 2 true true
|
||||||
|
172.20.0.2 + runtime Service trustd 2 true true
|
||||||
|
172.20.0.2 + runtime Service udevd 2 true true
|
||||||
|
172.20.0.2 - runtime Service timed 2 true true
|
||||||
|
172.20.0.2 + runtime Service timed 1 true false
|
||||||
|
172.20.0.2 runtime Service timed 2 true true
|
||||||
|
```
|
||||||
|
|
||||||
|
Column `*` specifies event type:
|
||||||
|
|
||||||
|
* `+` is created
|
||||||
|
* `-` is deleted
|
||||||
|
* ` ` is updated
|
||||||
|
|
||||||
|
In YAML/JSON output, field `event` is added to the resource representation to describe the event type.
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
Getting machine config:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get machineconfig -o yaml
|
||||||
|
node: 172.20.0.2
|
||||||
|
metadata:
|
||||||
|
namespace: config
|
||||||
|
type: MachineConfigs.config.talos.dev
|
||||||
|
id: v1alpha1
|
||||||
|
version: 2
|
||||||
|
phase: running
|
||||||
|
spec:
|
||||||
|
version: v1alpha1 # Indicates the schema used to decode the contents.
|
||||||
|
debug: false # Enable verbose logging to the console.
|
||||||
|
persist: true # Indicates whether to pull the machine config upon every boot.
|
||||||
|
# Provides machine specific configuration options.
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
Getting control plane static pod statuses:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get staticpodstatus
|
||||||
|
NODE NAMESPACE TYPE ID VERSION READY
|
||||||
|
172.20.0.2 controlplane StaticPodStatus kube-system/kube-apiserver-talos-default-master-1 3 True
|
||||||
|
172.20.0.2 controlplane StaticPodStatus kube-system/kube-controller-manager-talos-default-master-1 3 True
|
||||||
|
172.20.0.2 controlplane StaticPodStatus kube-system/kube-scheduler-talos-default-master-1 4 True
|
||||||
|
```
|
||||||
|
|
||||||
|
Getting static pod definition for `kube-apiserver`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl get sp kube-apiserver -n 172.20.0.2 -o yaml
|
||||||
|
node: 172.20.0.2
|
||||||
|
metadata:
|
||||||
|
namespace: controlplane
|
||||||
|
type: StaticPods.kubernetes.talos.dev
|
||||||
|
id: kube-apiserver
|
||||||
|
version: 3
|
||||||
|
phase: running
|
||||||
|
finalizers:
|
||||||
|
- k8s.StaticPodStatus("kube-apiserver")
|
||||||
|
spec:
|
||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
talos.dev/config-version: "1"
|
||||||
|
talos.dev/secrets-version: "2"
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
## Inspecting Controller Dependencies
|
||||||
|
|
||||||
|
Talos can report current dependencies between controllers and resources for debugging purposes:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ talosctl inspect dependencies
|
||||||
|
digraph {
|
||||||
|
|
||||||
|
n1[label="config.K8sControlPlaneController",shape="box"];
|
||||||
|
n3[label="config.MachineTypeController",shape="box"];
|
||||||
|
n2[fillcolor="azure2",label="config:KubernetesControlPlaneConfigs.config.talos.dev",shape="note",style="filled"];
|
||||||
|
...
|
||||||
|
```
|
||||||
|
|
||||||
|
This outputs graph in `graphviz` format which can be rendered to PNG with command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
talosctl inspect dependencies | dot -T png > deps.png
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Graph can be enhanced by replacing resource types with actual resource instances:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
talosctl inspect dependencies --with-resources | dot -T png > deps.png
|
||||||
|
```
|
||||||
|
|
||||||
|

|
BIN
website/static/images/controller-dependencies-with-resources.png
Normal file
BIN
website/static/images/controller-dependencies-with-resources.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 353 KiB |
BIN
website/static/images/controller-dependencies.png
Normal file
BIN
website/static/images/controller-dependencies.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 190 KiB |
Loading…
x
Reference in New Issue
Block a user