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 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。

文档捉虫

“有虫”文档片段

问题描述

提交类型 issue

有点复杂...

找人问问吧。

PR

小问题,全程线上修改...

一键搞定!

问题类型
规范和低错类

● 错别字或拼写错误;标点符号使用错误;

● 链接错误、空单元格、格式错误;

● 英文中包含中文字符;

● 界面和描述不一致,但不影响操作;

● 表述不通顺,但不影响理解;

● 版本号不匹配:如软件包名称、界面版本号;

易用性

● 关键步骤错误或缺失,无法指导用户完成任务;

● 缺少必要的前提条件、注意事项等;

● 图形、表格、文字等晦涩难懂;

● 逻辑不清晰,该分类、分项、分步骤的没有给出;

正确性

● 技术原理、功能、规格等描述和软件不一致,存在错误;

● 原理图、架构图等存在错误;

● 命令、命令参数等错误;

● 代码片段错误;

● 命令无法完成对应功能;

● 界面错误,无法指导操作;

风险提示

● 对重要数据或系统存在风险的操作,缺少安全提示;

内容合规

● 违反法律法规,涉及政治、领土主权等敏感词;

● 内容侵权;

您对文档的总体满意度

非常不满意
非常满意
提交
根据您的反馈,会自动生成issue模板。您只需点击按钮,创建issue即可。