Kubernetes 禁止:用户 "system:anonymous" 无法获取路径“/”

Kubernetes forbidden: User "system:anonymous" cannot get path "/"

当部署到 AWS EKS 时,我很难通过 Internet 公开我的应用程序。

我已经创建了一个部署和一个服务,我可以在使用 kubectl 时看到这两个 运行。我可以看到应用程序已成功连接到外部数据库,因为它在启动时运行脚本来初始化所述数据库。

我的问题是在尝试通过互联网访问应用程序时出现的。我已尝试访问集群端点,但出现此错误:

{
  "kind": "Status",
  "apiVersion": "v1",
  "metadata": {

  },
  "status": "Failure",
  "message": "forbidden: User "system:anonymous" cannot get path "/"",
  "reason": "Forbidden",
  "details": {

  },
  "code": 403
}

但是,如果我访问“/readyz”路径,我会返回 "ok"。 "/version" returns 如下:

{
  "major": "1",
  "minor": "16+",
  "gitVersion": "v1.16.8-eks-e16311",
  "gitCommit": "e163110a04dcb2f39c3325af96d019b4925419eb",
  "gitTreeState": "clean",
  "buildDate": "2020-03-27T22:37:12Z",
  "goVersion": "go1.13.8",
  "compiler": "gc",
  "platform": "linux/amd64"
}

我的 deployment.yml 文件包含以下内容:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: client
  labels:
    app: client
spec:
  replicas: 1
  selector:
    matchLabels:
      app: client
  template:
    metadata:
      labels:
        app: client
    spec:
      containers:
      - name: client
        image: image/repo
        ports:
        - containerPort: 80
        imagePullPolicy: Always

我的service.yml:

apiVersion: v1
kind: Service
metadata:
  name: client
  labels:
    run: client
spec:
  type: LoadBalancer
  ports:
    - name: "80"
      port: 80
      targetPort: 80
      protocol: TCP
  selector:
    run: client

我可以看到负载均衡器已在 AWS 控制台中创建,我已尝试更新 LB 的安全组以便能够与集群端点通信。 LB 仪表板显示一个附加实例是 'OutOfService' 并且在监控选项卡下,我可以看到一个不健康的主机。

我已经尝试访问控制台 EC2 区域中提供的负载平衡器端点(这与从 kubectl get services 返回的作为 LB 服务的 EXTERNAL-IP 的内容相匹配)并且我'我从那里得到一个空响应。

curl XXXXXXX.eu-west-2.elb.amazonaws.com:80
curl: (52) Empty reply from server

在网络浏览器中访问时也是如此。

我似乎在绕着这个圈子兜圈子,如果有任何帮助,我们将不胜感激。

I've tried accessing the Load Balancer endpoint

您正在访问 EKS URL,这是 kubernetes apiserver 端点,而不是(希望)为您的 client 创建的 LoadBalancer Service

您需要 kubectl get -o wide svc client,如果它成功地为您配置了一个 LoadBalancer,那么它的 URL 将出现在输出中。您可以通过 kubectl describe svc client 获得有关该情况的更多详细信息,其中将包括在配置期间影响它的任何事件

因为您的 eks 实例在 LoadBalancer 部分中处于 OutOfService 状态,您应该检查 LoadBalancer 正在对哪个端口进行健康检查。

您可以通过执行 kubectl get svc client -oyaml 并查看 nodePort 部分来做到这一点。

之后,检查您的 LoadBalancer 是否正在对这个确切的端口执行健康检查,如果不是,则将其更改为正确的端口。

如果您有正确的端口,但实例仍处于 OutOfService 状态,那么我建议您转到 eks 实例的安全组,并从 ELB 授予特定端口访问权限。

我从来没有深入了解这里的问题。我重新开始,并为我尝试部署的软件使用了预制的 Helm 图表,它成功了。