04 03 Install gitlab - kropachev/1c-devops-jr GitHub Wiki
Создаем директорию для манифестов и конфигурационных файлов.
mkdir -p /k3s-1c-ci/gitlab
cd /k3s-1c-ci/gitlabkubectl create namespace gitlab --dry-run=client -o yaml | kubectl apply -f -Команда создает Secret или обновляет, если, например, был перевыпущен сертификат:
kubectl create secret tls onecci.lan.tls \
--cert=/k3s-1c-ci/tls/tls.crt \
--key=/k3s-1c-ci/tls/tls.key \
-n gitlab \
--dry-run=client -o yaml | kubectl apply -f -Проверяем:
kubectl get secret onecci.lan.tls -n gitlabЭто нужно, чтобы при пересоздании подов SSH fingerprint GitLab не менялся (иначе клиенты будут ругаться на MITM)
mkdir -p hostKeysssh-keygen -t rsa -f hostKeys/ssh_host_rsa_key -N ""
ssh-keygen -t ecdsa -f hostKeys/ssh_host_ecdsa_key -N ""
ssh-keygen -t ed25519 -f hostKeys/ssh_host_ed25519_key -N ""kubectl -n gitlab create secret generic gitlab-gitlab-shell-host-keys \
--from-file hostKeys \
--dry-run=client -o yaml | kubectl apply -f -Traefik нужно открыть порт для GitLab Shell (SSH daemon). На реальном узле k3s порт 22 может быть занят системным SSH, поэтому делаем порт 2222.
В k3s любой манифест в /var/lib/rancher/k3s/server/manifests будет автоматически применяться.
Создаем файл:
sudo nano /var/lib/rancher/k3s/server/manifests/traefik-config-gitlab-ssh.yamlapiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
name: traefik
namespace: kube-system
spec:
valuesContent: |-
ports:
gitlab-shell:
expose:
default: true
port: 2222
exposedPort: 2222
protocol: TCPПроверка, что Traefik применил конфиг:
kubectl -n kube-system get pods -l app.kubernetes.io/name=traefik
kubectl -n kube-system get svc traefikВ колонке POT(S) должен появиться порт 2222.
Проверяем группу CRD для apiVersion.
kubectl get crd | grep -i ingressroutetcp- ingressroutetcps.traefik.io - apiVersion: traefik.io/v1alpha1
- ingressroutetcps.traefik.containo.us - apiVersion: traefik.containo.us/v1alpha1
Создаем файл настроек
nano gitlab-ssh-ingressroutetcp.yamlapiVersion: traefik.io/v1alpha1
kind: IngressRouteTCP
metadata:
name: gitlab-ssh
namespace: gitlab
spec:
entryPoints:
- gitlab-shell
routes:
- match: HostSNI(`*`)
services:
- name: gitlab-gitlab-shell
port: 2222Применяем
kubectl apply -f gitlab-ssh-ingressroutetcp.yamlПроверяем
kubectl -n gitlab get ingressroutetcp
kubectl -n gitlab describe ingressroutetcp gitlab-sshСоздаем файл
nano gitlab-values.yamlglobal:
edition: ce
hosts:
domain: onecci.lan
https: true
ingress:
class: traefik
tls:
secretName: onecci.lan.tls
configureCertmanager: false
shell:
port: 2222
registry:
enabled: false
gitlab:
webservice:
resources:
requests:
memory: "1.5Gi"
cpu: "500m"
minReplicas: 1
maxReplicas: 1
sidekiq:
resources:
requests:
memory: "1Gi"
cpu: "500m"
minReplicas: 1
maxReplicas: 1
gitlab-runner:
install: false
nginx-ingress:
enabled: false
registry:
enabled: false
installCertmanager: falseНа что обратить внимание
- global.edition: ce - устанавливать community edition
- global.hosts.domain - используемый домен
- global.ingress.class: traefik - gitlab может попытаться использовать nginx-ingress
-
global.ingress.tls.secretName - ранее мы создавали tls секрет, посмотреть можно командой
kubectl get secret -n <namespace> - global.ingress.configureCertmanager: false - не пытаться автоматически выпускать сертификат, использовать то что есть.
- global.shell.port - фиксирует ssh порт (мы настраивали 2222)
- global.registry.enabled: true - включает GitLab Container Registry
- gitlab.webservice.resources.requests - (опционально) минимальное количество ресурсов необходимое для запуска. По-умолчанию webservice запускается в двух экземплярах и просит по 2,5 гигабайт оперативки. Расточительно для хоумлаба.
- gitlab.webservice.minReplicas/maxReplicas - (опционально) количество запускаемых экземпляров. Для хоумлаба ставим 1 (по-умполчанию 2).
- gitlab.sidekiq.resources.requests - (опционально) аналогичная настройка для сервиса sidekiq - минимальное количество ресурсов. По-умолчанию sidekiq просит по 2 гигабайта оперативки.
- gitlab-runner.install: false - во-первых мы будем использовать jenkins, во-вторых для установки раннера нужен токен, который можно получить только в установленном gitlab.
- nginx-ingress.enabled: false - отключает компонент nginx
- installCertmanager: false - отключает компонент cert-manager
Добавляем Helm-репозиторий gitlab
helm repo add gitlab https://charts.gitlab.io
helm repo updateВыполняем установку
helm upgrade --install gitlab gitlab/gitlab \
--namespace gitlab \
-f gitlab-values.yaml \
--timeout 20m⚠️ Ошибка Error: Kubernetes cluster unreachable
Здесь может появиться ошибка
Error: Kubernetes cluster unreachable: Get "http://localhost:8080/version": dial tcp 127.0.0.1:8080: connect: connection refusedЭта ошибка почти всегда означает что Helm не видит kubeconfig, поэтому пытается подключиться к “кластеру по >умолчанию” localhost:8080 Самый простой способ решения указать kubeconfig k3s:
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml kubectl get nodesПосле этого повторите попытку установки.
Проверяем:
helm -n gitlab status gitlab
kubectl -n gitlab get pods -o wide
kubectl -n gitlab get ingressURL (в нашем примере) - https://gitlab.onecci.lan
Логин: root
Задаем пароль через toolbox:
kubectl -n gitlab exec -it $TOOLBOX_POD -- gitlab-rails runner "
u = User.find_by_username('root');
u.password = 'NewStrongPass123!';
u.password_confirmation = 'NewStrongPass123!';
if u.save
puts 'SUCCESS: Password changed'
else
puts 'ERROR: ' + u.errors.full_messages.join(', ')
end"В GitLab создаем тестовый проект и выполняем команду:
git clone https://gitlab.onecci.lan/<group>/<project>.gitgit clone ssh://[email protected]:2222/<group>/<project>.gitЕсли хотите, чтобы пользователи могли делать [email protected]:<group>/<project>.git без указания порта, тогда нужно освобождать порт 22 на узле или выносить GitLab SSH на отдельный IP.