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 图表,它成功了。
当部署到 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 图表,它成功了。