K8S+iSulad 搭建
除非特别说明,以下步骤在master节点和node节点均需执行,本教程以master为例
开始之前
需准备如下内容:
- NestOS-22.03-date.x86_64.iso
- 一台主机用作master,一台主机用作node
组件下载
编辑源文件,添加k8s的阿里云源
vi /etc/yum.repos.d/openEuler.repo
添加如下内容
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
下载k8s组件以及同步系统时间所用组件
rpm-ostree install kubelet kubeadm kubectl ntp ntpdate wget
重启生效
systemctl reboot
选择最新的版本分支进入系统
配置环境
修改主机名,以master为例
hostnamectl set-hostname k8s-master
sudo -i
编辑/etc/hosts
vi /etc/hosts
添加如下内容,ip为主机ip
192.168.237.133 k8s-master
192.168.237.135 k8s-node01
同步系统时间
ntpdate time.windows.com
systemctl enable ntpd
关闭swap分区,防火墙,selinux
NestOS默认无swap分区,默认关闭防火墙, 关闭selinux如下
vi /etc/sysconfig/selinux
修改为SELINUX=disabled
网络配置,开启相应的转发机制
创建配置文件
vi /etc/sysctl.d/k8s.conf
添加如下内容
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
使配置生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf
配置iSula
查看k8s需要的系统镜像,需注意pause的版本号
kubeadm config images list
修改daemon配置文件
vi /etc/isulad/daemon.json
##关于添加项的解释说明##
registry-mirrors 设置为"docker.io"
insecure-registries 设置为"rnd-dockerhub.huawei.com"
pod-sandbox-image 设置为"registry.aliyuncs.com/google_containers/pause:3.5"(使用阿
里云,pause版本可在上一步查看)
network-plugin 设置为"cni"。
cni-bin-dir 设置为"/opt/cni/bin";
cni-conf-dir 设置为"/etc/cni/net.d"
修改后的完整文件如下
{"group": "isula",
"default-runtime": "lcr",
"graph": "/var/lib/isulad",
"state": "/var/run/isulad",
"engine": "lcr",
"log-level": "ERROR",
"pidfile": "/var/run/isulad.pid",
"log-opts": {
"log-file-mode": "0600",
"log-path": "/var/lib/isulad",
"max-file": "1",
"max-size": "30KB"
},
"log-driver": "stdout",
"container-log": {
"driver": "json-file"
},
"hook-spec": "/etc/default/isulad/hooks/default.json",
"start-timeout": "2m",
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
],
"registry-mirrors": [
"docker.io"
],
"insecure-registries": [
"rnd-dockerhub.huawei.com"
],
"pod-sandbox-image": "registry.aliyuncs.com/google_containers/pause:3.5",
"native.umask": "secure",
"network-plugin": "cni",
"cni-bin-dir": "/opt/cni/bin",
"cni-conf-dir": "/etc/cni/net.d",
"image-layer-check": false,
"use-decrypted-key": true,
"insecure-skip-verify-enforce": false
}
启动相关服务
systemctl restart isulad
systemctl enable isulad
systemctl enable kubelet
以上为master,node节点均需执行的操作。
master节点初始化
该部分仅master节点执行。 在初始化这一步会拉取镜像,需等待一小段时间,也可在该步骤之前手动拉取镜像。
kubeadm init --kubernetes-version=1.22.2 --apiserver-advertise-
address=192.168.237.133 --cri-socket=/var/run/isulad.sock --image-repository
registry.aliyuncs.com/google_containers --service-cidr=10.10.0.0/16 --pod-
network-cidr=10.122.0.0/16
##关于初始化参数的解释说明##
kubernetes-version 为当前安装的版本
apiserver-advertise-address 为master节点ip
cri-socket 指定引擎为isulad
image-repository 指定镜像源为阿里云,可省去修改tag的步骤
service-cidr 指定service分配的ip段
pod-network-cidr 指定pod分配的ip段
初始化成功后,复制最后两行内容方便后续node节点加入使用
kubeadm join 192.168.237.133:6443 --token j7kufw.yl1gte0v9qgxjzjw --discovery-
token-ca-cert-hash
sha256:73d337f5edd79dd4db997d98d329bd98020b712f8d7833c33a85d8fe44d0a4f5 --cri-
socket=/var/run/isulad.sock
注意:添加--cri-socket=/var/run/isulad.sock以使用isulad为容器引擎, 查看下载好的镜像
isula images
按照初始化成功所提示,配置集群
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
source /etc/profile
查看健康状态
kubectl get cs
可能存在controller-manager,scheduler状态为unhealthy的情况,解决方法如下:
编辑相关配置文件
vi /etc/kubernetes/manifests/kube-controller-manager.yaml
注释如下内容:
--port=0
修改hostpath:
将所有/usr/libexec/kubernetes/kubelet-plugins/volume/exec 修改为/opt/libexec/...
vi /etc/kubernetes/manifests/kube-scheduler.yaml
注释如下内容:
--port=0
修改完成后,再次查看健康状态
配置网络插件
仅需要在master节点配置网络插件,但是要在所有节点提前拉取镜像,拉取镜像指令如下。
isula pull calico/node:v3.19.3
isula pull calico/cni:v3.19.3
isula pull calico/kube-controllers:v3.19.3
isula pull calico/pod2daemon-flexvol:v3.19.3
以下步骤仅在master节点执行 获取配置文件
wget https://docs.projectcalico.org/v3.19/manifests/calico.yaml
编辑calico.yaml 修改所有/usr/libexec/... 为 /opt/libexec/... 然后执行如下命令完成calico的安装:
kubectl apply -f calico.yaml
通过kubectl get pod -n kube-system查看calico是否安装成功 通过kubectl get pod -n kube-system查看是否所有pod状态都为running
node节点加入集群
在node节点执行如下指令,将node节点加入集群
kubeadm join 192.168.237.133:6443 --token j7kufw.yl1gte0v9qgxjzjw --discovery-
token-ca-cert-hash
sha256:73d337f5edd79dd4db997d98d329bd98020b712f8d7833c33a85d8fe44d0a4f5 --cri-
socket=/var/run/isulad.sock
通过kubectl get node 查看master和node节点状态是否为ready
至此,k8s部署成功。
rpm-ostree使用
rpm-ostree安装软件包
安装wget
rpm-ostree install wget
重启系统,可在启动时通过键盘上下按键选择rpm包安装完成后或安装前的系统状态,其中【ostree:0】为安装之后的版本。
systemctl reboot
查看wget是否安装成功
rpm -qa | grep wget
rpm-ostree 手动更新升级 NestOS
在NestOS中执行命令可查看当前rpm-ostree状态,可看到当前版本号
rpm-ostree status
执行检查命令查看是否有升级可用,发现存在新版本
rpm-ostree upgrade --check
预览版本的差异
rpm-ostree upgrade --preview
在最新版本中,我们将nano包做了引入。 执行如下指令会下载最新的ostree和RPM数据,不需要进行部署
rpm-ostree upgrade --download-only
重启NestOS,重启后可看到系统的新旧版本两个状态,选择最新版本的分支进入
rpm-ostree upgrade --reboot
比较NestOS版本差别
检查状态,确认此时ostree有两个版本,分别为LTS.20210927.dev.0和LTS.20210928.dev.0
rpm-ostree status
根据commit号比较2个ostree的差别
rpm-ostree db diff 55eed9bfc5ec fe2408e34148
系统回滚
当一个系统更新完成,之前的NestOS部署仍然在磁盘上,如果更新导致系统出现了问题,可以使用之前的部署回滚系统。
临时回滚
要临时回滚到之前的OS部署,在系统启动过程中按住shift键,当引导加载菜单出现时,在菜单中选择相关的分支。
永久回滚
要永久回滚到之前的操作系统部署,登录到目标节点,运行rpm-ostree rollback,此操作将使用之前的系统部署作为默认部署,并重新启动到其中。 执行命令,回滚到前面更新前的系统。
rpm-ostree rollback
切换版本
在上一步将NestOS回滚到了旧版本,可以通过命令切换当前 NestOS 使用的rpm-ostree版本,将旧版本切换为新版本。
rpm-ostree deploy -r 22.03.20220325.dev.0
重启后确认目前NestOS已经使用的是新版本的ostree了。
zincati自动更新使用
zincati负责NestOS的自动更新,zincati通过cincinnati提供的后端来检查当前是否有可更新版本,若检测到有新版本,会通过rpm-ostree进行下载。
目前系统默认关闭zincati自动更新服务,可通过修改配置文件设置为开机自动启动自动更新服务。
vi /etc/zincati/config.d/95-disable-on-dev.toml
将updates.enabled设置为true 同时增加配置文件,修改cincinnati后端地址
vi /etc/zincati/config.d/update-cincinnati.toml
添加如下内容
[cincinnati]
base_url="http://nestos.org.cn:8080"
设置zincati服务开机自动启动(重启机器生效)
systemctl enable zincati.service
重新启动zincati服务
systemctl restart zincati.service
当有新版本时,zincati会自动检测到可更新版本,此时查看rpm-ostree状态,可以看到状态是“busy”,说明系统正在升级中。
一段时间后NestOS将自动重启,此时再次登录NestOS,可以再次确认rpm-ostree的状态,如果状态转为"idle",而且当前版本已经是“20220325”,这说明rpm-ostree版本已经升级了。
查看zincati服务的日志,确认升级的过程和重启系统的日志。另外日志显示的"auto-updates logic enabled"也说明更新是自动的。
定制NestOS
我们可以使用nestos-installer 工具对原始的NestOS ISO文件进行加工,将Ignition文件打包进去从而生成定制的 NestOS ISO文件。使用定制的NestOS ISO文件可以在系统启动完成后自动执行NestOS的安装,因此NestOS的安装会更加简单。
在开始定制NestOS之前,需要做如下准备工作:
- 下载 NestOS ISO
- 准备 config.ign文件
生成定制NestOS ISO文件
设置参数变量
$ export COREOS_ISO_ORIGIN_FILE=nestos-22.03.20220324.x86_64.iso
$ export COREOS_ISO_CUSTOMIZED_FILE=my-nestos.iso
$ export IGN_FILE=config.ign
ISO文件检查
确认原始的NestOS ISO文件中没有包含Ignition配置。
$ nestos-installer iso ignition show $COREOS_ISO_ORIGIN_FILE
Error: No embedded Ignition config.
生成定制NestOS ISO文件
将Ignition文件和原始NestOS ISO文件打包生成定制的NestOS ISO文件。
$ nestos-installer iso ignition embed $COREOS_ISO_ORIGIN_FILE --ignition-file $IGN_FILE $COREOS_ISO_ORIGIN_FILE --output $COREOS_ISO_CUSTOMIZED_FILE
ISO文件检查
确认定制NestOS ISO 文件中已经包含Ignition配置了
$ nestos-installer iso ignition show $COREOS_ISO_CUSTOMIZED_FILE
执行命令,将会显示Ignition配置内容
安装定制NestOS ISO文件
使用定制的 NestOS ISO 文件可以直接引导安装,并根据Ignition自动完成NestOS的安装。在完成安装后,我们可以直接在虚拟机的控制台上用nest/password登录NestOS。