# 技術班課後作業 HW 2 ## 1. Managed Instance Group(MIG) - 在vpc-a,asia-east1-b,使用image-vm-pa-1,建立一個managed instance group (stateless),命名為mig-vm-pa-1 - 最低instance數量設為1 - 最高instance數量設為2 - CPU 40%的時候會進行自動擴展 - 設定一個監控HTTP 80 Port 的Healthcheck,Request path 為/ - 其他部分都用預設選項 - [提示] 建立templates 的時候請注意相關的network tags,要允許服 務所需要的firewall、另外要安裝ops agent ### steps 1. create instance template region: asia-east1 boot disk change image: image-vm-pa-1 firewall: allow http, https, lb check network interface: vpc-a > subnet-1 ![image](https://hackmd.io/_uploads/rypPewYDp.png) ![image](https://hackmd.io/_uploads/BJ0Y-DtPa.png) 安裝ops agent: management > automation > startup script (After it is installed, the agent is started automatically.) ![image](https://hackmd.io/_uploads/Syhv2wtva.png) 補充:可以之後進 vm 下指令確認 ops agent 有沒有裝好啟好 ``` sudo systemctl status google-cloud-ops-agent"*" ``` ref: [ops-agent安裝文件](https://cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/installation) 2. create group instance stateless: 左方選 stateless name: mig-vm-pa-1 region: asia-east1 asia-east1-b instance 數量: autoscaling > min:1, max:2 cpu 40%: autoscaling > edit signal ![image](https://hackmd.io/_uploads/SyPZC8YP6.png) ![image](https://hackmd.io/_uploads/rygEAIKv6.png) health check setting: setting 頁面下方 > VM instance lifecycle > Autohealing > Health check 為了不要頻繁被覺得壞掉,調整 interval: - check interval: 10s - unhealth thrd: 3 ![image](https://hackmd.io/_uploads/Bk0SVPKvT.png) ## 2. Application Load Balancer (External HTTP/HTTPS Load Balancer) - 目標:建立一個Application Load Balancer,alb-http-1,並使用 mig-vm-pa-1 作為backend service - Frontend 使用HTTP,並建立一個static external ip : alb-ip-1 - 新增一個Backend Service,命名為lb-backends ,在裡面新增一 個backend,使用mig-vm-pa-1,其中Balancing Mode 使用Rate ,RPS 25, Capacity 30% - Logging Enable , Sampling Rate 1 - 其他設定使用預設值 - 確定是否能使用http://alb-ip-1 看到正確頁面 ### steps 1. 建立 LB: alb-http-1 - 路徑:Create a load balancer > Application Load Balancer (HTTP/S) - frontend: protocol: http static ip: network service tier > ip address > create ip address > type name: alb-ip-1 ![image](https://hackmd.io/_uploads/rJJ6b_tPp.png) - backend service: 點選 create a backend service name: lb-backends instance group: mig-vm-pa-1, port: 80 balancing mode: rate, rps 25, capacity 30% health check: 新增一個 http-hc ![image](https://hackmd.io/_uploads/rkZEVuYPp.png) logging: enable, sampling rate = 1 2. 確認 http://alb-ip-1 alb-ip-1: 這個網址可以去 Load balancing > 點選 alb-http-1 > Frontend ip 注意: vpc-a 之前在 hw1 有設定過 http deny (--> 好像主要是上次http allow 只開 10.80.0.0/20 和 vm 跟 另一台 vm ip,必須加開 0.0.0.0/0,而不是單純移除 deny 的),記得要去開個防火牆給 frontend ip 開啟防火牆後畫面如下: ![image](https://hackmd.io/_uploads/B1D4UdFwp.png) ## 3. 更新MIG - 將vm-pa-1 的網頁http://EIP_1/ 顯示內容,”HTTP Load Balancing Lab” 修改為“HTTP Load Balancing Lab V2”,並重新建立一個Image : image-vm-pa-1-v2 - 將mig-vm-pa-1 更新使用新的image-vm-pa-1-v2 - 測試http://alb-ip-1/ 能否看到正確的頁面 ### steps 1. 修改顯示為“HTTP Load Balancing Lab V2” - 進機器將 gs://cloud-training/gcpnet/httplb/startup.sh 下載下來查看指令 ``` gcloud storage cp gs://cloud-training/gcpnet/httplb/startup.sh . cat startup.sh # 就可以看到 html 的檔案路徑!! ``` ![image](https://hackmd.io/_uploads/HJpXPcsPp.png) - 修改 /var/www/html/index.php ``` cd /var/www/html vim index.php # Lab -> Lab V2 ``` - 建立 image: image-vm-pa-1-v2 ![image](https://hackmd.io/_uploads/HJFr_csDa.png) 2. 將 mig-vm-pa-1 更新使用新的 image-vm-pa-1-v2 - 新增一個 instance template,並且 boot disk image的地方換成使用 image-vm-pa-1-v2: 可以先進去之前的 mig-vm-pa-1 的instance template,然後點選 “create similar”(--> 跟 copy 的差別是甚麼呀?),記得!! network 那邊要去按一下唷~ 居然 similar 不會把 subnet 資訊帶過來>< ![image](https://hackmd.io/_uploads/SkXd09sv6.png) - update mig: instance groups > 點選 mig-vm-pa-1 > update vms > instance template 改成 mig-vm-pa-1-v2 ![image](https://hackmd.io/_uploads/BJv4Joovp.png) - restart vm ![image](https://hackmd.io/_uploads/Hy6ufoiw6.png) 結果: 舊的 vm 顯示 being deleted, 新 vm 產生,然後過沒多久,舊的就不見了!! ![image](https://hackmd.io/_uploads/SyFxEsiwp.png) 未來可嘗試: ``` gcloud compute instance-groups managed rolling-action start-update [MIG_NAME] --version template=[TEMPLATE_NAME] ``` 3. 測試http://alb-ip-1/ 能否看到正確的頁面 ![image](https://hackmd.io/_uploads/rJMQNisva.png) ## 4. Application Load Balancer (External HTTP/HTTPS Load Balancer) - 在vpc-a上,asia-southeast1-b, 使用image-vm-pa-1, 建立第二組MIG mig-vm-pa-2 - MIG 相關設定如同mig-vm-pa-1 - 將mig-vm-pa-2 新增入alb-http-1 的backend service lb-backends,做 為另一個backend (同一個backend service 要有兩組instance groups) ,相關設定同mig-vm-pa-1 - 在vpc-a上,asia-east2-b,建立一台VM : stress-test - VM 名稱stress-test - e2-medium - 其他設定都使用預設 - 使用SSH 連線進入stress-test,執行sudo apt-get -y install siege - 在stress-test 中,執行siege -c 255 http://alb-ip-1 - 在ALB 中,點選alb-http-1,選擇monitor,觀察5~10分鐘backend 的流量 - 開啟瀏覽器,瀏覽http://alb-ip-1 ,多次refresh 看看Client IP 與Server Location 的變化 - 回到 stress-test 中,CTRL+C 中止程式 ### steps 1. 在vpc-a上,asia-southeast1-b, 使用image-vm-pa-1, 建立第二組MIG mig-vm-pa-2 - instance template >點 mig-vm-pa-1 > create similar > 改 region, subnetwork: asia-southeast1-b - create instance group: mig-vm-pa-2 (作法參考 mig-vm-pa-1 建立) ![image](https://hackmd.io/_uploads/SkaE6apDa.png) 2. 將 mig-vm-pa-2 新增入 alb-http-1 的 backend service lb-backends,做為另一個backend (同一個 backend service 要有兩組instance groups),相關設定同mig-vm-pa-1 - load balancing > alb-http-1 > Backend configuration > Backend services(點選 edit lb-backends) > 新加入 mig-vm-pa-2 instance ![image](https://hackmd.io/_uploads/BkeB0ppD6.png) 3. 在vpc-a上,asia-east2-b,建立一台VM : stress-test - name: stress-test - 機器: e2-medium - region, zone: asia-east2-b - network: vpc-a, subnet1 4. 使用 SSH 連線進入 stress-test,執行: - sudo apt-get -y install siege - siege -c 255 http://34.36.37.118 5. 在ALB 中,點選 alb-http-1,選擇 monitor,觀察5~10分鐘backend 的流量 - 長出了一條肥肥的Asia ![image](https://hackmd.io/_uploads/S1AlCHgu6.png) 6. 開啟瀏覽器,瀏覽 http://alb-ip-1 ,多次 refresh 看看 Client IP 與 Server Location 的變化 - Server Location 固定在 asia-east1-b, Client IP 會一直變:35.191.32.194, 35.191.16.194, 35.191.16.199, 35.191.16.197, 35.191.32.200 - 為麼 client ip 會一直變? (冠羽) - 曾經移除掉的 mig mig-temp-v3 居然還在??? (冠羽) ![image](https://hackmd.io/_uploads/ryhS8sPuT.png) ![image](https://hackmd.io/_uploads/SJjI0HlOa.png) - mig-vm-pa-1 長出了第 2 台: mig-vm-pa-1-8vd1,因為原本那台 cpu 使用超過了,就一台新的! (冠羽: 怎麼超過的QQ 我都好低) ![image](https://hackmd.io/_uploads/BkCZ_iDdT.png) - 回到 stress-test 中,CTRL+C 中止程式: { "transactions": 60803, "availability": 100.00, "elapsed_time": 883.42, "data_transferred": 9.58, "response_time": 3.69, "transaction_rate": 68.83, "throughput": 0.01, "concurrency": 254.24, "successful_transactions": 60803, "failed_transactions": 0, "longest_transaction": 20.13, "shortest_transaction": 0.01 } ### 補充 Siege:是一個簡單易用的網頁負載測試工具 ## 5. 使用Storage建立二個bucket (名稱自取,例如bucket_a 與bucket_b ) - 創建bucket_a - 建立位置在單一Region( asia-east1) - 關閉bucket 的prevent public access 限制 - 設定bucket統一(Uniform)存取權 - 其他使用預設選項 - 將bucket 設定可以讓allUsers 讀取(Storage Object Viewer) - 上傳一張圖片到gs://bucket_a/folder_a中,命名為bucket_a.jpg - 創建bucket_b - 建立位置在單一Region(asia-east2) - 關閉bucket 的prevent public access 限制 - 設定bucket統一(Uniform)存取權 - 關閉bucket 的CDN 選項 - 其他使用預設選項 - 將bucket 設定可以讓allUsers 讀取(Storage Object Viewer) - 設定生命週期規則,超過7天物件會自動刪除物件 - 上傳另外一張不一樣的圖片到gs://bucket_b/folder_b中,命名為 bucket_b.jpg - 將兩個bucket都新增到alb-http-1 的backend service中 - bucket_b 不開啟CDN - 確定http://alb-ip-1/folder_a/bucket_a.jpg 和 http://alb-ip-1/folder_b/bucket_b.jpg 都可以正常顯示[截圖] ### steps 1. 創建bucket_a create bucker: ![image](https://hackmd.io/_uploads/SJiuApYwa.png) grant usage to all user: (buckets > bucket_a_user10 最右邊3個點 > edit sccess) ![image](https://hackmd.io/_uploads/HJ8Ik0FPT.png) 2. 創建bucket_b create bucket: ![image](https://hackmd.io/_uploads/S1X_Q0Ywp.png) 關閉bucket 的CDN 選項: ??? 設定生命週期規則, 7 days: ![image](https://hackmd.io/_uploads/rJ4HNRKwa.png) (冠羽: 題目好像沒有特別說要加 version,應該只要 age 就夠了?) ![image](https://hackmd.io/_uploads/S1nk3jPup.png) 將bucket 設定可以讓allUsers 讀取 3. 加入 LB - bucket_a: - create backend bucket: ![image](https://hackmd.io/_uploads/SkEGIRtw6.png) - bucket_b: - create backend bucket: ![image](https://hackmd.io/_uploads/rJmYv0FDT.png) - set routing rule: ![image](https://hackmd.io/_uploads/r1ry_RFv6.png) 4. 確認結果 - http://34.36.37.118/folder_a/bucket_a.jpg ![image](https://hackmd.io/_uploads/SkRmFAKva.png) - http://34.36.37.118/folder_b/bucket_b.jpg ![image](https://hackmd.io/_uploads/BkJdK0tw6.png) ## 6. CDN 設定 - 將backend_bucket_a 的CDN Cache Time 設定(共三個),都調整為30分 鐘 - 瀏覽http://alb-ip-1/folder_a/bucket_a.jpg 確認現在的圖片 - 將gs://bucket_a/folder_a/bucket_a.jpg 更換為另外一張圖片 - 瀏覽http://alb-ip-1/folder_a/bucket_a.jpg 確認現在的圖片 - 使用無痕視窗瀏覽http://alb-ip-1/folder_a/bucket_a.jpg 確認現在的圖片 - 將CDN 啟動快取的invalid (建議僅針對單一圖片invalid) - 瀏覽http://alb-ip-1/folder_a/bucket_a.jpg 確認現在的圖片 ### steps 1. backend_bucket_a 的CDN Cache Time 設定(client, default, maximum TTL),調為30分 ![image](https://hackmd.io/_uploads/BylxidhD6.png) 2. 確認 http://34.36.37.118/folder_a/bucket_a.jpg ![image](https://hackmd.io/_uploads/BykvsO2D6.png) 3. 將 bucket_a.jpg 更換為另外一張圖片,再次確認 ![image](https://hackmd.io/_uploads/Byxd6OhPp.png) 4. 使用無痕視窗,再次確認 ![image](https://hackmd.io/_uploads/Byxd6OhPp.png) 5. 將 CDN 啟動快取的invalid,再次確認 ![image](https://hackmd.io/_uploads/H1ZQxYnwp.png) ![image](https://hackmd.io/_uploads/HyTNQKnD6.png) ### 補充 #### Cloud CDN caches invalidation 有以下幾個作用: **確保客戶看到最新的內容**:如果您更改了 backend bucket 中的內容,但未進行 caches invalidation,則客戶可能會繼續看到舊的內容。 **提高性能**:Cloud CDN 會將頻繁訪問的內容緩存在邊緣節點中。如果您進行 caches invalidation,則 Cloud CDN 會將新內容推送到邊緣節點,從而提高性能。 **節省成本**:Cloud CDN 會根據快取的內容來收費。如果您進行 caches invalidation,則 Cloud CDN 將不會為舊內容收費。 (無意間發現如果換圖片後,使用 gcs 的 public url https不會被更新,http會) ## 7. Cloud Armor 設置 - 建立Policy 規則套用在Load Balance 上 - 設定後端安全性Policy - 阻擋範圍為Global - 對stress-test 的外部IP 設定拒絕(403)規則,優先順序為1 - 再新增一條阻擋俄羅斯來源的連線規則 - 套用在alb-http-1 上 - 使用stress-test (VM) 做為對alb-http-1 的壓力測試機 - 在stress-test 中,執行siege -c 255 http://alb-ip-1 對alb-http-1 壓力測試(Siege) - 到Cloud Logging 查看阻檔記錄是否生效 ### steps 1. 建立Policy 規則套用在Load Balance - cloud armor policies > Create security policy ![image](https://hackmd.io/_uploads/B1jXyPgdp.png) - add rule(俄羅斯那個要用 geo-location 但我不確定怎麼用最正確??) ![image](https://hackmd.io/_uploads/Sy9sXPe_p.png) ![image](https://hackmd.io/_uploads/ryJiAyW_p.png) - 套用在alb-http-1 上 ![image](https://hackmd.io/_uploads/rJvG4DguT.png) 2. 使用 stress-test (VM) 做為對 alb-http-1 的壓力測試機 - siege -c 255 http://34.36.37.118 3. 到Cloud Logging 查看阻檔記錄是否生效 - 獲得一大堆 403: denied by security policy (冠羽: 預設是阻擋所有,那其他來源還是可以access 到 alb~?) ![image](https://hackmd.io/_uploads/BJrNTkZdp.png) ![image](https://hackmd.io/_uploads/Bk0Iay-dp.png) (冠羽: 我的沒有出現 failed_transaction,而且也沒有 log) ![image](https://hackmd.io/_uploads/r1EdxCP_6.png) ![image](https://hackmd.io/_uploads/H1eCxAvOa.png) (冠羽: 但是確實 access alb-ip 已經變成] 403) ![image](https://hackmd.io/_uploads/rk2ix0vdT.png) ## 8. GKE Cluster - 建立一個asia-east1 區域,Node 2的Cluster - 選擇private cluster - 調整Node 大小,2→1 - 建立nginx 工作負載,部署3 個Pod - 透過Cloud Monitoring 檢視Pod 詳細資料及資源使用率 ### steps 1. 建立一個 asia-east1 區域,Node 2 的Cluster - 要先去 enable kubernetest engine api - 路徑:kubernetest engine > clusters > 按 create > 選用Standard Cluster(其實Google推薦用Autopilot, 好處是不用管node=即VM) (怎麼知道要用 standard~?) ![image](https://hackmd.io/_uploads/S1iqDzuPp.png) - 調整Node 大小,2→1 > 直接在左手邊的default-pool改node number ![image](https://hackmd.io/_uploads/Bkg4_fODT.png) - 選擇 private cluster: networking > 選擇 private cluster,control plane IP range要是 vpc-a 內的,但又不能跟任一個 subnet 重複到,然後又要 28-bit,因此用:10.30.0.0/28 ![image](https://hackmd.io/_uploads/ry7zjAGtp.png) 2. 建立 nginx 工作負載,部署 3 個Pod - 路徑:kubernetest engine > clusters > deploy 按鈕 - 然後就會發現!它自帶部署 nginx~ 然後也是部 3 個 replicas,所以我就一直 continue! ![image](https://hackmd.io/_uploads/BkZ3v_mtp.png) ![image](https://hackmd.io/_uploads/SJhAudQFa.png) 補充育榮學長其他方法: > 我用GCP找marketplace裡的nginx(free),使用google click ![image](https://hackmd.io/_uploads/S1O15fdDp.png) 3. 透過Cloud Monitoring 檢視Pod 詳細資料及資源使用率 > 自我先驗證一下 >**[Cluster info]** ![image](https://hackmd.io/_uploads/rkm9AgdP6.png) >**[Pod info]** ![image](https://hackmd.io/_uploads/rksjAeuPp.png) >**[Check Webpage]** ![image](https://hackmd.io/_uploads/BJDkJ-uDT.png) >**[Monitoring dashboard]** ![image](https://hackmd.io/_uploads/rJAXJZ_DT.png) >另外,也可以透過cloud shell, 下幾個指令看整個k8s cluster的狀態: >gcloud container clusters get-credentials --zone "asia-east1-b" user12-cluster-1 >![image](https://hackmd.io/_uploads/ry2pnz_Pp.png) > >![image](https://hackmd.io/_uploads/H16yTfdDa.png) > >![image](https://hackmd.io/_uploads/HJFZTMdD6.png)