ARM64 平臺基於 openEuler + iSula 環境部署 Kubernetes

2021-12-26 雲原生指北
為什麼要在 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=disabledvim /etc/sysconfig/selinux

2. 關閉swap分區
#臨時關閉swapoff -a#永久關閉 注釋 swap 行vim /etc/fstab

3. 關閉防火牆
systemctl stop firewalldssystemctl disable firewalld

4. 網絡配置

對iptables內部的nf-call需要打開的內生的橋接功能

vim /etc/sysctl.d/k8s.conf

修改如下內容:

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

修改完成後執行:

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

5. 添加 Kubernetes 源

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

[kubernetes]name=Kubernetesbaseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-aarch64/enabled=1gpgcheck=1repo_gpgcheck=1gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg       https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

安裝配置 iSula

修改 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 isuladsystemctl 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.0k8s.gcr.io/kube-controller-manager:v1.20.0k8s.gcr.io/kube-scheduler:v1.20.0k8s.gcr.io/kube-proxy:v1.20.0k8s.gcr.io/pause:3.2k8s.gcr.io/etcd:3.4.13-0k8s.gcr.io/coredns:1.7.

對應的 arm64 版本鏡像為:

k8s.gcr.io/kube-apiserver-arm64:v1.20.0k8s.gcr.io/kube-controller-manager-arm64:v1.20.0k8s.gcr.io/kube-scheduler-arm64:v1.20.0k8s.gcr.io/kube-proxy-arm64:v1.20.0k8s.gcr.io/pause-arm64:3.2k8s.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.0isula tag k8s.gcr.io/kube-controller-manager-arm64:v1.20.0 k8s.gcr.io/kube-controller-manager:v1.20.0isula tag k8s.gcr.io/kube-scheduler-arm64:v1.20.0 k8s.gcr.io/kube-scheduler:v1.20.0isula tag k8s.gcr.io/kube-proxy-arm64:v1.20.0 k8s.gcr.io/kube-proxy:v1.20.0isula tag k8s.gcr.io/pause-arm64:3.2 k8s.gcr.io/pause:3.2isula tag k8s.gcr.io/etcd-arm64:3.4.2-0 k8s.gcr.io/etcd:3.4.13-0isula 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/configAlternatively, if you are the root user, you can run:  export KUBECONFIG=/etc/kubernetes/admin.confYou 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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configexport 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 nodesNAME            STATUS   ROLES                  AGE    VERSIONhost-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/binmkdir -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-arm64calico/pod2daemon-flexvol:v3.14.2-arm64calico/node:v3.14.2-arm64calico/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:latestkubectl 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 bashShare 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

相關焦點

  • Openstack+Kubernetes+Docker+Grafana全鏈路環境搭建演示
    彈性伸縮:        使用命令、UI或者基於CPU使用情況自動快速擴容和縮容應用程式實例,保證應用業務高峰並發時的高可用性;業務低峰時回收資源,以最小成本運行服務。    自動部署和回滾:   K8S採用滾動更新策略更新應用,一次更新一個Pod,而不是同時刪除所有Pod,如果更新過程中出現問題,將回滾更改,確保升級不受影響業務。
  • 2020版Kubernetes快速上手指南,讓你所見即所得
    作為雲計算平臺,除了計算容器化外,平臺的網絡和存儲需要額外選擇和配置。額外的應用適配。搭建好了的平臺,只有跑上我們開發的應用才是終極勝利。但這又是另外一件不很輕鬆的事情。基於以上常見痛點,本文結合實驗室搭建的Kubernetes演示環境,通過「所見即所得」方式來講解下具體的實踐過程,希望能達到如下目標:通過試用免費開放的實驗環境,增強體驗感和可操作性;
  • 深入解析Kubernetes service 概念
    深入解析Kubernetes service 概念Kubernetes在Kubernetes平臺上,Pod是有生命周期,為了可以給客戶端一個固定的訪問端點,因此需要在客戶端和Pod之間添加一個中間層,這個中間層稱之為ServiceService是什麼?
  • 擁抱Kubernetes,再見了Spring Cloud
    Spring boot可以說是Java中開發基於RESTful微服務Web應用的最快方法之一。它也非常適合docker容器部署和快速原型設計Spring Boot 2.0.0,於2018年3月1日發布,新版本特點有:基於 Java 8,支持 Java 9;支持 Quartz 調度程序;支持嵌入式 Netty,Tomcat, Undertow 和 Jetty 均已支持 HTTP/2;執行器架構重構,支持 Spring MVC, WebFlux 和 Jersey;對響應式編程提供最大支持;引入對
  • Kubernetes的Local Persistent Volumes使用小記
    這樣就避免了Pod開發者擅自使用本地磁碟帶來的衝突和風險;另外要注意的是,HostPath Volume和Local PV都是在使用本地磁碟,和常見的分布式文件系統相比,本地磁碟故障會導致數據丟失,保存重要數據請勿使用HostPath Volume和Local PV;基本概念說完了,接下來實戰體驗;實戰環境信息
  • Kubernetes在SHAREit的落地實戰
    : - __meta_kubernetes_namespace - __meta_kubernetes_service_name - __meta_kubernetes_endpoint_port_name scheme: https tls_config
  • Kubernetes 1.20 發布:妙啊 - OSCHINA - 中文開源技術交流社區
    此次更新內容包括:Major Themes該功能提供了觸髮捲快照操作的標準方法,並允許用戶以可移植的方式在任何 Kubernetes 環境和受支持的存儲程序上合併快照操作。此外,這些 Kubernetes 快照基元充當基本構建塊,為 Kubernetes 增加開發高級企業級存儲管理功能的能力,包括應用程式或集群級備份解決方案。
  • vSphere with Kubernetes實戰之:用戶訪問控制 - 文章精選 - CTI...
    通過使用kubernetes的RBAC,「Namespace管理員」可以將集群管理員角色或更加細粒度的權限分配給其他用戶和組,這些用戶稱為「Tanzu集群開發者」,他們負責在Tanzu Kubernetes集群上開發和部署應用程式。
  • 《蹲坑學kubernetes》之17-14:ServerAccount
    《蹲坑學kubernetes》之17-14:ServerAccountAPI Server作為Kubernetes網關,是訪問和管理資源對象的唯一入口,其各種集群組件訪問資源都需要經過網關才能進行正常訪問和管理。
  • 踢掉Docker 後,Kubernetes 還能歡快地跑 GPU?
    CUDA 驅動 CUDA(Compute Unified Device Architecture)是顯卡廠商 NVIDIA 推出的運算平臺
  • Arm64架構處理器的TS-532X如何安裝jellyfin、emby、plex伺服器
    4K解碼播放了,那麼64位的ARM CPU是不是也具備比較好的轉碼能力用於外網播放呢。不過看了這麼多也只是了解到64位 ARM CPU的轉碼能力還不錯,但是並沒有提到NAS的實戰,那麼手上有機器乾脆就自己實操吧。Emby安裝(踩雷經過)因為之前上了emby的98元的永久會員,一直用的不錯,emby也是我主要使用的多媒體平臺,只是沒想到Arm64版本的emby安裝這麼多坑。
  • 使用 Kubernetes 最易犯的 10 個錯誤
    Kubernetes 作為大規模企業級應用容器編排的首推工具,其為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,本文作者 Marek Bartik 深入分享了 K8s 的避坑寶典,相信會對開發者們大有裨益。
  • 巧用 K3s 和 Traefik 快速搭建本地 Kubernetes 集群
    MinikubeMinikube 是 Kubernetes 項目文檔中建議使用的一種解決方案,它用一個單節點集群部署一個虛擬機,我們需要付出虛擬化的代價,主機的最低要求 2CPU、2G內存、20G 存儲空間。
  • ARM平臺上實現Linux PPP撥號
    硬體平臺:億道Liod平臺(基於PXA270) 作業系統:嵌入式Linux本文引用地址:http://www.eepw.com.cn/article/201611/316817
  • [轉]基於IPVS的集群內負載均衡深入解讀
    因為基於IPVS的kube-proxy不能區分自身創建的規則和系統中用戶自帶的規則,因此如果您要使用基於IPVS的kube-proxy並且系統中原來存在一些IPVS規則,那麼應該加上這個啟動參數,否則系統中原來的規則會被清理掉。2.
  • ARM64 Linux 內核頁表的塊映射
    作者 | 宋寶華 責編 | 張文頭圖 | CSDN 下載自視覺中國內核文檔 Documentation/arm64/memory.rst 描述了 ARM64 Linux 內核空間的內存映射情況,應該是此方面最權威文檔。
  • 親測好用的Kubernetes&DevOps工具
    每個軟體工程師都能通過 Kubernetes 來定義服務之間的拓撲關係、線上的節點個數、資源使用量並且能夠快速實現水平擴容、藍綠部署等在過去複雜的運維操作。以下的一系列工具,可以助你充分運用Kubernetes。
  • openEuler是個啥
    https://openeuler.org/zh/interaction/summit-list/ http://net.zol.com.cn/758/7586597.html
  • 教你一次性成功安裝K8S集群(基於一主兩從模式)
    寫在前面研究K8S有一段時間了,最開始學習K8S時,根據網上的教程安裝K8S環境總是報錯。所以,我就改變了學習策略,先不搞環境搭建了。先通過官網學習了K8S的整體架構,底層原理,又硬啃了一遍K8S源碼。別問我為哈這樣學,只是我覺得對我個人來說,這樣學能讓我更好的理解整套雲原生體系。這不,這次,我總結了如何一次性成功安裝K8S集群的方法。
  • 萬物基於 ARM,但它到底是什麼?
    Ampere 近日發布了 Altra 處理器,官方稱它是業內首款 80 核伺服器處理器,可以提供十分強大的性能,甚至能夠與 64 核的 AMD EPYC 處理器媲美。Altra 基於 ARM Neoverse N1 平臺(也就是說它採用 ARM 架構),80 核心加上 3GHz 的規格下功耗僅為 210W。