OpenShift 4 Hands-on Lab (8) 使用配置參數和環境變量

使用ConfigMap配置參數

  1. 將github中的資源下載到本地。然後查看兩個properties配置文件的內容。
$ git clone https://github.com/liuxiaoyu-git/configmap
$ cat ./configmap/color.properties
color.good=green
color.bad=red
$ cat ./configmap/url.properties
url.google=www.google.com
url.redhat=www.redhat.com
  1. 執行以下命令,創建名爲config1和config2的ConfigMap,其中config1採用“–from-file”方法(可以帶多個文件參數),而config2採用“-from-env-file”方法(只能是一個文件參數)。
$ oc new-project USER-ID-config-env
$ oc create configmap config1 --from-file=./configmap/color.properties --from-file=./configmap/url.properties
$ oc create configmap config3 --from-env-file=./configmap/url.properties
  1. 執行以下命令查看config1和config2在“data”區域的區別。
$ oc get configmap config1 -o yaml
apiVersion: v1
data:
  color.properties: "color.good=green\r\ncolor.bad=red"
  url.properties: "url.google=www.google.com\r\nurl.redhat=www.redhat.com"
kind: ConfigMap
 
$ oc get configmap config2 -o yaml
apiVersion: v1
data:
  url.google: www.google.com
  url.redhat: www.redhat.com
kind: ConfigMap
  1. 查看configmap-test.yaml文件,它定義了一個訪問配置參數並打印所有環境變量的的Pod。然後根據它創建一個Pod。
$ cat ./configmap/configmap-test.yaml
apiVersion: v1
kind: Pod
metadata:
  name: configmap-test
spec:
  containers:
    - name: test-container
      image:  docker.io/busybox:latest
      command: [ "/bin/sh", "-c", "env" ]
      env:
        - name: REDHAT_URL
          valueFrom:
            configMapKeyRef:
              name: config1
              key: url.properties
      envFrom:
        - configMapRef:
            name: config2
  restartPolicy: Never
$ oc create -f ./configmap/configmap-test.yaml
  1. 查看configmap-test的log。注意打印的環境變量中url.google、url.redhat和REDHAT_URL的內容。
$ oc logs pod/configmap-test
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://172.30.0.1:443
url.redhat=www.redhat.com
HOSTNAME=configmap-test
SHLVL=1
HOME=/root
url.google=www.google.com
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=172.30.0.1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
KUBERNETES_PORT_443_TCP_PORT=443
REDHAT_URL=url.google=www.google.com
url.redhat=www.redhat.com
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://172.30.0.1:443
KUBERNETES_SERVICE_HOST=172.30.0.1
PWD=/

使用Env環境變量

本實驗使用Env環境變量向DeploymentConfig中傳遞參數。

  1. 部署測試應用,該應用會將環境變量全部打印出來。
$ oc new-app https://github.com/liuxiaoyu-git/PrintEnv
$ oc expose svc printenv
  1. 等到Pod運行起來,然後查看當前爲dc/printenv提供的環境變量(目前還沒有)。
$ oc get pod
NAME                READY   STATUS      RESTARTS   AGE
printenv-1-8sb4n    1/1     Running     0          58s
printenv-1-build    0/1     Completed   0          2m28s
printenv-1-deploy   0/1     Completed   0          66s
$ oc set env dc/printenv --list
# deploymentconfigs/printenv, container printenv
  1. 查看printenv應用的頁面,當前打印的都是系統級的變量。
$ curl $(oc get route printenv|awk '{print $2}'|grep printenv) | jq -S
{
  "APP_ROOT": "/opt/app-root",
  "DEBUG_PORT": "5858",
  "DESCRIPTION": "Node.js 10 available as container is a base platform for building and running various Node.js 10 applications and frameworks. Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.",
  "DEV_MODE": "false",
  "HOME": "/opt/app-root/src",
  "HOSTNAME": "printenv-1-8sb4n",
  "INIT_CWD": "/opt/app-root/src",
  "KUBERNETES_PORT": "tcp://172.30.0.1:443",
  "KUBERNETES_PORT_443_TCP": "tcp://172.30.0.1:443",
  "KUBERNETES_PORT_443_TCP_ADDR": "172.30.0.1",
  "KUBERNETES_PORT_443_TCP_PORT": "443",
  "KUBERNETES_PORT_443_TCP_PROTO": "tcp",
  "KUBERNETES_SERVICE_HOST": "172.30.0.1",
  "KUBERNETES_SERVICE_PORT": "443",
  "KUBERNETES_SERVICE_PORT_HTTPS": "443",
  "LD_LIBRARY_PATH": "/opt/rh/rh-nodejs10/root/usr/lib64",
  "LD_PRELOAD": "libnss_wrapper.so",
  "MANPATH": "/opt/rh/rh-nodejs10/root/usr/share/man:",
  "NAME": "nodejs",
。。。。
  1. 執行命令,爲dc/printenv設置2個環境變量:APP_VAR_1和APP_VAR_2
$ oc set env dc/printenv APP_VAR_1=Value1 APP_VAR_2=Value2
deploymentconfig.apps.openshift.io/printenv updated
  1. 查看pod的狀態,可以看到OpenShift會啓動一個新的部署printenv-2-deploy,它部署將運行的pod從printenv-1-8sb4n更新爲printenv-2-mn9np。
$ oc get pod
NAME                READY   STATUS      RESTARTS   AGE
printenv-1-build    0/1     Completed   0          10m
printenv-1-deploy   0/1     Completed   0          9m14s
printenv-2-deploy   0/1     Completed   0          41s
printenv-2-mn9np    1/1     Running     0          32s
  1. 再次查看dc/printenv的環境變量,可以看到已經有APP_VAR_1和APP_VAR_2變量了。
$ oc set env dc/printenv --list
# deploymentconfigs/printenv, container printenv
APP_VAR_1=Value1
APP_VAR_2=Value2
  1. 再次查看應用頁面輸出,可以看到已經有APP_VAR_1和APP_VAR_2變量了。
$ curl $(oc get route printenv|awk '{print $2}'| grep printenv) | jq -S
{ 
  "APP_ROOT": "/opt/app-root",
  "APP_VAR_1": "Value1",
  "APP_VAR_2": "Value2",
  "DEBUG_PORT": "5858",
  "DESCRIPTION": "Node.js 10 available as container is a base platform for building and running various Node.js 10 applications and frameworks. Node.js is a platform built on Chrome's JavaScript runtime for easily building fast, scalable network applications. Node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.",
  "DEV_MODE": "false",
  "HOME": "/opt/app-root/src",
  "HOSTNAME": "printenv-2-mn9np",
  "INIT_CWD": "/opt/app-root/src",
  "KUBERNETES_PORT": "tcp://172.30.0.1:443",
  "KUBERNETES_PORT_443_TCP": "tcp://172.30.0.1:443",
  "KUBERNETES_PORT_443_TCP_ADDR": "172.30.0.1",
  "KUBERNETES_PORT_443_TCP_PORT": "443",
。。。。
  1. 執行命令,刪除APP_VAR_2環境參數,然後再執行上一步驗證。
$ oc set env dc/printenv APP_VAR_2-

通過Volume使用ConfigMap配置參數

本實驗將ConfigMap配置參數放在容器能訪問的目錄中。

  1. 創建ConfigMap。
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example1/configmap-example.json
configmap/config created

$ oc get configmap config -o yaml
apiVersion: v1
data:
  message: Hello World!
  ui.properties: color=blue
kind: ConfigMap
  1. 創建Node-App應用相關資源 。
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example1/node-app-deployment.json
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example1/node-app-build.json
 
$ oc get pod
NAME                READY   STATUS      RESTARTS   AGE
node-app-1-5fg5p    1/1     Running     0          50s
node-app-1-build    0/1     Completed   0          2m32s
node-app-1-deploy   0/1     Completed   0          59s
  1. 查看node-app應用返回,其中頁面的“bgcolor”設爲“blue”顏色。
$ curl $(oc get route node-app|awk '{print $2}'| grep node-app)
<html><head><title></title></head><body bgcolor="blue"><h1>Hello world!</h1></body>
  1. 查看部署的應用頁面的NodeJS源文件,https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/node-app/server.js,其中以下第一行是讀取配置,最後二行是根據node-app.config中的內容設置背景,最後一行是根據env顯示“Hello World”。
      var properties = PropertiesReader('/etc/node-app/node-app.config');
      res.writeHead(200, {'Content-Type': 'text/html'});
      res.write('<html><head><title></title></head>');
      res.write('<body bgcolor="' + properties.get('color') + '">');
      res.write('<h1>' + process.env.BACKGROUND_MSG + '</h1>');
  1. 在OpenShift控制檯的Developer視圖中進入到Search菜單,在右側Search下方選出DeploymentConfig類型,然後點擊nodeapp一行右側的圖標,在菜單中進入“Edit Deployment Config”。
    在這裏插入圖片描述
  2. 在node-app的DeploymentConfig找到以下部分,其中下圖中三部分分別定義了configmap(顏色)、env(文字)、volumemount。
    在這裏插入圖片描述
  3. 修改node-app的DeploymentConfig的items配置,修改完爲下圖。最後保存修改。
    在這裏插入圖片描述
  4. OpenShift會自動根據新的DeploymentConfig配置重新部署應用。可以查看pod狀態,直到node-app-2-z58mx的pod運行起來。
$ oc get pod
NAME                READY   STATUS      RESTARTS   AGE
node-app-1-build    0/1     Completed   0          52m
node-app-1-deploy   0/1     Completed   0          51m
node-app-2-deploy   0/1     Completed   0          13m
node-app-2-z58mx    1/1     Running     0          13m
  1. 進入node-app-2-z58mx的pod內部,然後查看容器中的“/etc/node-app”目錄中已經有2個文件,最後查看“node-app1.config”文件中的內容。
$ oc rsh node-app-2-z58mx
sh-4.2$ ls /etc/node-app
node-app.config  node-app1.config
sh-4.2$ cat /etc/node-app/node-app1.config
color=blue
  1. 按照上述(4)的方法進入node-app的DeploymentConifg的Overview,可以在下方可以看到下圖的Volumes配置。
    在這裏插入圖片描述
  2. 點擊上圖中的“config”,然後可以在ConfigMap的Overview的下方可以看到名爲config的ConfigMap中的內容。
    在這裏插入圖片描述
  3. 回到以上(9)的界面,然後進入node-app的DeploymentConifg的Environment。可以看到“BACKGROUND_MSG”環境變量被設爲名爲config的ConfigMap中的message參數。
    在這裏插入圖片描述

結合應用發佈,在不同的應用運行環境中使用不同的參數配置

  1. 根據《OpenShift 4 之增加管理員用戶》新建兩個用戶USER-ID-dev和USER-ID-test。
  2. 用USER-ID-dev登錄,然後執行以下命令,在USER-ID-dev-node-app項目中創建configmap-dev和部署node-app應用。
$ oc new-project USER-ID-dev-node-app
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example2/configmap-dev.json
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example2/node-app-deployment.json
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example2/node-app-build.json
$ oc logs -f bc/node-app
  1. 訪問node-app應用,確認bgcolor爲green,頁面內容“This application is running in: DEVELOPMENT”。
$ curl $(oc get route node-app|awk '{print $2}'| grep node-app)
<html><head><title></title></head><body bgcolor="green"><h1>This application is running in: DEVELOPMENT</h1></body>

在這裏插入圖片描述
4. 用USER-ID-test登錄,然後執行以下命令,在USER-ID-test-node-app項目中創建configmap-test和部署node-app應用。注意:由於測試USER-ID-test-node-app項目中還沒有node-app鏡像,因此即便可通過route訪問頁面,但也無法顯示。

$ oc new-project USER-ID-test-node-app
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example2/configmap-test.json
$ oc create -f https://raw.githubusercontent.com/liuxiaoyu-git/app-promotion-configmap/master/example2/node-app-deployment.json
  1. 使用管理員用戶執行以下命令,讓tester-USER-ID用戶能夠看到node-app-dev-USER-ID項目並能從中“拉鏡像”
$ oc policy add-role-to-user view USER-ID-test -n USER-ID-dev-node-app
$ oc policy add-role-to-user system:image-puller USER-ID-test -n USER-ID-dev-node-app
  1. 用USER-ID-test用戶登錄,然後查看項目列表。可以發現該用戶能同時看到USER-ID-dev-node-app和USER-ID-test-node-app項目。
$ oc get project
NAME                  DISPLAY NAME   STATUS
user1-dev-node-app                   Active
user1-test-node-app                  Active
$ oc project USER-ID-test-node-app
  1. 執行命令,查看ImageStream。確認可以看到名爲node-app的ImageStream.
$ oc get is
NAME       IMAGE REPOSITORY                                                                                                                 TAGS   UPDATED
node-app   default-route-openshift-image-registry.apps.cluster-beijing-ed5f.beijing-ed5f.example.opentlc.com/user1-test-node-app/node-app
  1. 用USER-ID-test用戶執行以下命令,將USER-ID-dev-node-app-項目中的鏡像拉到USER-ID-test-node-app項目中。
oc tag USER-ID-dev-node-app/node-app USER-ID-test-node-app/node-app:latest
  1. 訪問USER-ID-test-node-app項目node-app應用的Route對應的頁面,將顯示下圖,說明該環境的應用使用了紅色背景配置文件。
$ curl $(oc get route node-app|awk '{print $2}'| grep node-app)
<html><head><title></title></head><body bgcolor="red"><h1>This application is running in: TEST</h1></body>

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章