tekton从入门到跑路-3-单独运行kaniko
tekton里镜像的生成和push,都是使用的kaniko,而不建议绑定docker.sock的方式。
kaniko 是从容器或 Kubernetes 集群内部的Dockerfile构建容器映像的工具。
kaniko 不依赖 Docker守护程序,而是完全在用户空间中执行 Dockerfile 中的每个命令。这样就可以在无法轻松或安全地运行Docker守护程序的环境(例如标准Kubernetes集群)中构建容器映像。
参考URL:
https://blog.csdn.net/qq_37377136/article/details/110096219
一,kaniko镜像获取
由于kaniko是google开源的项目,项目放在gcr.io上,不能访问。于是我包装了一下,使用如下镜像:
docker pull aguncn/kaniko-executor:v1.3.0
二,在本地建共享目录
此目录用于存放dockerfile文件,也用来作为pvc,相当于tekton中的workspace。相当于不用从git拉代码,直接在此目录按dockerfile生成image。
mkdir /root/kaniko
三,将此本地目录挂载成k8s中的pvc资源
volume.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: dockerfile
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
storageClassName: local-storage
hostPath:
path: /root/kaniko
volume-claim.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: dockerfile-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: local-storage
就这样,我们就拥有了一个k8s上可用的存储
四,制作dockerfile
在/root/kaniko目录下生成一个Dockerfile
FROM 3rd_part/alpine:3.7-bash-glibc
ENTRYPOINT ["/bin/sh", "-c", "echo 'hello kaniko'"]
五,制作一个harbor登陆证书,在kaniko推送的时候需要
kubectl create secret docker-registry docker-harbor --docker-server=http://demo.com.cn:8086 --docker-username=admin --docker-password=xxxxx --docker-email=cg@demo.com
- 其实,我在这里是有疑惑的,如果Dockerfile里是从一个需要认证的harbor里获取基础镜像,经过加工后,生成一个镜像,需要推上另一个需要认证的harbor镜像,那这种情况下,应该如何定义多个secret呢?
六,制作POD文件
pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: kaniko
spec:
containers:
- name: kaniko
image: aguncn/kaniko-executor:v1.3.0
env:
- name: "DOCKER_CONFIG"
value: "/tekton/home/.docker/"
command:
- /kaniko/executor
args:
- --insecure-pull
- --dockerfile=/workspace/Dockerfile
- --context=/workspace
- --insecure
- --destination=demo.com.cn:8086/3rd_part/alpine:3.7-kaniko
volumeMounts:
- name: kaniko-secret
mountPath: /tekton/home/.docker
- name: dockerfile-storage
mountPath: /workspace
restartPolicy: Never
volumes:
- name: kaniko-secret
secret:
secretName: docker-harbor
items:
- key: .dockerconfigjson
path: config.json
- name: dockerfile-storage
persistentVolumeClaim:
claimName: dockerfile-claim
- 其中无疑args下的参数,是主要调试对象。
- 由于我将两边的harbor都关闭了验证,都是公开项目,所以没有验证登陆。
七,成功的输出
kubectl get pod
NAME READY STATUS RESTARTS AGE
kaniko 0/1 Completed 0 11m
八,小小遗憾:
最终是生成了镜像,但我先屏蔽了所有的认证,都是在harbor中以公开项目的形式玩的。
这个之后要细节化。
还有就是搞不明白,内网harbor的pull也是这么慢,肯定哪里配置出了问题。
https://blog.csdn.net/u012803274/article/details/110506601