16

基本的に、自動的にスケーリングする 3 つのコンテナーを作成する展開があります: PHP-FPM、NGINX、およびアプリケーションを含むコンテナーで、すべてシークレット、サービス、イングレスで設定されています。アプリケーションは、PHP-FPM と NGINX の間でもプロジェクトを共有するため、すべてセットアップされています。

K8s を使ってもっと調べたいので、永続ディスクもマウントする Redis でポッドを作成することにしました (ただし、これは重要ではありません)。また、redis 用のサービスも作成しました。Redis コンテナーに SSH で接続して実行すると、すべてが完全に正常に動作しますredis-cli

興味深い点は、プロジェクトが Redis がオンになっているポッドに接続できないことです。ポッド間のコンテナは同じ「ローカル」ネットワークを共有しており、 を使用してアクセスできることを理解していますlocalhost

プロジェクトを、独立してスケーリングする他のポッドで実行されている redis サーバーに接続するにはどうすればよいですか? Redis サービスの何が問題になっていますか?


私のRedisサービスはこれです:

apiVersion: v1
kind: Service
metadata:
  name: redis-service
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis

私の Redis ポッドは、デプロイメント構成ファイルによって強化されています (必ずしもスケールする必要はありませんが、楽しみにしています)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis
  labels:
    app: redis
spec:
  selector:
    matchLabels:
      app: redis
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: redis
    spec:
      volumes:
        - name: redis-persistent-volume
          persistentVolumeClaim:
            claimName: redis-pvc
      containers:
        - image: redis:4.0.11
          command: ['redis-server']
          name: redis
          imagePullPolicy: Always
          resources:
            limits:
              cpu: 250m
              memory: 512Mi
            requests:
              cpu: 250m
              memory: 512Mi
          ports:
            - containerPort: 6379
              name: redis
          volumeMounts:
            - name: redis-persistent-volume
              mountPath: /data

また、 をタップするkubectl get serviceと、Redis サーバーにはクラスター IP があります。

NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1       <none>        443/TCP        21h
nginx-service   NodePort    10.100.111.16   <none>        80:30312/TCP   21h
redis-service   ClusterIP   10.99.80.141    <none>        6379/TCP       6s
4

3 に答える 3

16

プロジェクトを、独立してスケーリングする他のポッドで実行されている redis サーバーに接続するにはどうすればよいですか?

ここには 3 つの状態があります。

  • Redis ポッドが実行されているのと同じ名前空間で実行されている他のポッドから Redis ポッドに接続するには。この場合、サービス名を使用し、サービス ポートを指定して、現在の ClusterIP 経由でサービスに到達します (kube-dns が DNS 解決を行っています)。このシナリオを求めていると思います。redis-service6379

  • これは、あるポッド内から別のポッドにアクセスする例です(あなたの場合)。ファーストラン:

         kubectl run -it --rm test --image=busybox --restart=Never -- sh
    

    これにより、新しいテスト ポッドが実行さshれ、そのポッド内に表示されます。ここnslookup redis-serviceで (テスト ポッド内で) そこに入力すると、DNS がポッド間で正しく機能していることを確認できます。を使用して、redis ポートが実際に開いているかどうかを確認することもできますnc -zv redis-service 6379。kube-dns が正常に機能している場合、ポートが開いていることがわかります。

  • 同じ kubernetes クラスターで実行されているが異なる名前空間で実行されている他のポッドから Redis ポッドに接続するには。この場合、ドキュメントに記載されているように、サービス名と名前空間名で構成される FQDN を使用します。

  • kubernetes クラスターの外部から Redis ポッドに接続するには。この場合、redis サービスを外の世界に公開するために、ある種のイングレスまたは同様のメカニズムの nodePort が必要になります。詳細については、公式ドキュメントを参照してください。

于 2018-09-11T11:51:15.990 に答える