119 lines
3.1 KiB
Bash
119 lines
3.1 KiB
Bash
#!/usr/bin/env bash
|
|
###########################################################
|
|
#./kube-provisioning.sh dev cicd-user kubeconfig-dev.yaml
|
|
#arg1 = namespace
|
|
#arg2 = env (dev|qa|prod)
|
|
###########################################################
|
|
|
|
set -euo pipefail
|
|
|
|
############################################
|
|
# CONFIG
|
|
############################################
|
|
|
|
NAMESPACE=${1:-dev}-$2
|
|
SERVICE_ACCOUNT="deployer"
|
|
KUBECONFIG_FILE=${NAMESPACE}.yaml
|
|
|
|
echo "Namespace: $NAMESPACE"
|
|
echo "ServiceAccount: $SERVICE_ACCOUNT"
|
|
echo "Output kubeconfig: $KUBECONFIG_FILE"
|
|
|
|
############################################
|
|
# CHECK REQUIREMENTS
|
|
############################################
|
|
|
|
if ! command -v kubectl >/dev/null 2>&1; then
|
|
echo "kubectl not found"
|
|
exit 1
|
|
fi
|
|
|
|
############################################
|
|
# CREATE NAMESPACE
|
|
############################################
|
|
|
|
kubectl get ns "$NAMESPACE" >/dev/null 2>&1 || kubectl create namespace "$NAMESPACE"
|
|
|
|
############################################
|
|
# CREATE SERVICE ACCOUNT
|
|
############################################
|
|
|
|
kubectl -n "$NAMESPACE" get sa "$SERVICE_ACCOUNT" >/dev/null 2>&1 || \
|
|
kubectl -n "$NAMESPACE" create serviceaccount "$SERVICE_ACCOUNT"
|
|
|
|
############################################
|
|
# CREATE ROLE
|
|
############################################
|
|
|
|
cat <<EOF | kubectl apply -f -
|
|
apiVersion: rbac.authorization.k8s.io/v1
|
|
kind: Role
|
|
metadata:
|
|
name: namespace-deployer
|
|
namespace: $NAMESPACE
|
|
rules:
|
|
- apiGroups: ["", "apps", "batch", "networking.k8s.io"]
|
|
resources: ["*"]
|
|
verbs: ["*"]
|
|
EOF
|
|
|
|
############################################
|
|
# CREATE ROLE BINDING
|
|
############################################
|
|
|
|
kubectl -n "$NAMESPACE" get rolebinding namespace-deployer-binding >/dev/null 2>&1 || \
|
|
kubectl create rolebinding namespace-deployer-binding \
|
|
--role=namespace-deployer \
|
|
--serviceaccount=${NAMESPACE}:${SERVICE_ACCOUNT} \
|
|
-n "$NAMESPACE"
|
|
|
|
############################################
|
|
# GENERATE TOKEN
|
|
############################################
|
|
|
|
TOKEN=$(kubectl create token "$SERVICE_ACCOUNT" -n "$NAMESPACE")
|
|
|
|
############################################
|
|
# CLUSTER INFO
|
|
############################################
|
|
|
|
CLUSTER_NAME=$(kubectl config view --minify -o jsonpath='{.clusters[0].name}')
|
|
CLUSTER_SERVER=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
|
|
CLUSTER_CA=$(kubectl config view --raw --minify -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')
|
|
|
|
############################################
|
|
# GENERATE KUBECONFIG
|
|
############################################
|
|
|
|
cat <<EOF > "$KUBECONFIG_FILE"
|
|
apiVersion: v1
|
|
kind: Config
|
|
clusters:
|
|
- cluster:
|
|
certificate-authority-data: ${CLUSTER_CA}
|
|
server: ${CLUSTER_SERVER}
|
|
name: ${CLUSTER_NAME}
|
|
|
|
contexts:
|
|
- context:
|
|
cluster: ${CLUSTER_NAME}
|
|
namespace: ${NAMESPACE}
|
|
user: ${SERVICE_ACCOUNT}
|
|
name: ${SERVICE_ACCOUNT}-${CLUSTER_NAME}
|
|
|
|
current-context: ${SERVICE_ACCOUNT}-${CLUSTER_NAME}
|
|
|
|
users:
|
|
- name: ${SERVICE_ACCOUNT}
|
|
user:
|
|
token: ${TOKEN}
|
|
EOF
|
|
|
|
echo
|
|
echo "Kubeconfig generated:"
|
|
echo "$KUBECONFIG_FILE"
|
|
|
|
echo
|
|
echo "Test command:"
|
|
echo "kubectl --kubeconfig=$KUBECONFIG_FILE get pods"
|