kind can load an image from the host with the kind load ...
commands. If you configure your host with credentials to pull the desired
image(s) and then load them to the nodes you can avoid needing to authenticate
on the nodes.
#!/bin/sh
# Copyright The Kubernetes Authors.## Licensed under the Apache License, Version 2.0 (the "License");# you may not use this file except in compliance with the License.# You may obtain a copy of the License at## http://www.apache.org/licenses/LICENSE-2.0## Unless required by applicable law or agreed to in writing, software# distributed under the License is distributed on an "AS IS" BASIS,# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.# See the License for the specific language governing permissions and# limitations under the License.set -o errexit
# desired cluster name; default is "kind"KIND_CLUSTER_NAME="${KIND_CLUSTER_NAME:-kind}"# create a temp file for the docker configecho "Creating temporary docker client config directory ..."DOCKER_CONFIG=$(mktemp -d)export DOCKER_CONFIG
trap 'echo "Removing ${DOCKER_CONFIG}/*" && rm -rf ${DOCKER_CONFIG:?}' EXIT
echo "Creating a temporary config.json"# This is to force the omission of credsStore, which is automatically# created on supported system. With credsStore missing, "docker login"# will store the password in the config.json file.# https://docs.docker.com/engine/reference/commandline/login/#credentials-storecat <<EOF >"${DOCKER_CONFIG}/config.json"
{
"auths": { "gcr.io": {} }
}
EOF# login to gcr in DOCKER_CONFIG using an access token# https://cloud.google.com/container-registry/docs/advanced-authentication#access_tokenecho "Logging in to GCR in temporary docker client config directory ..."gcloud auth print-access-token | \
docker login -u oauth2accesstoken --password-stdin https://gcr.io
# setup credentials on each nodeecho "Moving credentials to kind cluster name='${KIND_CLUSTER_NAME}' nodes ..."for node in $(kind get nodes --name "${KIND_CLUSTER_NAME}"); do# the -oname format is kind/name (so node/name) we just want name node_name=${node#node/}# copy the config to where kubelet will look docker cp "${DOCKER_CONFIG}/config.json""${node_name}:/var/lib/kubelet/config.json"# restart kubelet to pick up the config docker exec "${node_name}" systemctl restart kubelet.service
doneecho "Done!"
Access tokens are short lived, so you may prefer to use a Service Account and keyfile instead.
First, either download the key from the console or generate one with gcloud:
gcloud iam service-accounts keys create <output.json> --iam-account <account email>
Then, replace the gcloud auth print-access-token | ... line from the access token snippet with:
If you have a registry authenticated with certificates, and both certificates and keys
reside on your host folder, it is possible to mount and use them into the containerd plugin
patching the default configuration, like in the example:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
# This option mounts the host docker registry folder into# the control-plane node, allowing containerd to access them. extraMounts:
- containerPath: /etc/docker/certs.d/registry.dev.example.com
hostPath: /etc/docker/certs.d/registry.dev.example.com
# NOTE: the following patch is not necessary with images from kind v0.27.0+# It may enable some older images to work similarlycontainerdConfigPatches:
- |- [plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"