无法识别文件。连接被拒绝

无法识别文件。连接被拒绝

connection refused在 Amazon Linux 2 实例上,每次运行引用文件路径的命令时,命令行都会引发以下错误。当https使用 url 代替文件路径 时,也会引发相同的错误。

为什么会发生这种情况?如何修复此问题以便可以从命令行读取和使用该文件?

这是控制台输出:

[kubernetes-host@ip-of-ec2-instance ~]$ sudo kubectl apply -f rbac-kdd.yaml | tee kubeadm-rbac-kdd.out
unable to recognize "rbac-kdd.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
unable to recognize "rbac-kdd.yaml": Get http://localhost:8080/api?timeout=32s: dial tcp 127.0.0.1:8080: connect: connection refused
[kubernetes-host@ip-of-ec2-instance ~]$

文件的相对路径正确。该命令正在尝试将 calico 应用到由 创建的 Kubernetes 集群(kubeadm如果有帮助的话)。 但我认为这是一个基本的 Linux 问题。

此 Amazon Linux 2 EC2 实例上已禁用 SELinux。

当我尝试找出可能的原因时,将不胜感激。


隔离问题:

.kube/config另外,指示端口的内容6443如下:

[kubernetes-host@ip-of-ec2-instance ~]$ cat /home/kubernetes-host/.kube/config
apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: <encrypted-certificate-authority-data-here>
    server: https://ip-of-ec2-instance:6443
  name: kubernetes
contexts:
- context:
    cluster: kubernetes
    user: kubernetes-admin
  name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: <encrypted-client-certificate-data-here>
    client-key-data: <encrypted-client-key-data-here>
[kubernetes-host@ip-of-ec2-instance ~]$

问题似乎是该kubectl apply命令使用 port8080而 Kubernetes apiserver 使用 port 6443。如何纠正这种不匹配以便该kubectl apply命令使用 port 6443

进一步,kubectl可以看到6443是正确的端口,并且curl可以到达正确的6443端口,如下:

[kubernetes-host@ip-of-ec2-instance ~]$ kubectl cluster-info
Kubernetes master is running at https://ip-of-ec2-instance:6443
KubeDNS is running at https://ip-of-ec2-instance:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy  

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

[kubernetes-host@ip-of-ec2-instance ~]$ curl https://ip-of-ec2-instance:6443
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
[kubernetes-host@ip-of-ec2-instance ~]$

[kubernetes-host@ip-of-ec2-instance ~]$ curl https://127.0.0.1:6443
curl: (60) SSL certificate problem: unable to get local issuer certificate
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.
[kubernetes-host@ip-of-ec2-instance ~]$

为什么kubectl apply无法映射到端口6443,什么时候kubectl cluster-info能够映射到正确的端口?

答案1

您似乎无法连接到 Kubernetes API 服务器。这可能有很多原因

  • kubernetes API 服务器未运行
  • API 服务器未侦听 TCP/8080
  • API 服务器未侦听 127.0.0.1 的环回地址
  • API 服务器未使用 HTTP 进行侦听(而是使用 HTTPS 进行侦听)
  • 本地防火墙(例如 iptables)正在阻止连接
  • TCPwrapper 正在阻止连接。
  • 诸如 SELinux 之类的强制访问控制系统正在阻止连接,但您说这已被禁用。如果您在 Amazon Linux 上安装了 AppArmor,那么我不知道是否有人可以帮助您。 :)
  • 这个列表可以继续说明为什么这种联系不会发生的更多深奥原因。
一些补救/故障排除步骤
  • 确保 k8s api 服务器正在运行(我不知道你是如何安装它的,所以我无法建议你如何检查,可能使用systemctl statusdocker ps)。
  • 运行ss -ln并检查在 127.0.0.1:8080 或 *:8080 上侦听的内容
  • 看看是否可以使用其他东西连接到套接字curl -k https://127.0.0.1:8080来检查 https 或curl http://127.0.0.1:8080HTTP。
  • 如果您的 API 服务器在 Docker 容器中运行,请确保它正在侦听主机上的 8080。docker psdocker inspect查看端口转发。
  • 检查防火墙,iptables -S这是一个不太可能的事情,您通常不会看到规则阻止数据包发送到本地主机。
  • 检查 /etc/hosts.deny 是否有任何可能阻止您的内容(同样,这是一个不太可能的事情,因为这通常不会被意外配置)。

编辑

在查看了更多故障排除数据后。我注意到你正在kubectl以 root 身份运行。你的 kubeconfig 位于用户目录中。您应该以用户“kubernetes-host”的身份运行 kubectl,只需sudo在命令开头删除 即可。 kubeconfig 文件会将 Kubectl 定向到正确的端点(地址和端口),但以 root 身份运行时,kubectl 不会签入 /home/kubernetes-host/.kube/config。

所以尝试一下kubectl apply -f rbac-kdd.yaml

如果由于某种原因您必须以 root 身份运行,您应该:

1)质疑导致你来到这里的生活选择。

2)运行sudo kubectl apply --kubeconfig=/home/kubernetes-host/.kube/config -f rbac-kdd.yaml以明确使用kubernetes-host用户主目录中的配置。

相关内容