如何将不安全 Docker 注册表证书添加到 kubeadm 配置

How to add insecure Docker registry certificate to kubeadm config

我是 Kubernetes 的新手,我设法使用 minikube 在本地部署了一个 Angular 应用程序。但是现在我正在处理一个 Bitnami Kubernetes Sandbox EC2 实例,并且我 运行 遇到了从另一个 EC2 实例上的 docker 注册表中提取的问题。

每当我尝试应用部署时,pods 都会记录以下错误

Failed to pull image "registry-url.net:5000/app": no available registry endpoint:
failed to do request: Head https://registry-url.net/v2/app/manifests/latest:
x509: certificate signed by unknown authority

docker 注册表证书 是由 CA (Comodo RSA) 签署的 ,但我必须添加注册表的 .crt.key 文件到 /etc/docker/certs.d/registry-url.net:5000/ 我的本地 minikube 副本和 docker.

但是,Bitnami 实例没有 /etc/docker/ 目录,也没有 daemon.json 文件来添加不安全的注册表例外,我不确定证书文件的用途位于 kubeadm.

那么有没有类似的位置来为 kubeadm 放置 .crt.key 文件,或者是否有一个命令我可以 运行 添加我的 docker 注册表到例外列表?

或者更好的是,有没有办法让 Kubernetes/docker 识别注册表的 SSL 证书的 CA?

谢谢

编辑: 我在下面包含了我的部署和秘密文件:

app-deployment.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
        - name: app
          image: registry-url.net:5000/app
          ports:
            - containerPort: 80
          env:
            ...

      imagePullSecrets:
        - name: registry-pull-secret

注册表-secret.yaml

apiVersion: v1
kind: Secret
metadata:
  name: registry-pull-secret
data:
 .dockerconfigjson: <base-64 JSON>
type: kubernetes.io/dockerconfigjson

您需要创建一个包含存储库详细信息的 secret

这可能是将图像上传到您的 docker 存储库的示例:

docker login _my-registry-url_:5000  
Username (admin):  
Password:  
Login Succeeded  

docker tag _user_/_my-cool-image_  _my-registry-url_:5000/_my-cool-image_:0.1  
docker push _my-registry-url_:5000/_my-cool-image_:0.1

从那个主机你应该像这样创建 ~/.docker/config.json 的 base64 cat ~/.docker/config.json | base64 然后你就可以将它添加到秘密中,因此创建一个 yaml 可能如下所示:

apiVersion: v1
kind: Secret
metadata:
 name: registrypullsecret
data:
 .dockerconfigjson: <base-64-encoded-json-here>
type: kubernetes.io/dockerconfigjson

完成后,您可以使用 kubectl create -f my-secret.yaml && kubectl get secrets.

应用秘密

至于你的 pod 它应该是这样的:

apiVersion: v1
kind: Pod
metadata:
 name: jss
spec:
 imagePullSecrets:
  — name: registrypullsecret
 containers:
  — name: jss
    image: my-registry-url:5000/my-cool-image:0.1

所以我最终通过以下命令手动安装 docker 解决了我的问题:

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get install docker-ce docker-ce-cli containerd.io

然后我必须创建目录结构 /etc/docker/certs.d/registry-url:5000/ 并将注册表的 .crt.key 文件复制到目录中。

但是,还是不行;但是在停止 EC2 实例并再次启动它之后,它似乎可以毫无问题地从远程注册表中提取。

当我最初 运行 service kubelet restart 时,更改似乎没有生效,但重新启动就成功了。我不确定是否有更好的方法来解决我的问题,但这是唯一对我有用的解决方案。