Resumo da questão
Tenho um cluster Kubernetes 1.30 em execução em 3 servidores AWS EC2, 1 nó mestre e 2 nós de trabalho. Estou tentando implantar um registro de contêiner privado usando a registry:2.8.2
imagem do projeto de distribuição CNCF. Segui as etapas listadas abaixo, mas estou recebendo o erro "certificado x509 assinado por autoridade desconhecida" enquanto tento executar um login docker no registro.
Observação: estou usando certificados autoassinados.
Passos para reproduzir
Crie certificados autoassinados e autenticação de usuário. Os certificados TLS usam OpenSSL:
mkdir registry cd registry mkdir certs mkdir auth openssl req -x509 -newkey rsa:4096 -days 365 -nodes -sha256 -keyout certs/tls.key -out certs/tls.crt -subj "/CN=my-registry" -addext "subjectAltName = DNS:my-registry"
Use
htpasswd
para adicionar autenticação de usuário para acesso ao registro. As credenciais para o registro privado sãomyuser/mypasswd
:docker run --entrypoint htpasswd httpd:2 -Bbn myuser mypasswd > auth/htpasswd
Crie um segredo para montar os certificados (tipo secreto
tls
):kubectl create secret tls certs-secret --cert=/home/ubuntu/day42/registry/certs/tls.crt --key=/home/ubuntu/day42/registry/certs/tls.key
Crie um segredo para autenticação:
kubectl create secret generic auth-secret --from-file=/home/ubuntu/day42/registry/auth/htpasswd
Crie o diretório local e aplique o PV PVC.
Crie o pod de registro.
apiVersion: v1
kind: Pod
metadata:
name: docker-registry-pod
labels:
app: registry
spec:
containers:
- name: registry
image: registry:2.8.2
volumeMounts:
- name: repo-vol
mountPath: "/var/lib/registry"
- name: certs-vol
mountPath: "/certs"
readOnly: true
- name: auth-vol
mountPath: "/auth"
readOnly: true
env:
- name: REGISTRY_AUTH
value: "htpasswd"
- name: REGISTRY_AUTH_HTPASSWD_REALM
value: "Registry Realm"
- name: REGISTRY_AUTH_HTPASSWD_PATH
value: "/auth/htpasswd"
- name: REGISTRY_HTTP_TLS_CERTIFICATE
value: "/certs/tls.crt"
- name: REGISTRY_HTTP_TLS_KEY
value: "/certs/tls.key"
volumes:
- name: repo-vol
persistentVolumeClaim:
claimName: registry-pvc
- name: certs-vol
secret:
secretName: certs-secret
- name: auth-vol
secret:
secretName: auth-secret
Crie o pod de serviço.
Exporte as variáveis de ambiente:
export REGISTRY_NAME="my-registry" Master-->export REGISTRY_IP="10.100.175.12" # (Above IP is the NodePort service IP)
Adicione a entrada abaixo a
/etc/hosts
todos os nós:10.100.175.12 my-registry
Copie
tls.crt
para/usr/local/share/ca-certificates
todos os nós e execute o seguinte comando:sudo update-ca-certificates
Tente fazer login no registro:
docker login my-registry:5000 -u myuser -p mypasswd
Detalhes do erro
Error response from daemon: Get "https://my-registry:5000/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
Saída decrictl info
crictl info |grep -i tls
"enableTLSStreaming": false,
"tlsCertFile": "",
"tlsKeyFile": ""
Para certificados como os SSL, você precisa adicionar toda a cadeia de certificados no arquivo de certificado que você está usando com o nginx para executar o registro. Muitos sistemas operacionais não confiam nas CAs intermediárias , apenas na CA raiz, então você precisa preencher as etapas ausentes entre o certificado para seu host e a CA raiz que é confiável pelo SO .
No e-mail que você recebeu seu certificado, você também deve encontrar links para as CAs intermediárias e a CA raiz. Abra o arquivo docker-registry.crt , role até o final e anexe as CAs intermediárias e, finalmente, o certificado da CA raiz para a cadeia PositiveSSL. Depois de fazer isso, reinicie o nginx. Agora você deve estar pronto para prosseguir.
Observação: se você possui um nome de domínio, pode usar o Let's Encrypt para obter um certificado confiável sem custo algum.
Ufa! Depois de passar 3 dias com esse problema, finalmente descobri.
Abaixo estão as etapas que tomei para corrigir o problema:
Garanta que todos os nós confiem no certificado autoassinado:
tls.crt
foi copiado para/usr/local/share/ca-certificates
todos os nóssudo update-ca-certificates
em cada nó.Configure o Docker para confiar no certificado autoassinado:
O Docker precisa ser explicitamente configurado para confiar no seu certificado autoassinado. Você deve copiar o
tls.crt
para o diretório de certificados confiáveis do Docker.Execute o docker login novamente