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
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 ユーザーホームディレクトリの構成を明示的に使用するには、実行します。