麒麟系统安装基于crio 的k8s集群
麒麟系统 使用 kubeadm 安装基于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.16 | kylin-k8s | kubeadm、kubelet、kubectl、crio |
192.168.10.17 | kylin-node | kubeadm、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 8 | CentOS_8 |
Centos 8 | CentOS_8_Stream |
Centos 7 | CentOS_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 9月 14 10:38 /etc/yum.repos.d/devel_kubic_libcontainers_stable_cri-o_1.24.repo
-rw-r--r-- 1 root root 359 9月 14 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 集群的安装。
更多推荐
所有评论(0)