繁体   English   中英

OpenShift从另一个Pod访问Mongodb Pod

[英]OpenShift Access Mongodb Pod from another Pod

我当前正试图在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: {}

和豆荚

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

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

现在有2个用例留给我

  1. 您正在使用本地计算机,并希望测试稍后上载到OpenShift的代码
  2. 您将该代码部署到OpenShift(必须在同一个项目中,但是与数据库不同的应用程序)

1.本地机器

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

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

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

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

2.在OpenShift上运行的应用程序

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

摘要

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

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

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);
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM