gitlab 安装备份恢复

安装:

  • 参考资料

gitlab 安装文档:
https://docs.gitlab.com/charts/charts/globals.html
安装命令行参数:
https://docs.gitlab.com/charts/installation/command-line-options.html#incoming-email-configuration
ssh配置:
https://docs.gitlab.com/charts/advanced/external-nginx/#tcp-services-in-the-external-ingress-controller
secrets 备份恢复及重制root密码:
https://docs.gitlab.com/charts/backup-restore/restore.html
备份恢复文档:
http://vlabs.iitb.ac.in/gitlab/help/raketasks/backup_restore.md
ingress控制器选择文档:
https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/
https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/multiple-ingress.md#multiple-ingress-controllers


  • 安装步骤:

    1. 获取chart包:

helm repo addd gitlab https://charts.gitlab.io/
helm fetch gitlab/gitlab --version=2.5.6 --untar

  1. 安装指令:

helm install --name gitlab --namespace gitlab gitlab/gitlab --version=2.5.6 \
  --set global.hosts.domain=example.cn \
  --set global.hosts.ssh=gitlab-beta.example.cn \
  --set global.hosts.hostSuffix=beta \ #If hostSuffix is `beta` it will produce `minio-beta.example.com` 如果此处为beta,那么产生的地址就是会是gitlab-beta.example.CN
  --set certmanager.install=false \
  --set global.ingress.configureCertmanager=false \
  --set global.ingress.tls.secretName=exampl.tls \   #给ingress添加域名的证书( kubectl create secret generic tls-cert--from-file=tls.crt=cert.pem --from-file=tls.key=key.pem -n YOUR_NAME_SPACE)cert.pem是应用层证书,由CA签发;  key.pem是私钥;如果是第三方证书机构给的cert证书需要将cert文件ca-bundle写到一起(cat xxx.crt xxx.ca-bundle > new.crt  #crt和ca-bundle文件位置填对,注意内容不要有重叠)。
  --set global.edition=ce \       #安装gitlab社区版
  --set prometheus.install=false \
  --set gitlab-runner.install=true \     #开启gitlab自带ci
  --set gitlab.sidekiq.timeout=20 \
  --set gitlab.unicorn.workerTimeout=250 \
  --set gitlab-runner.image="example.image.cn/gitlab-runner:alpine-v12.5.0" \ # runner 的镜像,默认拉取国外的,此处可更换为自己环境的镜像
  --set gitlab-runner.runners.cache.s3CacheInsecure=true \    #是否开启runner ci的cache
  --set nginx-ingress.enabled=false  \
  --set redis.persistence.storageClass=cephfs \         #对应集群内的存储类
  --set minio.persistence.storageClass=cephfs \        #对应集群内的存储类
  --set gitlab.gitaly.persistence.storageClass=cephfs \   #对应集群内的存储类
  --set postgresql.persistence.storageClass=cephfs  \   #对应集群内的存储类
  --set gitlab.gitaly.securityContext.runAsUser=0 \
  --set global.ingress.annotations."kubernetes\.io/ingress\.class"=nginx   #此处是选择ingress控制器,此次部署是使用已经存在于进群中的ingress- controller 
  --set global.appConfig.omniauth.enabled=true \         #对接外部oauth认证
  --set global.appConfig.omniauth.allowSingleSignOn=true \   #允许用户使用指定的提供程序登录,而无需两步验证。可以设置为true
  --set global.appConfig.omniauth.autoLinkSamlUser=false \   #如果启用了SAML集成,则可以使用。启用后,通过OmniAuth自动创建的用户也将链接到其SAML条目。
  --set global.appConfig.omniauth.blockAutoCreatedUsers=false \  #如果true自动创建的用户默认情况下将被阻止,并且必须先由管理员取消阻止,然后他们才能登录。
  --set global.appConfig.omniauth.providers[0].secret=gitlab-azure \  #对接azure
  --set global.appConfig.omniauth.syncProfileAttributes[0]=email \  #登录时从提供者同步的配置文件属性列表。
  --set global.appConfig.omniauth.syncProfileFromProvider[0]=azure_oauth2 \ #GitLab应该自动从中同步配置文件信息的提供商名称列表。条目应与提供者的名称匹配,例如saml或google_oauth2
  --set global.smtp.address=smtp.exmail.qq.com \ #使用qq邮件服务器,固定
  --set global.smtp.port=465 \   #固定
  --set global.smtp.tls=true \  #qq邮件服务器必须开启tls
  --set global.email.from=gitlab-beta@example.io \   #显示为来自GitLab的电子邮件发件人的电子邮件地址
  --set global.smtp.enabled=true \    
  --set global.smtp.password.secret=smtp-password \  #Secret包含SMTP密码的 名称  ,kubectl create secret generic smtp-password --from-literal=password=“your password” -n gitlab
  --set global.smtp.starttls_auto=true \  #是否在邮件服务器上启用了STARTTLS
  --set global.smtp.user_name=gitlab-beta@example.io \  #SMTP验证https的用户名
  --set global.smtp.authentication=login \
  --set global.smtp.domain=example.io \ #SMTP的可选HELO域
  --set global.appConfig.omniauth.syncProfileFromProvider[1]=bitbucket \ #对接bitbucket
  --set global.appConfig.omniauth.providers[1].secret=gitlab-bit   #bitbucket配置信息 [https://docs.gitlab.com/ee/integration/bitbucket.html](https://docs.gitlab.com/ee/integration/bitbucket.html)
下面是对接office356时的参数 :
#  --set global.smtp.address=smtp.office365.com \  
#  --set global.smtp.port=587 \
#   --set global.smtp.tls=false \
#  --set global.email.from=gitlab-beta@example.io \
#  --set global.smtp.enabled=true \
#  --set global.smtp.password.secret=smtp-password \
#  --set global.smtp.starttls_auto=true \
#  --set global.smtp.user_name=gitlab-beta@example.io \
#  --set global.smtp.authentication=login \
#  --set global.smtp.domain=example.io \
下面是对接LDAP时的参数:
#  --set global.appConfig.ldap.servers.main.label='LDAP' \
#  --set global.appConfig.ldap.servers.main.host='your_ldap_server' \
#  --set global.appConfig.ldap.servers.main.port='636' \
#  --set global.appConfig.ldap.servers.main.uid='sAMAccountName' \  # 用户名的LDAP属性。应该是属性,而不是映射到的值uid ('sAMAccountName','uid','userPrincipalName')
#  --set global.appConfig.ldap.servers.main.bind_dn='cn=administrator\,cn=Users\,dc=domain\,dc=net'  #您要绑定的用户的完整DN('america\momo' 要么 'CN=Gitlab,OU=Users,DC=domain,DC=com')
#  --set global.appConfig.ldap.servers.main.password.secret='my-ldap-password-secret' # kubectl create secret generic my-ldap-password-secret --from-literal=password=yourpasswordhere -n gitlab 
#  --set global.appConfig.ldap.servers.main.password.key='the-key-containing-the-password'  #(The key within the secret, which contains the password. The password should be unencoded value.) 暂时不清楚这个怎么创建,貌似不需要

*** global.appConfig.omniauth.providers[1].secret=gitlab-bit的信息:***
cat << eof > bit.yaml
name: bitbucket
app_id: 'xxxxxxxxxxxxxxxxx'
app_secret: 'xxxxxxxxxxxxxxxxxxxxxxx'
url: 'https://bitbucket.org/'
eof
kubectl create secret generic -n gitlab gitlab-bit --from-file=provider=bit.yaml注意修改bitbucket上的callback地址
***global.appConfig.omniauth.providers[0].secret=gitlab-azure的信息:***
cat << eof > provider.yaml
name: azure_oauth2
args:
  base_azure_url: 'gitlab-beta.example.cn'
  client_id: 'xxxxxxxxxxxxxxx'
  client_secret: 'xxxxxxxxxxxxxx'
  tenant_id: 'xxxxxxxxxxxxxxx'
eof
kubectl create secret generic -n gitlab gitlab-azure --from-file=provider=provider.yaml
注意修改azure上的callback地址

minio挂载pvc权限问题:

修改deploy,添加一个initContainers
      - command:
        - sh
        - -c
        - chmod -R 777 /export
        image: busybox:latest
        imagePullPolicy: IfNotPresent
        name: configure-1
        resources:
          requests:
            cpu: 50m
        securityContext:
          runAsUser: 0
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /export
          name: export

redis配置修改:

 (kubectl etcd cm -n gitlab gitlab-redis)添加“stop-writes-on-bgsave-error no”

备份:

在gitlab-task-runner容器中执行gitlab:backup:create会对当前gitlab进行一次全备,备份文件会在生成在容器中 /srv/gitlab/tmp/backups路径下
根据以上信息写了如下备份脚本,在k8s集群的master节点执行,将生成的备份文件拷贝到宿主机的 /gitbackup路径下,并删除容器中的备份文件,执行时需要修改下列指令的中namespaces

mkdir /gitbackup
kubectl exec -it -n gitlab `kubectl  get po -n gitlab  |grep gitlab-task-runner |awk '{print $1}'` gitlab-rake gitlab:backup:create
back=$(kubectl exec -it -n gitlab `kubectl  get po -n gitlab  |grep gitlab-task-runner |awk '{print $1}'` ls /srv/gitlab/tmp/backups)
back_path=/srv/gitlab/tmp/backups
echo "kubectl  cp -n gitlab $(kubectl  get po -n gitlab  |grep gitlab-task-runner |awk '{print $1}'):$back_path  /gitbackup"   |bash
echo "kubectl exec -it -n gitlab `kubectl  get po -n gitlab  |grep gitlab-task-runner |awk '{print $1}'` rm   /srv/gitlab/tmp/backups/$back" |tr -d '\r' |bash

恢复:

进入到备份集群的gitlab-task-runner容器中mkdir /srv/gitlab/tmp/backups
将主机群的备份的文件拷贝到 /srv/gitlab/tmp/backups下执行 gitlab-rake gitlab:backup:restore
并将gitlab-rails-secret的secrets也要拷贝到备份集群
阅读 296

推荐阅读