Gitlab Kubernetes 集成

Posted

技术标签:

【中文标题】Gitlab Kubernetes 集成【英文标题】:Gitlab kubernetes integration 【发布时间】:2020-03-16 03:29:29 【问题描述】:

我在服务器上有一个自定义 kubernetes 集群,公共 IP 和 DNS 指向它(也是通配符)。 Gitlab 按照本指南配置了集群:https://gitlab.touch4it.com/help/user/project/clusters/index#add-existing-kubernetes-cluster

但是,在安装Ingress 之后,从未检测到入口端点:

我尝试在k8s中修补对象,就像这样

externalIPs: (was empty)
 - 1.2.3.4
externalTrafficPolicy: local (was cluster)

我怀疑问题是空入口(滚动到最后)对象然后调用:

# kubectl get service ingress-nginx-ingress-controller -n gitlab-managed-apps -o yaml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: "2019-11-20T08:57:18Z"
  labels:
    app: nginx-ingress
    chart: nginx-ingress-1.22.1
    component: controller
    heritage: Tiller
    release: ingress
  name: ingress-nginx-ingress-controller
  namespace: gitlab-managed-apps
  resourceVersion: "3940"
  selfLink: /api/v1/namespaces/gitlab-managed-apps/services/ingress-nginx-ingress-controller
  uid: c175afcc-0b73-11ea-91ec-5254008dd01b
spec:
  clusterIP: 10.107.35.248
  externalIPs:
  - 1.2.3.4 # (public IP)
  externalTrafficPolicy: Local
  healthCheckNodePort: 30737
  ports:
  - name: http
    nodePort: 31972
    port: 80
    protocol: TCP
    targetPort: http
  - name: https
    nodePort: 31746
    port: 443
    protocol: TCP
    targetPort: https
  selector:
    app: nginx-ingress
    component: controller
    release: ingress
  sessionAffinity: None
  type: LoadBalancer
status:
  loadBalancer: 

但 Gitlab 仍然找不到入口端点。我尝试重新启动集群和 Gitlab。 Gitlab 中的网络检查总是显示这个响应:

...
name    ingress
status  installed
status_reason   null
version 1.22.1
external_ip null
external_hostname   null
update_available    false
can_uninstall   false
...

任何想法如何拥有一个有效的 Ingress Endpoint?

GitLab:12.4.3 (4d477238500) k8s:1.16.3-00

【问题讨论】:

你能发布入口吗? kubectl get ingress @Crou 它是空的 尝试使用kubectl get ingress --all-namespace 以确保它不在不同的命名空间中。 @Crou 也是空的.. 这意味着没有部署ingress。您只安装了 ingress-controller,现在您需要部署一个使用它的 ingress。 【参考方案1】:

我遇到了和你一模一样的问题,终于知道怎么解决了。

首先要了解的是,在裸机上,不使用 MetalLB 就无法使其工作,因为它调用所需的 Kubernetes API,使其接受您提供给 LoadBalancer 类型的 Service 的 IP 地址.

所以第一步是deploy MetalLB 到您的集群。

然后你需要有另一台机器,运行 NGiNX 或 HAproxy 之类的服务或任何可以做负载平衡的服务。

最后但并非最不重要的一点是,您必须将负载均衡器机器 IP 地址提供给 MetalLB,以便它可以将其分配给 Service。 通常 MetalLB 需要一系列 IP 地址,但您也可以像我一样提供一个 IP 地址:

apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: staging-public-ips
      protocol: layer2
      addresses:
      - 1.2.3.4/32

这样,MetalLB 会将 IP 地址分配给类型为 LoadBalancerService,Gitlab 最终会找到 IP 地址。

警告:MetalLB 将分配一次 IP 地址。如果你需要很多 Service 类型为 LoadBalancer,你需要很多机器运行 NGiNX/HAproxy 等,并将其 IP 地址添加到 MetalLB addresses 池中。

为了您的信息,我已将所有技术细节发布到my Gitlab issue here。

【讨论】:

以上是关于Gitlab Kubernetes 集成的主要内容,如果未能解决你的问题,请参考以下文章

如何找到用于 gitlab 集成的 gcloud Kubernetes api url

如何将 Azure AKS Kubernetes 集群自签名 CA 添加到 GitLab CI/CD Kubernetes 集成?

如何将 GitLab-Ci 与 Azure Kubernetes + Kubectl + ACR 集成以进行部署?

kubernetes(k8s)Gitlab CI Runner 的安装

用于 kubernetes 服务的 gitlab 管道中的证书和服务令牌

2020年,值得收藏的50多种Kubernetes工具