Jul 222022
 

最近接触太多专业术语,单词缩写,不记录一下,真的不知道什么含义。

DAOS 图解

这张图,其实可以理解为啥DAOS性能比Ceph强的地方,不仅仅是因为使用了闪存,而是利用新的存储架构,实现的更高的性能。

英特尔傲腾持久内存和英特尔傲腾固态盘之间区别

两者都使用了相同的英特尔® 傲腾™ 内存介质,但它们是完全不同的产品。

英特尔傲腾持久内存位于 DIMM 封装中,在 DRAM 总线上运行,可以作为易失性内存或持久内存使用。就是插入到服务器的内存槽使用

而英特尔傲腾固态盘严格用于标准 NAND 封装模型(AIC、M.2、U.2、EDSFF 等)中的快速存储,并采用 NVMe* 协议驻留于 PCIe 总线上,作为存储设备始终保持数据持久。

英特尔傲腾持久内存和标准 DRAM 区别

简单理解,傲腾其实是有两种运行模式,

  • 内存模式,这种模式下,傲腾的内存,和标准内存一样,掉电后,数据丢失。内存模式下,是必须和传统的内存一起使用,而不能单独使用傲腾内存。
  • 缓存模式,这种模式,傲腾存储,就变成一个盘,掉电后,数据不丢失。

linux下,需要内核支持,需要命令行下开启不同的模式。

相似之处:封装在 DIMMS 中,与 DRAM 驻留在同一总线/通道上,并且可以采取与 DRAM 相同的方式来存储易失性数据;

不同之处:持久内存容量远远高于传统的 DRAM。PMem 模块具有 128GB、256GB 和 512GB 三种容量,远远大于通常从 16GB 到 64GB 的 DRAM 模块,尽管也存在更大容量的 DRAM 模块。

看文档,DRAM和傲腾的搭配,是有要求。

Mar 152022
 

使用内部的镜像仓库来安装k8s或者kubesphere,速度都是非常爽了。那么如何搞一个离线镜像仓库,专门用来安装k8s和kubesphere呢?

最新的版本kubekey,提供了离线安装的功能,镜像仓库,自己签发ssl证书,这种方式,还是不太方便,使用的时候。我的设想是

  • 利用DNSPod 搞到证书,搭建一个docker 原厂的Registry的服务器
  • 使用kubesphere提供的阿里云镜像列表,通过skopeo来实现镜像的直接复制到私有的仓库

目前kubesphere的镜像仓库有两个,一个是在docker hub,一个是在阿里云 hub。在国内就使用阿里云hub。需要注意的是,如果使用国内的阿里云hub,那么namespace是:kubesphereio,那么你需要在kubekey上设置一下override才行。

主要参考的是木子的文章:https://blog.k8s.li/skopeo.html

image list,我已经整理了一份,安装k8s 1.21.5+kubesphere 3.2.1 的镜像列表,放在github上。

sync.sh 文件内容。

#!/bin/bash
GREEN_COL="\\033[32;1m"
RED_COL="\\033[1;31m"
NORMAL_COL="\\033[0;39m"
SOURCE_REGISTRY=$1
TARGET_REGISTRY=$2
: ${IMAGES_LIST_FILE:="images-list.txt"}
: ${TARGET_REGISTRY:="hub.chenshake.site"}
: ${SOURCE_REGISTRY:="registry.cn-beijing.aliyuncs.com"}

BLOBS_PATH="docker/registry/v2/blobs/sha256"
REPO_PATH="docker/registry/v2/repositories"
set -eo pipefail

CURRENT_NUM=0
ALL_IMAGES="$(sed -n '/#/d;s/:/:/p' ${IMAGES_LIST_FILE} | sort -u)"
TOTAL_NUMS=$(echo "${ALL_IMAGES}" | wc -l)

skopeo_copy() {
 if skopeo copy --insecure-policy --src-tls-verify=false --dest-tls-verify=false \
 --override-arch amd64 --override-os linux -q docker://$1 docker://$2; then
 echo -e "$GREEN_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 successful $NORMAL_COL"
 else
 echo -e "$RED_COL Progress: ${CURRENT_NUM}/${TOTAL_NUMS} sync $1 to $2 failed $NORMAL_COL"
 exit 2
 fi
}

for image in ${ALL_IMAGES}; do
 let CURRENT_NUM=${CURRENT_NUM}+1
 skopeo_copy ${SOURCE_REGISTRY}/${image} ${TARGET_REGISTRY}/${image}
done

镜像列表

  • https://github.com/shake/shell/blob/main/images-list.txt
  • http://www.chenshake.com/to-compile-the-skopeo/

skopeo,这个工具,其实是参考木子文章,我自己编译。

curl  https://hub.chenshake.site:443/v2/_catalog | python -m json.tool
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   365  100   365    0     0   2876      0 --:--:-- --:--:-- --:--:--  2896
{
    "repositories": [
        "busybox",
        "kubesphereio/alertmanager",
        "kubesphereio/alpine",
        "kubesphereio/builder-base",
        "kubesphereio/builder-go",
        "kubesphereio/builder-maven",
        "kubesphereio/builder-nodejs",
        "kubesphereio/examples-bookinfo-productpage-v1",
        "kubesphereio/kube-apiserver",
        "kubesphereio/kube-controller-manager",
        "kubesphereio/kube-proxy",
        "kubesphereio/kube-scheduler"
    ]
}

自己的镜像仓库的镜像列表。镜像的存储,我是放在 /mnt

cd /mnt/registry/
find docker -type d -name "current" | sed 's|docker/registry/v2/repositories/||g;s|/_manifests/tags/|:|g;s|/current||g' > images.list

#查看镜像列表
# cat images.list 
kubesphereio/thanos:v0.18.0
kubesphereio/kube-events-ruler:v0.3.0
kubesphereio/python-36-centos7:v3.2.0
kubesphereio/prometheus-config-reloader:v0.43.2

busybox:latest
Dec 232021
 

以前搞OpenStack的时候,对虚拟机镜像都没怎么折腾过。这次折腾镜像,倒是学了不少东西,这里总结一下。

工具

虚拟机镜像定制工具很多,原理有很大的差异,理论上用一个工具,就可以搞定。不过我这次制作镜像,使用到2个工具

  • Disk image builder (DIB)它是OpenStack的开发过程中产生的一个工具,可以把OpenStack项目的agent集成到镜像里,对镜像镜像深度的定制。
  • virt-customize,这个其实不是一个工具,是一套工具,红帽出品。基本上你对虚拟机镜像操作,都可以通过它来完成。

如果全部功能都使用DIB完成,那么这些定制,都需要自己写自己的element,这个对我以前的团队,是小case,维护一套自己需要定制的内容,写好相关的element,一条命令,就完成镜像的制作。

如果希望使用virt完成全部的镜像定制,有些比较繁琐的步骤,利用镜像格式转换,压缩,其实都比较折腾。

所以我的方案就是使用virt,对虚拟机进行相应的定制,最后一步,通过DIB,完成镜像的压缩和初始化。

我们都是采用操作系统官方提供的虚拟机镜像,进行定制开发

  • CentOS 7.6
  • CentOS 7.9
  • CentOS 8.4
  • Ubuntu 20.04

定制内容

官方提供的镜像有哪些内容需要定制呢,我这里整理一下,具体这些定制如何修改,我已经把相应的文档放到github上。

CentOS

针对CentOS的定制,主要是下面的内容

  • 虚拟机的repo,指向国内,华为,清华的repo。我是使用公司内部nexus的proxy repo
  • 内核升级到5.4,CentOS 7,官方有repo,可以直接升级,CentOS 8,需要使用外部的repo。5.4的内核,可以让CentOS 7工作更久,升级到5.4内核,virt的工具效率都提升很多,也减少很多麻烦。
  • qemu-guest-agent,现在虚拟机的修改密码都需要靠它。
  • 常用软件和k8s相关依赖,这样大幅提升效率
  • 设置时区
  • ssh定制,尤其dns,在内网不能联网的情况,ssh很慢,CentOS 8默认已经关闭dns。
  • 登陆CentOS ,运行命令,会出现很多中文,看起来很别扭,虚拟机的语言是英文,所以需要修改语言的环境变量
  • CentOS 8 ssh登陆,会有cockpit提示,很烦人,去掉。
  • 利用cloud init,来解决虚拟机第一次启动,运行脚本。以前是通过virt first boot来实现,不过在CentOS 8 下出现问题,改成cloud init的per-once,完美解决了这个问题。主要解决zstack环境的agent安装和端口修改,和普罗米修斯端口冲突。
  • 设置alias,提升效率,vi alias vim,c alias clear。大幅提升幸福感。
  • cloud init一些定制,运行root密码登陆,运行远程ssh访问。这个是通过DIB来实现
  • 关闭selinux,对镜像镜像压缩,调整镜像大小。这个也是通过DIB实现。
  • 针对OpenStack的cloud-init,ConfigDrive,提升虚拟机的启动速度,这块以前同事专门有文章介绍过。

Ubuntu

针对Ubuntu 定制的内容就少很多,通过下载镜像,定制完成,再DIB,这种方式行不通,ubuntu官方做了限制,不过由于ubuntu需要修改的内容不多,virt就能满足需求。

  • Repo定制,ubuntu的官方镜像,cloud init有设置,不让你修改repo,需要修改一下cloud init的配置文件,你替换repo文件才能生效。
  • qemu-guest-agent
  • 直接使用root ssh登陆,不需要sudo
  • 去掉登陆的banner
  • 利用cloud init,安装一次性运行脚本,如果需要,zstack的agent,通过这种方式,比较简单。
  • resize 镜像,对于zstack的平台,调整到80G,OpenStack是不需要修改。

效果

制作一个镜像,大概是10分钟,其实后续,真的可以锻炼一下自己的shell的能力,改成shell脚本。这样效率更高。

  • CentOS 定制 https://github.com/shake/shell/blob/main/custom-centos-image
  • ubuntu 定制 https://github.com/shake/shell/blob/main/ubuntu-image-custom

如果你希望镜像给root设置一个默认密码,我坚持不加默认密码

记得设置环境变量或者export一次。

virt-customize -a $image_name --root-password password:chenshake 
##替换repo


virt-customize -a $image_name --run-command ‘rm /etc/yum.repos.d/CentOS-7-all.repo'
virt-customize -a $image_name --run-command ‘wget -O /etc/yum.repos.d/all-huawei.repo https://raw.fastgit.org/shake/shell/main/CentOS7/all-huawei.repo'
Sep 082021
 

其实用了k8s很久,但是很多概念的理解,有时候真的需要动手,才能真正理解。

官方文档提供的nginx的deployment模版,我修改一下,采用alpine镜像,副本的数量为1

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: default
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80

有几个地方需要留意

  • deployment 名字是 nginx-deployment, 后续你可以用 kubectl get svc 看到
  • labels, 标签是:nginx,
  • namespace 如果不指定,就是使用default,我这里专门加入,便于理解。
  • 部署pod的数量是1
  • nginx的alpine镜像,小很多,方便试验。
kubectl apply -f nginx.yaml 
kubectl get pod
kubectl get deployment
kubectl get svc
kubectl expose deployment nginx-deployment --type=NodePort --name=hello
kubectl get svc
kubectl describe svc hello
May 172021
 

已经讨论了很久这套组合,这次动手验证一遍。流程还是非常顺利。从0开始,到部署完成kubesphere,基本2个小时可以搞定,主要是考验带宽。后续再慢慢研究离线安装。

青云设置

青云新的Dashboard改动很多,功能也真的比以前增加了很多很多。我也是需要花时间熟悉一下。其实我以前在青云上测试,基本上一个虚拟机来测试,这次至少要用3个虚拟机,需要vpc来玩,整理一下这个过程

  • 创建一个项目,kubeOperOperator and KubeSphere。青云引入了项目的概念,有点类似Azure的资源组,你可以在项目里看到所用到的资源。
  • 创建一个安全组,安全组有一个选项,组内互通,这个我打开的,应该是比较方便。为了方便,我打开所有的端口。
  • 创建vpc,指定网段,192.168.0.0/16, 创建子网,网段 192.168.10.0/16
  • 公网的ip,绑定在vpc上
  • 创建一个。4core,8g内存,60G存储的虚拟机,CentOS 7.9,用来部署kubeoperator。ip地址,指定 192.168.10.10
  • vpc上,进行端口映射,22,80,映射到192.168.10.10 这台虚拟机上。后续还需要映射30880端口到master节点到内网ip,这里是192.168.10.30
  • NFS Server 也部署在kubeoperator机器上。
  • 创建3台机器,master配置:4core,8G,60G存储,work节点,2core,4G,20G存储。

KubeOperator

安装

对于kubeOperator安装,倒是比较简单,一条命令就搞定。

curl -sSL https://github.com/KubeOperator/KubeOperator/releases/latest/download/quick_start.sh | sh

4M带宽,大概需要20分钟下载。组件都是部署在Dcoker里,通过compose来实现部署到机器上。

地址: http://<ko服务器_ip>:80
用户名: admin
密码: kubeoperator@admin123

相关命令

koctl status
koctl --help

设置

如果你是通过手动的方式来安装的话,倒是比较简单。这里就不截图,只是记录一个过程

  • 设置仓库地址,就是kubeoperator的地址
  • 创建凭证,就是节点root的密码
  • 创建项目
  • 添加主机,一台是master,一台是work节点,这两台机器,提前在青云平台创建。
  • 项目把主机添加到项目里
  • 项目里创建集群:这就是一个K8S集群。
  • k8s部署完毕,进入集群,设置存储:NFS
  • 需要通过kubectl,把NFS存储设置成默认存储,这样就可以顺利进行KubeSphere的安装

你可以在访问创建的集群里玩玩k8s。

安装NFS server

mkdir /data/nfs -p
yum install -y nfs-utils
vim /etc/exports
/data/nfs *(rw,sync,no_root_squash)

systemctl enable --now rpcbind.service
systemctl enable --now nfs-server.service

在部署的cluster里,配置nfs存储,查看存储的sc。你需要设置default 的存储。

> kubectl get sc
NAME              PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
mynfs (default)   nas           Delete          Immediate           false                  28m

kubectl patch storageclass mynfs -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'

KubeSphere

安装

KubeSphere的安装,也很简单。因为KubeOperator 提供web的kubectl,直接就可以进行kubesphere的安装

kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.0/kubesphere-installer.yaml
   
kubectl apply -f https://github.com/kubesphere/ks-installer/releases/download/v3.1.0/cluster-configuration.yaml

等着就可以,可以通过命令,查看安装的进度。

kubectl logs -n kubesphere-system $(kubectl get pod -n kubesphere-system -l app=ks-install -o jsonpath='{.items[0].metadata.name}') -f

安装过程,如果看到出现错误,例如我没设置默认存储,你配置完成默认存储后,你需要重启pod,继续安装

kubectl -n kubesphere-system rollout restart deploy

查看登陆地址

kubectl get svc/ks-console -n kubesphere-system

kubesphere web 端口是 30880,并通过 NodePort (IP:30880) 使用默认帐户和密码 (admin/P@88w0rd) 访问 Web 控制台。记得去vpc上做30880的端口映射。

配置

默认的安装,是没有包括devops的相关组件,这个可以通过web方式启用,也可以通过修改配置文件搞定。

Mar 262021
 

这里面其实就是记录一下做一个指定版本的镜像,所需要做的东西。假设DIB和virt已经装好。下面就是一个实际的操作过程。可以参考我上一篇文章。国内目前好像就中科大提供镜像下载。我这里下载的是7.6

https://mirrors.ustc.edu.cn/centos-cloud/centos/7/images/

我习惯就是

mkdir cloud-images
cd cloud-images
curl -O https://mirrors.ustc.edu.cn/centos-cloud/centos/7/images/CentOS-7-x86_64-GenericCloud-1905.qcow2

安装DIB和Virt

yum install centos-release-openstack-train -y
yum install diskimage-builder -y
yum install libguestfs-tools-c libguestfs-tools libguestfs -y

设置环境变量, 如何你希望再build一个centos 7.9 镜像,那么你只需要把 avoid pacage update 这个去掉就可以。

export LIBGUESTFS_BACKEND=direct
export DIB_LOCAL_IMAGE="/root/cloud-images/CentOS-7-x86_64-GenericCloud-1905.qcow2" 
export DIB_RELEASE=7
export DIB_CLOUD_INIT_ALLOW_SSH_PWAUTH="yes"
export DIB_AVOID_PACKAGES_UPDATE=1
export image_name='CentOS-7.6-x86.qcow2'

设置好环境变量,后续就简单了。

openstack平台

DIB_CLOUD_INIT_DATASOURCES="ConfigDrive, OpenStack"  disk-image-create -a amd64 -o $image_name  -x --image-size 40 vm base centos disable-selinux cloud-init cloud-init-datasources dhcp-all-interfaces growroot epel

Zstack

disk-image-create -a amd64 -o  $image_name -x --image-size 40 vm base centos disable-selinux cloud-init dhcp-all-interfaces epel

这样也就几分钟就可以创建出镜像。

# 设置时区

virt-customize -a $image_name --timezone "Asia/Shanghai" 

#安装工具

virt-customize -a $image_name --install epel-release

virt-customize -a $image_name --install net-tools,wget,vim,unzip,qemu-guest-agent,jq,bash-completion

virt-customize -a $image_name --install net-tools,wget,vim,unzip,qemu-guest-agent,jq,bash-completion,yum-utils,device-mapper-persistent-data,lvm2,openssl,socat,conntrack,ebtables,ipset,sysstat,iotop,iftop,nload,bridge-utils,bash-completion,bind-utils,nc,binutils,iscsi-initiator-utils,kmod-xfs,xfsprogs,sg3_utils-devel.x86_64,sg3_utils-libs.x86_64,sg3_utils.x86_64,psmisc

#启动服务
virt-customize -a $image_name --run-command 'systemctl enable qemu-guest-agent' 


#SSH服务
virt-customize -a $image_name --edit '/etc/ssh/sshd_config:s/GSS/#GSS/'
virt-customize -a $image_name --edit '/etc/ssh/sshd_config:s/#UseDNS yes/UseDNS no/'

#vim
virt-customize -a $image_name --append-line '/etc/profile:alias vi=vim'
virt-customize -a $image_name --append-line '/etc/profile:alias c="clear"'
virt-customize -a $image_name --append-line '/etc/profile:unset MAILCHECK'


#查看修改
virt-cat -a $image_name /etc/ssh/sshd_config 


virt-customize -a $image_name --run-command 'yum clean all'
virt-customize -a $image_name --run-command 'yum makecache'

最后一步,安装zstack的agent

virt-customize -a $image_name --firstboot-command '/bin/bash -c "$(curl -s -S http://169.254.169.254/vm-tools.sh)"'

由于zstack的agent,使用9100端口,如果你也使用普罗米修斯来监控,也必然导致端口冲突,所以我修改端口为9104。当多个启动脚本要运行,需要设置一下他们的优先级,默认是安装字母顺序来运行,所以我把重启agent的改成02。

virt-customize -a $image_name --firstboot-command "sed -i 's/9100/9104/g' /usr/local/zstack/zwatch-vm-agent/conf.yaml

virt-customize -a $image_name --firstboot-command. "/bin/systemctl restart zwatch-vm-agent.service"

virt-customize -a $image_name --run-command 'mv /usr/lib/virt-sysprep/scripts/0001--bin-systemctl-restart-zwatch-vm-agent-service /usr/lib/virt-sysprep/scripts/0002--bin-systemctl-restart-zwatch-vm-agent-service'

查看修改后的结果

virt-ls  -a $image_name  /usr/lib/virt-sysprep/scripts

上传镜像

python -m SimpleHTTPServer 80

如果希望定制内核版本

virt-customize -a $image_name --run-command 'rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org'
virt-customize -a $image_name --run-command 'rpm -Uvh https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm'
virt-customize -a $image_name --run-command 'yum --enablerepo=elrepo-kernel install kernel-lt -y'
virt-customize -a $image_name --run-command 'grub2-set-default 0'
virt-customize -a $image_name --run-command 'grub2-mkconfig -o /boot/grub2/grub.cfg'

elrepo在国外,速度很慢。可以修改使用国内的源

sed -i 's#elrepo.org/linux#mirrors.tuna.tsinghua.edu.cn/elrepo#g' /etc/yum.repos.d/elrepo.repo
sed -i 's|^mirrorlist=|#mirrorlist=|g' /etc/yum.repos.d/elrepo.repo

安装docker

virt-customize -a $image_name --run-command 'yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo'
virt-customize -a $image_name --run-command 'yum install docker-ce-20.10.7 -y'
virt-customize -a $image_name --run-command 'systemctl enable docker'
virt-customize -a $image_name --append-line '/etc/profile:KKZONE=cn'

设置docker代理

virt-customize -a $image_name --run-command 'mkdir -p /etc/docker'
virt-customize -a $image_name --upload /etc/docker/daemon.json:/etc/docker/daemon.json 
sudo sh -c 'echo {\"registry-mirrors\": [\"https://fz1p31b1.mirror.aliyuncs.com\"]} > /etc/docker/daemon.json'