我对 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
文件添加到我的本地 minikube 和 docker 副本/etc/docker/certs.d/registry-url.net:5000/
。
但是,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
registry-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
的base64cat ~/.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
时,更改似乎没有生效,但重新启动确实起到了作用。我不确定是否有解决我的问题的方法,但这是唯一对我有用的解决方案。