跳到主要內容

有趣的Google container-vm

研究Google在GCE執行datalab的範例中,發現了個頗有趣的事情... 不久前Google針對Optimized Container出了一個container-vm,雖然目前已經預計要deprecate這個image,不過在datalab執行於GCE的範例中M還是使用這個image來執行...
有趣的地方是,datalab-service.yaml是一個k8s的pod描述檔... 下面是instance執行的gcloud腳本:
gcloud compute instances create "instance-name" \
  --project "project-id" \
  --zone "zone" \
  --network "datalab-network" \
  --image-family "container-vm" \
  --image-project "google-containers" \
  --metadata-from-file "google-container-manifest=datalab-server.yaml" \
  --machine-type "n1-highmem-2" \
  --scopes "cloud-platform"
打開datalab-server.yaml檢視,內容如下:
apiVersion: v1
kind: Pod
metadata:
  name: 'datalab-server'
spec:
  containers:
    - name: datalab
      image: gcr.io/cloud-datalab/datalab:local
      command: ['/datalab/run.sh']
      imagePullPolicy: Always
      ports:
        - containerPort: 8080
          hostPort: 8080
          hostIP: 127.0.0.1
      env:
        - name: DATALAB_ENV
          value: GCE
      volumeMounts:
        - name: home
          mountPath: /content
    - name: logger
      image: gcr.io/google_containers/fluentd-gcp:1.18
      env:
        - name: FLUENTD_ARGS
          value: -q
      volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
  volumes:
    - name: home
      hostPath:
        path: /root
    - name: varlog
      hostPath:
        path: /var/log
    - name: varlibdockercontainers
      hostPath:
        path: /var/lib/docker/containers
這本身是個k8s pod的描述檔,本來需要透過kubernetes cluster才能夠執行,但是卻可以在container-vm中執行... 檢查了一下,原來是透過kubelet來執行... 研究一下kubelet執行container的方式,目前找到可以在/etc/kubernetes/manifests下面直接放置yaml檔案,然後重啟kubelet(/etc/init.d/kubelet restart)即可。

Reference

留言

  1. My TV (Hands Free) Videos on YouTube
    youtube.com Videos on YouTube | Videos on YouTube. Youtube best youtube to mp3 converter online is the largest streaming service to live stream the sport of soccer, Aug 8, 2019

    回覆刪除

張貼留言

這個網誌中的熱門文章

Google指令碼基本操作介紹 - Web Server篇

Google的指令碼是什麼東西呢?!原則上他就是Google的一份靜態檔案,但是透過Google的雲端服務平台的一些能力,將靜態檔案內的scriptlet片段拉到Google的後端作運算,寫起來就像在寫JavaScript(這邊說Node.js可能比較貼切,因為同為server side language)或JSP,而在scriptlet片段中,則可以操作許多Google的API服務,甚至他提供你連接JDBC的能力、URL呼叫的能力...等,宛如就是一套完整的雲端程式語言(這樣說應該不為過拉,這真是個創新!),有並駕於App Engine的氣勢喔! Google指令碼的範圍很廣,筆者也仍在摸索中,之前介紹過透過Sheet+指令碼做一個簡單的URL監控( 這裡 ),而本篇簡單介紹一下指令碼如何製作一個Web Server(嚴格說起來是Web Page拉,但是具備Server端運作功能喔!)。您將可以體驗到No-Hosting Web Server的威力! 指令碼是Google Drive的一個服務,Google將指令碼(Code)以檔案方式寄存在Drive中,類似的靜態檔案服務的應用,最近滿火紅的! 首先開啟指令碼時候,選擇"作為網路應用程式的指令碼",檔案開啟後,會有愈設定程式碼片段供編輯 程式碼片段大致上如下,是一個doGet function,Web base的指令碼需要認得doGet()作為server的進入點 如果選擇到空白專案的話,只要把doGet function建上即可 作為一個Cloud IDE,Google當然也有把Code Hint擺上來,透過簡單的提示,寫啟程是來就更容易拉! 而Web部分物件的建立主要是透過 HtmlService 這個模組來進行操作,我們利用他來output html, load static html page, load template html page..等,範例如下: Output HTML: // Script-as-app template. function doGet(e) {   return HtmlService. createHtmlOutput ("<h1>HELLO!</h1>");

Apps Script REST再一篇 - doPost request

通常操作REST服務時,除了GET方式操作之外 POST跟其他method的操作也少不了 這邊介紹POST的操作function:doPost() doPost function同樣會在參數部分帶入request object用來包裝傳入的參數 下面是一個範例,簡單的組一個response回覆前端的呼叫: function doPost(request){   var data = {"name": request.parameters.form };   return ContentService.createTextOutput(JSON.stringify(data))     .setMimeType(ContentService.MimeType.JSON); } 上面程式同樣使用request.parameters.[parameter name]來帶回傳入參數的值 後續可以有更複雜的操作,例如利用這個值做資料庫的查詢或是Google文件的查詢之類的... 程式完成後的deploy & publish部分則與之前方式相同。 Client操作的部份,為了應付比較複雜的POST操作,這邊使用Node.js的request模組來操作POST的呼叫,其中因為Apps Script執行url的redirect特性,必須加入 followAllRedirects 這個參數,指定request模組往下做redirect page的查詢動作,而form欄位所帶入的JOSN物件中,key值(form)所對應的value(123)則會實際反應在Apps Script中的request.parameters.[key]中 var request = require('request'); request({     url: ' https://script.google.com/macros/s/AKfycbxjC58GE1r...R5SA2nNb3Lsc/exec ',     method: 'POST',     followAllRedirects: true ,     form: {       form: '123'  

存取docker container內的檔案

Docker既然是container概念存在,就想到應該可以透過原filesystem找到對應的container內的檔案 Google了一下,在/var/lib/docker/這個目錄底下可以找到對應的container實際存在的位置... 列印一下目錄可以發現aufs/mnt下有一堆長檔名的資料夾... 透過docker ps或是進入到docker container後,可以看得到docker的instance id 範例中是:61ba7253b842 因此進入到"/var/lib/docker/aufs/mnt/"後,後面加讓instance id後,在透過tab補字可以列出該container相關資訊 其中會包含一個有"-init"跟一個純instance id的資料夾... 列表一下這兩個資料夾 其中無"-init"的目錄存放的就是container對應的磁碟位置 測試一下檔案的存取....,切到該目錄下,touch一個檔案... 結果真的可以在container內部看到對應touch出來的檔案 透過可見的目錄位置,container與host在某個層鍍上可以互通許多東西喲... 檔案傳輸也不用再透過scp或ftp方式存取,超方便的拉!