<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本篇將主要介紹 openEuler AWS AMI 映象製作的詳細過程。
通過建立 AWS AMI 映象可將 openEuler 與 AWS 雲服務相結合,支援雲環境中標準的 ssh key注入、分割區擴容、使用者資料執行等功能,並使用 cloud-init 機制實現自動啟動 Rancher RKE2 叢集。今後,openEuler Cloud Images 的工作也將成為 RFO SIG 的一部分,逐步擴充套件支援更多的雲平臺。
openEuler 官方提供的 qcow2 格式的映象為一個總磁碟大小為 40G 的虛擬機器器映象,在 qemu 中啟動虛擬機器器,檢視分割區情況。
可以看到磁碟含有兩個分割區,其中 2G 為 boot 分割區,38G 為 root 分割區。
使用 Net Based Disk (NBD) 將 qcow2 映象的分割區載入到 Linux 系統中,之後使用 resize2fs 壓縮 ext4 檔案系統的體積,並使用分割區調整工具 fdisk 調整分割區的大小。
# 載入 NBD 核心模組 $ sudo modprobe nbd max_part=3 # 載入 qcow2 映象中的分割區至系統 sudo qemu-nbd -c "/dev/nbd0" "openEuler-22.03-LTS-x86_64.qcow2" $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT nbd0 43:0 0 40G 0 disk |-nbd0p1 43:1 0 2G 0 part |-nbd0p2 43:2 0 38G 0 part # 調整 ext4 檔案系統大小至6G $ sudo resize2fs /dev/nbd0p2 6G # 使用fdisk調整分割區大小至6G $ sudo fdisk /dev/nbd0 Welcome to fdisk (util-linux 2.34). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): d Partition number (1,2, default 2): 2 Partition 2 has been deleted. Command (m for help): n Partition type p primary (1 primary, 0 extended, 3 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (2-4, default 2): 2 First sector (4194304-83886079, default 4194304): Last sector, +/-sectors or +/-size{K,M,G,T,P} (4194304-83886079, default 83886079): +6G Created a new partition 2 of type 'Linux' and of size 6 GiB. Partition 2 contains a ext4 signature. Do you want to remove the signature? [Y]es/[N]o: N Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. # 從系統中解除安裝 qcow2 映象的分割區 $ sudo qemu-nbd -d /dev/nbd0
之後使用 qemu-img 將 qcow2 映象縮小至8G,並轉換為 RAW 格式。
$ qemu-img resize openEuler-22.03-LTS-x86_64.qcow2 --shrink 8G $ qemu-img convert openEuler-22.03-LTS-x86_64.qcow2 openEuler-22.03-LTS-x86_64.raw
首先使用 awscli 提供的工具,將 RAW 映象上傳至 AWS S3 bucket 中。
$ aws s3 cp openEuler-22.03-LTS-x86_64.raw s3://${BUCKET_NAME}/
建立 vmimport policy 和 role policy。
$ cat << EOF > trust-policy.json { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "vmie.amazonaws.com" }, "Action": "sts:AssumeRole", "Condition": { "StringEquals":{ "sts:Externalid": "vmimport" } } } ] } EOF $ aws iam create-role --role-name vmimport --assume-role-policy-document file://trust-policy.json $ cat << EOF > role-policy.json { "Version":"2012-10-17", "Statement":[ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket" ], "Resource": [ "arn:aws:s3:::${BUCKET_NAME}", "arn:aws:s3:::${BUCKET_NAME}/*" ] }, { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:GetBucketAcl" ], "Resource": [ "arn:aws:s3:::${BUCKET_NAME}", "arn:aws:s3:::${BUCKET_NAME}/*" ] }, { "Effect": "Allow", "Action": [ "ec2:ModifySnapshotAttribute", "ec2:CopySnapshot", "ec2:RegisterImage", "ec2:Describe*" ], "Resource": "*" } ] } EOF $ aws iam put-role-policy --role-name vmimport --policy-name vmimport --policy-document file://role-policy.json
建立 import-snapshot 任務,將儲存在 S3 bucket 的 RAW 映象建立為 Snapshot。
$ aws ec2 import-snapshot --description "openEuler RAW image import task" --disk-container "Format=RAW,UserBucket={S3Bucket=${BUCKET_NAME},S3Key=openEuler-22.03-LTS-x86_64.raw}"
等待幾分鐘後,通過 import task ID 獲取匯入成功後的 Snapshot ID。
$ aws ec2 describe-import-snapshot-tasks --import-task-ids ${IMPORT_TAST_ID}
使用此 Snapshot 建立不含 cloud init 機制的 Base AMI 映象。
$ aws ec2 register-image --name "DEV-openEuler-22.03-LTS-x86_64-BASE" --description "DEV openEuler image, do not use for production!" --root-device-name /dev/xvda --architecture x86_64 --ena-support --virtualization-type hvm --block-device-mappings DeviceName=/dev/xvda,Ebs={SnapshotId=${SNAPSHOT_ID}}
至此,我們獲得了 Base AMI ID。
首先建立 Packer 的組態檔,注意修改組態檔中的 <BASE_AMI_ID> 為剛剛獲取的 Base AMI ID。
{ "variables": { "version": "{{env `OPENEULER_VERSION`}}", "build": "{{env `AWS_IMAGE_BUILD_NUMBER`}}", "arch": "{{env `OPENEULER_ARCH`}}" }, "builders": [ { "type": "amazon-ebs", "name": "amazon-ebs-hvm-x86_64", "region": "ap-northeast-1", "ami_regions": [ "ap-northeast-1" ], "source_ami": "<BASE_AMI_ID>", "instance_type": "t3a.micro", "ssh_username": "root", "ssh_password": "openEuler12#$", "ami_name": "openEuler-{{user `version`}}-x86_64-hvm-{{user `build`}}", "ena_support": "true" } ], "provisioners": [ { "type": "shell", "environment_vars": [ "VERSION={{user `version`}}", "ARCH={{user `arch`}}" ], "script": "./install-cloudinit.sh" } ] }
新建指令碼檔案 install-cloudinit.sh,用來執行安裝 cloud init 和其他設定的指令。
#!/bin/bash set -e yum -y update yum -y install cloud-init cloud-utils-growpart gdisk yum -y install vim tar make zip gzip wget git tmux conntrack-tools socat iptables-services htop # disable Apparmor echo "GRUB_CMDLINE_LINUX_DEFAULT="apparmor=0"" >> /etc/default/grub # Update grub config if [[ "$(uname -m)" == "x86_64" ]]; then grub2-mkconfig -o /boot/grub2/grub.cfg elif [[ "$(uname -m)" == "arm64" ]]; then grub2-mkconfig -o /boot/efi/EFI/openEuler/grub.cfg fi
最後使用以下指令使用 packer 構建 AMI 映象。
$ packer build <PACKER_CONFIG.json>
理論上構建 ARM 架構的 AMI 映象的整體流程與 x86_64 架構的流程幾乎一致,但是在實際操作過程中遇到了使用 Base AMI 映象啟動伺服器後找不到網路卡裝置而無法 ssh 連線到伺服器的情況。
在使用串列埠連線到伺服器上進行偵錯後發現,ARM 架構的 openEuler 系統的核心中沒有預裝 AWS ENA 網路卡驅動,所以無法存取網路連線。
後續 openEuler 會為 ARM 架構的核心增添 ENA 驅動支援,在此之前可使用編譯 ENA 驅動核心模組並匯入的方式,作為一個臨時的解決辦法,感興趣的朋友可以參考一下。
此辦法只能作為一個臨時的解決方法,不建議用作生產環境中。
首先在本地執行一個用來編譯核心模組的 openEuler aarch64 虛擬機器器,安裝 gcc,make,git,vim 核心標頭檔案等編譯需要的工具,克隆 ENA 驅動的原始碼到本地並編譯。
$ yum -y install make git gcc vim kernel-devel-$(uname -r) $ git clone git clone https://github.com/amzn/amzn-drivers.git $ cd amzn-drivers/kernel/linux/ena/ $ make -j2
編寫這篇文章時,在編譯的過程中會遇到這個報錯:
/root/amzn-drivers/kernel/linux/ena/ena_ethtool.c:1218:19: error: initialization of ‘int (*)(struct net_device *, struct ethtool_coalesce *, struct kernel_ethtool_coalesce *, struct netlink_ext_ack *)' from incompatible pointer type ‘int (*)(struct net_device *, struct ethtool_coalesce *)' [-Werror=incompatible-pointer-types] 1218 | .get_coalesce = ena_get_coalesce, | ^~~~~~~~~~~~~~~~ compilation terminated due to -Wfatal-errors.
一個比較直接的解決辦法是編輯 ena_ethtool.c,在 1218-1221 行,為這幾個函數指標新增 (void*) 強制的指標型別轉換。
編譯後會生成 ena.ko 核心模組檔案,可用 modinfo ena.ko 檢視該模組的資訊。
$ modinfo ena.ko filename: /root/amzn-drivers/kernel/linux/ena/ena.ko version: 2.8.0g license: GPL description: Elastic Network Adapter (ENA) author: Amazon.com, Inc. or its affiliates ......
在調整硬碟分割區時,掛載分割區,複製此核心模組檔案到掛載的分割區的目錄中並編輯 modprobe 組態檔,在每次開機啟動時都載入這個核心模組。
# 假設將分割區掛載到了 /mnt 目錄下面 $ sudo mount /dev/nbd0p2 /mnt # 這裡將核心模組複製到了 /root 目錄下面 $ sudo cp ./ena.ko /mnt/root/ $ sudo bash -c ' echo "install ena insmod /root/ena.ko" >> /mnt/etc/modprobe.d/ena.conf ' $ sudo bash -c ' echo "ena" >> mnt/etc/modules-load.d/ena.conf ' $ sudo sync && sudo umount /mnt
重啟系統後,可以使用 lsmod 檢視已載入的核心模組,或使用 dmesg 檢視核心紀錄檔,可以看到 ENA 驅動被載入的記錄。
$ sudo lsmod Module Size Used by ena 147456 0 ...... $ dmesg | grep ena: [ 94.814488] ena: loading out-of-tree module taints kernel. [ 94.814896] ena: module verification failed: signature and/or required key missing - tainting kernel
目前 openEuler 社群已修復了 ARM 架構的核心不包含 ENA 網路卡驅動的問題,會在後續的核心更新中獲取到包含 ENA 驅動的核心。更多資訊可在此PR中獲取到:gitee.com/openeuler/k…
在 AWS EC2 範例的控制檯頁面,使用構建的 AMI 映象建立一個 EC2 虛擬機器器,設定網路安全組、SSH 金鑰、磁碟大小、使用者資料等設定。
在本篇文章中,設定的 EBS 磁碟大小為 30G,在使用者資料中填寫了安裝 RKE2 的指令碼:
#!/bin/bash echo "-------- Start custom user data ----------" yum update curl -sfL https://get.rke2.io > install.sh chmod +x ./install.sh sudo INSTALL_RKE2_METHOD=tar ./install.sh sudo systemctl enable rke2-server sudo systemctl start rke2-server echo "-------- User data finished successfully -----------"
範例啟動後,cloud init 機制會自動建立使用者名稱為 openeuler 的賬號並設定僅使用 ssh key 登入,同時 root 賬號的 ssh 登入也會被禁止。磁碟的 root 分割區會自動擴容到我們設定的 EBS 磁碟大小,使用者資料中填寫的指令碼也將被自動執行。
檢視 cloud init 輸出的紀錄檔,其中包括使用者資料的執行結果:
$ tail -f /var/log/cloud-init-output.log Is this ok [y/N]: Operation aborted. [INFO] finding release for channel stable [INFO] using v1.24.4+rke2r1 as release [INFO] downloading checksums at https://github.com/rancher/rke2/releases/download/v1.24.4+rke2r1/sha256sum-amd64.txt [INFO] downloading tarball at https://github.com/rancher/rke2/releases/download/v1.24.4+rke2r1/rke2.linux-amd64.tar.gz [INFO] verifying tarball [INFO] unpacking tarball file to /usr/local Created symlink /etc/systemd/system/multi-user.target.wants/rke2-server.service → /usr/local/lib/systemd/system/rke2-server.service. -------- User data finished successfully ----------- Cloud-init v. 21.4 finished at Wed, 21 Sep 2022 06:56:30 +0000. Datasource DataSourceEc2Local. Up 130.47 seconds
驗證分割區自動擴容至總容量為設定的 EBS 的大小:
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS nvme0n1 259:0 0 30G 0 disk ├─nvme0n1p1 259:1 0 2G 0 part /boot └─nvme0n1p2 259:2 0 28G 0 part /
驗證 RKE2 安裝成功,所有 pods 均正常啟動:
$ sudo /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get nodes NAME STATUS ROLES AGE VERSION ip-172-31-21-213.ap-northeast-1.compute.internal Ready control-plane,etcd,master 7m58s v1.24.4+rke2r1 $ sudo /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE kube-system cloud-controller-manager-ip-172-31-21-213.ap-northeast-1.compute.internal 1/1 Running 0 14m kube-system etcd-ip-172-31-21-213.ap-northeast-1.compute.internal 1/1 Running 0 14m kube-system helm-install-rke2-canal-l5rnl 0/1 Completed 0 14m kube-system helm-install-rke2-coredns-jckq7 0/1 Completed 0 14m kube-system helm-install-rke2-ingress-nginx-dxcsc 0/1 Completed 0 14m kube-system helm-install-rke2-metrics-server-kgjdf 0/1 Completed 0 14m kube-system kube-apiserver-ip-172-31-21-213.ap-northeast-1.compute.internal 1/1 Running 0 14m kube-system kube-controller-manager-ip-172-31-21-213.ap-northeast-1.compute.internal 1/1 Running 0 14m kube-system kube-proxy-ip-172-31-21-213.ap-northeast-1.compute.internal 1/1 Running 0 14m kube-system kube-scheduler-ip-172-31-21-213.ap-northeast-1.compute.internal 1/1 Running 0 14m kube-system rke2-canal-ng2sw 2/2 Running 0 13m kube-system rke2-coredns-rke2-coredns-76cb76d66-nklrw 1/1 Running 0 13m kube-system rke2-coredns-rke2-coredns-autoscaler-58867f8fc5-mpgd7 1/1 Running 0 13m kube-system rke2-ingress-nginx-controller-fhpbd 1/1 Running 0 12m kube-system rke2-metrics-server-6979d95f95-2lrp8 1/1 Running 0 13m
Rancher是一個開源的企業級Kubernetes管理平臺,實現了Kubernetes叢集在混合雲+本地資料中心的集中部署與管理。Rancher一向因操作體驗的直觀、極簡備受使用者青睞,被Forrester評為“2020年多雲容器開發平臺領導廠商”以及“2018年全球容器管理平臺領導廠商”,被Gartner評為“2017年全球最酷的雲基礎設施供應商”。
目前Rancher在全球擁有超過三億的核心映象下載量,並擁有包括中國聯通、中國平安、中國人壽、上汽集團、三星、施耐德電氣、西門子、育碧遊戲、LINE、WWK保險集團、澳電訊公司、德國鐵路、廈門航空、新東方等全球著名企業在內的共40000家企業客戶。
2020年12月,SUSE完成收購RancherLabs,Rancher成為了SUSE “創新無處不在(Innovate Everywhere)”企業願景的關鍵組成部分。SUSE和Rancher共同為客戶提供了無與倫比的自由和所向披靡的創新能力,通過混合雲IT基礎架構、雲原生轉型和IT運維解決方案,簡化、現代化並加速企業數位化轉型,推動創新無處不在。
當前,SUSE及Rancher在中國大陸及港澳臺地區的業務,均由數碩軟體(北京)有限公司承載。SUSE在國內擁有優秀的研發團隊、技術支援團隊和銷售團隊,將結合Rancher領先的雲原生技術,為中國的企業客戶提供更加及時和可信賴的技術支撐及服務保障。
以上就是RFO SIG之openEuler AWS AMI 製作詳解的詳細內容,更多關於openEuler AWS AMI 製作的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45