本页介绍了如何解决 Config Sync 无法与可靠来源建立连接时发生的问题。
身份验证问题
如果身份验证失败,Config Sync 将无法连接到可靠来源。以下部分介绍如何解决某些身份验证问题。
Git 服务器的服务器证书验证失败
与专用 Git 服务器的连接使用 TLS 来验证服务器真实性。如需进行此验证,您必须提供用于标识根证书授权机构的证书,以及用于认证 Git 服务器身份的任何中间证书授权机构。如果 Git 服务器证书验证失败,则表示无法建立信任链。
如果您收到一条错误消息,表明服务器证书验证失败,则可能是以下某一问题导致:
- 未指定证书授权机构证书 (CACert)。如需解决此问题,请将 CACert 添加为 Secret,并在
RootSync
或RepoSync
对象的spec.git.caCertSecretRef
字段中引用该 Secret。 - CACert 不完整。如需解决此问题,请修正 CACert Secret,使其包含完整的信任链,包括根证书和所有中间证书。
- CACert 无效。如需解决此问题,请从服务器提供的证书指定的链接下载证书链,然后更新 CACert Secret。
无法装载 Git Secret
如果您在 git-sync
容器尝试将 Secret 与代码库同步时收到以下错误,则表示 Git Secret 未成功装载到 git-sync
容器中:
KNV2004: unable to sync repo Error in the git-sync container: ERROR: can't configure SSH: can't access SSH key: stat /etc/git-secret/ssh: no such file or directory: lstat /repo/root/rev: no such file or directory
此错误可能是由于您的 Git 代码库身份验证类型从 none
、gcenode
或 gcpserviceaccount
切换到需要 Secret 的其他类型引起的。
如要解决此问题,请运行以下命令来重启 Reconciler Manager 和 Reconciler:
# Stop the reconciler-manager Pod. The reconciler-manager Deployment spins
# up a new Pod which can pick up the latest `spec.git.auth`.
kubectl delete po -l app=reconciler-manager -n config-management-system
# Delete the reconciler Deployments. The reconciler-manager recreates the
# reconciler Deployments with correct volume mount.
kubectl delete deployment -l app=reconciler -n config-management-system
配置问题
通常,配置问题可能会导致 Config Sync 无法连接到可靠来源。以下部分介绍了如何识别和解决常见的配置问题。
图表名称无效
从 Helm 代码库同步时,请确保为 spec.helm.chart
设置正确的值。图表名称不包含代码库名称、图表版本或 .tgz
。您可以使用 helm
template
命令验证图表名称。
配置目录无效
检查您的配置是否存在错误,例如 ConfigManagement
对象中的 policyDir
值不正确,或者 RootSync
或 RepoSync
对象中的 spec.git.dir
或 spec.oci.dir
值不正确。您收到的任何 KNV2004
错误消息中都包含目录的值;请根据您的 Git 代码库或 OCI 映像验证该值。
Git 分支无效
检查 git-sync
容器的日志是否存在 Remote branch
BRANCH_NAME not found in upstream origin
或 warning: Could
not find remote branch BRANCH_NAME to clone.
等错误。如果未指定,则默认分支设置为 master
。
Git、Helm 或 OCI 凭据无效
检查 git-sync
、helm-sync
或 oci-sync
容器的 Config Sync 日志,看看是否存在以下错误之一:
Could not read from remote repository. Ensure you have the correct access rights and the repository exists.
Invalid username or password. Authentication failed for ...
401 Unauthorized
对于 Git 代码库,请验证 Git 凭据和 git-creds
Secret 是否已正确配置。
对于 Helm 代码库,请验证 Helm 凭据是否已正确配置。
对于 OCI 映像,请验证 OCI 凭据已正确配置。
Git 代码库网址无效
检查 git-sync
容器的日志是否存在 Repository not
found
等错误。
检查以确保您使用的网址格式正确无误。例如,如果您使用 SSH 密钥对向 Git 代码库进行身份验证,请确保在配置 Config Sync时为 Git 代码库输入的网址使用 SSH 协议。
Helm 代码库网址无效
检查 helm-sync
容器的日志是否存在 ...not a
valid chart repository
等错误。 您可以使用 helm
template
命令验证 Helm 代码库网址。
OCI 注册表网址无效
RootSync
或 RepoSync
对象的 spec.oci.image
或 spec.oci.dir
字段中无效的值可能会导致连接问题。请检查这些值是否正确。例如,如果您要从 OCI 注册表同步,则网址应以 oci://
开头。
您还可以查看 oci-sync
容器的日志,了解更多信息。
网络问题
如果您怀疑问题与集群的网络相关,请先执行以下问题排查步骤。
无法解析主机:github.com
当 Config Sync 尝试连接到您的 Git 代码库时,它会使用 DNS 来解析指定主机名的 IP。如果无法解析主机,通常表示 DNS 或集群网络存在问题。
如需诊断该问题,请参阅排查 GKE 中的 DNS 问题。
无法从集群内部访问 Git 代码库
有时,git-sync
容器在其日志中抛出错误,表明它无法访问代码库。例如 ssh: connect to host
source.developers.google.com port 2022: Network is unreachable
。如需解决此问题,请调整集群的防火墙或网络配置。
大量来源 API 请求
Config Sync 使用多实例策略来扩缩和隔离租户和故障网域。因此,每个 RootSync
和 RepoSync
对象都会获得自己的协调器实例。每个协调器实例都有自己的特定于来源的边车,即 git-sync
、oci-sync
或 helm-sync
。这些边车会轮询可靠来源。当您添加其他 RootSync
或 RepoSync
对象时,会导致轮询可靠来源的协调器发出的 API 请求数线性增加。因此,如果您有许多 RootSync
和 RepoSync
对象都轮询同一可靠来源,则这有时可能会在来源服务器上造成大量流量负载。
请考虑以下策略之一来缓解此问题:
- 组合多个
RootSyncs
或RepoSync
对象,以减少发出来源 API 请求的协调器的数量。 - 将来源类型从 Git 更改为 OCI。与大多数 Git 服务器相比,Artifact Registry 等 OCI 代码库通常具有更好的扩缩能力,因为它们可以横向扩缩,而无需在服务器副本之间进行同步。
其他问题
本部分包含不属于前面各部分的其他杂项问题。
残存 Git 锁定文件
如果您在 git-sync
中看到以下错误,则表示之前的 git
调用可能已失败,并在容器中留下了残存锁定文件:
KNV2004: error in the git-sync container: ... fatal: Unable to create '/repo/source/.git/shallow.lock': File exists. ...
如需解决此问题,请重启受影响的协调器 Pod 以为其提供新的临时卷:
kubectl delete pod -n config-management-system RECONCILER_NAME
后续步骤
- 如果您仍然遇到问题,请检查您的问题是否为已知问题。