Skip to content

Prepare the target cluster

Follow this guide to create a service account and generate a kubeconfig file from a target cluster. These are the only steps required to be performed in the target cluster.

For manual configuration, go to Manual Configuration, otherwise proceed to Setup Script.

Note

If your target cluster is under a server proxy for external communication, like those present on platforms like Rancher, we recommend generating a kubeconfig file through your own platform.

Normally these platforms handle their own tokens instead of a service account token.

Zora requires read-only access, as described here.

Setup Script

A script is available to prepare a cluster, which can be executed by any POSIX compliant shell.

curl -q https://zora-docs.undistro.io/v0.5/targetcluster.sh | sh

By default, the script uses the current context. But it's possible to set the target cluster context by exporting the CONTEXT:

curl -q https://zora-docs.undistro.io/v0.5/targetcluster.sh | CONTEXT=<TARGET_CONTEXT> sh

Or switching the current context via kubectl before running the script:

kubectl config use-context <TARGET_CONTEXT>
curl -q https://zora-docs.undistro.io/v0.5/targetcluster.sh | sh

The generated kubeconfig will be named as your Kuberntes context suffixed with -kubeconfig.yaml, by default.

Before finishing, the script will show a command to connect the target cluster through the generated kubeconfig, and save a sample Cluster manifest.

A complete list of customizable environment variables can be seen on the table below.

Environment Variable Description
SVC_ACCOUNT_NS Service Account namespace, defaults to zora-system
SVC_ACCOUNT_NAME Service Account name, defaults to zora-view
CLUSTER_ROLE_NAME Cluster Role name, defaults to zora-view
SVC_ACCOUNT_SECRET_NS Service Account Secret namespace, defaults to the value of SVC_ACCOUNT_NS
SVC_ACCOUNT_SECRET_NAME Service Account Secret name, defaults to the of value of SVC_ACCOUNT_NAME with the "-token" suffix
KCONFIG_SECRET_NAME Name of the displayed kubeconfig Secret, defaults to the value of CLUSTER_NAME with the "-kubeconfig" suffix
TOKEN_NAME Uses the value of SVC_ACCOUNT_SECRET_NAME or the one generated by K8s, according to the cluster version
CONTEXT K8s context, using the current one as default
CLUSTER_NAME Cluster name from the CONTEXT variable
CLUSTER_NS Cluster namespace used on the manifest sample, defaults to the value of SVC_ACCOUNT_NS
CLUSTER_CA Cluster Certificate Authority, extracted according to CONTEXT
CLUSTER_SERVER Cluster server address, extracted according to CONTEXT
KCONFIG_NAME Name of the generated kubeconfig, defaulting to the value of CONTEXT plus the string "_kubeconfig.yaml"
SAMPLE_MANIFEST_NAME Name of the Cluster manifest sample, defaults to cluster_sample.yaml plus the K8s context as prefix

The next instructions explain how to manually configure your target clusters.

Manual Configuration

The target cluster can be configured through the steps described in the next sections.

1. Access the target cluster

First, make sure you are in the context of the target cluster. You can do this by the following commands:

  • Display list of contexts: kubectl config get-contexts

  • Display the current-context: kubectl config current-context

  • Set the default context to my-target-cluster: kubectl config use-context my-target-cluster

2. Create the RBAC resources

Create the service account in a separate namespace and configure view permissions. The token generated by this service account will be used in the kubeconfig file.

Important

You should create a separate service account in the target cluster to connect it to Zora. This is required because the kubeconfig files generated by most cloud providers, call CLI commands, such as aws or gcloud, those can’t be called by Zora.

kubectl create namespace zora-system
kubectl -n zora-system create serviceaccount zora-view
cat << EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: zora-view
rules:
  - apiGroups: [ "" ]
    resources:
      - configmaps
      - endpoints
      - limitranges
      - namespaces
      - nodes
      - persistentvolumes
      - persistentvolumeclaims
      - pods
      - replicationcontrollers
      - secrets
      - serviceaccounts
      - services
    verbs: [ "get", "list" ]
  - apiGroups: [ "apps" ]
    resources:
      - daemonsets
      - deployments
      - statefulsets
      - replicasets
    verbs: [ "get", "list" ]
  - apiGroups: [ "autoscaling" ]
    resources:
      - horizontalpodautoscalers
    verbs: [ "get", "list" ]
  - apiGroups: [ "networking.k8s.io" ]
    resources:
      - ingresses
      - networkpolicies
    verbs: [ "get", "list" ]
  - apiGroups: [ "policy" ]
    resources:
      - poddisruptionbudgets
      - podsecuritypolicies
    verbs: [ "get", "list" ]
  - apiGroups: [ "rbac.authorization.k8s.io" ]
    resources:
      - clusterroles
      - clusterrolebindings
      - roles
      - rolebindings
    verbs: [ "get", "list" ]
  - apiGroups: [ "metrics.k8s.io" ]
    resources:
      - pods
      - nodes
    verbs: [ "get", "list" ]
  - apiGroups: [ batch ]
    resources:
      - jobs
      - cronjobs
    verbs: [ "get", "list" ]
  - apiGroups: [ admissionregistration.k8s.io ]
    resources:
      - validatingwebhookconfigurations
      - mutatingwebhookconfigurations
    verbs: [ "get", "list" ]
EOF
kubectl create clusterrolebinding zora-view --clusterrole=zora-view --serviceaccount=zora-system:zora-view

Info

Zora requires just view permissions of your target clusters.

3. Set up the environment variables

Set up the following environment variables based on the Kubernetes version of the target cluster.

You can verify the version of your cluster by running:

kubectl version

The Server Version is the version of Kubernetes your target cluster is running.

export TOKEN_NAME=$(kubectl -n zora-system get serviceaccount zora-view -o=jsonpath='{.secrets[0].name}')
export TOKEN_VALUE=$(kubectl -n zora-system get secret ${TOKEN_NAME} -o=jsonpath='{.data.token}' | base64 --decode)
export CURRENT_CONTEXT=$(kubectl config current-context)
export CURRENT_CLUSTER=$(kubectl config view --raw -o=go-template='{{range .contexts}}{{if eq .name "'''${CURRENT_CONTEXT}'''"}}{{ index .context "cluster" }}{{end}}{{end}}')
export CLUSTER_CA=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}"{{with index .cluster "certificate-authority-data" }}{{.}}{{end}}"{{ end }}{{ end }}')
export CLUSTER_SERVER=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}{{ .cluster.server }}{{end}}{{ end }}')
export TOKEN_NAME="zora-view-token"
cat << EOF | kubectl apply -f - 
apiVersion: v1
kind: Secret
metadata:
    name: "$TOKEN_NAME"
    namespace: "zora-system"
    annotations:
        kubernetes.io/service-account.name: "zora-view"
type: kubernetes.io/service-account-token
EOF
export TOKEN_VALUE=$(kubectl -n zora-system get secret ${TOKEN_NAME} -o=jsonpath='{.data.token}' | base64 --decode)
export CURRENT_CONTEXT=$(kubectl config current-context)
export CURRENT_CLUSTER=$(kubectl config view --raw -o=go-template='{{range .contexts}}{{if eq .name "'''${CURRENT_CONTEXT}'''"}}{{ index .context "cluster" }}{{end}}{{end}}')
export CLUSTER_CA=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}"{{with index .cluster "certificate-authority-data" }}{{.}}{{end}}"{{ end }}{{ end }}')
export CLUSTER_SERVER=$(kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}{{ .cluster.server }}{{end}}{{ end }}')

4. Generate a kubeconfig file

Generate a file with kubeconfig data, based on the environment variables defined before:

cat << EOF > zora-view-kubeconfig.yml
apiVersion: v1
kind: Config
current-context: ${CURRENT_CONTEXT}
contexts:
- name: ${CURRENT_CONTEXT}
  context:
    cluster: ${CURRENT_CONTEXT}
    user: zora-view
clusters:
- name: ${CURRENT_CONTEXT}
  cluster:
    certificate-authority-data: ${CLUSTER_CA}
    server: ${CLUSTER_SERVER}
users:
- name: zora-view
  user:
    token: ${TOKEN_VALUE}
EOF
Example of a generated kubeconfig file
apiVersion: v1
kind: Config
current-context: mycluster-prod
contexts:
- name: mycluster-prod
  context:
    cluster: mycluster-prod
    user: zora-view
clusters:
- name: mycluster-prod
  cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJU...OMITTED
    server: https://OMITTED.us-east-1.eks.amazonaws.com
users:
- name: zora-view
  user:
    token: eyJhbGciOiJSUzI1NiIs...OMITTED

Verify the generated kubeconfig

These steps create a file in your current working directory called zora-view-kubeconfig.yml. The contents of this file are used in the next guide to connect this target cluster into Zora.

Before using this kubeconfig, you can verify that it is functional by running:

kubectl --kubeconfig zora-view-kubeconfig.yml get all --all-namespaces