crossplane / crossplane/cli

proposal(crossplane project): add configuration options to support users in closed networks and devcontainers

Open
#313 1 comment 2 reactions 0 assignees View on GitHub
enhancement
Dominant language
Go
Stars
19
Forks
31
Avg merge
3d 4h
Merged PRs (30d)
52

Description

Hi, awesome that `crossplane project` has been added and cant wait to try it out more, but unfortunately it is currently unusable for people who develop in devcontainers and in a closed company networks.

I've done some digging and i believe i would have to add 3 functionalities for this to work seamlessly.

1) Configuring internal kubeconfig

Currently the `crossplane project` command only exports the kubeconfig with the external addresses:

https://github.com/crossplane/cli/blob/main/internal/project/controlplane/controlplane.go#L419

This could be fixed by adding an option to configure the export of the KinD kubeconfig with an `--internal` flag to use the internal addresses which are reachable inside devcontainer.

This fixes the following error on startup:

```sh
crossplane: error: failed to create crossplane-system namespace: failed to get server groups: Get "https://127.0.0.1:35341/api": dial tcp 127.0.0.1:35341: connect: connection refused
```

2) Configuring kind docker network

While this solves the initial connectivity issue from a devcontainer, the cluster creation will still not work seamlessly as the "kind" docker network is automatically created. And this docker network does not automatically have connectivity to the dev-container.

A simple solution for this is that the user is allowed to specify the docker-network that kind should use when starting the up the containers. Perhaps with a `--docker-network=""` flag?

But KinD does not expose this as a configuration option in the go-library.

The only solution that i have found is to set the environment variable `KIND_EXPERIMENTAL_DOCKER_NETWORK`.

I quickly tested to set this environment-variable before the cluster creation before [this line](https://github.com/crossplane/cli/blob/main/internal/project/controlplane/controlplane.go#L449) and it worked:

```
os.Setenv("KIND_EXPERIMENTAL_DOCKER_NETWORK", "the-network-my-devcontainer-is-in")
```

3) Configure containerd registry mirrors

The last hurdle to overcome i believe, is configuring the containerd registry mirrors so that KinD fetches images from the configured registry-proxies.

In closed network environments, it is usually required that container-images are fetched via a central registry, so for example docker.io cannot be reached directly.

With the assumption that if a user passes ImageConfigs via the `--init-resources` flag, the user also most likely would like to configure the containerd registry mirrors, it seems like the best option is to parse the `ImageConfigs` the user supplies and configure the containerd with the `containerdConfigPatches` option in KinD like this:

```yaml
containerdConfigPatches:
- |
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker-remote.my-registry-proxy.com"]
```

This could be done in the existing [createKindClusterConfig](https://github.com/crossplane/cli/blob/81bfd23f1e7edc0e6a94580c4bc5366c72390b46/internal/project/controlplane/controlplane.go#L472) function.

What do you think? I'd be happy to send in a PR and test it more, but is this something you want to add support for?

Let me know if you have any questions!

### What problem are you facing?

Running `crossplane project` in a dev-container and closed company network.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.