原文地址:K8S环境使用gitlab+drone2 进行持续交付

K8S环境使用gitlab+drone2 进行持续交付

环境说明

1、K8S:1.23.0

2、docker: 20.10.13

3、gitlab: 14.7

4、drone: 2

5、nfs: 4

drone版本说明

drone有两个大版本分别是drone1和drone2,从drone2开始被EDGE收购,重启项目为:Gitness。

本次教程提供的yaml文件同时适用于1和2

drone1界面

drone1.webp

drone2界面

1697435854153.png

开始部署

第一步、创建 OAuth 应用程序

在gitlab创建出GitLab OAuth 应用程序授权资源

1697092175124.png

1697092207105.png

第二步、创建共享密钥

创建共享密钥以验证运行器与中央无人机服务器之间的通信。

# 您可以使用 openssl 生成共享密钥
[root@llody-dev ~]#openssl rand -hex 16
303b6068fb64fe4296da1f1def6295db

第三步、启动drone-server

apiVersion: v1
kind: Service
metadata:
  name: drone-service
  namespace: default
spec:
  selector:
    app: drone
  ports:
    - name: http
      protocol: TCP
      port: 80
      targetPort: 80
    - name: https
      protocol: TCP
      port: 443
      targetPort: 443

---

apiVersion: v1
kind: ConfigMap
metadata:
  name: drone-config
  namespace: default
data:
  DRONE_GITLAB_SERVER: "gitlab地址"
  DRONE_GITLAB_CLIENT_ID: "GitLab oauth 客户端 ID"
  DRONE_GITLAB_CLIENT_SECRET: "GitLab oauth 客户端密钥"
  DRONE_RPC_SECRET: "上面生成的共享密钥"
  DRONE_SERVER_HOST: "drone地址,建议填写域名"
  DRONE_SERVER_PROTO: "https"
  DRONE_USER_CREATE: "username:gitlab管理员名称,admin:true"

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: drone-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: drone
  template:
    metadata:
      labels:
        app: drone
    spec:
      containers:
        - name: drone
          image: drone/drone:2
          volumeMounts:
            - name: drone-data
              mountPath: /data
          envFrom:
            - configMapRef:
                name: drone-config
          ports:
            - containerPort: 80
            - containerPort: 443
          resources:
            limits:
              cpu: 2000m
              memory: 2048Mi
            requests:
              cpu: 100m
              memory: 512Mi
      volumes:
        - name: drone-data
          persistentVolumeClaim:
            claimName: drone-pvc
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  # pvc名称
  name: drone-pvc
spec:
  # 读写权限
  accessModes:
    - ReadWriteOnce
  # 使用的存储类
  storageClassName: managed-nfs-storage
  # 定义容量
  resources:
    requests:
      storage: 5Gi
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    #nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: traefik
    traefik.ingress.kubernetes.io/router.tls: "true"
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
  labels:
    app: drone
  name: drone
  namespace: default
spec:
  rules:
    - host: droneci.llody.com
      http:
        paths:
          - backend:
              serviceName: drone-service
              servicePort: 80
            path: /
            pathType: ImplementationSpecific
  tls:
    - hosts:
        - droneci.llody.com
      secretName: wildcard.llody.com-tls

其中有几点需要注意

1、文件中依赖了NFS存储

2、文件中使用了treafik作为ingress对外暴露端口

3、configmap中的几个变量解释一下:

  • DRONE_GITLAB_CLIENT_ID** 必需的字符串值提供您的 GitLab oauth 客户端 ID。

  • DRONE_GITLAB_CLIENT_SECRET** 必需的字符串值提供 GitLab oauth 客户端密钥。

  • DRONE_GITLAB_SERVER** 选项字符串值提供您的 GitLab 服务器 URL。默认值为 gitlab.com 处的服务器地址。`https://gitlab.com`

  • DRONE_GIT_ALWAYS_AUTH** 可选的布尔值将 Drone 配置为在克隆公共存储库时进行身份验证。仅当使用启用了私有模式的自承载 GitLab 时,才应启用此功能。

  • DRONE_RPC_SECRET** 必需的字符串值提供在上一步中生成的共享密钥。这用于验证服务器和运行器之间的 rpc 连接。必须为服务器和运行器提供相同的密钥值。

  • DRONE_SERVER_HOST** 必需的字符串值提供外部主机名或 IP 地址。如果使用 IP 地址,则可以包含端口。例如 drone.domain.com

  • DRONE_SERVER_PROTO** 必需的字符串值提供外部协议方案。此值应设置为 或 。如果配置 ssl 或 acme,则此字段默认为 https。`http``https`

  • DRONE_USER_FILTER**GitLab 用户或组织的可选逗号分隔列表。注册仅限于此列表中的用户或属于此列表中组织成员的用户。*如果未设置此值,则注册对公众开放。*

第四步、部署drone-runner

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: default
  name: drone
rules:
- apiGroups:
  - ""
  resources:
  - secrets
  verbs:
  - create
  - delete
- apiGroups:
  - ""
  resources:
  - pods
  - pods/log
  verbs:
  - get
  - create
  - delete
  - list
  - watch
  - update
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: drone
  namespace: default
subjects:
- kind: ServiceAccount
  name: default
  namespace: default
roleRef:
  kind: Role
  name: drone
  apiGroup: rbac.authorization.k8s.io
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: drone-runner
  labels:
    app.kubernetes.io/name: drone-runner
spec:
  replicas: 1
  selector:
    matchLabels:
      app.kubernetes.io/name: drone-runner
  template:
    metadata:
      labels:
        app.kubernetes.io/name: drone-runner
    spec:
      containers:
      - name: drone-runner
        image: drone/drone-runner-kube:latest
        ports:
        - containerPort: 3000
        env:
        - name: DRONE_RPC_HOST
          value: drone-service.default.svc.cluster.local  # Drone Server地址
        - name: DRONE_RPC_PROTO
          value: http
        - name: DRONE_RPC_SECRET
          value: 303b6068fb64fe4296da1f1def6295db         # Drone Server部署时候填写的secret共享密钥
---
apiVersion: v1
kind: Service
metadata:
  name: drone-runner-service
spec:
  selector:
    app: drone-runner
  ports:
    - protocol: TCP
      port: 3000
      targetPort: 3000

第五步、登录

1697097696641.png

这里的用户名最好与gitlab中的账户名称保持一致

第六步、开启需要的选项,配置需要的证书密钥,如镜像仓靠地址,缓存等。

1697435317731.png

第七步、登录gitlab确认webhooks是否自动配置

1697435446540.png

注意:这个选项是在你的drone页面开启关联后自动配置的。

第八步、在nginx-test项目下编写.drone.yml

1697435704602.png

修改.drone.yml文件并推送到gitlab仓库

注意,我这里只做了一个操作,拉取我自己制作的镜像,打印当前路径和打印当前文件。默认会分两步,第一步会拉取代码,第二步会执行builds的job

更多pipeline请参考官网:https://docs.drone.io/pipeline/overview/

第九步、查看执行结果

1697435854153.png

总结

drone2开始虽然可能没有后续版本了,但是还是可以关注Gitness。

drone2分类了每个项目的CICD信息,不像drone1一样全部堆在一个页面上。

后面再补充一些关于drone在云原生环境更丝滑的用法。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐