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 status
或docker ps
)。 - 运行
ss -ln
并检查在 127.0.0.1:8080 或 *:8080 上侦听的内容 - 看看是否可以使用其他东西连接到套接字
curl -k https://127.0.0.1:8080
来检查 https 或curl http://127.0.0.1:8080
HTTP。 - 如果您的 API 服务器在 Docker 容器中运行,请确保它正在侦听主机上的 8080。
docker ps
或docker 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用户主目录中的配置。