エラーのデバッグについてヘルプが必要です:0/1 nodes are available: 1 node(s) didn't have free ports for the requested pod ports.
誰か助けてくれますか?
Mac(最初)でKubernetesのDocker Desktopフレーバーを使用してポッドを実行しようとしています。バージョンは2.1.0.1(37199)です。 hostNetworkモードの効率と、開く必要のあるポートの数(数千)のため、私はhostNetworkモードを試してみたいと思います。 hostNetwork: true
のみを設定すると、エラーは発生しませんが、ホストで開かれているポートも、コンテナ内のホストネットワークインターフェースも表示されません。また、ポート443を開く必要があるため、NET_BIND_SERVICE
の機能を追加しました。これが、エラーをスローし始めたときです。
コンテナ(ubuntu:18.04)内でlsof -i
を実行してから、MacでSudo lsof -i
を実行しましたが、競合は発生しませんでした。次に、/var/lib/log/containers/kube-apiserver-docker-desktop_kube-system_kube-apiserver-*.log
も確認しましたが、手掛かりはありませんでした。ありがとう!
追加情報:コンテナー内で次のコードを実行しました。
# ss -nltp
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 5 0.0.0.0:10024 0.0.0.0:* users:(("pnnsvr",pid=1,fd=28))
LISTEN 0 5 0.0.0.0:2443 0.0.0.0:* users:(("pnnsvr",pid=1,fd=24))
LISTEN 0 5 0.0.0.0:10000 0.0.0.0:* users:(("pnnsvr",pid=1,fd=27))
LISTEN 0 50 0.0.0.0:6800 0.0.0.0:* users:(("pnnsvr",pid=1,fd=14))
LISTEN 0 1 0.0.0.0:6802 0.0.0.0:* users:(("pnnsvr",pid=1,fd=13))
LISTEN 0 50 0.0.0.0:443 0.0.0.0:* users:(("pnnsvr",pid=1,fd=15))
次に、Mac(ホスト)でnetstat
を実行して、それらのポートを検索しましたが、衝突が見つかりません。必要に応じて、netstat(767行)の出力を提供できてうれしいです。
ここにyamlがあります:
apiVersion: apps/v1
kind: Deployment
metadata:
name: pnnsvr
labels:
app: pnnsvr
env: dev
spec:
replicas: 1
selector:
matchLabels:
app: pnnsvr
env: dev
template:
metadata:
labels:
app: pnnsvr
env: dev
spec:
hostNetwork: true
containers:
- name: pnnsvr
image: dev-pnnsvr:0.92
args: ["--root_ip=192.168.15.194"]
# for using local images
imagePullPolicy: Never
ports:
- name: https
containerPort: 443
hostPort: 443
- name: cport6800tcp
containerPort: 6800
hostPort: 6800
protocol: TCP
- name: cport10000tcp
containerPort: 10000
hostPort: 10000
protocol: TCP
- name: cport10000udp
containerPort: 10000
hostPort: 10000
protocol: UDP
- name: cport10001udp
containerPort: 10001
hostPort: 10001
protocol: UDP
#test
- name: cport23456udp
containerPort: 23456
hostPort: 23456
protocol: UDP
securityContext:
capabilities:
add:
- SYS_Nice
- NET_BIND_SERVICE
- CAP_SYS_ADMIN
Macのdockerでこれをセットアップする可能性はありませんが、Docker VMのポートを確認する必要があるようです:
screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty
デフォルトのノードポート範囲を変更できるかどうか検討してください(--service-node-port-range
portRange-Default:30000-32767 )ここに、それを行うための優れた投稿があります docker for mac
hostNetwork: true
ベストプラクティスによると、これは適切なソリューションではありません。
ドキュメントに従って:
絶対に必要でない限り、ポッドにhostPortを指定しないでください。ポッドをhostPortにバインドすると、各組み合わせは一意である必要があるため、ポッドをスケジュールできる場所の数が制限されます。 hostIPとプロトコルを明示的に指定しない場合、KubernetesはデフォルトのhostIPとして0.0.0.0を使用し、TCP=をデフォルトのプロトコルとして使用します。hostPortと同じ理由で、hostNetworkの使用は避けてください。
ノードでポッドのポートを明示的に公開する必要がある場合は、hostPortに頼る前にNodePort Serviceの使用を検討してください。
ポッドまたはコンテナのセキュリティコンテキストを構成する https://kubernetes.io/docs/tasks/configure-pod-container/security-context/
コンテナのセキュリティ設定を指定するには、コンテナマニフェストにsecurityContextフィールドを含めます。 securityContextフィールドはSecurityContextオブジェクトです。コンテナに指定したセキュリティ設定は個々のコンテナにのみ適用され、重複がある場合はポッドレベルで行われた設定を上書きします。コンテナの設定はポッドのボリュームには影響しません。
さらに、PODのsecurityContextについても注意してください。
RunAsGroupフィールドは、ポッドの任意のコンテナ内のすべてのプロセスに対して3000のプライマリグループIDを指定します。このフィールドを省略すると、コンテナーの1次グループIDはroot(0)になります
それが役に立ったかどうか私に知らせてください。