This setup expects you to have two clusters running and uses the following conventions for KUBECONFIGS:
# kubeconfig to access the cluster kcp is running in
export KUBECONFIG=kcp-cluster.kubeconfig
# kubeconfig to access the cluster cloudnativepg is running in
export KUBECONFIG=provider.kubeconfigfollowing commands are all in kcp Kubernetes cluster
export KUBECONFIG=kcp-cluster.kubeconfigkubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.18.2/cert-manager.crds.yaml
helm upgrade \
--install \
--wait \
--namespace cert-manager \
--create-namespace \
--version v1.18.2 \
cert-manager jetstack/cert-managerhelm upgrade \
--install \
--values ./kcp/values.yaml \
--namespace kcp \
--create-namespace \
--version "0.12.5" \
kcp kcp/kcpexport KCP_EXTERNAL_HOSTNAME=$(yq '.externalHostname' kcp/values.yaml)
kubectl --kubeconfig=kcp-admin.kubeconfig config set-cluster base --server https://$KCP_EXTERNAL_HOSTNAME:8443 --certificate-authority=ca.crt
kubectl --kubeconfig=kcp-admin.kubeconfig config set-cluster root --server https://$KCP_EXTERNAL_HOSTNAME:8443/clusters/root --certificate-authority=ca.crtkubectl apply -f kcp/admin-client-cert-request.yaml
kubectl get secret cluster-admin-client-cert -o=jsonpath='{.data.tls\.crt}' | base64 -d > client.crt
kubectl get secret cluster-admin-client-cert -o=jsonpath='{.data.tls\.key}' | base64 -d > client.key
chmod 600 client.crt client.key
kubectl --kubeconfig=kcp-admin.kubeconfig config set-credentials kcp-admin --client-certificate=client.crt --client-key=client.key --embed-certs=true
kubectl --kubeconfig=kcp-admin.kubeconfig config set-context base --cluster=base --user=kcp-admin
kubectl --kubeconfig=kcp-admin.kubeconfig config set-context root --cluster=root --user=kcp-admin
kubectl --kubeconfig=kcp-admin.kubeconfig config use-context rootexport KUBECONFIG="kcp-admin.kubeconfig"
kubectl create workspace providerAll the following commands are to be run using the provider kubeconfig
export KUBECONFIG=provider.kubeconfigkubectl apply --server-side -f \
https://raw.githubusercontent.com/cloudnative-pg/cloudnative-pg/release-1.27/releases/cnpg-1.27.0.yamlCreate the provider kcp kubeconfig. Note for breviety we are just re-using the admin certificate here. For prod setups, of course you would re-use the Certificate approach outlined earlier.
yq '.clusters[0].cluster.server += ":provider"' kcp-admin.kubeconfig | sed 's/admin-kcp/provider-kcp/g' > provider-kcp.kubeconfig
kubectl --kubeconfig=provider-kcp.kubeconfig config set-credentials kcp-admin --client-key=client.key --client-certificate=client.crt --embed-certs=true
kubectl --kubeconfig=provider-kcp.kubeconfig config set-cluster "workspace.kcp.io/current" --server https://$KCP_EXTERNAL_HOSTNAME:8443/clusters/root:provider --certificate-authority=ca.crt --embed-certs=trueexport KUBECONFIG="provider-kcp.kubeconfig"
k apply -f provider/databases-apiexport.yamlInstall kcp-api-syncagent:
export KUBECONFIG=provider.kubeconfig
kubectl create namespace kcp-sync-agent
kubectl create secret generic kcp-kubeconfig -n kcp-sync-agent --from-file=kubeconfig=provider-kcp.kubeconfig
kubectl apply -f api-syncagent/rbac.yaml
helm upgrade \
--install \
--values api-syncagent/values.yaml \
--namespace kcp-sync-agent \
--create-namespace \
--version "0.4.2" \
kcp-api-syncagent kcp/api-syncagentexport KUBECONFIG=provider.kubeconfig
kubectl apply -f api-syncagent/published-resource.yamlexport KUBECONFIG=kcp-admin.kubeconfig
kubectl create workspace consumer
yq '.clusters[0].cluster.server += ":consumer"' kcp-admin.kubeconfig | sed 's/admin-kcp/provider-kcp/g' > consumer-kcp.kubeconfig
kubectl --kubeconfig=consumer-kcp.kubeconfig config set-cluster "workspace.kcp.io/current" --server https://$KCP_EXTERNAL_HOSTNAME:8443/clusters/root:consumer --certificate-authority=ca.crt --embed-certs=trueexport KUBECONFIG=consumer-kcp.kubeconfig
kubectl apply -f consumer/api-binding.yamlexport KUBECONFIG=consumer-kcp.kubeconfig
kubectl apply -f consumer/postgres-cluster.yaml