connection refused
Amazon Linux 2 인스턴스에서 파일 경로를 참조하는 명령을 실행할 때마다 명령줄에서 다음 오류가 발생합니다. 파일 경로 대신 URL을 사용 하면 https
동일한 오류가 발생합니다 .
왜 이런 일이 발생합니까? 명령줄에서 파일을 읽고 사용할 수 있도록 이 문제를 어떻게 수정합니까?
콘솔 출력은 다음과 같습니다.
[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 ~]$
파일의 상대 경로가 정확합니다. 이 명령은 (도움이 되는 경우)에 의해 생성된 Kubernetes 클러스터에 calico를 적용하려고 합니다 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 ~]$
문제는 Kubernetes apiserver가 port 를 사용하는 동안 kubectl apply
명령이 port 를 사용하는 것 같습니다 . 명령이 port 를 사용 하도록 이 불일치를 수정하려면 어떻게 해야 합니까 ?8080
6443
kubectl apply
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 또는 HTTP를 확인하기 위해 다른 것을 사용하여 소켓에 연결할 수 있는지 확인하세요curl http://127.0.0.1:8080
.- API 서버가 Docker 컨테이너에서 실행 중인 경우 호스트 시스템의 8080에서 수신 대기하는지 확인하세요.
docker ps
아니면docker inspect
포트 포워딩을 살펴보세요. - 방화벽을 확인하십시오.
iptables -S
그럴 가능성은 거의 없습니다. 일반적으로 패킷이 localhost로 전송되는 것을 차단하는 규칙은 표시되지 않습니다. - 당신을 차단할 수 있는 것이 있는지 /etc/hosts.deny를 확인하십시오(다시 말하지만, 이것은 일반적으로 실수로 구성될 수 없기 때문에 가능성이 낮습니다).
편집하다
더 많은 문제 해결 데이터를 살펴본 후. 나는 당신이 kubectl
루트로 실행되고 있음을 알았습니다. kubeconfig는 사용자 디렉터리에 있습니다. "kubernetes-host" 사용자로 kubectl을 실행해야 하며, sudo
명령 시작 부분에서 이를 제거하기만 하면 됩니다. kubeconfig 파일은 Kubectl을 올바른 엔드포인트(주소 및 포트)로 지정하지만, 루트로 실행할 때 kubectl은 /home/kubernetes-host/.kube/config를 체크인하지 않습니다.
그러니 시도해 보세요kubectl apply -f rbac-kdd.yaml
어떤 이유로 루트로 실행해야 하는 경우 다음을 수행해야 합니다.
1) 당신을 여기로 이끈 삶의 선택에 대해 질문해 보세요.
2) sudo kubectl apply --kubeconfig=/home/kubernetes-host/.kube/config -f rbac-kdd.yaml
kubernetes-host 사용자 홈 디렉터리의 구성을 명시적으로 사용하려면 실행합니다.