首页 文章

OpenShift从另一个Pod访问Mongodb Pod

提问于
浏览
0

我当前正试图在OpenShift上部署一个mongodb pod,并通过mongoose从另一个node.js应用程序访问这个pod . 现在起初一切似乎都很好 . 我创建了一条通往mongodb的路线,当我在浏览器中打开它时,我得到了

看起来您正尝试在本机驱动程序端口上通过HTTP访问MongoDB .

到现在为止还挺好 . 但是,当我尝试从另一个pod打开与数据库的连接时,它拒绝连接 . 我正在使用OpenShift提供的用户名和密码并连接到

mongodb://[username]:[password]@[host]:[port]/[dbname]

不幸没有运气 . 似乎数据库只是接受来自localhost的连接 . 但是我无法找到如何改变它 . 如果有人有想法会很棒 .

继承人部署配置

apiVersion: v1
kind: DeploymentConfig
metadata:
  annotations:
    template.alpha.openshift.io/wait-for-ready: "true"
  creationTimestamp: null
  generation: 1
  labels:
    app: mongodb-persistent
    template: mongodb-persistent-template
  name: mongodb
spec:
  replicas: 1
  selector:
    name: mongodb
  strategy:
    activeDeadlineSeconds: 21600
    recreateParams:
      timeoutSeconds: 600
    resources: {}
    type: Recreate
  template:
    metadata:
      creationTimestamp: null
      labels:
        name: mongodb
    spec:
      containers:
      - env:
        - name: MONGODB_USER
          valueFrom:
            secretKeyRef:
              key: database-user
              name: mongodb
        - name: MONGODB_PASSWORD
          valueFrom:
            secretKeyRef:
              key: database-password
              name: mongodb
        - name: MONGODB_ADMIN_PASSWORD
          valueFrom:
            secretKeyRef:
              key: database-admin-password
              name: mongodb
        - name: MONGODB_DATABASE
          valueFrom:
            secretKeyRef:
              key: database-name
              name: mongodb
        image: registry.access.redhat.com/rhscl/mongodb-32-rhel7@sha256:82c79f0e54d5a23f96671373510159e4fac478e2aeef4181e61f25ac38c1ae1f
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 3
          initialDelaySeconds: 30
          periodSeconds: 10
          successThreshold: 1
          tcpSocket:
            port: 27017
          timeoutSeconds: 1
        name: mongodb
        ports:
        - containerPort: 27017
          protocol: TCP
        readinessProbe:
          exec:
            command:
            - /bin/sh
            - -i
            - -c
            - mongo 127.0.1:27017/$MONGODB_DATABASE -u $MONGODB_USER -p $MONGODB_PASSWORD
              --eval="quit()"
          failureThreshold: 3
          initialDelaySeconds: 3
          periodSeconds: 10
          successThreshold: 1
          timeoutSeconds: 1
        resources:
          limits:
            memory: 512Mi
        securityContext:
          capabilities: {}
          privileged: false
        terminationMessagePath: /dev/termination-log
        volumeMounts:
        - mountPath: /var/lib/mongodb/data
          name: mongodb-data
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30
      volumes:
      - name: mongodb-data
        persistentVolumeClaim:
          claimName: mongodb
  test: false
  triggers:
  - imageChangeParams:
      automatic: true
      containerNames:
      - mongodb
      from:
        kind: ImageStreamTag
        name: mongodb:3.2
        namespace: openshift
    type: ImageChange
  - type: ConfigChange
status:
  availableReplicas: 0
  latestVersion: 0
  observedGeneration: 0
  replicas: 0
  unavailableReplicas: 0
  updatedReplicas: 0

服务配置

apiVersion: v1
kind: Service
metadata:
  annotations:
    template.openshift.io/expose-uri: mongodb://{.spec.clusterIP}:{.spec.ports[?(.name=="mongo")].port}
  creationTimestamp: null
  labels:
    app: mongodb-persistent
    template: mongodb-persistent-template
  name: mongodb
spec:
  ports:
  - name: mongo
    port: 27017
    protocol: TCP
    targetPort: 27017
  selector:
    name: mongodb
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}

和 beans 荚

apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/created-by: |
      {"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"ReplicationController","namespace":"some-name-space","name":"mongodb-3","uid":"xxxx-xxx-xxx-xxxxxx","apiVersion":"v1","resourceVersion":"244413593"}}
    kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu request for container
      mongodb'
    openshift.io/deployment-config.latest-version: "3"
    openshift.io/deployment-config.name: mongodb
    openshift.io/deployment.name: mongodb-3
    openshift.io/scc: nfs-scc
  creationTimestamp: null
  generateName: mongodb-3-
  labels:
    deployment: mongodb-3
    deploymentconfig: mongodb
    name: mongodb
  ownerReferences:
  - apiVersion: v1
    controller: true
    kind: ReplicationController
    name: mongodb-3
    uid: a694b832-5dd2-11e8-b2fc-40f2e91e2433
spec:
  containers:
  - env:
    - name: MONGODB_USER
      valueFrom:
        secretKeyRef:
          key: database-user
          name: mongodb
    - name: MONGODB_PASSWORD
      valueFrom:
        secretKeyRef:
          key: database-password
          name: mongodb
    - name: MONGODB_ADMIN_PASSWORD
      valueFrom:
        secretKeyRef:
          key: database-admin-password
          name: mongodb
    - name: MONGODB_DATABASE
      valueFrom:
        secretKeyRef:
          key: database-name
          name: mongodb
    image: registry.access.redhat.com/rhscl/mongodb-32-rhel7@sha256:82c79f0e54d5a23f96671373510159e4fac478e2aeef4181e61f25ac38c1ae1f
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 3
      initialDelaySeconds: 30
      periodSeconds: 10
      successThreshold: 1
      tcpSocket:
        port: 27017
      timeoutSeconds: 1
    name: mongodb
    ports:
    - containerPort: 27017
      protocol: TCP
    readinessProbe:
      exec:
        command:
        - /bin/sh
        - -i
        - -c
        - mongo 127.0.1:27017/$MONGODB_DATABASE -u $MONGODB_USER -p $MONGODB_PASSWORD
          --eval="quit()"
      failureThreshold: 3
      initialDelaySeconds: 3
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 1
    resources:
      limits:
        memory: 512Mi
      requests:
        cpu: 250m
        memory: 512Mi
    securityContext:
      capabilities:
        drop:
        - KILL
        - MKNOD
        - SETGID
        - SETUID
        - SYS_CHROOT
      privileged: false
      runAsUser: 1049930000
      seLinuxOptions:
        level: s0:c223,c212
    terminationMessagePath: /dev/termination-log
    volumeMounts:
    - mountPath: /var/lib/mongodb/data
      name: mongodb-data
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: default-token-rfvr5
      readOnly: true
  dnsPolicy: ClusterFirst
  imagePullSecrets:
  - name: default-dockercfg-3mpps
  nodeName: thenode.name.net
  nodeSelector:
    region: primary
  restartPolicy: Always
  securityContext:
    fsGroup: 1049930000
    seLinuxOptions:
      level: s0:c223,c212
    supplementalGroups:
    - 5555
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  volumes:
  - name: mongodb-data
    persistentVolumeClaim:
      claimName: mongodb
  - name: default-token-rfvr5
    secret:
      defaultMode: 420
      secretName: default-token-rfvr5
status:
  phase: Pending

1 回答

  • 2

    好的,这是一个漫长的搜索,最后我能够解决它 . 我的第一个错误是,路由不适合与数据库 Build 连接,因为它们只使用http协议 .

    现在有2个用例留给我

    • 您正在使用本地计算机,并希望测试稍后上载到OpenShift的代码

    • 您将该代码部署到OpenShift(必须在同一个项目中,但是与数据库不同的应用程序)

    1. Local Machine

    由于路由不起作用,因此使用端口转发 . 我以前读过这个,但并不真正理解它的含义(我认为服务本身就是转发端口) .

    当您在本地计算机上时,您将使用oc执行以下操作

    oc port-forward <pod-name> <local-port>:<remote-port>
    

    您将获得转发端口的信息 . 现在问题是,在您的应用程序中,您现在将连接到localhost(即使在本地计算机上)

    2. App running on OpenShift

    将代码上传到OpenShift后(在我的情况下,只需添加到项目 - > Node.js - >添加您的仓库),localhost将不再工作 . 我花了一段时间才能理解,只要你在同一个项目中,你的环境变量就会有很多信息 . 所以只需检查数据库服务的名称(在我的情况下是mongodb),你会发现要使用的主机和端口

    Summary

    这是一个现在可以运行的小代码示例,也可以在本地机器上运行,就像在OpenShift上一样 . 我已经在OpenShift上设置了一个名为mongodb的persoand MongoDB .

    代码没有做太多,但它会 Build 一个连接并告诉你它确实如此,所以你知道它正在工作 .

    var mongoose = require('mongoose');
    
    // Connect to Mongodb
    var username = process.env.MONGO_DB_USERNAME || 'someUserName';
    var password = process.env.MONGO_DB_PASSWORD || 'somePassword';
    
    var host = process.env.MONGODB_SERVICE_HOST || '127.0.0.1';
    var port = process.env.MONGODB_SERVICE_PORT || '27017';
    
    var database = process.env.MONGO_DB_DATABASE || 'sampledb';
    console.log('---DATABASE PARAMETERS---');
    console.log('Host: ' + host);
    console.log('Port: ' + port);
    console.log('Username: ' + username);
    console.log('Password: ' + password); 
    console.log('Database: ' + database);
    
    
    
    var connectionString = 'mongodb://' + username + ':' + password +'@' + host + ':' + port + '/' + database;
    console.log('---CONNECTING TO---');
    console.log(connectionString);
    mongoose.connect(connectionString);
    
    mongoose.connection.once('open', (data) => {
        console.log('Connection has been made');
        console.log(data);
    });
    

相关问题