Testing cloud-init trên local sử dụng KVM
TIL
770
Male avatar

lamchipabc viết ngày 17/10/2020

Testing cloud-init trên local sử dụng KVM .

Trong quá trình thực tập tại trường , mình đã được thầy hướng dẫn cho tiếp xúc với một số công nghệ ảo hóa làm mình cảm thấy rất hứng thú . Hôm nay mình muốn giới thiệu tới mọi người một công nghệ rất được dùng phổ biến để cấu hình các máy ảo - Cloud Init . Bài viết là kết quả thực hành tạo máy ảo mà mình muốn chia sẻ tới mọi người . Trong bài viết này mình sẽ trình bày các bước để tạo một máy ảo Ubuntu sử dụng KVM và dùng cloud-init để cấu hình máy ảo tự động khi khởi động trên môi trường local .

Cloud-init và ứng dụng của nó .

Đầu tiên chúng ta phải hiểu rõ cloud-init làm gì ?
Cloud init là một service có khả năng tự động hóa việc cấu hình các máy ảo trong quá trình khởi động các máy ảo đó . Cloud-init giúp giảm tối đa thời gian việc bạn phải cấu hình thủ công trên từng con máy ảo ( sua memory , device , networking , storage ... ) .
sua Với khả năng khởi động một máy khách OS , cloud-init thường được phổ biến với việc triển khai các dịch vụ máy ảo IaaS như EC2 hoặc Azure . Nhưng cloud-init không chỉ được dùng cho các nhà cung cấp dịch vụ cloud mà còn được dùng cho việc triển khai các máy ảo trên local một cách nhanh chóng trong quá trình development và testing .

Chuẩn bị :

+gioi thieu cloud init có the dung chung với những thằng này Cài đặt kvm , libvirt , qemu :

sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virt-manager

1. Tạo một snap-shot từ Ubuntu cloud image

Bước này ta tạo một ổ đĩa mới có backing file trỏ tới file image gốc , file qcow2 này có đặc điểm chỉ lưu thông tin khác nhau giữa chính nó với image gốc ( ở ví dụ bên dưới thì ta tăng bộ nhớ của image gốc từ 2GB thành bộ nhớ ảo 10GB với ổ đĩa mới ) . Lợi ích của cách tạo file này là không những không tác động tới image gốc do các thông tin chỉnh sửa được thể hiện qua ổ đĩa mới vừa tạo ra , đồng thời cũng tiết kiệm không gian bộ nhớ do không phải clone lại image gốc và có thể gia tăng bộ nhớ ảo so với bộ nhớ thật của image gốc .

# original image is 2G, create snapshot and make it 10G
qemu-img create -b bionic-server-cloudimg-amd64.img -f qcow2 snapshot-bionic-server-cloudimg.qcow2 10G
# show snapshot info
qemu-img info snapshot-bionic-server-cloudimg.qcow2

image: snapshot-bionic-server-cloudimg.qcow2
file format: qcow2
virtual size: 10G (10737418240 bytes)
disk size: 196K
cluster_size: 65536
backing file: bionic-server-cloudimg-amd64.img
Format specific information:
    compat: 1.1
    lazy refcounts: false
    refcount bits: 16
    corrupt: false

2. Tạo ssh keypair

Ta sẽ tạo ra một ssh key-pair và dùng public key để gắn vào một user trong file cloud-config cho việc thực hiện ssh vào user trên máy ảo cần tạo .

ssh-keygen -t rsa -b 4096 -f id_rsa -C ubuntu-testing -N "" -q

Trong đó các option :
-t : type , -b : byte , -f : output key-gen ,-C : comment ,-N : new_passphrase
( chi tiết các option xem tại đây )

3. Cấu hình Cloud-config

Để cấu hình máy ảo cho lần khởi động đầu tiên , ta cần phải tạo ra một file cloud-config chứa thông tin cấu hình mà máy ảo sẽ được tạo . Trong file config này chứa các module mà cloud-init đọc và thực thi lệnh dựa trên những module đó . Chi tiết các module của cloud-init các bạn có thể tìm đọc tại đây

Ở ví dụ dưới ta sẽ tạo ra một file cloud-config đơn giản có nhiệm vụ tạo ra một user lam có thể đăng nhập bằng user/password và một user ubuntu chỉ cho phép đăng nhập qua giao thức ssh . Thêm một nhiệm vụ nữa là mình sẽ disable cloud-init service để nó chỉ có thể chạy duy nhất lần đầu tiên khi tạo máy ảo còn các lần sau thì không khởi động lên nữa . Mình sẽ nói lí do về cuối bài viết .

vi cloud_init.cfg
#cloud-config
hostname: ubuntu
fqdn: test1.example.com
manage_etc_hosts: true
users:
  - name: ubuntu
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/ubuntu
    shell: /bin/bash
    lock_passwd: true
    ssh-authorized-keys:
      -< paste content of public key here> 
  - name: lam 
    sudo: ALL=(ALL) NOPASSWD:ALL
    groups: users, admin
    home: /home/lam
    shell: /bin/bash
    lock_passwd: false

# only cert auth via ssh (console access can still login)
ssh_pwauth: false
disable_root: false
chpasswd:
  list: |
     lam:qwertyui
  expire: False
bootcmd:
  - sudo touch /etc/cloud/cloud-init.disabled
# written to /var/log/cloud-init-output.log
final_message: "The system is finally up, after $UPTIME seconds"

4. Cấu hình network

Bước này chúng ta cấu hình một mạng tĩnh , các bạn cũng có thể tìm hiểu thêm chi tiết ở đây

vi network_config_static.cfg 
version: 2
ethernets:
  ens3:
     dhcp4: false
     # default libvirt network
     addresses: [ 192.168.122.158/24 ]
     gateway4: 192.168.122.1
     nameservers:
       addresses: [ 192.168.122.1,8.8.8.8 ]

5. Dùng cloud-localds để lưu thông tin datasouce

Trong cloud-init , khái niệm datasource là chỉ các thông tin mà máy ảo cần để cấu hình cho lần đầu tiên boot lên .
Ở ví dụ bên dưới , ta nén các thông tin cấu hình máy ảo mà ta tạo ra trước đó ở hai file cloud_init.cfg và cấu hình mạng tĩnh network_config_static.cfg và trong trong ổ đĩa ubuntu-seed.qcow2 .
Cloud-localds là một tools trong cloud-init với nhiệm vụ tạo ra các datasource NoCloud .

# insert network and cloud config into seed image
cloud-localds -v --network-config=network_config_static.cfg ubuntu-seed.qcow2 cloud_init.cfg

# show seed disk just generated
$ qemu-img info ubuntu-seed.qcow2 

image: ubuntu-seed.qcow2
file format: raw
virtual size: 368K (376832 bytes)
disk size: 368K

6. Start VM

Ở bước này ta sử dụng virt-install để tạo ra một domain với các thông số như ở bên dưới , domain này được attach với file ubuntu-seed.qcow2 và file snap-shot.qcow2 dùng để cloud init đọc trong quá trình cấu hình máy ảo khi khởi động lên


virt-install --name ubuntu \
  --virt-type kvm --memory 2048 --vcpus 2 \
  --boot hd,menu=on \
  --disk path=test1-seed.qcow2,device=cdrom \
  --disk path=snapshot-ubuntu.qcow2,device=disk \
  --graphics vnc \
  --os-type Linux --os-variant ubuntu18.04 \
  --network network:default \
  --console pty,target_type=serial \
  --noautoconsole

Sau khi tạo xong , ta check xem máy ảo đã được booting hay chưa

virsh list  
 Id    Name                           State
----------------------------------------------------
 5     ubuntu                         running


Đăng nhập vào máy ảo

virsh console ubuntu 
login : lam
pass:qwertyui

Ta thấy cách này khá là thủ công vì phải gõ từng dòng lệnh , ta có thể tạo ra 1 bash shell scripts để chạy lênh này hoặc có thể tạo ra domain này từ file xml bằng cách sau khi khởi tạo máy ảo xong , ta đăng nhập vào VM và dùng lệnh

virsh dumpxml domain-name  >  ubuntu-bionic.xml

Cấu hình của domain vừa tạo sẽ được xuất ra file ubuntu-bionic.xml , sau đó mỗi khi muốn tạo lại domain từ file cloud-image , ta chỉ cần gõ lệnh

virsh create domain-name 

Khi check lại domain ta cũng sẽ thấy máy ảo tương tự khi dùng virsh-install ( chú ý destroy máy ảo trước để tránh conflict)

7. SSH login

Tại bước này ta sẽ đăng nhập vào máy bảo bằng giao thức ssh qua user ubuntu

ssh ubuntu@192.168.122.158 -i id_rsa

# final cloud-init status
cat /run/cloud-init/result.json

# cloud logs
vi /var/log/cloud-init.log
vi /var/log/cloud-init-output.log

Disable cloud-init service

Tại sao phải vô hiệu hóa cloud-init khi đã tạo xong máy ảo ?
Trong thực tế , ta chỉ nên để cloud-init service chạy 1 lần duy nhất khi khởi tạo domain lần đầu tiên , tránh việc khi restart lại domain thì cloud-init service cũng khởi động lại và thực hiện lặp lại quá trình cấu hình máy ảo và có thể gây lỗi không mong muốn . Lệnh cmd trong file cloud_init.cfg :

bootcmd:
  - sudo touch /etc/cloud/cloud-init.disabled

lệnh này tạo ra 1 file cloud-init.disable có tác dụng disable cloud-init , khi mỗi lần khởi động bằng systemd , 1 generator được tạo ra và quyết định service cloud-init có được chạy không bằng cách kiểm tra file cloud-init.disable có tồn tại không . Nếu có nó sẽ vô hiệu hóa cloud-init mỗi lần khởi động lại máy ảo . Cũng có nhiều cách để disable cloud-init nhưng mình chỉ nêu ví dụ cách này .

bổ sung

  • lưu file public key vào biến môi trường
Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

lamchipabc

1 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Bài viết liên quan
White
0 5
fCC: Technical Documentation Page note So I have finished the HTML part of this exercise and I want to come here to lament about the lengthy HTML ...
HungHayHo viết hơn 2 năm trước
0 5
White
4 0
I used Spring boot, Hibernate few times back then at University, I'v started using it again recently. In this (Link), I want to check how Spring J...
Rey viết gần 2 năm trước
4 0
White
24 1
Toán tử XOR có tính chất: + A XOR A = 0 + 0 XOR A = A Với tính chất này, có thể cài đặt bài toán sau với độ phức tạp O(N) về runtime, và với O(1)...
kiennt viết 4 năm trước
24 1
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
1 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!