-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcreate-user.sh
More file actions
135 lines (112 loc) · 5.66 KB
/
create-user.sh
File metadata and controls
135 lines (112 loc) · 5.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/bin/bash
# Этот скрипт создает изолированного пользователя в кластере Kubernetes
# Проверка наличия аргумента - имени пользователя
if [ -z "$1" ]; then
echo "Ошибка: Имя пользователя не указано"
echo "Использование: $0 <имя_пользователя>"
exit 1
fi
USER_NAME="$1"
TEMPLATES_DIR="./templates"
OUTPUT_DIR="./generated/${USER_NAME}"
# Создаем выходную директорию
mkdir -p "$OUTPUT_DIR"
# Функция для генерации файлов из шаблонов
generate_from_template() {
local template_file="$1"
local output_file="$2"
sed "s/\${USER_NAME}/$USER_NAME/g" "$template_file" > "$output_file"
echo "Сгенерирован файл: $output_file"
}
# Генерируем все файлы из шаблонов
for template in "$TEMPLATES_DIR"/*.template; do
filename=$(basename "$template" .template)
generate_from_template "$template" "$OUTPUT_DIR/${filename}"
done
# Генерируем пример deployment
sed "s/\${USER_NAME}/$USER_NAME/g" ./example-deployment.yaml > "$OUTPUT_DIR/example-deployment.yaml"
# Применяем сгенерированные манифесты
echo "Применяем манифесты для пользователя $USER_NAME..."
kubectl apply -f "$OUTPUT_DIR/namespace.yaml"
kubectl apply -f "$OUTPUT_DIR/serviceaccount.yaml"
kubectl apply -f "$OUTPUT_DIR/rbac.yaml"
kubectl apply -f "$OUTPUT_DIR/network-policy.yaml"
# Проверка наличия namespace traefik и установка лейбла при необходимости
if kubectl get namespace traefik >/dev/null 2>&1; then
if ! kubectl get namespace traefik -o json | grep -q '"name":"traefik"'; then
echo "Устанавливаем метку name=traefik для namespace traefik..."
kubectl label namespace traefik name=traefik --overwrite
fi
fi
# Генерация kubeconfig для пользователя
echo "Генерация kubeconfig файла для пользователя $USER_NAME..."
# Явное создание токена для сервисного аккаунта (работает с Kubernetes 1.24+)
echo "Создание токена для сервисного аккаунта $USER_NAME..."
TOKEN=$(kubectl create token "$USER_NAME" -n "$USER_NAME")
if [ -z "$TOKEN" ]; then
echo "Не удалось создать токен. Пробуем старый метод получения токена..."
# Запасной метод для старых версий Kubernetes
SECRET_NAME=$(kubectl -n "$USER_NAME" get serviceaccount "$USER_NAME" -o jsonpath='{.secrets[0].name}')
if [ -n "$SECRET_NAME" ]; then
TOKEN=$(kubectl -n "$USER_NAME" get secret "$SECRET_NAME" -o jsonpath='{.data.token}' | base64 --decode)
fi
if [ -z "$TOKEN" ]; then
echo "Ошибка: Не удалось получить токен для пользователя $USER_NAME"
exit 1
fi
fi
# Получение CA сертификата из текущего контекста администратора
echo "Получение CA сертификата из текущего контекста..."
CA_DATA=$(kubectl config view --raw -o jsonpath='{.clusters[0].cluster.certificate-authority-data}')
# Проверим, получили ли мы CA сертификат
if [ -z "$CA_DATA" ]; then
echo "Предупреждение: Не удалось получить certificate-authority-data из текущего контекста"
echo "Попробуем альтернативный метод..."
# Попытка получить CA из kubeconfig файла, если он существует
if [ -f "$HOME/.kube/config" ]; then
CA_DATA=$(grep -A 1 "certificate-authority-data" "$HOME/.kube/config" | tail -n 1 | sed 's/^ *//' | sed 's/: //')
fi
# Если все еще нет данных, пробуем получить из секрета
if [ -z "$CA_DATA" ]; then
echo "Попытка получить CA из секрета..."
SECRET_NAME=$(kubectl -n "$USER_NAME" get serviceaccount "$USER_NAME" -o jsonpath='{.secrets[0].name}')
CA_DATA=$(kubectl -n "$USER_NAME" get secret "$SECRET_NAME" -o jsonpath='{.data.ca\.crt}')
fi
if [ -z "$CA_DATA" ]; then
echo "Предупреждение: Не удалось получить CA сертификат. Kubeconfig может не работать без --insecure-skip-tls-verify=true"
fi
fi
# Получение информации о кластере
CLUSTER_NAME=$(kubectl config current-context)
CLUSTER_ENDPOINT=$(kubectl config view --minify -o jsonpath='{.clusters[0].cluster.server}')
# Создание kubeconfig файла
KUBECONFIG_FILE="$OUTPUT_DIR/${USER_NAME}-kubeconfig.yaml"
cat > "$KUBECONFIG_FILE" << EOF
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
certificate-authority-data: $CA_DATA
server: $CLUSTER_ENDPOINT
name: $CLUSTER_NAME
users:
- name: $USER_NAME
user:
token: $TOKEN
contexts:
- context:
cluster: $CLUSTER_NAME
namespace: $USER_NAME
user: $USER_NAME
name: $USER_NAME-context
current-context: $USER_NAME-context
EOF
echo "Готово! Создан пользователь $USER_NAME с изолированным namespace."
echo "Kubeconfig файл: $KUBECONFIG_FILE"
echo ""
echo "Для применения примера деплоймента выполните:"
echo "kubectl apply -f $OUTPUT_DIR/example-deployment.yaml"
echo ""
echo "Пользователь может использовать kubeconfig так:"
echo "kubectl --kubeconfig=$KUBECONFIG_FILE get pods"