Kubernetes 集群配置
为 Kubernetes 节点和 workload 配置 SparkCR 镜像拉取。
Kubernetes 集群配置
本指南面向使用 containerd 的 Kubernetes 集群。目标是让节点通过 SparkCR 拉取镜像,并让需要认证的 workload 使用 SparkCR Access Token。
节点运行时配置
在每个节点为 Docker Hub 配置 containerd mirror:
sudo mkdir -p /etc/containerd/certs.d/docker.io
sudo tee /etc/containerd/certs.d/docker.io/hosts.toml >/dev/null <<'EOF'
server = "https://docker.io"
[host."https://sparkcr.cn/docker.io"]
capabilities = ["pull", "resolve"]
EOF
sudo systemctl restart containerd如果使用别名入口:
server = "https://docker.io"
[host."https://docker.sparkcr.cn"]
capabilities = ["pull", "resolve"]多上游配置
为 registry.k8s.io 增加 mirror:
sudo mkdir -p /etc/containerd/certs.d/registry.k8s.io
sudo tee /etc/containerd/certs.d/registry.k8s.io/hosts.toml >/dev/null <<'EOF'
server = "https://registry.k8s.io"
[host."https://sparkcr.cn/registry.k8s.io"]
capabilities = ["pull", "resolve"]
EOF
sudo systemctl restart containerd使用别名入口时,把 host 改为 k8s.sparkcr.cn。
配置 imagePullSecret
需要认证拉取时,在 namespace 中创建 Secret:
kubectl create secret docker-registry sparkcr-registry \
--docker-server=sparkcr.cn \
--docker-username=<email> \
--docker-password=<access-token>使用别名入口时,--docker-server 使用对应上游 host:
kubectl create secret docker-registry sparkcr-docker \
--docker-server=docker.sparkcr.cn \
--docker-username=<email> \
--docker-password=<access-token>在 workload 中引用:
apiVersion: v1
kind: Pod
metadata:
name: hello-world
spec:
restartPolicy: Never
imagePullSecrets:
- name: sparkcr-registry
containers:
- name: hello-world
image: sparkcr.cn/docker.io/library/hello-world:latest如果节点已经配置 Docker Hub mirror,也可以保持原始镜像引用:
apiVersion: v1
kind: Pod
metadata:
name: hello-world-native-ref
spec:
restartPolicy: Never
imagePullSecrets:
- name: sparkcr-registry
containers:
- name: hello-world
image: docker.io/library/hello-world:latest批量下发节点配置
小规模集群可以通过 SSH 批量分发 hosts.toml:
while read -r node; do
[ -n "$node" ] || continue
scp hosts.toml "$node:/tmp/sparkcr-docker-hosts.toml"
ssh "$node" 'sudo mkdir -p /etc/containerd/certs.d/docker.io && sudo mv /tmp/sparkcr-docker-hosts.toml /etc/containerd/certs.d/docker.io/hosts.toml && sudo systemctl restart containerd'
done < nodes.txt如果集群允许特权 DaemonSet,也可以用一次性 DaemonSet 写入配置。生产环境建议由节点镜像、cloud-init、Ansible 或其他配置管理系统持久化。
验证
创建一次临时 Pod:
kubectl run sparkcr-test \
--image=sparkcr.cn/docker.io/library/hello-world:latest \
--restart=Never查看事件:
kubectl describe pod sparkcr-testSparkCR 控制台的 History 中应能看到对应镜像、上游、字节数和状态。
回滚
删除节点 mirror 配置并重启 containerd:
sudo rm -f /etc/containerd/certs.d/docker.io/hosts.toml
sudo systemctl restart containerd删除 Kubernetes Secret:
kubectl delete secret sparkcr-registry --namespace default如果出现 ImagePullBackOff,优先检查节点 containerd 配置、Secret 所在 namespace 和镜像路径。