麒麟系统安装基于crio 的k8s集群

麒麟v10系统安装基于crio 的k8s_1.24集群

银河麒麟服务器操作系统V10 使用 kubeadm 安装基于crio 的k8s集群

一、背景

1.1. 使用crio的背景

(官网翻译)
从kubelet中移除dockershim
自1.20版本被弃用之后,dockershim组件终于在1.24的kubelet中被删除。从1.24开始,大家需要使用其他受到支持的运行时选项(例如containerd或CRI-O);如果您选择Docker Engine作为运行时,则需要使用cri-dockerd。
对于kubelet和containerd重要提示
在升级至1.24之前,请确认containerd版本

#以下容器运行时已经或即将全面兼容Kubernetes 1.24:
containerd v1.6.4及更高,v1.5.11及更高
CRI-O 1.24及更高

二、Kubernetes 1.24新特性

• 各beta API默认关闭
在默认情况下,新的各beta API不会在集群内得到启用。但全部原有beta API及其新版本将在1.24中继续默认启用
• OpenAPI v3
Kubernetes 1.24开始为API的OpenAPI v3发布格式提供beta支持。
• 存储容量与存储卷扩展双双迎来通用版本
存储容量跟踪通过CSIStorageCapacity对象公开当前可用的存储容量,并对使用后续绑定的CSI存储卷的pod进行调度增强。
存储卷扩展则新增对现有持久卷的重新调整功能。
• NonPreemptingPriority迎来稳定版
此功能为PriorityClasses添加了新的选项,可开启或关闭Pod抢占机制
• 存储插件迁移
目前Kubernetes开发团队正在迁移树内存储插件,希望在实现CSI插件的同时、保持原有API的正常起效。Azure Disk与OpenStack Cinder等插件已经完成了迁移。
• gRPC探针升级至beta版
在1.24版本中,gRPC探针功能已经进入beta阶段且默认启用。现在,大家可以在Kubernetes中为自己的gRPC应用程序原生配置启动、活动与就绪探测,而且无需公开HTTP商战或者使用额外的可执行文件。
• Kubelet证书提供程序升级至beta版
最初在Kubernetes 1.20版本中以alpha版亮相的kubelet镜像证书提供程序现已升级至beta版。现在,kubelet将使用exec插件动态检索容器镜像注册表的凭证,而不再将凭证存储在节点文件系统之上。
• 避免为服务分配IP时发生冲突
Kubernetes 1.24引入了一项新的选择性功能,允许用户为服务的静态IP分配地址保留一个软范围。通过手动启用此项功能,集群将从您指定的服务IP池中自动获取地址,从而降低冲突风险。
也就是说,服务的ClusterIP能够以下列方式分配:
动态分配,即集群将在配置的服务IP范围内自动选择一个空闲IP。
静态分配,意味着用户需要在已配置的服务IP范围内指定一个IP。
服务ClusterIP是唯一的;因此若尝试使用已被分配的ClusterIP进行服务创建,则会返回错误结果。

三、环境准备

3.1 基本配置

3.1.1. 集群说明

单台或者集群都可以,master 和 node 节点只是逻辑上的区分,测试环境或者自己的笔记本虚机环境,可以无须明确区分,但是生产环境最好还是分开部署。

3.1.2. 基本信息

此处使用个人电脑虚拟化主机进行部署,采用一个master 和 一个node 节点做演示。
信息如下:

ip地址主机名主要组件
192.168.10.16kylin-k8skubeadm、kubelet、kubectl、crio
192.168.10.17kylin-nodekubeadm、kubelet、kubectl
3.1.3. 系统信息

(master 节点和node 节点都是使用同一镜像创建的虚拟机,所以系统信息一致):
虚拟机配置最好是 2c、2g 或者2c、4g,(当然土豪随意😀)

[root@kylin-k8s ~]# uname -a 
Linux kylin-k8s 4.19.90-24.4.v2101.ky10.x86_64 #1 SMP Mon May 24 12:14:55 CST 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@kylin-k8s ~]# cat /etc/kylin-release 
Kylin Linux Advanced Server release V10 (Sword)
3.1.4. 节点间免密配置(非必须步骤)
ssh-keygen  #(一直回车)

在我们的以往操作中,新节点可能会出现以下两种情况:
(1) root可直接登录。
(2) root不能直接登录。

① 对于(1)中的节点,按如下方式添加(root)免密,更方便快捷:
以root 在master 上执行如下命令:

ssh-copy-id  root@192.168.10.17 

② 对于其他用户(test 为例),将master1的公钥id_rsa.pub拷贝至这些节点的非root用户的家目录中,再追加到这些节点的authorized_keys中。
以root在master上执行

scp ~/.ssh/id_rsa.pub test@192.168.10.17:/home/test/

以test 为例登录到各节点,再切到root,完成免密登录。

su - root
cat /home/test/id_rsa_pub  >>  ~/.ssh/authorized_keys

3.2 操作系统配置

3.2.1. 关闭 firewalld、selinux、swap 等
systemctl stop firewalld
systemctl disable firewalld
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat
iptables -P FORWARD ACCEPT
swapoff -a
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
setenforce 0
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
3.2.2. 调整内核参数
cat > /etc/sysctl.d/kubernetes.conf <<EOF
# 是否在 iptables 链中过滤 IPv4 包
net.bridge.bridge-nf-call-iptables=1
# 是否在 ip6tables 链中过滤 IPv6 包
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
#防止coredump占用文件系统
kernel.core_pattern = core_%e
kernel.core_uses_pid = 0
EOF

配置节点生效

sysctl -p /etc/sysctl.d/kubernetes.conf

注:如果出现

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

如果需要永久生效的话,需要在/etc/sysconfig/modules/ 下添加文件,如下配置:

echo –e 'modprobe br_netfilter\nmodprobe ip_conntrack' /etc/sysconfig/modules/iptables.modules
cat /etc/sysconfig/modules/iptables.modules
modprobe br_netfilter
modprobe ip_conntrack

临时生效
bash /etc/sysconfig/modules/iptables.modules
永久生效(重启服务器)
reboot

四、基础软件安装

4.1. 配置yum 源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum -y clean all
yum makecache
4.2. 安装常用软件包

常用软件包可解决大部分问题,使得操作更灵活,也可以等到需要时再下载;

yum -y install c++ make net-tools  lsof vim tree lrzsz mtr ntpdate zip unzip vim wget net-tools 

五、k8s核心组件安装

5.1. 安装容器引擎(CRI-O)
5.1.1 CentOS 系统安装 (麒麟系统用的是linux 4.19 的内核,所以也可以使用此方法)

按照官方的步骤,下载yum源
• Centos : 适用于以下版本
要在以下操作系统上安装,请将环境变量设置$OS为下表中的相应字段:

Operating system$OS
Centos 8CentOS_8
Centos 8CentOS_8_Stream
Centos 7CentOS_7

然后,设置$VERSION为与您的 kubernetes 版本匹配的 cri-o 版本。
例如,如果您要安装 cri-o 1.24,VERSION=1.24 我们还支持固定到特定版本。要安装 1.17.3,VERSION=1.17:1.17.3
然后以 root 身份运行以下命令:

OS=CentOS_7   #或者 OS=CentOS_8
VERSION=1.24  #或者 VERSION=1.24:1.24.1  # 支持此写法
curl -L -o /etc/yum.repos.d/devel_kubic_libcontainers_stable.repo https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/$OS/devel:kubic:libcontainers:stable.repo

curl -L -o /etc/yum.repos.d/devel_kubic_libcontainers_stable_cri-o_$VERSION.repo https://download.opensuse.org/repositories/devel:kubic:libcontainers:stable:cri-o:$VERSION/$OS/devel:kubic:libcontainers:stable:cri-o:$VERSION.repo

下载完后官方源如下

[root@kylin-k8s ~]# ll /etc/yum.repos.d/devel_kubic_libcontainers_stable*
-rw-r--r-- 1 root root 381  914 10:38 /etc/yum.repos.d/devel_kubic_libcontainers_stable_cri-o_1.24.repo
-rw-r--r-- 1 root root 359  914 10:36 /etc/yum.repos.d/devel_kubic_libcontainers_stable.repo


[root@kylin-k8s ~]# cat /etc/yum.repos.d/devel_kubic_libcontainers_stable*
[devel_kubic_libcontainers_stable_cri-o_1.24]
name=devel:kubic:libcontainers:stable:cri-o:1.24 (CentOS_8)
type=rpm-md
baseurl=https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.24/CentOS_8/
gpgcheck=1
gpgkey=https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o:/1.24/CentOS_8/repodata/repomd.xml.key
enabled=1
[devel_kubic_libcontainers_stable]
name=Stable Releases of Upstream github.com/containers packages (CentOS_8)
type=rpm-md
baseurl=https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8/
gpgcheck=1
gpgkey=https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable/CentOS_8/repodata/repomd.xml.key
enabled=1

此时,可以直接使用yum 安装 CRI-O了

yum install -y cri-o
systemctl start crio
systemctl enable crio
[root@kylin-k8s etc]# crio  --version
WARN[0000] Failed to decode the keys ["secret" "secret.opts"] from "/usr/share/containers/containers.conf". 
crio version 1.24.2
Version:          1.24.2
GitCommit:        bd548b04f78a30e1e9d7c17162714edd50edd6ca
GitTreeState:     clean
BuildDate:        2022-08-09T18:58:47Z
GoVersion:        go1.18.2
Compiler:         gc
Platform:         linux/amd64
Linkmode:         dynamic
BuildTags:        exclude_graphdriver_devicemapper, seccomp
SeccompEnabled:   true
AppArmorEnabled:  false

注意! 麒麟系统安装crio 报错

错误:事物测试失败:
  file /usr/share/man/man5/rsyslog.conf.5.gz from install of rsyslog-8.24.0-57.el7_9.3.x86_64 conflicts with file from package rsyslog-help-8.2006.0-2.p02.ky10.noarch
  file /usr/share/man/man8/rsyslogd.8.gz from install of rsyslog-8.24.0-57.el7_9.3.x86_64 conflicts with file from package rsyslog-help-8.2006.0-2.p02.ky10.noarch
原因 :安装包冲突!
解决办法:
yum remove rsyslog-8.2006.0-2.p02.ky10.x86_64 –y
再次安装成功!
yum install -y cri-o
但是 此方法卸载了 rsyslog  需要重新安装回来
yum -y install rsyslog  --allowerasing
systemctl start rsyslog
systemctl enable rsyslog

麒麟系统启动crio 后报错

conmon: option parsing failed: Unknown option --persist-dir

由于懒。。。未更新上次使用的yum 源导致。
安装时未更新crio的yum源,所以安装后部分功能缺失导致;
解决:更新crio的yum源后重新安装crio 即可解决。

检查服务安装启动情况(安装完成会出现三个服务)

systemctl list-unit-files | grep cri
cri-o.service                                 enabled 
crio-wipe.service                             disabled
crio.service                                  enabled
2、安装 k8s 核心组件

安装kubelet、kubectl、cri-tools、kubeadm
(1).配置 k8s 的yum 源,依旧使用阿里云的yum 源

cat  yum.repos.d/kubernetes.repo 
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
        http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

(2).安装部署时,也需要指定版本安装部署,版本需要和cri-o的版本保持一致,官网推荐
指定版本安装:

yum install -y kubelet-1.24.4-0.x86_64 kubectl-1.24.4-0.x86_64 kubeadm-1.24.4-0.x86_64  --nogpgcheck
最新版安装(不指定默认最新版):
yum install -y kubelet kubectl kubeadm cri-tools
systemctl enable kubelet
查看版本信息
kubeadm version 
kubeadm version: &version.Info{Major:"1", Minor:"24", GitVersion:"v1.24.4", GitCommit:"95ee5ab382d64cfe6c28967f36b53970b8374491", GitTreeState:"clean", BuildDate:"2022-08-17T18:52:53Z", GoVersion:"go1.18.5", Compiler:"gc", Platform:"linux/amd64"}

(3). kubelet 配置文件处理
kubelet默认配置文件未指定相关参数,指定kubelet使用crio创建容器(此步骤不配置好像也可以, 未 )

[root@k8s-master mwt]# cat /etc/sysconfig/kubelet 
KUBELET_EXTRA_ARGS="--container-runtime=remote --cgroup-driver=systemd --container-runtime-endpoint='unix:///var/run/crio/crio.sock' --runtime-request-timeout=5m"

(4).安装cni 插件(测试环境已有)

官网地址:https://github.com/cri-o/cri-o/blob/master/contrib/cni/README.md
个人理解就是把编译好的二进制文件,放到/opt/cni/bin目录下,让kublet程序根据/etc/cni/net.d/中的confg文件中指定的type类型去调用,
然后创建相关的pod的接口和ip地址的分配(应该不是很严谨)。

# 此处的cni 安装包是在网上查找的资源,(cni-plugins.tar)
将压缩文件解压后,将二进制文件拷贝到/opt/cni/bin目录下面,如果不存在该目录就先创建该目录
tar cni-plugins.tar –C /opt/cni/bin/

六、准备工作完成,开始安装k8s

6.1. 配置文件处理
6.1.1. crio.conf 文件

crio.conf文件中,进行pause镜像源的配置,不然部署pod容器会失败,因为无法连接国外的镜像仓库,步骤如下:(虽然在yum安装crio时,生成了该文件,但是很多选项都是禁用的,重新生成后的文件会取消很多注释)

systemctl list-unit-files | grep cri   # 检查crio 是否正常
crio config --default > /etc/crio/crio.conf      
可以使用默认的路径,如果需要改别的路径和自定义其他内容的话,例如修改配置如下:

root = "/var/lib/crio/"    #“根目录”的路径。CRI-O存储其所有数据,包扩容器镜像,在此目录中。
runroot = "/run/lib/crio/storage"   # “运行目录”的路径。CRI-O将其所有状态存储在此目录中。
insecure_registries = [''4v2510z7.mirror.aliyuncs.com:443/library'']  ##考虑通过/etc/containers/registries配置注册表 ,或者在此处填写 镜像仓库名称
pause_image = "registry.aliyuncs.com/google_containers/pause:3.6" 

6.1.2. kubeadm 文件

生成kueadm的初始文件,podSubnet的字段需要指定,不然部署网络插件时网段划分会存在问题,无法成功分配ip所以就无法正常创建pod

kubeadm config print init-defaults > kubeadm-config.yaml

1、简易测试初始化命令

kubeadm init --kubernetes-version=1.24.0 \
--apiserver-advertise-address=192.168.10.16 \
--image-repository=registry.aliyuncs.com/google_containers \
--service-cidr=192.169.0.0/16 \
--pod-network-cidr=102.0.0.0/16 \
--cri-socket unix:///var/run/crio/crio.sock \
--ignore-preflight-errors=Swap    #防止未关闭 Swap 导致的报错

2、修改生成的初始化文件,自定义相关参数

vim kubeadm-config.yaml
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress: 192.168.10.16  #修改此处
  bindPort: 6443
nodeRegistration:
  criSocket: unix:///var/run/crio/crio.sock
  imagePullPolicy: IfNotPresent
  name: kylin-k8s      #修改此处
  taints: null
---
apiServer:
  timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers #修改此处
kind: ClusterConfiguration
kubernetesVersion: 1.24.0
networking:
  dnsDomain: cluster.local
  podSubnet: 10.85.0.0/16       #增加podSubnet ,自定义pod 网段
  serviceSubnet: 10.96.0.0/12   #修改此处
scheduler: {}
6.2. 万事具备,开始初始化
kubeadm init --config kubeadm-config.yaml --upload-certs

初始化完成
根据初始化完成的提示进行操作,

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6.3. 初始化的其他问题
6.3.1. 提前下载k8s相关的组件镜像

提高init 的速度,下载时,指定阿里云镜像源来下载,如下:

kubeadm config images pull --config kubeadm.yaml  --image-repository registry.aliyuncs.com/google_containers
kube-apiserver:v1.24.0
kube-controller-manager:v1.24.0
kube-scheduler:v1.24.0
kube-proxy:v1.24.0
pause:3.7
etcd:3.5.3-0
coredns:v1.8.6

6.4 如果需要再次进行初始化的话,清理初始化的文件和目录
Kubeadm reset -f
#下列这些文件使用kubeadm reset 一般会默认清除的,(也可以手动删除,慎用 **rm -rf** !!!)。
rm -rf /etc/kubernetes/ /var/lib/etcd /var/lib/kubelet /var/lib/dockershim /var/run/kubernetes /var/lib/cni   
# 再执行下列命令,清除网络规则。
ipvsadm --clear  

七、node节点加入(node节点执行以下命令 )

7.1. node节点安装kubeadm,kubelet,kubectl,最好和master 保持一致
yum install -y kubelet-1.24.4-0.x86_64 kubectl-1.24.4-0.x86_64 kubeadm-1.24.4-0.x86_64 
7.2. 使用join 命令加入节点

此命令是初始化完成时系统提供的命令。但是,由于1.24版本的cri 并非唯一,所以还需要指定cri,即 --cri-socket=/var/run/crio/crio.sock

kubeadm join 192.168.10.16:6443 --token ca7sr0.tl2f1cmida1lr9b4 \
        --discovery-token-ca-cert-hash sha256:7902f26fadbf59b3ff14249c99e1a86992a1c07178b80c613ea26e2229b1196d 

在这里插入图片描述

加入集群成功!

默认token有效期为24小时,当过期之后,该token就不可用了。这时就需要在master 节点上重新创建token,操作如下:

kubeadm token create --print-join-command 

当我们把节点都加入进来后,就可以执行下面命令查看情况

kubectl get node
kubectl get pod -A 

在这里插入图片描述

7.3. 此时,通过kubeadm 已完成k8s 集群的安装。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值