web-dev-qa-db-ja.com

「hostNetwork:true」と「NET_BIND_SERVICE」の設定で「空きポートがありません」エラーをデバッグする方法

エラーのデバッグについてヘルプが必要です: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
3
skwokie

Macのdockerでこれをセットアップする可能性はありませんが、Docker VMのポートを確認する必要があるようです:

screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty

デフォルトのノードポート範囲を変更できるかどうか検討してください(--service-node-port-rangeportRange-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)になります

それが役に立ったかどうか私に知らせてください。

1
Hanx