update/structure thoughts

pull/227/head
iwilltry42 5 years ago
parent bc49f197d9
commit 4cbf88a443
No known key found for this signature in database
GPG Key ID: 7BA57AD1CFF16110
  1. 3
      README.md
  2. 281
      thoughts.md

@ -56,11 +56,12 @@ Check out the [examples here](docs/examples.md).
## What now? ## What now?
Find more details under the following Links: ### More Information
- [Further documentation](docs/documentation.md) - [Further documentation](docs/documentation.md)
- [Usage examples](docs/examples.md) - [Usage examples](docs/examples.md)
- [Frequently asked questions and nice-to-know facts](docs/faq.md) - [Frequently asked questions and nice-to-know facts](docs/faq.md)
- [Design/Architecture Thoughts, Plans, Unsorted Ideas and more](thoughts.md)
### Connect ### Connect

@ -1,91 +1,56 @@
# Thoughts # Thoughts
## commands ## Command Tree
### `create`
```shell
k3d
|- create
| |- cluster [NAME ] [flags]
| |- node [NAME ] [flags]
|
|- delete
| |- cluster [NAME ] [flags]
| |- node [NAME ] [flags]
|- get
| |- cluster
| |- node
|- start
| |- cluster
| |- node
|- stop
| |- cluster
| |- node
```
## Overview
- `cmd/`: everything around the CLI of k3d = human interface, printed output (e.g. list of clusters) - k3d
- `pkg/`: everything else, can be used as a module from other Go projects - create
- `cluster/`: everything around managing cluster components - cluster NAME
- `runtimes/`: translate k3d types (node, cluster, etc.) to container runtime specific types and manage them - --api-port
- `types/`: collection of types (structs) and constants used by k3d - --datastore-cafile
- `util/`: utilities, that could be used for everything, not directly related to the project - --datastore-certfile
- --datastore-endpoint
## k3d <-> runtime - --datastore-keyfile
- --datastore-network
k3d _should_ work with more than one runtime, if we can implement the Runtime interface for it. - --image
Here's how k3d types should translate to a runtime type: - --k3s-agent-arg
- --k3s-server-arg
- `cluster` = set of _containers_ running in the same _network_, maybe mounting the same _volume(s)_ - --lb-port
- `node` = _container_ with _exposed ports_ and _volume mounts_ - --masters
- --network
### docker - --no-lb
- --port
#### node -> container - --secret
- --volume
`container = "github.com/docker/docker/api/types/container"` - --workers
`network = "github.com/docker/docker/api/types/network"` - node NAME
- --cluster
- Name -> container.Hostname = node.Name - --image
- Role -> container.Labels["k3d.role"] = node.Role - --replicas
- Image -> container.Image = node.Image - --role
- Volumes -> container.HostConfig.PortBindings - delete
- Env -> - cluster NAME
- Args -> - --all
- Ports -> - node NAME
- Restart -> - --all
- Labels -> container.Labels - get
- cluster NAME
## expose ports / volumes => DONE - --no-headers
- node NAME
- `--port [host:]port[:containerPort][/protocol][@group_identifier[[index] | @node_identifier]` - --no-headers
- Examples: - kubeconfig NAME
- `--port 0.0.0.0:8080:8081/tcp@workers` -> whole group - --output
- `--port 80@workers[0]` -> single instance of group by list index - start
- `--port 80@workers[0,2-3]` -> multiple instances of a group by index lists and ranges - cluster NAME
- `--port 80@k3d-test-worker-0` -> single instance by specific node identifier - --all
- `--port 80@k3d-test-master-0@workers[1-5]` -> multiple instances by combination of node and group identifiers - node NAME
- stop
- analogous for volumes - cluster NAME
- --all
## multi master setup => WIP - node NAME
- if `--masters` > 1 deploy a load-balancer in front of them as an extra container
- consider that in the kubeconfig file and `--tls-san`
- make this the default, but provide a `--no-lb` flag
## Store additional created stuff in labels => DONE
- when creating a cluster, usually, you also create a new docker network (and maybe other resources)
- store a reference to those in the container labels of cluster nodes
- when deleting the cluster, parse the labels, deduplicate the results and delete the additional resources
- DONE for network
- new labels `k3d.cluster.network=<ID>` and `k3d.cluster.network.external=<true|false>` (determine whether to try to delete it when you delete a cluster, since network may have been created manually)
## Feature Comparison to k3d v1
# Comparison to k3d v1 ### v1.x feature -> implemented in v3
- k3d - k3d
- check-tools - check-tools
@ -134,74 +99,41 @@ Here's how k3d types should translate to a runtime type:
- --name -> y - --name -> y
- --no-remove -> y - --no-remove -> y
- k3d ## Repository/Package Overview
- create
- cluster NAME
- --api-port
- --datastore-cafile
- --datastore-certfile
- --datastore-endpoint
- --datastore-keyfile
- --datastore-network
- --image
- --k3s-agent-arg
- --k3s-server-arg
- --lb-port
- --masters
- --network
- --no-lb
- --port
- --secret
- --volume
- --workers
- node NAME
- --cluster
- --image
- --replicas
- --role
- delete
- cluster NAME
- --all
- node NAME
- --all
- get
- cluster NAME
- --no-headers
- node NAME
- --no-headers
- kubeconfig NAME
- --output
- start
- cluster NAME
- --all
- node NAME
- stop
- cluster NAME
- --all
- node NAME
## tools - `cmd/`: everything around the CLI of k3d = human interface, printed output (e.g. list of clusters)
- `pkg/`: everything else, can be used as a module from other Go projects
- `cluster/`: everything around managing cluster components
- `runtimes/`: translate k3d types (node, cluster, etc.) to container runtime specific types and manage them
- `types/`: collection of types (structs) and constants used by k3d
- `util/`: utilities, that could be used for everything, not directly related to the project
- maybe rename `k3d load` to `k3d tools` and add tool cmds there? ## k3d types <-> runtime translation
- e.g. `k3d tools import-images`
- let's you set tools container version
- `k3d tools --image k3d-tools:v2 import-images`
- add `k3d create --image-vol NAME` flag to re-use existing image volume
- will add `k3d.volumes.imagevolume.external: true` label to nodes
- should not be deleted with cluster
- possibly add `k3d create volume` and `k3d create network` to create external networks?
## extra commands k3d _should_ work with more than one runtime, if we can implement the Runtime interface for it.
Here's how k3d types should translate to a runtime type:
- `k3d prune` to prune all dangling resources - `cluster` = set of _containers_ running in the same _network_, maybe mounting the same _volume(s)_
- nodes, volumes, networks - `node` = _container_ with _exposed ports_ and _volume mounts_
## use OCI ### Docker
- [https://github.com/opencontainers/runtime-spec/blob/master/specs-go/config.go](https://github.com/opencontainers/runtime-spec/blob/master/specs-go/config.go) #### Node to Container translation
- move node -> container translation out of runtime
`container = "github.com/docker/docker/api/types/container"`
`network = "github.com/docker/docker/api/types/network"`
- Name -> container.Hostname = node.Name
- Role -> container.Labels["k3d.role"] = node.Role
- Image -> container.Image = node.Image
- Volumes -> container.HostConfig.PortBindings
- Env ->
- Args ->
- Ports ->
- Restart ->
- Labels -> container.Labels
## node configuration comparison ## Node Configuration
- master node(s) - master node(s)
- ENV - ENV
@ -244,4 +176,65 @@ Here's how k3d types should translate to a runtime type:
## Features ## Features
## [DONE] Node Filters
- `--port [host:]port[:containerPort][/protocol][@group_identifier[[index] | @node_identifier]`
- Examples:
- `--port 0.0.0.0:8080:8081/tcp@workers` -> whole group
- `--port 80@workers[0]` -> single instance of group by list index
- `--port 80@workers[0,2-3]` -> multiple instances of a group by index lists and ranges
- `--port 80@k3d-test-worker-0` -> single instance by specific node identifier
- `--port 80@k3d-test-master-0@workers[1-5]` -> multiple instances by combination of node and group identifiers
- analogous for volumes
## [WIP] Multi-Master Setup
- if `--masters` > 1 deploy a load-balancer in front of them as an extra container
- consider that in the kubeconfig file and `--tls-san`
- make this the default, but provide a `--no-lb` flag
## [DONE] Keep State in Docker Labels
- when creating a cluster, usually, you also create a new docker network (and maybe other resources)
- store a reference to those in the container labels of cluster nodes
- when deleting the cluster, parse the labels, deduplicate the results and delete the additional resources
- DONE for network
- new labels `k3d.cluster.network=<ID>` and `k3d.cluster.network.external=<true|false>` (determine whether to try to delete it when you delete a cluster, since network may have been created manually)
## Bonus Ideas
### Tools
- maybe rename `k3d load` to `k3d tools` and add tool cmds there?
- e.g. `k3d tools import-images`
- let's you set tools container version
- `k3d tools --image k3d-tools:v2 import-images`
- add `k3d create --image-vol NAME` flag to re-use existing image volume
- will add `k3d.volumes.imagevolume.external: true` label to nodes
- should not be deleted with cluster
- possibly add `k3d create volume` and `k3d create network` to create external volumes/networks?
### Prune Command
- `k3d prune` to prune all dangling resources
- nodes, volumes, networks
### Use Open Standards (OCI, CRI, ...)
- [https://github.com/opencontainers/runtime-spec/blob/master/specs-go/config.go](https://github.com/opencontainers/runtime-spec/blob/master/specs-go/config.go)
- move node -> container translation out of runtime
### Private registry
- create a private registry to be used by k3d clusters
- similar to [https://github.com/rancher/k3d/pull/161](https://github.com/rancher/k3d/pull/161)
- add `k3d create registry` command to create external registry (maybe instead of flags as in PR #161?)
### Unsorted Ideas
- Integrate build tool (e.g. buildkit, buildah, ...)
### Required Enhancements
- remove/add nodes -> needs to remove line in `/var/lib/rancher/k3s/server/cred/node-passwd` for the deleted node - remove/add nodes -> needs to remove line in `/var/lib/rancher/k3s/server/cred/node-passwd` for the deleted node

Loading…
Cancel
Save