Google Code Prettify

2023年1月27日 星期五

GCP: Basic concepts of Compute Services

GCP 提供四種 Compute Services:

  1. App Engine

    • GCP 提供的第一個 Compute Service,是一種 PaaS,開發人員只要把程式部署到部台上,即可開始運作,簡稱 GAE。
    • 提供有多種許言、framework、library。
    • 分成兩種環境: 
      • Standard: 在沙盒中執行 
      • Flexible: 在 Docker 中執行
  2. Compute Engine

    • 提供 Linux 和 Windows VM,這個環境簡稱 GCE,屬於 IaaS
    • VM 有提供各種機型,可以調整 CPU core 數、RAM、Storage,實際上就像是一台遠端的機器。
  3. Kubernetes Engine

    • 全托管的 Kubernetes 環境,簡稱 GKE,一般稱這樣的一個容器服務為 CaaS
    • GKE 由 Stack Driver 監控,這是 Google Cloud 系統內置的監控平台。
  4. Cloud Functions

    • Serverless 環境,不需要先配置 VM 或 Container、K8s 即可運行程式。
    • 這種程式通常是被事件觸發,當被外部事件觸發才執行。
    • Cloud Functions 支持三種語言: JavaScript、Python 3、Go
    • Cloud Functions 包含三部份: Trigger、event、function,程式員定義一個 event,透過 trigger 連結到 fuction,這樣的服務又稱為 FaaS

四種服務總結如下表: 


GCP: Getting Started with Cloud Shell and gcloud

一、基本觀念

1. Project

  • Project 是 GCP 的計費項目,需要綁定一個 Billing Account (可能是個人信用卡或公司帳號),所有資源會掛在 Project 下,並依使用量計費,從 Billing Account 扣除。
  • Billing 可以開許多個,如下,進入 Billing 功能,按【CREATE ACCOUNT】即可增加,目前我已經有一個命名為 POC 的 Billing Account。 

  • 每個帳號可以開許多 Project,方便管理一個組織中各個不同的工作、組織成員,建立 Project 時,即會選擇要綁定到那一個 Billing Account。 

  • GCP 的資源結構如下,由一個組織,下面可以分 folder,folder 下再分 Project,然後就如上面所說,資源會掛到 Project 下。 

     在 GCP Console 中的「Manage resource」功能中,可以管理 Project。 


2. Cloud Shell

  • GCP Console 是 GUI 管理介面,Cloud Shell 是命令列管理介面。

  • 開啟 Cloud Shell 的方式,很簡單,按下 GCP Console 的右上角紅色框起來的按鍵即可,開啟後會出現在下面,如綠框所示。

  • Cloud Shell 是基於 GCE (Google Compute Engine) 的 VM,這個 VM 的 OS 是 Debian,內附 5 GB 的儲存空間,足夠供管理者安裝一些必要的功具軟體,預設已經安裝好 Google Cloud SDK。

  • Google Cloud SDK 包含 gcloud、gsutil、kubectl、bq 等命令列指令,SDK 也可以安裝在 VM 或任何電腦上,OS 支援 Windows、Linux、Mac,Cloud SDK 本身是免費的,當然如果是安裝在 GCP 上的 VM,VM 會產生費用,安裝在自己的電腦,用來管理公有雲上的資源也是可以,這樣就不會有費用。

二、gcloud 命令

1. activate Cloud Shell

  • gcloud auth list
    列出有效的帳號名稱,如下,目前僅一個有效的帳號,可以同時登入多個,並透過 gcloud config set account … 切換帳號。 

  • gcloud config list project
    ​列出 project ID,如下所示。 

2. Configuration your environment

  • gcloud config get-value compute/region
    如下,可以看到一開始沒有設定預設的 region、zone,因此透過 gcloud config set compute/region asia-east1-b 將預計的 region、zone 設定在台灣彰濱機房的 zone b。 

  • gcloud config set compute/zone
    重新下指令查詢,可以看到 region 已經設定,但是 zone 沒有! 也就是說 set compute/region 真的只設定了 region 卻沒有設定 zone,透過 gcloud config set compute/zone asia-east1-b 才設定好 zone。 

3. Finding project information

  • gcloud config get-value project
    查出目前正在使用的 project。 
  • gcloud compute project-info describe --project $(gcloud config get-value project)
    上面指令 --project 後面的參數是 project id,可以查出這個 project 的詳細設定。 

4. Setting environment variables

  • export PROJECT_ID=$(gcloud config get-value project)
    設定環境變數 PROJECT_ID 為目前 project 的 id。
  • export ZONE=$(gcloud config get-value compute/zone)
    設定環境變數 ZONE 為目前系統所在的 available zone。
  • echo -e "PROJECT ID: $PROJECT_ID\nZONE: $ZONE"
    用 echo 指令顯示出上述兩個環境變數,確認值是正確的。 

5. Creating a virtual machine with the gcloud tool

  • gcloud compute instances create gcelab2 --machine-type e2-medium --zone $ZONE
    在 $ZONE ( asia-east1-b ) 建立一個新的 VM,命名為 gcelab2,VM 型別為 e2-medium。 


    用 GCP Console 查看,確實有建立出來,如下: 


  • gcloud compute instances create --help
    這個指令可以顯示出說明文件,查看有那些參數可以用。

6. Exploring gcloud commands

  • gcloud -h
    -h 參數,可以顯示出如下的命令說明文件。 

  • gcloud config --help or gcloud help config
    這兩個命令是等價的,都顯示出 gcloud config 的命令說明文件。
  • gcloud config list
    列出目前環境裡的所有 gcloud 設定。 

  • gcloud config list --all
    這個指令和上一個指令最大差別的,沒有設定值的也會被列出來,可以看出來有那些值可以設定。
  • gcloud components list
    這個指令會列出已安裝的所有 component 

  • gcloud components install COMPONENT_ID
  • gcloud components remove COMPONENT_ID
    上面兩個指令可以安裝、移除 component

7. Filtering command-line output

  • gcloud compute instances list
    列出目前 project 中的所有 VM,目前只有剛剛建立的 gcelab2 這個 VM。 

  • gcloud compute instances list --filter="name=('gcelab2')"
    如果 project 中 VM 很多,可以加上過濾條件,上面指令的過濾條件是 name。
  • gcloud compute firewall-rules list
    列出 project 中的所有防火牆規則,會非常多,通常會加上過濾條件。
  • gcloud compute firewall-rules list --filter="ALLOW:'icmp'" 

8. Connecting to your VM instance

  • gcloud compute ssh gcelab2 --zone $ZONE
    ssh 到剛剛建立的 VM,當目前的 zone 和要連入的 VM 所處的 zone 不同,才需要指定 zone。 

  • sudo apt install -y nginx
    在 VM 中安裝 NGINX
  • exit
    離開 VM

9. Updating the firewall

  • gcloud compute firewall-rules list
    列出 project 中的所有防火牆規則,會非常多,通常會加上過濾條件,參看上面第 7 項。
  • gcloud compute instances add-tags gcelab2 --tags http-server,https-server
    為 VM 加上 tag http-server、https-server,這只是為了分類及搜尋用途。
  • gcloud compute firewall-rules create default-allow-http --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server
    為有 tag http-server 的所有 VM 開啟防火牆 port 80。 

  • gcloud compute firewall-rules list --filter=ALLOW:'80'
    列出開放 port 80 的所有防火牆規則 

  • curl http://$(gcloud compute instances list --filter=name:gcelab2 --format='value(EXTERNAL_IP)')
    用 curl 指令,從外部 IP 連線到 VM 裡的 NGINX,確定是否連的到,是否 NGINX 正常運作,如下,表示防火牆確實有開通,NGINX 也正常運作。 

10. Viewing the system logs

  • gcloud logging logs list
    列出可以查看的系統 log 有那些 

  • gcloud logging logs list --filter="compute"
    加上過濾條件,結果如下: 

  • gcloud logging read "resource.type=gce_instance" --limit 5
    讀取 log 的內容,指定讀的是 resource.type=gce_instance 裡的 log,並限制只列出 5 個。
  • gcloud logging read "resource.type=gce_instance AND labels.instance_name='gcelab2'" --limit 5
    讀取指定 VM 的 log

 

2023年1月10日 星期二

GCP: Configuring Networks via gcloud

 準備環境

開啟 Cloud Shell,看一下它是什麼 OS ?

cat /etc/os-release

看來是 Debian,因為這篇是要設定網路組態,需要用到 ping 指令,先執行如下指令安裝:

sudo apt install iputils-ping
進入主題前,先了解以下基本觀念:
  1. VPC (Virtual Private Cloud) 在 GCP 中是彼此隔離的。

  2. 每個 Google Cloud project 建立時,系統會自動建立一個預設的 subnet 網路。

Create network

  • 基礎觀念

  1. VPC 分兩種模式 (mode): auto、custom。

  2. 在同一個 project 裡,VPC 名稱不能重複。

  3. 每個 project 可以有四個 VPC

  • 建立 network

建立一個 custom 模式的網路,指令如下,網路命名為 labnet。

gcloud compute networks create labnet --subnet-mode=custom

上面的指令說明如下:

  1. gcloud: 調用 Cloud SDK 裡的 gcloud 命令

  2. compute: gcloud 指令集之一

  3. network: compute 的指令集之一

  4. create: 執行的動作

  5. labnet: 網路名稱

  6. --subnet-mode=custom: 指定要建立的網路模式為 custom

點選 Google Cloud Console 左邊選單「網路 > 虛擬私有雲網路 > 虛擬私有雲網路」


顯示出如下畫面,確實建立了一個名稱為 labnet 的 Network。

Create a subnetwork

  • 基礎觀念

  1. 一個 project 可以跨好幾個 region

  2. subnetwork 的名稱在同一個 project 的同一個 region 裡不能重複

  3. subnetwork 的名稱在同一個 project 可在不同 region 出現兩次

  4. 每個 subnetwork 要設定一個 IP 網段,這個網段在同一 project 的同一 region 中不可與其它 subnetwork 衝突。

  • 建立 subnetwork

建立 subnetwork 指令如下:

gcloud compute networks subnets create labnet-sub --network labnet --region asia-east1 --range 10.0.0.0/28
這個 subnetwork 的 IP 範圍會是 10.0.0.0 ~ 10.0.0.255
Viewing networks
gcloud compute networks list

顯示出共有兩個網路,一個 default、一個 labnet,與從控制台的「虛擬私有網路」看到是一樣的,要看網路的詳細資料,指令如下:
gcloud compute networks describe labnet
最後一個參數是網路名稱,這裡查看剛剛新建立的 labnet,得到如下結果:

List subnets
gcloud compute networks subnets list
如上指令查看 subnets,得到的結果非常多,找到 labnet-sub 的 subnetwork,內容如下:

內容太多不好找,可以執加過濾條件,如下,只會列出在台灣彰濱機房的 subnetwork。

gcloud compute networks subnets list --filter=“REGION: asis-east1”
Creating firewall rules
  • 基礎觀念
  1. network 的模式 (mode) 為 custom 時,系統不會預設建立任何防火牆規則。

  2. 防火牆規則是定義在 network 層。

  3. 防火牆規則的名稱,在同一個 project 中不可重複。

gcloud compute firewall-rules create labnet-allow-internal --network=labnet --action=ALLOW --rules=icmp,tcp:22 --source-ranges=0.0.0.0/0
  • 建立防火牆規則
上面指令為 network labnet 建立了一條防火牆規則,名為 labnet-allow-internal,允許通過 icmp 及 tcp:22 port,連線來源不設限,說明如下:
  1. firewall-rules: compute 指令的子類別

  2. create: 這次指令要做的事 (動詞)

  3. labnet-allow-internal: 防火牆規則名稱

  4. --network=labnet: 指出這個防火牆規則要套用到那個 network

  5. --action: 有兩個值 ALLOW (允許)、DENY (拒絕),這裡是要開通防火牆,所以用 ALLOW。

  6. --rule=icmp,tcp:22 : 指出要開通的通訊協定 (icmp、tcp) 和 port (22)。

  7. --srouce-ranges=0.0.0.0/0: 規定來源 IP 的範圍

Viewing firewall rules details
gcloud compute firewall-rules describe [FIREWALL_RULE_NAME]
這個指令可以查看防火牆規則的細節,執行後產生的結果如下:

從上面的細節內容 direction: INGRESS,可以看出來,開通的這個防火牆是單向的,只允許由外向內。
Create another network
gcloud compute networks create privatenet --subnet-mode=custom
上面指令,會建立一個名稱為 privatenet 的 network,其 mode=custom,執行結果如下圖,訊息顯示,這個時候這個 network 還沒有套用任何防火牆規則。
gcloud compute networks subnets create private-sub --network=privatenet --region=asia-east1 --range 10.1.0.0/28
上面指令執行結果如下圖,在 network privatent 中建立了一個名稱為 private-sub 的 subnetwork (子網路)。
Create  the firewall rules for privatenet
gcloud compute firewall-rules create privatenet-deny --network=privatenet --action=DENY --rules=icmp,tcp:22 --source-ranges=0.0.0.0/0
這個指令建立的防火牆規則和前面剛好相反,這個規則允許除 icpm、tcp:22 的所有連線通過,執行結果如下:
想看一下這條規則的詳細說明,如下用如下指令:
gcloud compute firewall-rules describe privatenet-deny
到目前建立了兩個 network,可以用以下指令列出來看看
gcloud compute firewall-rules list --sort-by=NETWORK

上面指令包含預設的都會列出來,如果只想列出我們自行建立的,可以加上過濾條件。

gcloud compute firewall-rules list --sort-by=NETWORK --filter=“NETWORK != ‘default’”
Create VM instances

查一下到目前為止,我們建立了那些 subnets。

gcloud compute networks subnets list --filter=“REGION = ‘asia-east1’”

執行結果如下:

接下來要在 labnet-sub 及 privatek-sub 兩個 subnets 中各建立一個 VM,用來測試網路是否有通。
  • Create the pnet-vm instance
gcloud compute instances create pnet-vm --zone=asia-east1-c --machine-type=n1-standard-1 --subnet=private-sub

執行結果如下,在 AZ = asia-east1-c 的機房,在子網路 private-sub 裡建立了名稱為 pnet-vm 的 VM,內部 IP: 10.1.0.2,外部 IP: 35.221.157.5。

  • Create the lnet-vm instance
gcloud compute instances create lnet-vm --zone=asia-east1-c --machine-type=n1-standard-1 --subnet=labnet-sub

執行結果如下,在 AZ = asia-east1-c 的機房,在子網路 labnet-sub 裡建立了名稱為 lnet-vm 的 VM,內部 IP: 10.0.0.2,外部 IP: 34.80.241.172。

檢查上面建立的兩個 VM,列出來看看,指令如下:

gcloud compute instances list --sort-by=ZONE --filter="ZONE='asia-east1-c'"

結果如下, STATUS 都是 RUNNING,正常在運作。

Explore the connectivity

檢查一下防火牆,在自己的電腦開個命令列視窗,ping 上面的兩個外部 IP。

結果是 lnet-vm 可以通,pnet-vm 不通,如預期!

2023年1月7日 星期六

GCP: Create a Persistent Disk

目標
  1. 建立一個 VM 及一個 Disk

  2. format 和掛載 Disk 到 VM

建立 VM
  • 開啟 Cloud Shell
這一篇都將使用 Cloud Shell 的 command line 完成所有事項,首先打開 Cloud Shell,如下圖,click 右上角紅色,即可開啟 Cloud Shell。

用以下指令檢查一下環境,看看帳號對不對? 是否在正確的 project 裡?
gcloud auth list
gcloud config list project
  • create a new instance
gcloud compute instances create gcelab3 --zone asia-east1-a

如上指令建立了一個 VM,一切都用預設的,AZ 指定在 asia-east1-a,是台灣彰濱機房三個 AZ 之一。要特別注意,VM 和 Disk 必須在同一個 AZ 才可以將 Disk 掛載到 VM 上

建立&掛載 Disk
  • create a new persistent disk
gcloud compute disks create mydisk --size=100GB --zone asia-east1-a
注意看上面紅框裡的說明,Disk 最好要 200GB 以上,否則會有效能低下的問題。

  •  attaching a disk

gcloud compute instances attach-disk gcelab3 --disk mydisk --zone asia-east1-a
VM 的名稱是 gcelab3,disk 的名稱是 mydisk,都位於 asia-east1-a 這個 AZ,出現如上訊息表示成功將 VM 和 Disk 連結在一起! 要怎麼檢查呢? ssh 進 VM !
gcloud compute ssh gcelab3 --zone asia-east1-a

檢查 /dev/disk/by-id/ 目錄,看到最下面的 sdb 那一行,就是剛剛連結上去的 Disk,預設名稱就是 scsi-0Google_PersistentDisk_persistent-disk-1

上面的名稱不好認,可以自己命名,那麼在 attach-disk 時要指出 device-name,如下:
gcloud compute instances attach-disk gcelab3 --disk mydisk --device-name <YOUR_DEVICE_NAME> --zone asia-east1-a
  • formatting and mounting the persistent disk
上面的磁碟空間還沒有 format,也沒有 mount 到 OS。
sudo mkdir /mnt/mydisk  
sudo mkfs.ext4 -F -E lazy_itable_init=0,lazy_journal_init=0,discard /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1
第一行,先在 /mnt 下建一個目錄,是接下來要掛載的; 第二行將 disk format,注意看,最後一個參數是 device name。

sudo mount -o discard,defaults /dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1 /mnt/mydisk
接著掛載到 OS,如下,算一下它的大小,差不多 100 GB 沒錯!

  • automatically mount the disk on restart
上面掛載成功,但是 VM 重啟,又得重新掛載,如果要 VM 重啟會自動掛載,要做一些設定。
sudo vi /etc/fstab
在最後一行加上如下內容:
UUID=/dev/disk/by-id/scsi-0Google_PersistentDisk_persistent-disk-1 /mnt/mydisk ext4 defaults 1 1
整個檔案內容如下,最後一行是新加上去的,這樣 VM 重啟 Disk 也不需重新掛載了!