# 技術班課後作業 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


安裝ops agent:
management > automation > startup script
(After it is installed, the agent is started automatically.)

補充:可以之後進 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


health check setting:
setting 頁面下方 > VM instance lifecycle > Autohealing > Health check
為了不要頻繁被覺得壞掉,調整 interval:
- check interval: 10s
- unhealth thrd: 3

## 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

- 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

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
開啟防火牆後畫面如下:

## 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 的檔案路徑!!
```

- 修改 /var/www/html/index.php
```
cd /var/www/html
vim index.php
# Lab -> Lab V2
```
- 建立 image: image-vm-pa-1-v2

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 資訊帶過來><

- update mig: instance groups > 點選 mig-vm-pa-1 > update vms > instance template 改成 mig-vm-pa-1-v2

- restart vm

結果: 舊的 vm 顯示 being deleted, 新 vm 產生,然後過沒多久,舊的就不見了!!

未來可嘗試:
```
gcloud compute instance-groups managed rolling-action start-update [MIG_NAME] --version template=[TEMPLATE_NAME]
```
3. 測試http://alb-ip-1/ 能否看到正確的頁面

## 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 建立)

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

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

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 居然還在??? (冠羽)


- mig-vm-pa-1 長出了第 2 台: mig-vm-pa-1-8vd1,因為原本那台 cpu 使用超過了,就一台新的!
(冠羽: 怎麼超過的QQ 我都好低)

- 回到 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:

grant usage to all user:
(buckets > bucket_a_user10 最右邊3個點 > edit sccess)

2. 創建bucket_b
create bucket:

關閉bucket 的CDN 選項: ???
設定生命週期規則, 7 days:

(冠羽: 題目好像沒有特別說要加 version,應該只要 age 就夠了?)

將bucket 設定可以讓allUsers 讀取
3. 加入 LB
- bucket_a:
- create backend bucket:

- bucket_b:
- create backend bucket:

- set routing rule:

4. 確認結果
- http://34.36.37.118/folder_a/bucket_a.jpg

- http://34.36.37.118/folder_b/bucket_b.jpg

## 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分

2. 確認 http://34.36.37.118/folder_a/bucket_a.jpg

3. 將 bucket_a.jpg 更換為另外一張圖片,再次確認

4. 使用無痕視窗,再次確認

5. 將 CDN 啟動快取的invalid,再次確認


### 補充
#### 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

- add rule(俄羅斯那個要用 geo-location 但我不確定怎麼用最正確??)


- 套用在alb-http-1 上

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~?)


(冠羽: 我的沒有出現 failed_transaction,而且也沒有 log)


(冠羽: 但是確實 access alb-ip 已經變成] 403)

## 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~?)

- 調整Node 大小,2→1
> 直接在左手邊的default-pool改node number

- 選擇 private cluster: networking > 選擇 private cluster,control plane IP range要是 vpc-a 內的,但又不能跟任一個 subnet 重複到,然後又要 28-bit,因此用:10.30.0.0/28

2. 建立 nginx 工作負載,部署 3 個Pod
- 路徑:kubernetest engine > clusters > deploy 按鈕
- 然後就會發現!它自帶部署 nginx~ 然後也是部 3 個 replicas,所以我就一直 continue!


補充育榮學長其他方法:
> 我用GCP找marketplace裡的nginx(free),使用google click

3. 透過Cloud Monitoring 檢視Pod 詳細資料及資源使用率
> 自我先驗證一下
>**[Cluster info]**

>**[Pod info]**

>**[Check Webpage]**

>**[Monitoring dashboard]**

>另外,也可以透過cloud shell, 下幾個指令看整個k8s cluster的狀態:
>gcloud container clusters get-credentials --zone "asia-east1-b" user12-cluster-1
>
>
>
>
>