You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

集群内Pod用.NET Kubernetes客户端启动AKS Job遇SSL证书验证错误

解决集群内.NET Kubernetes客户端SSL证书验证失败问题

问题重现

在AKS集群内的Pod中运行以下F#代码启动Kubernetes Job时,首次调用DeleteNamespacedJobAsync抛出SSL连接异常:

//F#
let startJob (yaml: string) = task {
    let config = KubernetesClientConfiguration.InClusterConfig()
    let job = KubernetesYaml.Deserialize<V1Job>(yaml)

    use client = new Kubernetes(config)
    let! _ = client.BatchV1.DeleteNamespacedJobAsync(job.Name(), job.Metadata.Namespace())
    let! _ = client.BatchV1.CreateNamespacedJobAsync(job, job.Namespace()) }

异常信息:

无法建立SSL连接,请查看内部异常。
远程证书被提供的RemoteCertificateValidationCallback拒绝。

解决方案

1. 调整TLS证书验证配置

集群内运行时,InClusterConfig有时无法正确加载AKS的CA证书,可通过以下两种方式修复:

方式一:指定CA证书路径(推荐生产环境)

集群内Pod的服务账号默认挂载CA证书到/var/run/secrets/kubernetes.io/serviceaccount/ca.crt,手动指定该路径即可:

let startJob (yaml: string) = task {
    let config = 
        let cfg = KubernetesClientConfiguration.InClusterConfig()
        // 显式指定集群CA证书路径
        cfg.CaCertPath <- "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
        cfg
    let job = KubernetesYaml.Deserialize<V1Job>(yaml)

    use client = new Kubernetes(config)
    let! _ = client.BatchV1.DeleteNamespacedJobAsync(job.Name(), job.Metadata.Namespace())
    let! _ = client.BatchV1.CreateNamespacedJobAsync(job, job.Namespace()) }

方式二:临时跳过TLS验证(仅测试环境)

如果只是测试场景,可临时关闭证书验证(生产环境禁止使用):

let startJob (yaml: string) = task {
    let config = 
        let cfg = KubernetesClientConfiguration.InClusterConfig()
        cfg.SkipTlsVerify <- true
        cfg
    let job = KubernetesYaml.Deserialize<V1Job>(yaml)

    use client = new Kubernetes(config)
    let! _ = client.BatchV1.DeleteNamespacedJobAsync(job.Name(), job.Metadata.Namespace())
    let! _ = client.BatchV1.CreateNamespacedJobAsync(job, job.Namespace()) }

2. 验证服务账号权限

确保Pod使用的服务账号拥有操作Job的权限,创建对应的Role和RoleBinding:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: <你的命名空间>
  name: job-operator-role
rules:
- apiGroups: ["batch"]
  resources: ["jobs"]
  verbs: ["create", "delete", "get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  namespace: <你的命名空间>
  name: job-operator-binding
subjects:
- kind: ServiceAccount
  name: <Pod使用的服务账号名>
  namespace: <你的命名空间>
roleRef:
  kind: Role
  name: job-operator-role
  apiGroup: rbac.authorization.k8s.io

内容的提问来源于stack exchange,提问作者Franco Tiveron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 21:17:46