Bạn có chắc chắn muốn xóa bài viết này không ?
Bạn có chắc chắn muốn xóa bình luận này không ?
Testing cloud-init trên local sử dụng KVM
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
- Download Ubuntu bionic cloud image
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




