日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ARM全国产云平台部署容器实战

發(fā)布時間:2024/1/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ARM全国产云平台部署容器实战 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如何基于國產(chǎn)CPU的云平臺構(gòu)建容器管理平臺??

?

目錄

第一節(jié)?基于國產(chǎn)CPU的服務(wù)器 2

第二節(jié)?國產(chǎn)云平臺 6

1、安裝云平臺 9

1.1啟動ARM服務(wù)器,從U盤啟動 9

1.2 ARM服務(wù)器BIOS基本設(shè)置 10

第三節(jié)?基于ZStack云主機構(gòu)建K8S集群 18

1、準備工作 20

2、安裝部署 21

2.1安裝Docker 21

2.3 安裝kubelet、kubeadm、kubectl 22

2.4用kubeadm創(chuàng)建集群 22

2.5 配置kubectl 22

2.6 安裝Pod網(wǎng)絡(luò) 23

2.7注冊節(jié)點到K8S集群 29

2.8部署kubernetes-dashboard 30

第四節(jié)?全篇總結(jié) 40

?

?

如何基于國產(chǎn)CPU的云平臺構(gòu)建容器管理平臺?(上篇)

?

??隨著“中興事件”不斷升級,引起了國人對國產(chǎn)自主可控技術(shù)的高度關(guān)注;本人作為所在單位的運維工程師,也希望能找到一個穩(wěn)定、能兼容國產(chǎn)CPU的一整套架構(gòu)方案,來構(gòu)建IaaS平臺和PaaS平臺,滿足單位對安全自主可控的需求。要基于全國產(chǎn)方式解決公司業(yè)務(wù)需求至少要在軟硬件層面滿足,而國內(nèi)基本都是基于x86解決方案,想找到滿足需求的國產(chǎn)化解決方案還是非常困難的事情。但筆者由于一個偶然的機會,接觸到了國產(chǎn)的芯片廠商和云計算廠商,并得知他們已經(jīng)實現(xiàn)了全國產(chǎn)化的云計算平臺,筆者也親自動手體驗了安裝部署該云計算平臺,并在其之上安裝部署了容器平臺,以下是筆者的分享。

?

第一節(jié)?基于國產(chǎn)CPU的服務(wù)器

縱觀國內(nèi)能用于商用國產(chǎn)CPU服務(wù)器也沒幾家真實能用的;有的是基于3B1500國產(chǎn)商用28納米8核處理最高主頻達1.5GHz;通過多方查閱相關(guān)資料目前性能無法滿足云平臺需求,而且還不支持虛擬化。

一個偶然機會參加2018年貴州大數(shù)據(jù)博覽會,參會過程中發(fā)現(xiàn)一個有意思的事情,就是在阿里云展臺看到國產(chǎn)云平臺+國產(chǎn)芯片宣傳字樣。

?于是上前跟現(xiàn)場的工作人員進行簡單的溝通,了解到國產(chǎn)CPU是由華芯通設(shè)計開發(fā),這顆芯片內(nèi)置48顆物理核心,單核心2.6GHz,64Bit、?支持虛擬化!沒想到這顆CPU居然支持虛擬化,看來距離我的想法又進一步,起碼已經(jīng)有硬件可以實現(xiàn)了。還了解到目前已經(jīng)有國產(chǎn)云平臺具備商用環(huán)境;名字叫ZStack?for?Alibaba?Cloud,據(jù)工作人員介紹目前已有業(yè)務(wù)系統(tǒng)運行在基于華芯通CPU的云平臺上,云平臺就是ZStack。熱心的工作人員帶我去華芯通的專柜進行詳細參觀。

?

?

?

看到實物那一刻,我發(fā)現(xiàn)這個跟x86架構(gòu)的服務(wù)器區(qū)別并不大,之前一直以為它是一個類似路由器這樣的小盒子。沒想到ARM服務(wù)器工藝已和x86服務(wù)器自造工藝無太大差別。

第二節(jié)?國產(chǎn)云平臺

???ZStack作為國內(nèi)為數(shù)不多的自研云平臺,根據(jù)官網(wǎng)信息已發(fā)布基于國產(chǎn)CPU架構(gòu)的版本,那么完全可以實現(xiàn)基于國產(chǎn)CPU架構(gòu)來構(gòu)建國產(chǎn)云平臺。

?

ZStack架構(gòu):

?

??這架構(gòu)圖摘自他們的產(chǎn)品白皮書,從架構(gòu)上看整個邏輯還是比較清晰,各組件依賴度并不高,不會因為管理控制節(jié)點故障而影響業(yè)務(wù)系統(tǒng)。經(jīng)過仔細研究ZStack架構(gòu)發(fā)現(xiàn)以下特點:

?全異步架構(gòu):異步消息、異步方法、異步HTTP調(diào)用

?無狀態(tài)服務(wù):單次請求不依賴其他請求

?無鎖架構(gòu):一致性哈希算法。

?進程內(nèi)微服務(wù):微服務(wù)解耦。

再看看ZStack的功能架構(gòu)圖:

?

從圖里可以發(fā)現(xiàn),服務(wù)之間的交互統(tǒng)一走消息隊列,整個拓撲結(jié)構(gòu)不再緊密,實現(xiàn)星狀的架構(gòu),各服務(wù)之間只有消息的交互,服務(wù)之間基本獨立,添加或者刪除某個服務(wù)不會影響整個架構(gòu)(只會失去某些功能)。

回到文章的主題上,了解到以上信息后,我們決定使用華芯通CPU+ZStack國產(chǎn)化云平臺來實現(xiàn)容器平臺管理方案敲定后,接下來就是走借測流程。

??通過之前展會聯(lián)系的華芯通負責(zé)人幫忙,在等了2、3個星期之后,機器寄到了單位。

?

上圖是他們的工程機,但做工已經(jīng)非常精細,完全不輸給主流大廠的X86服務(wù)器。接下來先部署云平臺,之前提到的ZStack是國產(chǎn)化云計算平臺的先行者,核心引擎也是完全開源的,筆者通過ZStack的官方網(wǎng)站(http://www.zstack.io/product/enterprise/),下載了他們的iso系統(tǒng),并根據(jù)用戶手冊的圖文教程做了燒錄,不得不說,整個文檔做的非常清晰,很快就完成了準備工作,下面就按照文檔進入安裝過程。

?

3、安裝云平臺

3.1啟動ARM服務(wù)器,從U盤啟動

通過Console連接看到如下一些信息,這是ARM服務(wù)器在進行自檢。

?

直到出現(xiàn)以下信息:

?

按Delete或者ESC建進入BIOS設(shè)置。

3.2?ARM服務(wù)器BIOS基本設(shè)置

3.2.1修改時間

?

3.2.2快速選擇引導(dǎo)設(shè)備

?

選擇引導(dǎo)設(shè)備后按回車鍵,快速引導(dǎo)。

3.2.3使用基于VNC方式安裝ZStack

當(dāng)選擇引導(dǎo)設(shè)備后,將進入啟動項選擇界面,如下圖所示:

?

選擇using?VNC模式進行引導(dǎo)啟動;

?

選擇usingVNC模式引導(dǎo)啟動,即可實現(xiàn)通過VNC圖形模式進行安裝;

?

表示啟動VNC服務(wù),并自動從DHCP工具獲取IP地址同時自動分配默認VNC端口5901;當(dāng)出現(xiàn)這個界面即可使用VNC?viewer客戶端進行連接。

?

?

?

3.2.4安裝設(shè)置

A.?選擇安裝模式

?

?

目前ZStack?For ARM有3種安裝模式分別對應(yīng)為:

?企業(yè)版管理節(jié)點模式

? 計算節(jié)點模式

? 專家模式

可根據(jù)實施規(guī)劃進行選擇部署,選擇建議:

??如果在實施方案中將管理節(jié)點獨立,則第一次安裝時應(yīng)選擇管理節(jié)點模式;

??如果用承載云主機,則安裝模式為計算節(jié)點;

?

根據(jù)實際情況選擇好對應(yīng)的安裝模式,然后點擊Done按鈕;

B.?配置磁盤分區(qū):

??選擇磁盤:

?

?

選擇用于安裝ZStack的系統(tǒng)盤。

??配置分區(qū)

?

??自動分區(qū)。

下面就分區(qū)模式進行說明:

分區(qū)模式有UEFI 模式和Legacy模式兩種,應(yīng)與BIOS設(shè)置的引導(dǎo)模式一致。

??UEFI 模式

???????/boot:創(chuàng)建分區(qū) 1GB

??????/boot/efi:創(chuàng)建分區(qū) 500MB

??????swap(交換分區(qū)):創(chuàng)建分區(qū) 32GB

?/(根分區(qū)):配置剩下容量

??網(wǎng)絡(luò)設(shè)置:

?

?

選擇需要修改的網(wǎng)卡,點擊Configure按鈕進行配置;

設(shè)置密碼并開始安裝:

?

?

各模式安裝部署步驟都大同小異,官網(wǎng)可以直接下載用戶手冊。安裝完后的Web?UI,非常簡潔大方,整個安裝過程超級簡單,以前一直都是使用OpenStack的,而這回使用ZStack 不到30分鐘部署成功,1個小時內(nèi)3個節(jié)點全部部署成功,還順帶初始化了環(huán)境。

?

?

安裝部署結(jié)束后,可以看到還有網(wǎng)絡(luò)拓撲功能?

安裝總結(jié):

底層硬件是ARM服務(wù)器,云平臺底層也是基于ARM64位的系統(tǒng)。安裝部署超級方便,管理控制層與業(yè)務(wù)層完全獨立,就是說如果管控節(jié)點宕掉,根本就不影響業(yè)務(wù)系統(tǒng)的正常運行,這一點是OpenStack無法實現(xiàn)的。在測試過程中嘗試各種斷電關(guān)機測試,整個平臺運行依然不受影響,穩(wěn)定性非常高。目前在ZStack?For?ARM?云平臺上輕松跑了16個ARM架構(gòu)的云主機。

?

第三節(jié)?基于ZStack云主機構(gòu)建K8S集群

這里要提一下,為什么我們不直接使用物理ARM服務(wù)器部署K8S集群,這跟單位測試場景有關(guān)系,既要使用云主機透傳GPU計算卡進行大量的計算,又要實現(xiàn)容器管理平臺。況且國外主流的K8S集群通常是跑在虛擬機里面的,運行在虛擬機里面的好處有很多,比如可以實現(xiàn)資源定制分配、利用云平臺API接口可以快速生成K8S集群Node節(jié)點、更好的靈活性以及可靠性;在ZStack?ARM云平臺上可以同時構(gòu)建IaaS+PaaS混合平臺,滿足不同場景下的需求。

?由于篇幅有限下面先介紹一下如何在基于ZStack?For ARM平臺中云主機部署K8S集群,整個部署過程大概花1小時(這主要是訪問部分國外網(wǎng)絡(luò)時不是很順暢)。

集群環(huán)境介紹:

主機名

角色

IP地址

配置

系統(tǒng)版本

K8S-Master

Master

172.120.194.196

8vCPU\16G內(nèi)存

Ubuntu-1804-aarch64

K8S-Node1

Node

172.120.194.197

8vCPU\16G內(nèi)存

Ubuntu-1804-aarch64

K8S-Node2

Node

172.120.194.198?

8vCPU\16G內(nèi)存

Ubuntu-1804-aarch64

K8S-Node3

Node

172.120.194.199

8vCPU\16G內(nèi)存

Ubuntu-1804-aarch64

在本環(huán)境中用于構(gòu)建K8S集群所需的資源,為基于ZStack構(gòu)建的平臺上的云主機:

?

?

ZStack云主機K8S集群架構(gòu)

1、準備工作

配置主機名

hostnamectl set-hostname K8S-Master

hostnamectl set-hostname K8S-Node1

hostnamectl set-hostname K8S-Node2

hostnamectl set-hostname K8S-Node3

?

所有云主機上關(guān)閉swap分區(qū) 否則會報錯;該操作只需在云主機環(huán)境下執(zhí)行,物理機環(huán)境無需操作。

sudo swapoff -a ??

2、安裝部署

2.1安裝Docker

# step 1: 安裝必要的一些系統(tǒng)工具

sudo apt-get update

sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common

# step 2: 安裝GPG證書

curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

# Step 3: 寫入軟件源信息

sudo add-apt-repository "deb [arch=arm64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"

# Step 4: 更新并安裝 Docker-CE

sudo apt-get -y update

sudo apt-get -y install docker-ce

使用daocloud對docker鏡像下載進行加速。

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://56d10455.m.daocloud.io

2.2安裝go環(huán)境

apt-get install golang- golang

2.3 安裝kubelet、kubeadm、kubectl

apt-get update && apt-get install -y apt-transport-https

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -

cat <<EOF >/etc/apt/sources.list.d/kubernetes.list

deb http://apt.kubernetes.io/ kubernetes-xenial main

EOF

apt-get update

apt-get install -y kubectl kubeadm kubectl

2.4用kubeadm創(chuàng)建集群

初始化Master

kubeadm init --apiserver-advertise-address ?172.120.194.196 --pod-network-cidr 10.244.0.0/16

執(zhí)行完上面命令后,如果中途不報錯會出現(xiàn)類似以下信息:

??kubeadm join 172.120.194.196:6443 --token oyf6ns.whcoaprs0q7growa --discovery-token-ca-cert-hash sha256:30a459df1b799673ca87f9dcc776f25b9839a8ab4b787968e05edfb6efe6a9d2

這段信息主要是提示如何注冊其他節(jié)點到K8S集群。

2.5 配置kubectl

Kubectl是管理K8S集群的命令行工具,因此需要對kubectl運行環(huán)境進行配置。

su - zstack

sudo mkdir -p $HOME/.kube

sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config

sudo chown $(id -u):$(id -g) $HOME/.kube/config

echo "source <(kubectl completion bash)" >> ~/.bash

2.6 安裝Pod網(wǎng)絡(luò)

為了讓K8S集群的Pod之間能夠正常通訊,必須安裝Pod網(wǎng)絡(luò),Pod網(wǎng)絡(luò)可以支持多種網(wǎng)絡(luò)方案,當(dāng)前測試環(huán)境采用Flannel模式。

先將Flannel的yaml文件下載到本地,進行編輯,編輯的主要目的是將原來X86架構(gòu)的鏡像名稱,改為ARM架構(gòu)的。讓其能夠在ZStack?ARM云環(huán)境正常運行。修改位置及內(nèi)容參考下面文件中紅色粗體字部分。

sudo wget?https://raw.githubusercontent.com/coreos/flannel/master/documentation/kube-flannel.yml

vim?kube-flannel.yml

---

kind: ClusterRole

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

??name: flannel

rules:

??- apiGroups:

??????- ""

????resources:

??????- pods

????verbs:

??????- get

??- apiGroups:

??????- ""

????resources:

??????- nodes

????verbs:

??????- list

??????- watch

??- apiGroups:

??????- ""

????resources:

??????- nodes/status

????verbs:

??????- patch

---

kind: ClusterRoleBinding

apiVersion: rbac.authorization.k8s.io/v1beta1

metadata:

??name: flannel

roleRef:

??apiGroup: rbac.authorization.k8s.io

??kind: ClusterRole

??name: flannel

subjects:

- kind: ServiceAccount

??name: flannel

??namespace: kube-system

---

apiVersion: v1

kind: ServiceAccount

metadata:

??name: flannel

??namespace: kube-system

---

kind: ConfigMap

apiVersion: v1

metadata:

??name: kube-flannel-cfg

??namespace: kube-system

??labels:

????tier: node

????app: flannel

data:

??cni-conf.json: |

????{

??????"name": "cbr0",

??????"plugins": [

????????{

??????????"type": "flannel",

??????????"delegate": {

????????????"hairpinMode": true,

????????????"isDefaultGateway": true

??????????}

????????},

????????{

??????????"type": "portmap",

??????????"capabilities": {

????????????"portMappings": true

??????????}

????????}

??????]

????}

??net-conf.json: |

????{

??????"Network": "10.244.0.0/16",

??????"Backend": {

????????"Type": "vxlan"

??????}

????}

---

apiVersion: extensions/v1beta1

kind: DaemonSet

metadata:

??name: kube-flannel-ds

??namespace: kube-system

??labels:

????tier: node

????app: flannel

spec:

??template:

????metadata:

??????labels:

????????tier: node

????????app: flannel

????spec:

??????hostNetwork: true

??????nodeSelector:

????????beta.kubernetes.io/arch: arm64

??????tolerations:

??????- key: node-role.kubernetes.io/master

????????operator: Exists

????????effect: NoSchedule

??????serviceAccountName: flannel

??????initContainers:

??????- name: install-cni

????????image: quay.io/coreos/flannel:v0.10.0-arm64

????????command:

????????- cp

????????args:

????????- -f

????????- /etc/kube-flannel/cni-conf.json

????????- /etc/cni/net.d/10-flannel.conflist

????????volumeMounts:

????????- name: cni

??????????mountPath: /etc/cni/net.d

????????- name: flannel-cfg

??????????mountPath: /etc/kube-flannel/

??????containers:

??????- name: kube-flannel

????????image: quay.io/coreos/flannel:v0.10.0-arm64

????????command:

????????- /opt/bin/flanneld

????????args:

????????- --ip-masq

????????- --kube-subnet-mgr

????????resources:

??????????requests:

????????????cpu: "100m"

????????????memory: "50Mi"

??????????limits:

????????????cpu: "100m"

????????????memory: "50Mi"

????????securityContext:

??????????privileged: true

????????env:

????????- name: POD_NAME

??????????valueFrom:

????????????fieldRef:

??????????????fieldPath: metadata.name

????????- name: POD_NAMESPACE

??????????valueFrom:

????????????fieldRef:

??????????????fieldPath: metadata.namespace

????????volumeMounts:

????????- name: run

??????????mountPath: /run

????????- name: flannel-cfg

??????????mountPath: /etc/kube-flannel/

??????volumes:

????????- name: run

??????????hostPath:

????????????path: /run

????????- name: cni

??????????hostPath:

????????????path: /etc/cni/net.d

????????- name: flannel-cfg

??????????configMap:

????????????name: kube-flannel-cfg

?

sudo kubectl apply -f ??kube-flannel.yml

執(zhí)行上面命令后會正常情況下會有如下輸出:

clusterrole.rbac.authorization.k8s.io "flannel" created

clusterrolebinding.rbac.authorization.k8s.io "flannel" created

serviceaccount "flannel" created

configmap "kube-flannel-cfg" created

daemonset.extensions "kube-flannel-ds" created

2.7注冊節(jié)點到K8S集群

分別在K8S-Node1、K8S-Node2、K8S-Node3

kubeadm join 172.120.194.196:6443 --token oyf6ns.whcoaprs0q7growa --discovery-token-ca-cert-hash sha256:30a459df1b799673ca87f9dcc776f25b9839a8ab4b787968e05edfb6efe6a9d2

?

kubectl get nodes 查看節(jié)點狀態(tài)

zstack@K8S-Master:~$ kubectl get nodes

NAME ????????STATUS ????ROLES ????AGE ??????VERSION

k8s-master ??Ready ?????master ???49m ??????v1.11.0

k8s-node1 ???NotReady ??<none> ???4m ???????v1.11.0

k8s-node2 ???NotReady ??<none> ???4m ???????v1.11.0

k8s-node3 ???NotReady ??<none> ???4m ???????v1.11.0

如果發(fā)現(xiàn)所有節(jié)點是NotReady 是因每個節(jié)點都需要啟動若干個組件,這些組件都是在Pod中運行,且需要到Google下載鏡像。使用下面命令查看Pod運行狀況:

kubectl get pod --all-namespaces??正常情況應(yīng)該是如下的狀態(tài):

NAMESPACE ????NAME ????????????????????????????????READY ????STATUS ???RESTARTS ??AGE

kube-system ??coredns-78fcdf6894-49tkw ????????????1/1 ??????Running ??0 ?????????1h

kube-system ??coredns-78fcdf6894-gmcph ????????????1/1 ??????Running ??0 ?????????1h

kube-system ??etcd-k8s-master ?????????????????????1/1 ??????Running ??0 ?????????19m

kube-system ??kube-apiserver-k8s-master ???????????1/1 ??????Running ??0 ?????????19m

kube-system ??kube-controller-manager-k8s-master ??1/1 ??????Running ??0 ?????????19m

kube-system ??kube-flannel-ds-bqx2s ???????????????1/1 ??????Running ??0 ?????????16m

kube-system ??kube-flannel-ds-jgmjp ???????????????1/1 ??????Running ??0 ?????????16m

kube-system ??kube-flannel-ds-mxpl8 ???????????????1/1 ??????Running ??0 ?????????21m

kube-system ??kube-flannel-ds-sd6lh ???????????????1/1 ??????Running ??0 ?????????16m

kube-system ??kube-proxy-cwslw ????????????????????1/1 ??????Running ??0 ?????????16m

kube-system ??kube-proxy-j75fj ????????????????????1/1 ??????Running ??0 ?????????1h

kube-system ??kube-proxy-ptn55 ????????????????????1/1 ??????Running ??0 ?????????16m

kube-system ??kube-proxy-zl8mb ????????????????????1/1 ??????Running ??0 ?????????16m

kube-system ??kube-scheduler-k8s-master ???????????1/1 ??????Running ??0 ?????????19m

在整個過程中如果發(fā)現(xiàn)狀態(tài)為Pending、ContainerCreateing、ImagePullBackOff等狀態(tài)都表示Pod還未就緒,只有Running狀態(tài)才是正常的。要做的事情只有等待。

kubectl get nodes 再次查看節(jié)點狀態(tài)

NAME ????????STATUS ???ROLES ????AGE ??????VERSION

k8s-master ??Ready ????master ???1h ???????v1.11.0

k8s-node1 ???Ready ????<none> ???16m ??????v1.11.0

k8s-node2 ???Ready ????<none> ???16m ??????v1.11.0

k8s-node3 ???Ready ????<none> ???16m ??????v1.11.0

當(dāng)所有節(jié)點均為?Ready狀時,此時就可以使用這個集群了

2.8部署kubernetes-dashboard

克隆kubernetes-dashboard yaml文件

sudo?git clone https://github.com/gh-Devin/kubernetes-dashboard.git

修改kubernetes-dashboard yaml文件,修改內(nèi)容為下面紅色粗體部分。

cd kubernetes-dashboard/

vim kubernetes-dashboard.yaml

# Copyright 2017 The Kubernetes Authors.

#

# Licensed under the Apache License, Version 2.0 (the "License");

# you may not use this file except in compliance with the License.

# You may obtain a copy of the License at

#

# ????http://www.apache.org/licenses/LICENSE-2.0

#

# Unless required by applicable law or agreed to in writing, software

# distributed under the License is distributed on an "AS IS" BASIS,

# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

# See the License for the specific language governing permissions and

# limitations under the License.

?

# Configuration to deploy release version of the Dashboard UI compatible with

# Kubernetes 1.8.

#

# Example usage: kubectl create -f <this_file>

?

# ------------------- Dashboard Secret ------------------- #

?

apiVersion: v1

kind: Secret

metadata:

??labels:

????k8s-app: kubernetes-dashboard

??name: kubernetes-dashboard-certs

??namespace: kube-system

type: Opaque

?

---

# ------------------- Dashboard Service Account ------------------- #

?

apiVersion: v1

kind: ServiceAccount

metadata:

??labels:

????k8s-app: kubernetes-dashboard

??name: kubernetes-dashboard

??namespace: kube-system

?

---

# ------------------- Dashboard Role & Role Binding ------------------- #

?

kind: Role

apiVersion: rbac.authorization.k8s.io/v1

metadata:

??name: kubernetes-dashboard-minimal

??namespace: kube-system

rules:

??# Allow Dashboard to create 'kubernetes-dashboard-key-holder' secret.

- apiGroups: [""]

??resources: ["secrets"]

??verbs: ["create"]

??# Allow Dashboard to create 'kubernetes-dashboard-settings' config map.

- apiGroups: [""]

??resources: ["configmaps"]

??verbs: ["create"]

??# Allow Dashboard to get, update and delete Dashboard exclusive secrets.

- apiGroups: [""]

??resources: ["secrets"]

??resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]

??verbs: ["get", "update", "delete"]

??# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.

- apiGroups: [""]

??resources: ["configmaps"]

??resourceNames: ["kubernetes-dashboard-settings"]

??verbs: ["get", "update"]

??# Allow Dashboard to get metrics from heapster.

- apiGroups: [""]

??resources: ["services"]

??resourceNames: ["heapster"]

??verbs: ["proxy"]

- apiGroups: [""]

??resources: ["services/proxy"]

??resourceNames: ["heapster", "http:heapster:", "https:heapster:"]

??verbs: ["get"]

?

---

apiVersion: rbac.authorization.k8s.io/v1

kind: RoleBinding

metadata:

??name: kubernetes-dashboard-minimal

??namespace: kube-system

roleRef:

??apiGroup: rbac.authorization.k8s.io

??kind: Role

??name: kubernetes-dashboard-minimal

subjects:

- kind: ServiceAccount

??name: kubernetes-dashboard

??namespace: kube-system

?

---

# ------------------- Dashboard Deployment ------------------- #

?

kind: Deployment

apiVersion: apps/v1beta2

metadata:

??labels:

????k8s-app: kubernetes-dashboard

??name: kubernetes-dashboard

??namespace: kube-system

spec:

??replicas: 1

??revisionHistoryLimit: 10

??selector:

????matchLabels:

??????k8s-app: kubernetes-dashboard

??template:

????metadata:

??????labels:

????????k8s-app: kubernetes-dashboard

????spec:

??????serviceAccountName: kubernetes-dashboard

??????containers:

??????- name: kubernetes-dashboard

????????image: k8s.gcr.io/kubernetes-dashboard-arm64:v1.8.3

????????ports:

????????- containerPort: 9090

??????????protocol: TCP

????????args:

??????????#- --auto-generate-certificates

??????????# Uncomment the following line to manually specify Kubernetes API server Host

??????????# If not specified, Dashboard will attempt to auto discover the API server and connect

??????????# to it. Uncomment only if the default does not work.

????????volumeMounts:

????????- name: kubernetes-dashboard-certs

??????????mountPath: /certs

??????????# Create on-disk volume to store exec logs

????????- mountPath: /tmp

??????????name: tmp-volume

????????livenessProbe:

??????????httpGet:

????????????scheme: HTTP

????????????path: /

????????????port: 9090

??????????initialDelaySeconds: 30

??????????timeoutSeconds: 30

??????volumes:

??????- name: kubernetes-dashboard-certs

????????secret:

??????????secretName: kubernetes-dashboard-certs

??????- name: tmp-volume

????????emptyDir: {}

??????serviceAccountName: kubernetes-dashboard-admin

??????# Comment the following tolerations if Dashboard must not be deployed on master

??????tolerations:

??????- key: node-role.kubernetes.io/master

????????effect: NoSchedule

?

---

# ------------------- Dashboard Service ------------------- #

?

kind: Service

apiVersion: v1

metadata:

??labels:

????k8s-app: kubernetes-dashboard

??name: kubernetes-dashboard

??namespace: kube-system

spec:

??ports:

????- port: 9090

??????targetPort: 9090

??selector:

????k8s-app: kubernetes-dashboard

?

# ------------------------------------------------------------

kind: Service

apiVersion: v1

metadata:

??labels:

????k8s-app: kubernetes-dashboard

??name: kubernetes-dashboard-external

??namespace: kube-system

spec:

??ports:

????- port: 9090

??????targetPort: 9090

??????nodePort: 30090

??type: NodePort

??selector:

k8s-app: kubernetes-dashboard

修改完成后執(zhí)行?

kubectl ?-n kube-system create -f?.

執(zhí)行命令的正常輸出:

serviceaccount "kubernetes-dashboard-admin" created

clusterrolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-admin" created

secret "kubernetes-dashboard-certs" created

serviceaccount "kubernetes-dashboard" created

role.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created

rolebinding.rbac.authorization.k8s.io "kubernetes-dashboard-minimal" created

deployment.apps "kubernetes-dashboard" created

service "kubernetes-dashboard-external" created

?

然后查看kubernetes-dashboard Pod的狀態(tài)

kubectl get pod --all-namespaces

?

NAMESPACE ????NAME ???????????????????????????????????READY ????STATUS ???RESTARTS ??AGE

kube-system ??kubernetes-dashboard-66885dcb6f-v6qfm ??1/1 ??????Running ??0 ?????????8m

?

當(dāng)狀態(tài)為running 時執(zhí)行下面命令 查看端口

kubectl --namespace=kube-system describe svc kubernetes-dashboard

Name: ????????????????????kubernetes-dashboard-external

Namespace: ???????????????kube-system

Labels: ??????????????????k8s-app=kubernetes-dashboard

Annotations: ?????????????<none>

Selector: ????????????????k8s-app=kubernetes-dashboard

Type: ????????????????????NodePort

IP: ??????????????????????10.111.189.106

Port: ????????????????????<unset> ?9090/TCP

TargetPort: ??????????????9090/TCP

NodePort: ????????????????<unset> ?30090/TCP ????此端口為外部訪問端口

Endpoints: ???????????????10.244.2.4:9090

Session Affinity: ????????None

External Traffic Policy: ?Cluster

Events: ??????????????????<none>

?

注意:如果在部署K8S-Dashboard界面過程中如果則登錄UI的時候會報錯:

?

這是因為K8S在1.6版本以后啟用了RBAC訪問控制策略,可以使用kubectl或Kubernetes API進行配置。使用RBAC可以直接授權(quán)給用戶,讓用戶擁有授權(quán)管理的權(quán)限,這樣就不再需要直接觸碰Master Node。按照上面部署步驟則可以避免。

?

?

?

至此,基于ARM環(huán)境的K8S集群就部署完成了。

?

?

?

?

第四節(jié)?全篇總結(jié)

先說說關(guān)于ZStack安裝部署的一些心得,整個ZStack?For?ARM平臺部署到業(yè)務(wù)環(huán)境構(gòu)建的過程,都是比較流暢的。ZStack產(chǎn)品化程度高,安裝過程非常簡單,基本上按照官方部署文檔1個小時內(nèi)就能完成3臺規(guī)模的云平臺搭建及平臺初始化工作。

ZStack云平臺采用獨特的異步架構(gòu),大大提升了平臺響應(yīng)能力,使得批量并發(fā)操作不再成為煩惱;管理層面與業(yè)務(wù)層面獨立,不會因為管理節(jié)點意外宕機導(dǎo)致業(yè)務(wù)中斷;平臺內(nèi)置大量實用性很高的功能,極大方便了在測試過程中運維任務(wù);版本升級簡單可靠,完全實現(xiàn)5分鐘跨版本無縫升級,經(jīng)實測升級過程中完全不影響業(yè)務(wù)正常運行。通過升級后能實現(xiàn)異構(gòu)集群管理,也就是說在ARM服務(wù)器上構(gòu)建管理節(jié)點,可以同時管理ARM集群中的資源,也能管理X86架構(gòu)集群中的資源;同時實現(xiàn)高級SDN功能。

而基于ZStack云主機構(gòu)建K8S集群時,我們團隊在選擇方案的時候,也拿物理機和云主機做過一系列對比,對比之后發(fā)現(xiàn)當(dāng)我用ZStack云主機部署K8S集群的時候更加靈活、可控。具體的可以在以下幾個方面體現(xiàn):

1、ZStack云主機天生隔離性好

???對容器技術(shù)了解的人應(yīng)該清楚,多個容器公用一個Host?Kernel;這樣就會遇到隔離性方面的問題,雖然隨著技術(shù)發(fā)展,目前也可以使用Linux系統(tǒng)上的防護機制實現(xiàn)安全隔離,但是從某個層面講并不是完全隔離,而云主機方式受益于虛擬化技術(shù),天生就有非常好的隔離性,從而可以進一步保障安全。ZStack就是基于KVM虛擬化技術(shù)架構(gòu)自研。

2、受益于ZStack云平臺多租戶

??在物理服務(wù)器上運行的大堆容器要實現(xiàn)資源自理,所謂資源自理就是各自管理自己的容器資源,那么這個時候問題就來了,一臺物理機上有成千上萬個容器怎么去細分管理范圍呢?這個時候云平臺的多租戶管理就派上用處了,每個租戶被分配到相應(yīng)的云主機,各自管理各自的云主機以及容器集群。同時還能對不同人員權(quán)限進行控制管理。在本次測試的ZStack?For?ARM云平臺,就可以實現(xiàn)按企業(yè)組織架構(gòu)方式進行資源、權(quán)限管理,同時還能實現(xiàn)流程審批,審批完成后自動創(chuàng)建所需的云主機;據(jù)說后面發(fā)布的ZStack2.5.0版本還有資源編排功能。

3.ZStack云平臺靈活性、自動化程度高

通過ZStack,可以根據(jù)業(yè)務(wù)需求,對云主機進行資源定制,減少資源浪費。同時根據(jù)自身業(yè)務(wù)情況調(diào)整架構(gòu)實現(xiàn)模式,比如:有計算密集型業(yè)務(wù),此時可以借助GPU透傳功能,將GPU透傳到云主機,能快速實現(xiàn)計算任務(wù),避免過多繁瑣配置。

另外目前各種云平臺都有相應(yīng)API接口,可以方便第三方應(yīng)用直接調(diào)用,從而實現(xiàn)根據(jù)業(yè)務(wù)壓力自動進行資源伸縮。但是對于物理服務(wù)器來說沒什么完整的API接口,基本上都是基于IPMI方式進行管理,而且每個廠商的IPMI還不通用,很難實現(xiàn)資源的動態(tài)伸縮。說到API接口,我了解到的ZStack云平臺,具備全API接口開放的特點。可以使容器集群根據(jù)業(yè)務(wù)壓力自動伸縮。

4、可靠性非常好

??為什么這么說呢?其實不難理解,計劃內(nèi)和計劃外業(yè)務(wù)影響少。當(dāng)我們對物理服務(wù)器進行計劃內(nèi)維護時,那些單容器運行的業(yè)務(wù)必定會受影響,此時可以借助云平臺中的熱遷移功能,遷移的過程中可實現(xiàn)業(yè)務(wù)不中斷。對于計劃外停機,對業(yè)務(wù)影響基本上都是按天算的,損失不可言表。如果采用云平臺方式業(yè)務(wù)中斷時間將會縮短到分鐘級別。

上面簡單分享了一下用云主機構(gòu)建K8S集群的一些優(yōu)點,當(dāng)然也有一些缺點,在我看來缺點無非就是性能有稍微點損失,總之利大于弊。可以在規(guī)劃時規(guī)避掉這個問題,比如可以將性能型容器資源集中放到物理Node上,這樣就可以完美解決了。

最后再說說在ZStack?ARM架構(gòu)的云主機上部署K8S需要注意的地方,為大家提供一些參考。

1、默認Get下來的yaml配置文件,里面涉及的image路徑都是x86架構(gòu)的amd64,需要將其改成arm64。

2、在創(chuàng)建集群的時候,如果采用flannel網(wǎng)絡(luò)模式則--pod-network-cidr一定要為?10.244.0.0/16,否則Pod網(wǎng)可能不通。

3、云主機環(huán)境一定要執(zhí)行sudo swapoff -a?不然創(chuàng)建K8S集群的時候就會報錯。

以上就是我本次的主要分享內(nèi)容,歡迎大家關(guān)注交流。(qq:410185063;mail:zts@viczhu.com)。

總結(jié)

以上是生活随笔為你收集整理的ARM全国产云平台部署容器实战的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。