百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

ARM64 平台基于 openEuler + iSula 环境部署 Kubernetes

off999 2025-02-18 12:50 19 浏览 0 评论

为什么要在 arm64 平台上部署 Kubernetes,而且还是鲲鹏 920 的架构。说来话长 。。。此处省略5000 字。

介绍下系统信息;

?架构:鲲鹏 920(Kunpeng920)

?OS:openEuler 20.03 (LTS-SP1)

?CPU:4c

?内存:16G

?硬盘:若干

整个过程虽然参考了鲲鹏论坛的帖子[1],不过还是颇费周折。

TL;DR

整个过程中要注意 arm64 平台上安装 Kubernetes 及网络组件,需要使用 arm64 版本的镜像。

环境配置

1.关闭 selinux

#临时关闭
setenforce 0
#永久关闭 SELINUX=disabled
vim /etc/sysconfig/selinux

2. 关闭swap分区

#临时关闭
swapoff -a
#永久关闭 注释 swap 行
vim /etc/fstab

3. 关闭防火墙

systemctl stop firewalld
ssystemctl disable firewalld

4. 网络配置

对iptables内部的nf-call需要打开的内生的桥接功能

vim /etc/sysctl.d/k8s.conf

修改如下内容:

net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm_swappiness=0

修改完成后执行:

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

5. 添加 Kubernetes 源

在文件 /etc/yum.repos.d/openEuler.repo 中追加如下内容:

[kubernetes]

name=Kubernetes

baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/

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

安装配置 iSula

yum install -y iSulad

修改 iSula 配置,打开文件 /etc/isulad/daemon.json,按照下面的部分:

{
"registry-mirrors": [
"docker.io"
],
"insecure-registries": [
"rnd-dockerhub.huawei.com"
],
"pod-sandbox-image": "k8s.gcr.io/pause:3.2", // 按照对应 Kubernetes 版本进行修改,后面会有说明
"network-plugin": "cni",
"cni-bin-dir": "",
"cni-conf-dir": "",
"hosts": [
"
unix:///var/run/isulad.sock"

]
}

修改之后重启 isulad

systemctl restart isulad
systemctl enable isulad

Kubernetes 部署

1. 安装 kubelet、kubeadm、kubectl

yum install -y kubelet-1.20.0 kubeadm-1.20.0 kubectl-1.20.0

2. 准备镜像

由于某种未知的网络问题,会导致拉取 k8s.gcr.io 的镜像失败。需要提前下载好。

通过 kubeadm config images list --kubernetes-version 1.20.0 命令,获取初始化所需的镜像。这里需要注意通过 --kubernetes-version 参数指定版本号,否则 kubeadm 是打印出最高的 1.20.x 版本的初始化镜像(比如,1.20.x 的最高版本是 1.20.4)。

k8s.gcr.io/kube-apiserver:v1.20.0
k8s.gcr.io/kube-controller-manager:v1.20.0
k8s.gcr.io/kube-scheduler:v1.20.0
k8s.gcr.io/kube-proxy:v1.20.0
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.13-0
k8s.gcr.io/coredns:1.7.

对应的 arm64 版本镜像为:


k8s.gcr.io/kube-apiserver-arm64:v1.
20.0

k8s.gcr.io/kube-controller-manager-arm64:v1.
20.0

k8s.gcr.io/kube-scheduler-arm64:v1.
20.0

k8s.gcr.io/kube-proxy-arm64:v1.
20.0
k8s.gcr.io/pause-arm64:3.2
k8s.gcr.io/etcd-arm64:3.4.2-0 #支持 arm64 的 3.4.x 的最高版本
k8s.gcr.io/coredns:1.7.0 #无需特别的 arm64 版本

凭“运气”下载好镜像后,再通过 isula tag 命令修改成我们需要的:

isula tag k8s.gcr.io/kube-apiserver-arm64:v1.20.0 k8s.gcr.io/kube-apiserver:v1.20.0
isula tag k8s.gcr.io/kube-controller-manager-arm64:v1.20.0 k8s.gcr.io/kube-controller-manager:v1.20.0
isula tag k8s.gcr.io/kube-scheduler-arm64:v1.20.0 k8s.gcr.io/kube-scheduler:v1.20.0
isula tag k8s.gcr.io/kube-proxy-arm64:v1.20.0 k8s.gcr.io/kube-proxy:v1.20.0
isula tag k8s.gcr.io/pause-arm64:3.2 k8s.gcr.io/pause:3.2
isula tag k8s.gcr.io/etcd-arm64:3.4.2-0 k8s.gcr.io/etcd:3.4.13-0
isula tag k8s.gcr.io/coredns:1.7.0 k8s.gcr.io/coredns:1.7.0

3. 初始化 master 节点

注意需要指定 --cri-socket 参数使用 isulad 的 API。

kubeadm init --kubernetes-version v1.20.0 --cri-socket=/var/run/isulad.sock --pod-network-cidr=10.244.0.0/16

安装成功的话,会看到如下的内容

Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

Alternatively, if you are the root user, you can run:

export KUBECONFIG=/etc/kubernetes/admin.conf

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 12.0.0.9:6443 --token 0110xl.lqzlegbduz2qkdhr \
--discovery-token-ca-cert-hash sha256:42b13f5924a01128aac0d6e7b2487af990bc82701f233c8a6a4790187ea064af

4. 配置集群环境

然后根据上面的输出进行配置

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

export KUBECONFIG=/etc/kubernetes/admin.conf

5. 向集群添加 Node 节点

重复前面的步骤:环境配置安装配置 iSula 以及 Kubernetes 部署 的 1 和 2。

同样使用上面输出的命令,再加上 --cri-socket 参数:

kubeadm join 12.0.0.9:6443 --token 0110xl.lqzlegbduz2qkdhr \
--discovery-token-ca-cert-hash \
--cri-socket=/var/run/isulad.sock

配置网络插件

完成 master 节点初始化并配置完集群环境后就可以执行 kubectl 的命令了。

kubectl get nodes
NAME STATUS ROLES AGE VERSION
host-12-0-0-9 NotReady control-plane,master 178m v1.20.0

看下节点,发现节点是 NotReady 的状态,这是因为网络插件还没安装。如果此时通过命令 journalctl -uf kubelet 查看 kubelet 的日志,会看到日志提示网络插件没有 ready。

kubelet.go:2160] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:iSulad: network plugin is not ready: cni config uninitialized

还记得 isulad 的配置么?

"network-plugin": "cni",
"cni-bin-dir": "", //使用默认 /opt/cni/bin
"cni-conf-dir": "", //使用默认 /etc/cni/net.d

实际上两个目录都是空的内容,如果目录不存在,先创建:

mkdir -p /opt/cni/bin
mkdir -p /etc/cni/net.d

这里使用 calico 做为网络插件,先下载 manifest。

wget https://docs.projectcalico.org/v3.14/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml

因为是 arm64 的硬件,同样需要使用对应 arm64 版本的镜像,先查看要用哪些镜像:

grep 'image:' calico.yaml | uniq
image: calico/cni:v3.14.2
image: calico/pod2daemon-flexvol:v3.14.2
image: calico/node:v3.14.2
image: calico/kube-controllers:v3.14.2

对应的 arm64 版本,操作步骤参考上面,不再赘述。

calico/cni:v3.14.2-arm64
calico/pod2daemon-flexvol:v3.14.2-arm64
calico/node:v3.14.2-arm64
calico/kube-controllers:v3.14.2-arm64

搞定镜像之后执行:

kubectl apply -f calico.yaml

之后就可以看到节点变成了 Ready 状态。

测试

通常都是用 nginx 的镜像创建 pod 进行测试,但是 nginx 并没有 arm64 的版本,这里就用 docker 官方提供的 hello-world 镜像。没错,支持 arm64。

注意:容器里的进程打印出信息就会退出了,因此 pod 会不停的重启,但用来测试是足够的。

kubectl run hello-world --image hello-world:latest

kubectl logs hello-world --previous

可以看到

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(arm64v8)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

总结

至此,我们就完成了在鲲鹏平台上基于 openEuler + iSula 部署 Kubernetes 的工作。

引用链接

[1] 鲲鹏论坛的帖子: https://bbs.huaweicloud.com/forum/thread-94271-1-1.html

相关推荐

面试官:来,讲一下枚举类型在开发时中实际应用场景!

一.基本介绍枚举是JDK1.5新增的数据类型,使用枚举我们可以很好的描述一些特定的业务场景,比如一年中的春、夏、秋、冬,还有每周的周一到周天,还有各种颜色,以及可以用它来描述一些状态信息,比如错...

一日一技:11个基本Python技巧和窍门

1.两个数字的交换.x,y=10,20print(x,y)x,y=y,xprint(x,y)输出:102020102.Python字符串取反a="Ge...

Python Enum 技巧,让代码更简洁、更安全、更易维护

如果你是一名Python开发人员,你很可能使用过enum.Enum来创建可读性和可维护性代码。今天发现一个强大的技巧,可以让Enum的境界更进一层,这个技巧不仅能提高可读性,还能以最小的代价增...

Python元组编程指导教程(python元组的概念)

1.元组基础概念1.1什么是元组元组(Tuple)是Python中一种不可变的序列类型,用于存储多个有序的元素。元组与列表(list)类似,但元组一旦创建就不能修改(不可变),这使得元组在某些场景...

你可能不知道的实用 Python 功能(python有哪些用)

1.超越文件处理的内容管理器大多数开发人员都熟悉使用with语句进行文件操作:withopen('file.txt','r')asfile:co...

Python 2至3.13新特性总结(python 3.10新特性)

以下是Python2到Python3.13的主要新特性总结,按版本分类整理:Python2到Python3的重大变化Python3是一个不向后兼容的版本,主要改进包括:pri...

Python中for循环访问索引值的方法

技术背景在Python编程中,我们经常需要在循环中访问元素的索引值。例如,在处理列表、元组等可迭代对象时,除了要获取元素本身,还需要知道元素的位置。Python提供了多种方式来实现这一需求,下面将详细...

Python enumerate核心应用解析:索引遍历的高效实践方案

喜欢的条友记得关注、点赞、转发、收藏,你们的支持就是我最大的动力源泉。根据GitHub代码分析统计,使用enumerate替代range(len())写法可减少38%的索引错误概率。本文通过12个生产...

Python入门到脱坑经典案例—列表去重

列表去重是Python编程中常见的操作,下面我将介绍多种实现列表去重的方法,从基础到进阶,帮助初学者全面掌握这一技能。方法一:使用集合(set)去重(最简单)pythondefremove_dupl...

Python枚举类工程实践:常量管理的标准化解决方案

本文通过7个生产案例,系统解析枚举类在工程实践中的应用,覆盖状态管理、配置选项、错误代码等场景,适用于Web服务开发、自动化测试及系统集成领域。一、基础概念与语法演进1.1传统常量与枚举类对比#传...

让Python枚举更强大!教你玩转Enum扩展

为什么你需要关注Enum?在日常开发中,你是否经常遇到这样的代码?ifstatus==1:print("开始处理")elifstatus==2:pri...

Python枚举(Enum)技巧,你值得了解

枚举(Enum)提供了更清晰、结构化的方式来定义常量。通过为枚举添加行为、自动分配值和存储额外数据,可以提升代码的可读性、可维护性,并与数据库结合使用时,使用字符串代替数字能简化调试和查询。Pytho...

78行Python代码帮你复现微信撤回消息!

来源:悟空智能科技本文约700字,建议阅读5分钟。本文基于python的微信开源库itchat,教你如何收集私聊撤回的信息。[导读]Python曾经对我说:"时日不多,赶紧用Python"。于是看...

登录人人都是产品经理即可获得以下权益

文章介绍如何利用Cursor自动开发Playwright网页自动化脚本,实现从选题、写文、生图的全流程自动化,并将其打包成API供工作流调用,提高工作效率。虽然我前面文章介绍了很多AI工作流,但它们...

Python常用小知识-第二弹(python常用方法总结)

一、Python中使用JsonPath提取字典中的值JsonPath是解析Json字符串用的,如果有一个多层嵌套的复杂字典,想要根据key和下标来批量提取value,这是比较困难的,使用jsonpat...

取消回复欢迎 发表评论: