在IBM云上部署Red Hat OpenShift内部Pod的GitLab
所追求的目标
因为一些特殊情况,我想使用GitLab,但是IBM Cloud的GitLab版本有点旧,或者一些设置无法自由更改,因此我选择将其部署到Red Hat OpenShift on IBM Cloud(ROKS)。GitLab原本就支持Kubernetes,但是OpenShift和ROKS有其特定的操作步骤,我想在这里说明一下。
另外,GitLab的分发版本可以在Pod中运行内部使用的PostgreSQL和Redis等,也可以使用外部服务。这次我们尝试了在Pod中运行。
操作步骤
这是我们的指南。
这次将通过Helm安装进行操作。
创建公共域名和TLS证书。
当运行Helm时,会自动部署Nginx Ingress,并且会为IBM Cloud VPC配置负载均衡器。然而,由于负载均衡器没有TLS证书,所以无法直接通过HTTPS进行通信。虽然可以自行订购和获取TLS证书,但本次我们将使用IBM Cloud提供的标准证书。
如果使用OpenShift,可能会考虑使用Router,但GitLab在git通信中使用SSH,因此我们使用了与HTTP无关的Router,并使用了GitLab附带的Nginx Ingress。
ROKS的默认设置包括注册面向公众的FQDN和负载均衡器。
$ ibmcloud oc nlb-dns ls -c ${クラスター名}
OK
サブドメイン ターゲット SSL 証明書の状況 SSL 証明書の秘密名 秘密の名前 空間
********-********d72d9643e3d07091333056f5-0000.jp-tok.containers.appdomain.cloud ********-jp-tok.lb.appdomain.cloud created ********-********d72d9643e3d07091333056f5-0000 openshift-ingress
在这种情况下,我们会记住负载均衡器的名称。虽然不会直接使用,但我们会暂时借用它的名字。
如果还没有为安装GitLab创建命名空间,则需要事先创建它。
$ oc create ns ${ネームスペース名}
执行下面的命令,添加一个面向公众的域名。
-
- ネームスペース名: GitLabをインストールするネームスペース名
- ロードバランサー名: 先ほど控えたロードバランサー名
$ ibmcloud oc nlb-dns create vpc-gen2 -c ${クラスター名} --secret-namespace ${ネームスペース名} --type public --lb-host ${ロードバランサー名}
NLB DNS を作成中...
OK
NLB ホスト名が ********-********d72d9643e3d07091333056f5-0001.jp-tok.containers.appdomain.cloud として作成され、public DNS に登録されました
我会确认证书的创建情况。在这种情况下,第二行的”-0001″是刚刚添加的域名。请稍等,只要SSL证书的状态变成了”created”就可以了。
有时候这里可能会处于待处理状态。在这种情况下,您可以使用ibmcloud ks nlb-dns secret regenerate命令来生成。如果仍然无法解决问题,请联系技术支持。
请记录下所显示的子域名(-0001)和SSL证书的密钥名称。
$ ibmcloud oc nlb-dns ls -c ${クラスター名}
OK
サブドメイン ターゲット SSL 証明書の状況 SSL 証明書の秘密名 秘密の名前空間
********-********d72d9643e3d07091333056f5-0000.jp-tok.containers.appdomain.cloud ********-jp-tok.lb.appdomain.cloud created ********-********d72d9643e3d07091333056f5-0000 openshift-ingress
********-********d72d9643e3d07091333056f5-0001.jp-tok.containers.appdomain.cloud ********-jp-tok.lb.appdomain.cloud created ********-********d72d9643e3d07091333056f5-0001 ********
添加GitLab Helm库
添加Helm存储库。
$ helm repo add gitlab https://charts.gitlab.io/
$ helm repo update
添加ServiceAccount
由于OpenShift特定的SCC限制,原本的ServiceAccount在Helm中会自动创建,但不能直接使用。我们需要事先创建它,以便在使用Helm进行安装时能够顺利运行。
创建必要的ServiceAccount。
$ oc create sa gitlab-certmanager-issuer
$ oc create sa gitlab-gitlab-runner
$ oc create sa gitlab-nginx-ingress
$ oc create sa gitlab-nginx-ingress-backend
$ oc create sa gitlab-prometheus-server
$ oc create sa gitlab-shared-secrets
授予必要的权限。
$ oc adm policy add-scc-to-user anyuid -z default
$ oc adm policy add-scc-to-user anyuid -z gitlab-certmanager-issuer
$ oc adm policy add-scc-to-user privileged -z gitlab-gitlab-runner
$ oc adm policy add-scc-to-user privileged -z gitlab-nginx-ingress
$ oc adm policy add-scc-to-user anyuid -z gitlab-nginx-ingress-backend
$ oc adm policy add-scc-to-user anyuid -z gitlab-prometheus-server
$ oc adm policy add-scc-to-user anyuid -z gitlab-shared-secrets
为此必须添加标签,否则在Helm安装时将被视为重复的ServiceAccount,从而导致失败。
$ oc label sa gitlab-certmanager-issuer app.kubernetes.io/managed-by=Helm
$ oc label sa gitlab-gitlab-runner app.kubernetes.io/managed-by=Helm
$ oc label sa gitlab-nginx-ingress app.kubernetes.io/managed-by=Helm
$ oc label sa gitlab-nginx-ingress-backend app.kubernetes.io/managed-by=Helm
$ oc label sa gitlab-prometheus-server app.kubernetes.io/managed-by=Helm
$ oc label sa gitlab-shared-secrets app.kubernetes.io/managed-by=Helm
在相似的用法中,给出注释。
$ oc annotate sa gitlab-certmanager-issuer meta.helm.sh/release-name=gitlab meta.helm.sh/release-namespace=${ネームスペース名}
$ oc annotate sa gitlab-gitlab-runner meta.helm.sh/release-name=gitlab meta.helm.sh/release-namespace=${ネームスペース名}
$ oc annotate sa gitlab-nginx-ingress meta.helm.sh/release-name=gitlab meta.helm.sh/release-namespace=${ネームスペース名}
$ oc annotate sa gitlab-nginx-ingress-backend meta.helm.sh/release-name=gitlab meta.helm.sh/release-namespace=${ネームスペース名}
$ oc annotate sa gitlab-prometheus-server meta.helm.sh/release-name=gitlab meta.helm.sh/release-namespace=${ネームスペース名}
$ oc annotate sa gitlab-shared-secrets meta.helm.sh/release-name=gitlab meta.helm.sh/release-namespace=${ネームスペース名}
GitLab的安装
终于要安装GitLab了。
-
- インストール名: 任意
-
- ドメイン名: 先ほど控えたサブドメイン(-0001)
- シークレット名: 先ほど控えたSSL証明書の秘密名
$ helm upgrade --install ${インストール名} gitlab/gitlab --timeout 300s \
--set certmanager-issuer.email=me@example.com \
--set global.hosts.domain=${ドメイン名} \
--set global.ingress.tls.secretName=${シークレット名}
如果您想使用GitLab Pages,请添加以下参数。
--set global.pages.enabled=true \
--set global.pages.host=${ドメイン名}
如果之前的设置没有问题,Pod应该能够顺利启动,但是只有gitlab-runner预计会启动失败。原因是因为之前设置的域名通信仍然无法进行。
域名目标更改
部署GitLab时,将自动为Nginx Ingress配置一个负载均衡器。请记下它的名称。
$ oc get svc | grep LoadBalancer
gitlab-nginx-ingress-controller LoadBalancer 172.21.161.208 ********-jp-tok.lb.appdomain.cloud 80:31150/TCP,443:30340/TCP,22:30119/TCP 4m37s
我将把先前注册的域名的目标地址更改为上述名称。
$ ibmcloud oc nlb-dns replace -c ${クラスター名} --lb-host ********-jp-tok.lb.appdomain.cloud --nlb-subdomain ********-********d72d9643e3d07091333056f5-0001.jp-tok.containers.appdomain.cloud
NLB DNS を更新中...
注: 変更が適用されるまで数分かかる場合があります。
OK
稍等一下,gitlab-runner会变为Running状态。
由于DNS记录传播的关系,可能需要几十分钟左右的时间。
确认root密码
您可以使用以下命令确认root管理员用户的初始密码。
$ oc get secret ${インストール名}-gitlab-initial-root-password -o jsonpath='{.data.password}' | base64 -d; echo
********
访问GitLab
请提供以下选项的中文本地化版本:
https://gitlab.********-********d72d9643e3d07091333056f5-0001.jp-tok.containers.appdomain.cloud/ ->
https://gitlab.********-********d72d9643e3d07091333056f5-0001.jp-tok.containers.appdomain.cloud/
请注意
默认情况下,以下存储空间正在使用中。请注意,此为收费服务。
$ oc get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
data-gitlab-postgresql-0 Bound pvc-817fe266-d46e-4ce8-aa37-1e48ce42a1e3 10Gi RWO ibmc-vpc-block-10iops-tier 44h
gitlab-minio Bound pvc-fa24be28-5c07-4111-8e3b-1d8134fe081e 10Gi RWO ibmc-vpc-block-10iops-tier 44h
gitlab-prometheus-server Bound pvc-2ade9e01-a65f-43b9-ac0c-178377e819dd 10Gi RWO ibmc-vpc-block-10iops-tier 44h
redis-data-gitlab-redis-master-0 Bound pvc-93ea63c4-9e4c-41ad-81a1-31a6fdee5d88 10Gi RWO ibmc-vpc-block-10iops-tier 44h
repo-data-gitlab-gitaly-0 Bound pvc-8172fd76-5ceb-468d-ab9d-91f43dcfdd63 50Gi RWO ibmc-vpc-block-10iops-tier 44h