feat: add first class support for private github repos (#1271)

Signed-off-by: Devin Buhl <devin@buhl.casa>
This commit is contained in:
Devin Buhl authored and GitHub committed 2024-01-29 20:57:58 -05:00
1 parent 95bf353f7e
commit 8ef31af331
9 files changed
+49 -93

No files matched your search

+2
View File
@@ -32,6 +32,8 @@ flux:
webhook: webhook:
enabled: true enabled: true
token: fake token: fake
private:
enabled: false
sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY
cloudflare: cloudflare:
+2
View File
@@ -32,6 +32,8 @@ flux:
webhook: webhook:
enabled: true enabled: true
token: fake token: fake
private:
enabled: false
sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY
cloudflare: cloudflare:
+2
View File
@@ -32,6 +32,8 @@ flux:
webhook: webhook:
enabled: true enabled: true
token: fake token: fake
private:
enabled: false
sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY
cloudflare: cloudflare:
+2
View File
@@ -32,6 +32,8 @@ flux:
webhook: webhook:
enabled: true enabled: true
token: fake token: fake
private:
enabled: false
sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY sops_age_public_key: $BOOTSTRAP_AGE_PUBLIC_KEY
cloudflare: cloudflare:
+4 -2
View File
@@ -7,6 +7,7 @@ vars:
PROMETHEUS_OPERATOR_VERSION: v0.71.2 PROMETHEUS_OPERATOR_VERSION: v0.71.2
CLUSTER_SECRET_SOPS_FILE: "{{.KUBERNETES_DIR}}/flux/vars/cluster-secrets.sops.yaml" CLUSTER_SECRET_SOPS_FILE: "{{.KUBERNETES_DIR}}/flux/vars/cluster-secrets.sops.yaml"
CLUSTER_SETTINGS_FILE: "{{.KUBERNETES_DIR}}/flux/vars/cluster-settings.yaml" CLUSTER_SETTINGS_FILE: "{{.KUBERNETES_DIR}}/flux/vars/cluster-settings.yaml"
GITHUB_DEPLOY_KEY_FILE: "{{.KUBERNETES_DIR}}/bootstrap/github-deploy-key.sops.yaml"
tasks: tasks:
@@ -63,7 +64,8 @@ tasks:
- { msg: "Flux not installed", sh: "kubectl get namespace flux-system --kubeconfig {{.KUBECONFIG_FILE}} &>/dev/null && exit 0 || exit 1" } - { msg: "Flux not installed", sh: "kubectl get namespace flux-system --kubeconfig {{.KUBECONFIG_FILE}} &>/dev/null && exit 0 || exit 1" }
github-deploy-key: github-deploy-key:
cmd: sops --decrypt {{.KUBERNETES_DIR}}/bootstrap/github-deploy-key.sops.yaml | kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --filename - cmd: sops --decrypt {{.GITHUB_DEPLOY_KEY_FILE}} | kubectl apply --kubeconfig {{.KUBECONFIG_FILE}} --server-side --filename -
preconditions: preconditions:
- { msg: "Missing kubeconfig", sh: "test -f {{.KUBECONFIG_FILE}}" } - { msg: "Missing kubeconfig", sh: "test -f {{.KUBECONFIG_FILE}}" }
- { msg: "Flux not installed", sh: "kubectl get namespace flux-system --kubeconfig {{.KUBECONFIG_FILE}} &>/dev/null && exit 0 || exit 1" } - { msg: "Missing Sops Age key file", sh: "test -f {{.AGE_FILE}}" }
- { msg: "Missing Github deploy key file", sh: "test -f {{.GITHUB_DEPLOY_KEY_FILE}}" }
+4 -90
View File
@@ -392,7 +392,7 @@ You have two different options for setting up your local workstation.
### 🔹 Stage 6: Install Flux in your cluster ### 🔹 Stage 6: Install Flux in your cluster
> [!IMPORTANT] > [!NOTE]
> Skip this stage if you have **disabled** Flux in the `config.yaml` > Skip this stage if you have **disabled** Flux in the `config.yaml`
1. Verify Flux can be installed 1. Verify Flux can be installed
@@ -407,6 +407,9 @@ You have two different options for setting up your local workstation.
2. Install Flux and sync the cluster to the Git repository 2. Install Flux and sync the cluster to the Git repository
> [!IMPORTANT]
> Run `task flux:github-deploy-key` first if using a private repository.
```sh ```sh
task flux:bootstrap task flux:bootstrap
# namespace/flux-system configured # namespace/flux-system configured
@@ -579,95 +582,6 @@ To browse or get ideas on applications people are running, community member [@wh
The included CSI (openebs in local-hostpath mode) is a great start for storage but soon you might find you need more features like replicated block storage, or to connect to a NFS/SMB/iSCSI server. If you need any of those features be sure to check out the projects like [rook-ceph](https://github.com/rook/rook), [longhorn](https://github.com/longhorn/longhorn), [openebs](https://github.com/openebs/openebs), [democratic-csi](https://github.com/democratic-csi/democratic-csi), [csi-driver-nfs](https://github.com/kubernetes-csi/csi-driver-nfs), The included CSI (openebs in local-hostpath mode) is a great start for storage but soon you might find you need more features like replicated block storage, or to connect to a NFS/SMB/iSCSI server. If you need any of those features be sure to check out the projects like [rook-ceph](https://github.com/rook/rook), [longhorn](https://github.com/longhorn/longhorn), [openebs](https://github.com/openebs/openebs), [democratic-csi](https://github.com/democratic-csi/democratic-csi), [csi-driver-nfs](https://github.com/kubernetes-csi/csi-driver-nfs),
and [synology-csi](https://github.com/SynologyOpenSource/synology-csi). and [synology-csi](https://github.com/SynologyOpenSource/synology-csi).
#### Authenticate Flux over SSH
<details>
<summary><i>Click <b>here</b> to read guide on adding Flux SSH authentication</i></summary>
Authenticating Flux to your git repository has a couple benefits like using a private git repository and/or using the Flux [Image Automation Controllers](https://fluxcd.io/docs/components/image/).
By default this template only works on a public Github repository, it is advised to keep your repository public.
The benefits of a public repository include:
- Debugging or asking for help, you can provide a link to a resource you are having issues with.
- Adding a topic to your repository of `kubesearch` to be included in the [Kubesearch](https://kubesearch.dev) results. This search helps people discover different configurations of Helm charts across others Flux based repositories.
1. Generate new SSH key:
```sh
ssh-keygen -t ecdsa -b 521 -C "github-deploy-key" -f ./kubernetes/bootstrap/github-deploy.key -q -P ""
```
2. Paste public key in the deploy keys section of your repository settings
3. Create sops secret in `./kubernetes/bootstrap/github-deploy-key.sops.yaml` with the contents of:
```yaml
apiVersion: v1
kind: Secret
metadata:
name: github-deploy-key
namespace: flux-system
stringData:
# 3a. Contents of github-deploy-key
identity: |
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
# 3b. Output of curl --silent https://api.github.com/meta | jq --raw-output '"github.com "+.ssh_keys[]'
known_hosts: |
github.com ssh-ed25519 ...
github.com ecdsa-sha2-nistp256 ...
github.com ssh-rsa ...
```
4. Encrypt secret:
```sh
sops --encrypt --in-place ./kubernetes/bootstrap/github-deploy-key.sops.yaml
```
5. Apply secret to cluster:
```sh
sops --decrypt ./kubernetes/bootstrap/github-deploy-key.sops.yaml | kubectl apply -f -
```
6. Update `./kubernetes/flux/config/cluster.yaml`:
```yaml
apiVersion: source.toolkit.fluxcd.io/v1beta2
kind: GitRepository
metadata:
name: home-kubernetes
namespace: flux-system
spec:
interval: 10m
# 6a: Change this to your user and repo names
url: ssh://git@github.com/$user/$repo
ref:
branch: main
secretRef:
name: github-deploy-key
```
7. Commit and push changes
8. Force flux to reconcile your changes
```sh
flux reconcile -n flux-system kustomization cluster --with-source
```
9. Verify git repository is now using SSH:
```sh
flux get sources git -A
```
10. Optionally set your repository to Private in your repository settings.
</details>
## 🙌 Related Projects ## 🙌 Related Projects
If this repo is too hot to handle or too cold to hold check out these following projects. If this repo is too hot to handle or too cold to hold check out these following projects.
@@ -0,0 +1,17 @@
{% if flux.github.private.enabled %}
---
apiVersion: v1
kind: Secret
metadata:
name: github-deploy-key
namespace: flux-system
stringData:
identity: |
{% filter indent(width=4, first=False) %}
{{ flux.github.private.key }}
{%- endfilter %}
known_hosts: |
github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl
github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg=
github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=
{% endif %}
@@ -7,7 +7,7 @@ metadata:
spec: spec:
interval: 30m interval: 30m
url: "{{ flux.github.address }}" url: "{{ flux.github.address }}"
{% if flux.github.address.startswith('ssh://') %} {% if flux.github.private.enabled %}
secretRef: secretRef:
name: github-deploy-key name: github-deploy-key
{% endif %} {% endif %}
+15
View File
@@ -66,6 +66,21 @@ flux:
enabled: true enabled: true
# Token for Github push-based sync (openssl rand -hex 16) # Token for Github push-based sync (openssl rand -hex 16)
token: "" token: ""
# (Required) Private key for Flux to access the Github repository
private:
# (Required) Enable to use a private Github repository
enabled: false
# Private key for Flux to access the Github repository
# 1. Generate a new key with the following command:
# ssh-keygen -t ecdsa -b 521 -C "github-deploy-key" -f github-deploy.key -q -P ""
# 2. Make sure to paste public key from "github-deploy.key.pub"
# into the deploy keys section of your repository settings
# 3. Uncomment and paste the private key below
# key: |
# -----BEGIN OPENSSH PRIVATE KEY-----
# ...
# -----END OPENSSH PRIVATE KEY-----
# (Required) Age Public Key (e.g. age15uzrw396e67z9wdzsxzdk7ka0g2gr3l460e0slaea563zll3hdfqwqxdta) # (Required) Age Public Key (e.g. age15uzrw396e67z9wdzsxzdk7ka0g2gr3l460e0slaea563zll3hdfqwqxdta)
sops_age_public_key: "" sops_age_public_key: ""