kubernetes - mongo, mongo-express & node.js app: three pods connection practice

Practice1: Three containers in one pod


clone data from github

1. Prepare one deployment

💡 k is abbreviation from kubectl

three containers in one pod deployment

three-container.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: mongo-app-deploy
  labels:
    app: mongo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mongo
  template:
    metadata:
      labels:
        app: mongo
    spec:
      containers:
      - name: mongo
        image: mongo
        env:
        - name: MONGO_INITDB_ROOT_USERNAME
          value: admin
        - name: MONGO_INITDB_ROOT_PASSWORD
          value: password
        ports:
        - containerPort: 27001
      - name: mongo-express
        image: mongo-express
        ports:
        - containerPort: 8081
        env:
        - name: ME_CONFIG_MONGODB_ADMINUSERNAME
          value: admin
        - name: ME_CONFIG_MONGODB_ADMINPASSWORD
          value: password
        - name: ME_CONFIG_MONGODB_URL
          value: mongodb://admin:password@localhost:27017/
      - name: my-app
        image: chi811008/my-app:1.3
        ports:
        - containerPort: 3000

由於 mongo, mongo-express, app 都在同一個 pod 中

因此 containers level 會包含三個 container 以及其所需設定的環境變數

  • image: mongo

    env:

    • name: MONGO_INITDB_ROOT_USERNAME value: admin

    • name: MONGO_INITDB_ROOT_PASSWORD value: password

  • image: mongo-ecpress

    env:

    • name: ME_CONFIG_MONGODB_ADMINUSERNAME
      value: admin
    • name: ME_CONFIG_MONGODB_ADMINPASSWORD
      value: password
    • name: ME_CONFIG_MONGODB_URL
      value: mongodb://admin:password@localhost:27017/
  • image: chi811008/my-app:1.3

    my-app:1.3 中 node.js app connect mongo db 的寫法如下

    let mongoUrlLocal = "mongodb://admin:password@localhost:27017";
    MongoClient.connect(mongoUrlLocal, ....
    

    因為在同一個 pod 中,所以連接 mongodb 時,可以直接用 localhost + mongodb 的 port →

    localhost:27017

2. Apply

╰─$ k apply -f three-container.yaml

3. Check elements

╰─$ k get po
NAME                                                    READY   STATUS    RESTARTS   AGE
mongo-app-deploy-847754876-r5mcs   3/3          Running     0                   33m

4. Port forward

╰─$ k port-forward mongo-app-deploy-847754876-r5mcs 3000:3000

5. Open browser

localhost:3000

Practice2: Three pods each contains one container

1. Prepare

  • 1 namespace

  • 1 mongo configmap

  • 1 mongo secret

  • 1 mongo deployment which contains internal service

  • 1 mongo-expredd deployment which contains (external) service

  • 1 app deployment which contains external service

    app deployment 中使用的 image: chi811008:1.4

    與上面 1.3 tag 不同的是,node.js app mongodb connection 的 url 改成用環境變數接

    let mongoUrlLocal = process.env.MONGODB_URL;
    MongoClient.connect(mongoUrlLocal, ....

    因此在設定 my-app-deployment.yaml 檔時,需要設定 MONGODB_RUL 這個環境變數

    • env:
    • name: MONGODB_URL value: "mongodb://admin:password@mongodb-service.mongodb-namespace.svc.cluster.local:27017"

    💡 連接到 mongodb service 的路徑 mongodb://<user>:<password>@<mongodb service name>.<namespace>.svc.cluster.local:27017

2. Apply

  1. mongo-namespace

    k apply -f mongo-namespace.yaml
  2. mongo-configmap

    k apply -f mongo-configmap.yaml
  3. mongo-secret

    k apply -f mongo-secret.yaml
  4. mongo

    k apply -f mongo.yaml
  5. mongo-express

    k apply -f mongo-express.yaml
  6. my-app-deployment

    k apply -f my-app-deployment.yaml

3. Check elements

╰─$ k -n mongodb-namespace get po
NAME                                          READY   STATUS    RESTARTS   AGE
mongodb-deployment-7bb6c6c4c7-pk4zl           1/1     Running   0          25h
mongodb-express-deployment-58b4bfcffd-wnq2s   1/1     Running   0          25h
my-app-deployment-d5f6dcfd8-lspb2             1/1     Running   0          42mk -n mongodb-namespace get secret

╰─$ k -n mongodb-namespace get cm
NAME                DATA   AGE
mongodb-configmap   1      25hk -n mongodb-namespace get deploy

╰─$ k -n mongodb-namespace get ns
NAME                STATUS   AGE
mongodb-namespace   Active   25h

╰─$ k -n mongodb-namespace get svc
NAME                      TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
mongodb-express-service   ClusterIP      10.104.37.87     <none>        8081/TCP         25h
mongodb-service           ClusterIP      10.110.202.183   <none>        27017/TCP        25h
my-app-service            LoadBalancer   10.103.207.9     <pending>     3000:30001/TCP   41m

4. Port forward

╰─$ k -n mongodb-namespace port-forward my-app-deployment-d5f6dcfd8-lspb2 3000:3000

5. Open browser

localhost:3000

reference

Comments

Popular posts from this blog

《 Imgproxy 使用分析一:圖片下載速度優化分析:Akamai CDN vs Imgproxy 效能比較》

《 Akamai + S3 與 CloudFront + Imgproxy + S3 使用分析二:壓縮圖片設計流程:檔案大小 vs 載入時間的權衡》

程式語言初學者 Docker 入門第二章 —— 安裝與驗證 (Mac)