Чтобы GitLab Runner мог управлять кластером (деплой, импорт образов и т.п.), ему нужен доступ к kubeconfig и при необходимости — право выполнять команды с sudo.
Сводка
| Действие | Назначение |
|---|---|
| Настройка kubeconfig для gitlab-runner | Копирует kubeconfig в ~gitlab-runner/.kube, настраивает права; проверка доступа через kubectl от имени gitlab-runner |
| Настройка sudo для gitlab-runner | Создаёт sudoers: разрешённые команды без пароля (например, импорт образов в containerd) |
Настройка kubeconfig для gitlab-runner
Сохраните в файл и выполните от root. Требуется пользователь gitlab-runner. После переустановки кластера запустите снова.
#!/bin/bash
# Настройка прав доступа gitlab-runner к Kubernetes
set -e
echo "=== Настройка прав доступа gitlab-runner к Kubernetes ==="
if [ "$EUID" -ne 0 ]; then echo "Запустите от root: sudo bash $0"; exit 1; fi
if ! id gitlab-runner >/dev/null 2>&1; then echo "Пользователь gitlab-runner не найден"; exit 1; fi
GITLAB_RUNNER_HOME=$(getent passwd gitlab-runner | cut -d: -f6)
[ -z "$GITLAB_RUNNER_HOME" ] && { echo "Не удалось определить домашнюю директорию gitlab-runner"; exit 1; }
mkdir -p "$GITLAB_RUNNER_HOME/.kube"
chown gitlab-runner:gitlab-runner "$GITLAB_RUNNER_HOME/.kube"
chmod 700 "$GITLAB_RUNNER_HOME/.kube"
if [ -f /etc/kubernetes/super-admin.conf ]; then
cp /etc/kubernetes/super-admin.conf "$GITLAB_RUNNER_HOME/.kube/config"
elif [ -f /root/.kube/config ]; then
cp /root/.kube/config "$GITLAB_RUNNER_HOME/.kube/config"
else
echo "kubeconfig не найден в /etc/kubernetes/super-admin.conf или /root/.kube/config"; exit 1
fi
chown gitlab-runner:gitlab-runner "$GITLAB_RUNNER_HOME/.kube/config"
chmod 600 "$GITLAB_RUNNER_HOME/.kube/config"
if [ -f /usr/local/bin/kubectl ]; then
if ! grep -q 'export PATH.*usr/local/bin' "$GITLAB_RUNNER_HOME/.bashrc" 2>/dev/null; then
echo '' >> "$GITLAB_RUNNER_HOME/.bashrc"
echo 'export PATH="/usr/local/bin:$PATH"' >> "$GITLAB_RUNNER_HOME/.bashrc"
chown gitlab-runner:gitlab-runner "$GITLAB_RUNNER_HOME/.bashrc"
fi
fi
KUBECTL_PATH="/usr/local/bin/kubectl"
[ ! -f "$KUBECTL_PATH" ] && KUBECTL_PATH=$(command -v kubectl || echo "kubectl")
echo "Проверка доступа..."
if sudo -u gitlab-runner "$KUBECTL_PATH" get nodes >/dev/null 2>&1; then
echo "✓ gitlab-runner имеет доступ к кластеру"
sudo -u gitlab-runner "$KUBECTL_PATH" get nodes
else
echo "⚠ kubectl недоступен для gitlab-runner или кластер не запущен"
fi
echo "KUBECONFIG: $GITLAB_RUNNER_HOME/.kube/config"
echo "=== Настройка завершена ==="
Настройка sudo для gitlab-runner
Сохраните в файл и выполните от root один раз. Создаёт /etc/sudoers.d/gitlab-runner-k8s.
#!/bin/bash
# Настройка sudo для gitlab-runner (выполнить один раз от root)
set -e
echo "=== Настройка sudo для gitlab-runner ==="
if [ "$EUID" -ne 0 ]; then echo "Запустите от root: sudo bash $0"; exit 1; fi
if ! id gitlab-runner >/dev/null 2>&1; then echo "Пользователь gitlab-runner не найден"; exit 1; fi
GITLAB_RUNNER_HOME=$(getent passwd gitlab-runner | cut -d: -f6)
SUDOERS_FILE="/etc/sudoers.d/gitlab-runner-k8s"
cat > "$SUDOERS_FILE" << 'SUDOERS_EOF'
# Разрешения для gitlab-runner для работы с Kubernetes
gitlab-runner ALL=(ALL) NOPASSWD: /bin/cp /etc/kubernetes/super-admin.conf /home/gitlab-runner/.kube/config
gitlab-runner ALL=(ALL) NOPASSWD: /bin/cp /root/.kube/config /home/gitlab-runner/.kube/config
gitlab-runner ALL=(ALL) NOPASSWD: /bin/chown gitlab-runner\:gitlab-runner /home/gitlab-runner/.kube/config
gitlab-runner ALL=(ALL) NOPASSWD: /bin/chmod 600 /home/gitlab-runner/.kube/config
gitlab-runner ALL=(ALL) NOPASSWD: /bin/mkdir -p /home/gitlab-runner/.kube
SUDOERS_EOF
chmod 440 "$SUDOERS_FILE"
visudo -c -f "$SUDOERS_FILE" && echo "✓ Sudoers файл создан: $SUDOERS_FILE" || { rm -f "$SUDOERS_FILE"; exit 1; }
echo "=== Настройка завершена ==="
Когда использовать
После установки Kubernetes, если CI/CD джобы должны деплоить в кластер или работать с образами на узле. Документируйте порядок настройки в runbook.
Итого: Два блока кода выше: первый даёт Runner доступ к кластеру через kubeconfig, второй — право на sudo для операций с образами. Сохраните каждый в файл и выполните от root.