Tekton - 自定义镜像配置git仓库克隆

  • [1 条件准备](#1 条件准备)
  • [2 git 仓库配置](#2 git 仓库配置)
    • [2.1 本机生成ssh密钥对](#2.1 本机生成ssh密钥对)
    • [2.2 配置pub key到github](#2.2 配置pub key到github)
  • [3 git credentials创建](#3 git credentials创建)
  • [4 动态存储storageclass创建](#4 动态存储storageclass创建)
  • [5 TaskRun配置文件编写](#5 TaskRun配置文件编写)
  • [6 TaskRun运行测试](#6 TaskRun运行测试)

1 条件准备

  1. 正常运行的K8s集群(我这里演示的集群版本是1.28)
  2. 能正常动态创建sc的存储(我这里创建的存储是nfs存储)
  3. 拥有一个github账户,并且创建了一个repository用于测试

tekton官方文档: tekton参考文档

2 git 仓库配置

此篇文档仅演示github . ssh-auth 认证

2.4 本机生成ssh密钥对

复制代码
[root@master-01 Tasks]# ssh-keygen -t rsa

2.4 配置pub key到github

复制代码
[root@master-01 Tasks]# cat ~/.ssh/id_rsa.pub  #拷贝输出的内容
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx  root@master-01

打开自己的github项目.点击右上角头像. settings -> SSH -> NEW SSH key

Paste your pub key here and save.

复制代码
#下面随便创建一个目录git clone 一下测试
[root@master-01 gitdir]# mkdir git_20250910
[root@master-01 gitdir]# cd git_20250910/
[root@master-01 git_20250910]# git init .
初始化空的 Git 版本库于 /data/gitdir/git_20250910/.git/
[root@master-01 git_20250910]# git clone git@github.com:qq772819554/git_data.git
正克隆到 'git_data'...
remote: Enumerating objects: 27, done.
remote: Counting objects: 100% (27/27), done.
remote: Compressing objects: 100% (13/13), done.
remote: Total 27 (delta 9), reused 17 (delta 6), pack-reused 0 (from 0)
接收对象中: 100% (27/27), done.
处理 delta 中: 100% (9/9), done.

可以看到能正常拉取到git project.

3 git credentials创建

cat ~/.ssh/id_rsa | base64 -w0 #获取本地id_rsa base64编码

cat ~/.ssh/known_hosts | base64 -w0 #获取本地known_hosts base64编码

下面是git credential的模版

复制代码
[root@master-01 20250909]# cat github-secret.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: git-credentials
data:
  id_rsa: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcEFJQkFBS0NBUUVBdURFOXliL1N3WDZsYVNySkZjNHhmNUp5Q2g3K0V5dEprcklXeDlaL000M2VUa3U5CkQwQ29BQW9OdGVHSHh5NXk0UUMwdzZ1SjRIU1hJLys3SmJPUnp0N3pYM1lScWJFcTNQOXFEL296NVFrOUU3ejEKYWpPRXE3UFFNWWl4a3NTdzJaVzZsNGVHZ21PdHBsK1hheERmMWJxQ3pXcUw5bVhFMEpoN1UxSnQvNDRjbFVUSAppZDJrQTgvVGx2bXorckxHeWg1YkczcGhtMlA0Wi8wKzFKQnZRbmlZdVZhVXdzbWemQKTG56ZzFjRWNScDlTbUc4dTRxQitpaG1pUTVqeWZycUJkKzRrUDZqcTdXcUkxSW1DZjVqQUNFSWxaSno3U1dtMgovMzNQa2VjR1M0S1VDdmJQUXlwK1Y3N2pLbHlYa3FJeUZ4VEZBcDFxckZONHhzcTBZR1hFN2ZncW9MZkJSRXJhClB5VTExeUZJWVhWaFBBcVl5Y1FrQ3VYS1pQaXNwWnhIK25PQlpTRU9xVm5lbnNYRmFYNmdITnBVRlg4dk9DMGgKWlV2ejFSYkJBb0dCQU84ZDVoS1U4YTNEY3pTWEdlTFpxR2dhNDVLd0pnMXE0dFZ6ajZDcTZMME8wS0Z2NW1DVQovVng4YjMxalFEOXVTVjdjeUNNQnE5YWpSSmM3YWdJeGs2NkErREdhbm8vN2ViNnFQMmU4eU54M1dSQUFtRFk2CnJLN3RxV0NYMitqZ09mTDgrVEduY3BxczdEMlVpUkRPQktZeDlLVGN0cFlJbW56bmZTcWtXQjZWQW9HQkFNVXkKa1g3em5PTjFnVjFCaU41R1pCRURWUlVhYkpHbHNSUlptLzFzRkFGYkJjSERYMk1jS1lNbFBkOSs3WnNtTktHTwpqUjlTZnk2ekRuc2VEYjR6eEE5QmdvTExXdE1OSGZ1ZUVhN0lXS2grc0hSV1FMZklsNGdKSGdtZnlUeEgyc2pqCks1OEhRSTJZdVBXNGljOWJzT2dIc3ZMUVlablMxN0VnS1V2VkQzQXhBb0dCQU1OS1F2N0lJTDZQRTRkUEpUZ3UKRmltNFZFY1lrR3VDOFhIdGFNK0s1bnlLSGdETG1IY25GK295UXdoQVNGZkY1aXlRMnZBa1RFa0huVng2alBEdgp0ckxkNkZieTlpK1g3bTIzTkFPd25zZll2YWVoSksrZHFpMVFNM2FOY0hDNHVQdG9lc2wvL2N5d0VGMlc4MzhECkU2Nzh1OWJ0NEQyWEZ6Mk4vcDhXREZZbEFvR0FKOHNaa3ozRDFoNjdPVDlsU0QxNktmaTdMYVFFYnF1NS9UcE0KQVNyVEtxYmNsWXBBY0hhWlplNlkrc1haV3VxdHlrQkMrQ1FrcUI3WCtENUxWYXVLaisyUFVhZUpyM2RCS3FwdQpOUkFXM0FHY3lBMHp5Q0tCZWFFbFg1blArUXNpK2xEbFY1VVdFTHpWN2pnTUR6MFlpT29zMFZUOXJSWGdFczFECnFCclpuN0VDZ1lBMXFjcWNhQng0MFBuZzI3Wm1LTlNYKzFDVjk5ai9BemFFdHE1dVRvWWE0dGZacHhNUlFDU1cKVGljei9WUXlnTnRxNFMzcnVEUU8xdWEyZHBjRDA0dEk1TDFWdnppUEN3T0MrNGo2RjV5SHZTT0xQdkNGVnpQUApPVGNkTzRFeUxLU3MveHZKem9FbWlGZkdIcmFzMkxsMmM4d1lDWnJEYjZUV29OL0p6U1Z5dEE9PQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQo=
  known_hosts: Z2l0aHViLmNvbSwxNDADI1NiBBQUFBRTJWalpITmhMWE5vWVRJdGJtbHpkSEF5TlRZQUFBQUlibWx6ZEhBeU5UWUFBQUJCQkVtS1NFTmpRRWV6T214a1pNeTdvcEtnd0ZCOW5rdDVZUnJZTWpOdUc1Tjg3dVJnZzZDTHJibzV3QWRUL3k2djBtS1YwVTJ3MFdaMllCLysrVHBvY2tnPQo=

4 动态存储storageclass创建

复制代码
需要事先创建动态存储.  我这里创建的是nfs存储 . 如何创建nfs存储请参考我下边的分享文档
[root@master-01 storageclass]# cat forTekton.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nfs-client
provisioner: cluster.local/nfs-subdir-external-provisioner
parameters:
  archiveOnDelete: "false"

Linux下NFS服务器的搭建与配置

密码:lumd

搭建完nfs之后还需要在集群中安装nfs驱动.适当的修改如下参数为你自己的nfs服务器和export 目录

NFS Provisioner是Kubernetes中用于动态提供NFS存储卷的外部控制器,它通过实现Kubernetes的Provisioner接口,能够按需创建和删除基于NFS的PersistentVolume(PV)。

以下是其核心特性和部署要点:

工作原理

NFS Provisioner分为两种工作模式:nfs-client和nfs-server。nfs-client模式通过Kubernetes内置NFS驱动挂载远程NFS服务器到本地目录,并在PVC申请时动态创建子目录作为PV;而nfs-server模式则直接在容器内运行NFS服务,通过ganesha.nfsd导出本地目录。两种模式均需依赖现有NFS服务器提供底层存储
helm install nfs-provisioner nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --set nfs.server=192.168.95.137 --set nfs.path=/data/nfs --set image.repository=registry.k8s.io/sig-storage/nfs-subdir-external-provisioner --set logLevel=5

5 TaskRun配置文件编写

复制代码
[root@master-01 Tasks]# cat task_04.yaml 
apiVersion: tekton.dev/v1
kind: TaskRun
metadata:
  generateName: gitpull-
spec:
  taskSpec:
    steps:
      - image: alpine/git
        name: gitclient
        script: |
          #!/usr/bin/env sh
          mkdir ~/.ssh
          cp $(workspaces.git-credentials.path)/* ~/.ssh/
          chmod 700 ~/.ssh
          chmod -R 400 ~/.ssh/*
          cd $(workspaces.shared-data.path)
          mkdir gitdata
          git init gitdata
          git config --global --add safe.directory $(workspaces.shared-data.path)/gitdata
          cd $(workspaces.shared-data.path)/gitdata
          git pull git@github.com:qq772819554/git_data.git
          sleep 3000
    workspaces:
    - name: shared-data
    - name: git-credentials
  workspaces:
  - name: shared-data
    volumeClaimTemplate:
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 1Gi
        storageClassName: nfs-client
  - name: git-credentials
    secret:
      secretName: git-credentials


#上边taskRun的逻辑我简单说下:
1 id_rsa. knowhosts.这两个文件的内容被写在了secret. 然后挂载到我们自定义的镜像里边. 我这里懒的配置环境了.就直接使用的自带Git工具的alpine/git镜像. 你可以使用任何镜像然后自己安装git工具也可以
2 拷贝ssh-auth文件到镜像的~/.ssh/目录并且修改权限
3 创建了一个pvc. 挂载到Task生成的pod. 然后切到pvc的目录里边也就是$(workspaces.shared-data.path) .然后做一些git init操作
4 在pvc持久化存储里边克隆Git
5 最后我sleep了一下.便于我exec进pod进行调试.不过也可以直接去nfs server. 也能找到创建的这个pvc目录

6 TaskRun运行测试

root@master-01 Tasks\]# kubectl create -f task_04.yaml taskrun.tekton.dev/gitpull-k88cx created

可以看到pvc已经自动创建出来了

这个Task生成的pod已经Running. 其他他已经完成了git clone任务.但是我用sleep命令强制它hang住了

下面我们看看nfs server

可以看到刚刚生成的这个pvc directory.

这是刚刚拉取下来的git数据

如果不想自己去写命令打镜像去配置git拉取.官方也推荐了一种现成的. 已经写好的git Task.

参考如下链接:
git clone Task official

不过需要你梳理好各种pipeline. pipelineRun之间的各种params参数传递和参数配置. 也需要配置好git credentials. 已经涉及到容器内部的用户权限问题. 我写的文档是简化逻辑后的.

而且本文档只是简单演示的是一个taskRun. 如果你需要完成一套流程,git pull -> build image -> push dockerhub. 我建议你需要拆解我得taskRun. 然后把一些params 具体的value 配置到pipelineRun中.

相关推荐
pwj去战斗吧4 小时前
k8s+jenkins+harbor构建Devops平台
kubernetes·jenkins·devops
Adorable老犀牛5 小时前
可遇不可求的自动化运维工具 | 2 | 实施阶段一:基础准备
运维·git·vscode·python·node.js·自动化
xiaok7 小时前
把代码上传到gitee的时候,怎么忽略node_modules文件夹
git·gitlab·github
唐叔在学习7 小时前
听说有老哥分不清Git branch和tag?这不看看嘛
git·后端
雁于飞17 小时前
vscode中使用git、githup的基操
笔记·git·vscode·学习·elasticsearch·gitee·github
小毛驴8501 天前
所有微服务部署都使用一个git地址,并且通过docker部署各个服务的情况下,如何编写mvn指令来处理各个服务。
git·docker·微服务
国王不在家1 天前
git 切换仓库后清理分支缓存
git
柯南二号1 天前
【Gitlab】Ubuntu 20.04服务器部署Gitlab
git·gitlab
phac1231 天前
git 如何直接拉去远程仓库的内容且忽略本地与远端不一致的commit
大数据·git·elasticsearch