--- title: Lab Meeting Minutes 2021/11/03 tags: lab_meeting --- > Outline > [TOC] --- # PERAL Lab Meeting - 時間:110年11月02日15:00 - 地點:[Gather Town](https://gather.town/app/M31iEgA2veBWAFAA/NCNU-TC-409) - 出席者:謝萬霖、周以恆、吳騰然、陳嘉瑋、劉怡君、田蕙瑜、劉又聖、洪胤勛、莊才賢、丘世宇 - 吳坤熹老師(參加PCH會議) - 會議主題: [Cloud Init](https://docs.google.com/presentation/d/12em-avihTstJ1DLg3Qu4aRHtVB5mwTa0BNHu3bQJtsU/edit?usp=sharing) - 請大家先把環境準備好,一台裝好 kvm or libvirt or lxd 的機器 - [環境設定 REF](https://hackmd.io/@txLtb1_dT1eziDq4utYbqA/B1jkjJcbY) - 主講者: 莊才賢 - 主記: 吳騰然 ## 會議內容 #### Cloud init - TOC - intro - how to use cloud init - how cloud-init run - debuging *** ### intro - cloud init 達成什麼 ![](https://upload.cc/i1/2021/11/03/sAVeH2.png) - 為甚麼我需要 cloud-init - 遷移 vm 到其他的雲可能很麻煩 - 不同雲的配置組態不同 - 已經變成行業的標準 - 大部分的雲和 distribution 都支援 cloud-init 作為啟動標準 - 防止 user 使用、維護過時的 image 或是 自己做 image - 可以不用做一些特定、麻煩的工作 - package 管理 - 帳號管理 - 儲存空間初始化 - ssh key 管理 - 每個雲提供資料的方式都不同 - cloud init 可以標準化資料,讓有支援的雲都可以有一樣的行為 - 1 個 systemd 動態分配 service 的 generator - 4 個 systemd 的 service - 雖然 cloud init 是一個 package ,但在初始化得過程利用 service 分割初始化的各個階段,類似虛擬出一個雲在對 vm 進行初始化的概念 *** ### How to use cloud init - consume data - meta-data(required) - 根據 cloud 不同會有不同的選項 - hostname - local_ip or remote_ip - instance_id - user-data(optional) - user 對於機器 configuration 的設定 - vendor-data(optional) - cloud provider 為了 user 更好的體驗,增加的設定 - 可以被使用者 disable ![](https://upload.cc/i1/2021/11/03/OvQmct.png) - meta-data - meta data 會根據 datasource (程式判斷的 cloud 種類) 有所不同 - 存取方式 - http request( EC2 meta-data service ) - configure drive - kernel cmdline( grub or /boot/cmdline.txt ) - 具體支援需要看 cloud 支援程度 - 很多雲都支援 ec2 的 meta-data service (or 提供類似的服務) - openstack - aliyun - E24Cloud - ec2 ![](https://upload.cc/i1/2021/11/03/1OvJ05.png) #### user-data and vendor-data - user-data(客製化的起點) - 通常不是 config 就是 shell script - 執行這個 user-data 內行為的使用者是 root - chown - chmod - shell (內容不用加sudo,可能會出現問題) - vendor-data( cloud provider 的優化 ) - 使用者對 vendor-data 有最終控制權 - 可以禁用部份或全部行為 - vendor-data 不應該被用作啟動的必要條件 - 不應該沒有 vendor-data 就無法啟動 - 如果 user-data 和 vendor-data 有衝突 - 預設會覆蓋原先的 vendor-data - 排除 vendor-data 的某種 content-type ![](https://upload.cc/i1/2021/11/03/vgdTUo.png) #### user-data and vendor-data - transfer format - plain text with Gzip compression - Mime Multi Part Archive - user (可以傳輸多於一種的) - usage type - usage type - User-Data Script - Include File - Cloud Config Data - Upstart Job - Cloud Boothook - Part Handler - jinja2 - check supported usage type - cloud-init devel make-mime --list-types ![](https://upload.cc/i1/2021/11/03/nCRjQi.png) - Start Demo 1. `git clone https://github.com/efficacy38/cloud-init_demos` 2. `cd demos/demo0` 3. run the start shell script - 如果是 kvm or libvirt - `./genseed.sh` (kvm and libvirt 都要) - `./boot.sh` ( kvm boot ) - `./virtboot.sh` ( libvirt ) - 如果是 lxd - `./lxdboot.sh` (lxd) - User-Data Script - 顧名思義就是可以放入 script,會在 boot 時做執行 - start with `#!` or text/x-shellscript(MIME Content-Type) - shbang 上寫著 /bin/bash,使用 bash 執行 - 小提醒:所有的 shell 都使用 root 跑,檔案權限可能會需要調整 ![](https://upload.cc/i1/2021/11/03/Lx4zW2.png) - User-Data Script(demo 0) - 檔案權限的問題(執行的角色為 root) - chown - chmod - ```ls /su_dog /a_cat``` ![](https://upload.cc/i1/2021/11/03/yWh1Ka.png) - Cloud Config Data - 使用yaml來進行編輯 - 有許多官方做好的 module, 可以在這個 config file 設定執行的方式 - start with `#cloud-config` or text/cloud-config(MIME Content-Type) - module 要注意執行的時機 - always (不管怎樣一定會執行) - per-boot (開機時執行) - once-per-instance or per-instance 在文件上沒統一 - cloud-init repo 指定的 [frequency](https://github.com/canonical/cloud-init/blob/main/cloudinit/settings.py) 也只有三個 - 常用的幾個 module - ssh_import_id - Users and Groups - user - group - apt - run command - write_files ![](https://upload.cc/i1/2021/11/03/3n2rTA.png) - moudle 執行的時機 - always - 每次開機都執行 - per-boot - 每次開機都執行 - once-per-instance or per-instance - cloud-init 區別不同機器的重點在 instance-id - cloud provider 的 meta-data service 提供的 - 有利於 template 的製作 - 會重跑 dhcp - 一些 ssh host key 會重新生成 - 在 file system(/var/lib/cloud/instance/) 可能會留下 cache(obj.pkl) 裡面包含一些 instance-id - 如果不一樣就可以知道是不同主機 ![](https://upload.cc/i1/2021/11/03/rgEBIR.png) - 查看 module 執行時機[(disable ec2 metadata)](https://cloudinit.readthedocs.io/en/latest/topics/modules.html#disable-ec2-metadata) ![](https://i.imgur.com/qkuI91v.png) - Cloud Config Data (install Docker) - 小提醒: - 新增新的 apt repo archive 需要 import GPG key - `gpg --show-keys gpgkeyname` 查看 gpg keyID - cloud-init 可以指定 keyid 也可以指定 keysever,也就是下載後在加入 apt 的 gpg keyring ```#cloud-config apt: sources: source1: source: deb [arch=amd64] https://download.docker.com/linux/ubuntu $RELEASE stable keyid: 9DC858229FC7DD38854AE2D88D81803C0EBFCD88 # keyserver: https://download.docker.com/linux/ubuntu/gpg packages: - docker-ce - docker-ce-cli - containerd.io ``` - Cloud Config Data( demo1 ) ![](https://upload.cc/i1/2021/11/03/UscNoS.png) - Cloud Config Data (add user and group) - 提醒: - `lock_passwd: False` : 如果想要馬上可以登入,False 代表禁用該使用者密碼登入 - `ssh_pwauth: True`:sshd 的密碼登入 - plain_text_passwd: test,設定文字密碼 - ssh_import_id 可以 import github 上的公鑰 ``` groups: - <group>: [<user>, <user>] - <group> users: - default # User explicitly omitted from sudo permission; also default behavior. - name: <some_restricted_user> sudo: false - name: <username> expiredate: '<date>' gecos: <comment> groups: <additional groups> homedir: <home directory> inactive: '<number of days>' lock_passwd: <true/false> no_create_home: <true/false> no_log_init: <true/false> no_user_group: <true/false> passwd: <password> primary_group: <primary group> selinux_user: <selinux username> shell: <shell path> snapuser: <email> ssh_redirect_user: <true/false> ssh_authorized_keys: - <key> - <key> ssh_import_id: <id> sudo: <sudo config> system: <true/false> uid: <user id> ``` - Cloud Config Data(demo3) - userdata.yaml ![](https://upload.cc/i1/2021/11/03/Ty2uHP.png) - jinja2 - start with `## template: jinja` or text/jinja2(MIME Content-Type) - 利用 jinja2 渲染 cloud-config 或是任何想要的 userdata type - `cloud-init query --list-keys` 可以查看支援的 key - meta-data service 提供的[資訊](https://cloudinit.readthedocs.io/en/latest/topics/instancedata.html) - cloud init 渲染範例 ``` ## template: jinja #!/bin/bash {% if v1.region == 'us-east-2' -%} echo 'Installing custom proxies for {{ v1.region }} sudo apt-get install my-xtra-fast-stack {%- endif %} ``` - jinja2 ( demo2 ) ![](https://upload.cc/i1/2021/11/03/rf1K6c.png) *** ### how cloud-init run - boot stages - cloud-init 執行分五個階段執行 - generator stage - local stage - network stage - config stage - final stage - 執行順序由上到下 - systemd units ( cloud init ) ![](https://upload.cc/i1/2021/11/03/7idYew.png) - generator stage - 使用 shell script ( /lib/cloud-init/ds-identify ) 檢查,如果發現任一符合就會是 notfound - 存在 /etc/cloud/cloud-init.disabled - /proc/cmdline 存在 cloud-init=disabled - 如果是 container 環境變數 KERNEL_CMDLINE - 確定 datasource 不是 notfound 不然就執行下面 link 的動作 - link “/lib/systemd/system/cloud-init.target” to “/run/systemd/generator.early/multi-user.target.wants/cloud-init.target” - 如果上面的 link 存在,就會讓 cloud-init 的服務被放入 systemd 的排程 - local stage - 初始化 datasource( a class in python ) - 如果透過本機的資料可以找到符合的 datasource - 讀入 config(越下面優先度越高,會覆蓋掉之前讀入的 config) - 程式碼內的 code - /etc/cloud/cloud.cfg - /run/cloud-init/cloud.cfg - kernel cmd line - 讀入 cache (obj.pkl) - 如果 instance-id 在 cache 和 local 上都一樣 - 可以跳過一些初始化步驟 - 不會執行 cloud-config 的任何 moudle - local stage services check ![](https://upload.cc/i1/2021/11/03/QXhIe4.png) - cache(obj.pkl) 出現的情況 - 情境一(最常見) - 之前已經 boot 過,這次開機是第2次 or n 次開機 - 情境二 - file system 被 attach 到另一個 instance - 從已經被包裝好的 image 開機 - 或者是從別的已經 launch 過的 instance 開機,複製一份 - Network stage - meta-data crawler - 最小化一個網路環境,根據本機可以得到的資料,找出 datasource 抓取資料 - 啟動可以找到的 part-handler - 執行這個 stage 執行的 module ( cloud_init_modules ) - cat /etc/cloud/cloud.cfg ![](https://upload.cc/i1/2021/11/03/pz8slh.png) ![](https://upload.cc/i1/2021/11/03/edC4RD.png) - config stage - 這個 statge 執行的 module 通常是和其他 stage 沒有前後關係的 moudle - 執行這個 stage 執行的 module ( cloud_config_modules ) - cat /etc/cloud/cloud.cfg ![](https://upload.cc/i1/2021/11/03/cJ6wrU.png) ![](https://upload.cc/i1/2021/11/03/615nVv.png) - Final stage - 所有在登入過後應該執行的部分應該都放在這裡 - 執行這個 stage 執行的 module ( cloud_config_modules ) - cat /etc/cloud/cloud.cfg ![](https://upload.cc/i1/2021/11/03/qN76MA.png) ![](https://upload.cc/i1/2021/11/03/G9wDO3.png) *** ### Debuging - debug - `/run/cloud-init/status.json` - 有 boot 的時間 - 可以看看那一個 stage 可以縮短,加速開機時間 - 每一步有沒有出現 error - `/run/cloud-init/result.json` - datasource error 的位置, troubleshooting 的好地方 - `/var/log/cloud-init-output.log` - 印出所有 cloud-init 做的事情,和做的同時 console 跑出的東西 - 同樣是個 trouble shooting 的好地方 ### 建議&問題 1. always vs per-boot? [name= Jerry] Ans: [name=] 2. cloud-init 是否有額外功能? [name=Branko] Ans : 沒有,只是初始化[name=Jerry] 3. cloudflare.sh 怎麼運作的? [name=chofinn] Ans : 有新的IP,就會用到Domain上[name=Jerry] 4. OS 是不是不只有兩個? [name=Phoebe] Ans : 待補[name=Jerry] 5. P.27 編號大的會覆蓋編號小的是有沒有意義的? [name=Angela] Ans : 有意義,愈下面愈不能動[name=Jerry] 6. P.7 舉例說讓使用者更好的使用? [name=Jeffery] Ans : 可以讓使用者更好管理[name=Jerry] 7. 實驗室的VMware也有相同服務,對應到我們的VMware是否有會有相同服務?[name=Johnson] Ans : 需要升級![name=Jerry] 8. P.16 執行時機是使用者無法改變的嗎?[name=Johnson] Ans : single [name=Jerry] 9. 169.254.0.0/16 ? [name=Johnson] Ans: [link local address](https://en.wikipedia.org/wiki/Link-local_address)[name=Jerry] 10. userdata 的 yaml 檔案名稱是有統一的規則還是內容? [name=Johnson] Ans : 要引用的檔案自己指定 (virtboot.sh -> genseed.sh -> SEED.img + userdata.yaml + metadata.yaml)[name=Jerry] 11. seed 的取名是有什麼意義嗎? [name=Johnson] Ans : 參考官方網站的檔案,可以修改[name=Jerry] 12. ssh 加密方式可以更換 or 可以自己加 PEM key? [name=Toby] Ans : 依文件內容可以自己加 [name=Jerry] 13. 如果用冷門的執行cloud-init,是否可以直接套用config設定?[name=Henry] Ans : 可能需要寫很多的code[name=Jerry] 14. P.9 圖片的範例屬於user-data嗎?[name=Edger] Ans : 是[name=Jerry] 15. P.10 都是在講user-data嗎?[name=Edger] Ans : 是,user-data 和 vendor-data 都是同一個[name=Jerry] 16. 建議 : 在操作之前,先說明或註明,如 : cloud-config需要先說明,不然不知道檔案是用來做甚麼的[name=Edger] ## 待追蹤事項 1. 將投影片內容轉為 SOP 文件 [name=Jerry] ## 臨時動議 - 無 --- 散會結束時間:17:12