【问题标题】:Deploy inhouse docker image in Kubernetes cluster在 Kubernetes 集群中部署内部 docker 镜像
【发布时间】:2019-03-29 02:52:22
【问题描述】:

我尝试部署一个我构建的 Docker 映像,它不在公共或私有注册表上。

我使用imagePullPolicy: IfNotPresent 进行 Kubernetes 部署。

我用kubeadm v1.12报错:

Normal   Scheduled       35s                default-scheduler       Successfully assigned default/test-777dd9bc96-chgc7 to ip-10-0-1-154
Normal   SandboxChanged  32s                kubelet, ip-10-0-1-154  Pod sandbox changed, it will be killed and re-created.
Normal   BackOff         30s (x3 over 31s)  kubelet, ip-10-0-1-154  Back-off pulling image "test_kube"
Warning  Failed          30s (x3 over 31s)  kubelet, ip-10-0-1-154  Error: ImagePullBackOff
Normal   Pulling         15s (x2 over 34s)  kubelet, ip-10-0-1-154  pulling image "test"
Warning  Failed          13s (x2 over 33s)  kubelet, ip-10-0-1-154  Failed to pull image "test": rpc error: code = Unknown desc = Error response from daemon: pull access denied for test_kube, repository does not exist or may require 'docker login'
Warning  Failed          13s (x2 over 33s)  kubelet, ip-10-0-1-154  Error: ErrImagePull

我的部署文件:

apiVersion: apps/v1beta1
kind: Deployment
vmetadata:
  name: test-kube
spec:
  template:
    metadata:
  labels:
    app: test
spec:
  containers:
  - name: test
    image: test
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 3000
    env:
    - name: SECRET-KUBE
      valueFrom:
        secretKeyRef:
          name: secret-test
          key: username

泊坞窗图像]

REPOSITORY  TAG
test   latest 
test   test  

在我尝试过的部署文件中

图像:测试和图像:测试:测试

同样的错误:

错误:ErrImagePull

【问题讨论】:

  • 检查您的 docker 镜像是否使用 docker 镜像使用镜像标签“test_kube”构建。如果没有,则将 docker 镜像标签更改为 test_kube
  • 使用正确的凭据?您是否使用相同的凭据推送图像?
  • 我尝试部署一个我构建的 Docker 映像,它不在公共或私有注册表上。
  • @PrafullLadha 我试过了,同样的问题,谢谢 :)

标签: docker kubernetes kubeadm


【解决方案1】:
  • 基于具有拉/推权限的 docker 注册表用户创建机密
  • 将其用作 imagePullSecret

  • 在部署节点上预拉镜像

创建secret和用法的详细信息:

Kubernetes 集群使用 docker-registry 类型的 Secret 向容器注册表进行身份验证以提取私有映像。

创建此 Secret,将其命名为 regcred:

kubectl create secret docker-registry regcred --docker-server=<your-registry-server> --docker-username=<your-name> --docker-password=<your-pword> --docker-email=<your-email>

地点:

<your-registry-server> is your Private Docker Registry FQDN. (https://index.docker.io/v1/ for DockerHub)
<your-name> is your Docker username.
<your-pword> is your Docker password.
<your-email> is your Docker email.

然后创建一个使用该密钥的 pod:

apiVersion: v1
kind: Pod
metadata:
  name: private-reg
spec:
  containers:
  - name: private-reg-container
    image: <your-private-image>
  imagePullSecrets:
  - name: regcred

对于本地图像用例,请参阅这篇文章:

Pull a local image to run a pod in Kubernetes

【讨论】:

  • 我在部署节点上构建镜像,在 docker 镜像上,但什么也没有。我会尝试你说的第一个。创建 docker 私有注册表,在 kubernetes 中拉取并添加凭证。谢谢:)
  • 如果图像已经在节点上,它应该可以工作,检查图像的路径
  • @cdemet 答案已更新,请参阅该帖子以使用本地图像
  • @IjazAhmadKhan 最初的问题是关于 kubeadm,您的链接帖子是关于 minikube。
【解决方案2】:

你应该在 kubernetes 集群的主节点上有一个 docker 私有注册表,这样如果 pod 部署在一个节点上,就可以从那里拉取镜像。您可以在以下位置找到使用 docker 私有注册表创建 Kubernetes 集群的步骤:Kubernetes cluster with docker private registry

6。在主节点上创建 docker 私有注册表

# Set basic auth.
rm -f /auth/*
mkdir -p /auth
docker run --entrypoint htpasswd registry:2 -Bbn test test > /auth/htpasswd

docker rm registry -f
# Set certificates auth.
rm -f /certs/*
mkdir -p /certs
openssl genrsa 1024 > /certs/registrykey.pem
chmod 400 /certs/registrykey.pem
openssl req -new -x509 -nodes -sha1 -days 365 -key /certs/registrykey.pem  -out /certs/registry.pem  -subj "/C=/ST=/L=/O=/OU=/CN=registry.com" > /dev/null 2>&1
docker run -d -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 -p 5000:5000 --restart=always --name registry -v `pwd`/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd -v `pwd`/certs:/certs -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.pem -e REGISTRY_HTTP_TLS_KEY=/certs/registrykey.pem registry:2

# Create secret to be used in "imagePullSecrets" section of a pod
kubectl create secret docker-registry regsecret --docker-server=192.168.147.3:5000 --docker-username=test --docker-password=test --namespace=kube-system

# Push image in private registry.
docker tag test-image:latest 192.168.147.3:5000/test-image
docker push 192.168.147.3:5000/test-image

7。带有来自私有注册表的图像的 pod 的 YAML 示例

apiVersion: v1
kind: Pod
metadata:
  name: test-site
  labels:
    app: web
spec:
  containers:
    - name: test
  image: 192.168.147.3:5000/test-image:latest
    ports:
      - containerPort: 8000
  imagePullPolicy: Always
    imagePullSecrets:
      - name: regsecret

【讨论】:

    猜你喜欢
    • 2019-01-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2020-08-19
    • 1970-01-01
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多