📌 本文导览
字数:约 2000+ 字,阅读时间:9 分钟 这两天我从零开始,把一条完整的镜像构建链路彻底打通: Jenkins(K8s Agent) → Kaniko → Harbor这篇文章不仅讲“怎么做”,更重点讲清楚:

在 Pod 内测试:
ping 192.168.xxx.xxx
结果:
100% packet loss

在 Node 上测试:
ping 192.168.xxx.xxx
结果正常:

测试 | 结果 |
|---|---|
Pod → Harbor | ❌ |
Node → Harbor | ✅ |
👉 结论:不是 Harbor 问题,而是 Pod 网络问题

sysctl net.ipv4.ip_forward

iptables -t nat -L
重点看:cali-POSTROUTING、cali-nat-outgoing、MASQUERADE

检查发现:并没有MASQUERADE规则。
ip a
关注:tunl0、caliXXXX

👉 本质问题:Pod 出口 NAT(SNAT)未生效(后续通过调整 CNI 配置或手动添加 SNAT 规则解决)
Get "https://192.168.114.136/v2/": i/o timeout
在 Kaniko 命令中添加:
--insecure
--skip-tls-verify

镜像地址必须带端口(因为 Harbor 监听 80):
192.168.xxx.xxx:80/demo/demo-app
如上图
docker loginKaniko 只认 /kaniko/.docker/config.json这个文件。
{
"auths": {
"192.168.xxx.xxx:80": {
"username": "admin",
"password": "xxxxx",
"auth": "YWRtaWxxxxxxxxLmNvbQ=="
}
}
}

192.168.xxx.xxx而不是 192.168.xxx.xxx:80)Get "https://index.docker.io/v2/": dial tcp ... i/o timeout

使用国内可访问的镜像源,例如:
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/tiangolo/uvicorn-gunicorn:python3.11-slim

Unauthorized (401)

为 jenkins-agent绑定 RBAC:
apiVersion: rbac.authorization.k8s.io/v1
kind:Role
metadata:
namespace:cicd
name:jenkins-agent-role
rules:
-apiGroups:[""]
resources:["pods","pods/log","pods/exec"]
verbs:["get","list","watch","create","update","patch","delete"]
---
apiVersion:rbac.authorization.k8s.io/v1
kind:RoleBinding
metadata:
namespace:cicd
name:jenkins-agent-rolebinding
subjects:
-kind:ServiceAccount
name:jenkins-agent
namespace:cicd
roleRef:
kind:Role
name:jenkins-agent-role
apiGroup:rbac.authorization.k8s.io
这是我最宝贵的实战记录。下面展示每次迭代的关键变化和错误。
agent {
kubernetes {
yaml """
containers:
- name: kaniko
image: gcr.io/kaniko-project/executor:debug
"""
}
}
结果:❌ UNAUTHORIZED
volumes:
- name: docker-config
secret:
secretName: harbor-secret
volumeMounts:
- name: docker-config
mountPath: /kaniko/.docker
结果:❌ 仍然 401(因为 registry 地址不带端口,认证信息不匹配)
--destination=192.168.xxx.xxx:80/demo/demo-app:latest
结果:❌ config.json not found(Secret 未正确挂载)
sh '''
mkdir -p /kaniko/.docker
cat > /kaniko/.docker/config.json <<EOF
{
"auths": {
"192.168.xxx.xxx:80": {
"username": "admin",
"password": "xxxxxxx",
"auth": "YWRtaxxxxxxxxzLmNvbQ=="
}
}
}
EOF
'''
结果:✅ 认证通过,但基础镜像拉取超时
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/tiangolo/uvicorn-gunicorn:python3.11-slim
结果:✅ 最终成功!


pipeline {
agent {
kubernetes {
cloud 'Kubernetes'
yaml """
apiVersion: v1
kind: Pod
spec:
serviceAccountName: jenkins-agent
automountServiceAccountToken: true
containers:
- name: jnlp
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/jenkins/inbound-agent:trixie-jdk17
env:
- name: JENKINS_URL
value: "http://jenkins:8080"
- name: kaniko
image: m.daocloud.io/gcr.io/kaniko-project/executor:debug
command: ['/busybox/sh', '-c', 'sleep 999999']
tty: true
env:
- name: DOCKER_CONFIG
value: "/kaniko/.docker"
volumeMounts:
- name: workspace-volume
mountPath: /workspace
volumes:
- name: workspace-volume
emptyDir: {}
"""
}
}
stages {
stage('Prepare App') {
steps {
container('kaniko') {
sh '''
cd /workspace
cat > app.py <<EOF
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello from Kaniko + Harbor!"
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000)
EOF
cat > requirements.txt <<EOF
flask
EOF
cat > Dockerfile <<EOF
FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
EXPOSE 5000
CMD ["python", "app.py"]
EOF
'''
}
}
}
stage('Build & Push') {
steps {
container('kaniko') {
sh '''
cd /workspace
mkdir -p /kaniko/.docker
cat > /kaniko/.docker/config.json <<EOF
{
"auths": {
"192.168.xxx.xxx:80": {
"username": "admin",
"password": "xxxxx",
"auth": "YWRtaxxxxxxmNvbQ=="
}
}
}
EOF
/kaniko/executor \
--dockerfile=Dockerfile \
--context=/workspace \
--destination=192.168.xxx.xxx:80/demo/demo-app:latest \
--insecure \
--skip-tls-verify
'''
}
}
}
}
}
这是本文最有价值的部分。
1. 网络(通不通)
2. 协议(http/https)
3. 认证(凭证)
4. 镜像源(能否拉取)
5. 权限(RBAC)

👉 一句话总结:CI/CD问题 ≠ 工具问题,而是网络 + 认证 + 权限的综合问题
如果这篇文章帮到了你,欢迎点赞、转发给正在“踩坑”的朋友。 下一篇将进入 CI → CD 自动部署:Jenkins + kubectl + ArgoCD 实现应用自动发布。 👉 关注我,不错过下期硬核实战。