排查连接到可靠来源的问题

本页介绍了如何解决 Config Sync 无法与可靠来源建立连接时发生的问题。

身份验证问题

如果身份验证失败,Config Sync 将无法连接到可靠来源。以下部分介绍如何解决某些身份验证问题。

Git 服务器的服务器证书验证失败

与专用 Git 服务器的连接使用 TLS 来验证服务器真实性。如需进行此验证,您必须提供用于标识根证书授权机构的证书,以及用于认证 Git 服务器身份的任何中间证书授权机构。如果 Git 服务器证书验证失败,则表示无法建立信任链。

如果您收到一条错误消息,表明服务器证书验证失败,则可能是以下某一问题导致:

  • 未指定证书授权机构证书 (CACert)。如需解决此问题,请将 CACert 添加为 Secret,并在 RootSyncRepoSync 对象的 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 代码库身份验证类型从 nonegcenodegcpserviceaccount 切换到需要 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 值不正确,或者 RootSyncRepoSync 对象中的 spec.git.dirspec.oci.dir 值不正确。您收到的任何 KNV2004 错误消息中都包含目录的值;请根据您的 Git 代码库或 OCI 映像验证该值。

Git 分支无效

检查 git-sync 容器的日志是否存在 Remote branch BRANCH_NAME not found in upstream originwarning: Could not find remote branch BRANCH_NAME to clone. 等错误。如果未指定,则默认分支设置为 master

Git、Helm 或 OCI 凭据无效

检查 git-synchelm-syncoci-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 注册表网址无效

RootSyncRepoSync 对象的 spec.oci.imagespec.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 使用多实例策略来扩缩和隔离租户和故障网域。因此,每个 RootSyncRepoSync 对象都会获得自己的协调器实例。每个协调器实例都有自己的特定于来源的边车,即 git-syncoci-synchelm-sync。这些边车会轮询可靠来源。当您添加其他 RootSyncRepoSync 对象时,会导致轮询可靠来源的协调器发出的 API 请求数线性增加。因此,如果您有许多 RootSyncRepoSync 对象都轮询同一可靠来源,则这有时可能会在来源服务器上造成大量流量负载。

请考虑以下策略之一来缓解此问题:

  • 组合多个 RootSyncsRepoSync 对象,以减少发出来源 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

后续步骤

  • 如果您仍然遇到问题,请检查您的问题是否为已知问题