ARM全国产云平台部署容器实战
如何基于國(guó)產(chǎn)CPU的云平臺(tái)構(gòu)建容器管理平臺(tái)??
?
目錄
第一節(jié)?基于國(guó)產(chǎn)CPU的服務(wù)器 2
第二節(jié)?國(guó)產(chǎn)云平臺(tái) 6
1、安裝云平臺(tái) 9
1.1啟動(dòng)ARM服務(wù)器,從U盤啟動(dòng) 9
1.2 ARM服務(wù)器BIOS基本設(shè)置 10
第三節(jié)?基于ZStack云主機(jī)構(gòu)建K8S集群 18
1、準(zhǔn)備工作 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注冊(cè)節(jié)點(diǎn)到K8S集群 29
2.8部署kubernetes-dashboard 30
第四節(jié)?全篇總結(jié) 40
?
?
如何基于國(guó)產(chǎn)CPU的云平臺(tái)構(gòu)建容器管理平臺(tái)?(上篇)
?
??隨著“中興事件”不斷升級(jí),引起了國(guó)人對(duì)國(guó)產(chǎn)自主可控技術(shù)的高度關(guān)注;本人作為所在單位的運(yùn)維工程師,也希望能找到一個(gè)穩(wěn)定、能兼容國(guó)產(chǎn)CPU的一整套架構(gòu)方案,來(lái)構(gòu)建IaaS平臺(tái)和PaaS平臺(tái),滿足單位對(duì)安全自主可控的需求。要基于全國(guó)產(chǎn)方式解決公司業(yè)務(wù)需求至少要在軟硬件層面滿足,而國(guó)內(nèi)基本都是基于x86解決方案,想找到滿足需求的國(guó)產(chǎn)化解決方案還是非常困難的事情。但筆者由于一個(gè)偶然的機(jī)會(huì),接觸到了國(guó)產(chǎn)的芯片廠商和云計(jì)算廠商,并得知他們已經(jīng)實(shí)現(xiàn)了全國(guó)產(chǎn)化的云計(jì)算平臺(tái),筆者也親自動(dòng)手體驗(yàn)了安裝部署該云計(jì)算平臺(tái),并在其之上安裝部署了容器平臺(tái),以下是筆者的分享。
?
第一節(jié)?基于國(guó)產(chǎn)CPU的服務(wù)器
縱觀國(guó)內(nèi)能用于商用國(guó)產(chǎn)CPU服務(wù)器也沒幾家真實(shí)能用的;有的是基于3B1500國(guó)產(chǎn)商用28納米8核處理最高主頻達(dá)1.5GHz;通過多方查閱相關(guān)資料目前性能無(wú)法滿足云平臺(tái)需求,而且還不支持虛擬化。
一個(gè)偶然機(jī)會(huì)參加2018年貴州大數(shù)據(jù)博覽會(huì),參會(huì)過程中發(fā)現(xiàn)一個(gè)有意思的事情,就是在阿里云展臺(tái)看到國(guó)產(chǎn)云平臺(tái)+國(guó)產(chǎn)芯片宣傳字樣。
?于是上前跟現(xiàn)場(chǎng)的工作人員進(jìn)行簡(jiǎn)單的溝通,了解到國(guó)產(chǎn)CPU是由華芯通設(shè)計(jì)開發(fā),這顆芯片內(nèi)置48顆物理核心,單核心2.6GHz,64Bit、?支持虛擬化!沒想到這顆CPU居然支持虛擬化,看來(lái)距離我的想法又進(jìn)一步,起碼已經(jīng)有硬件可以實(shí)現(xiàn)了。還了解到目前已經(jīng)有國(guó)產(chǎn)云平臺(tái)具備商用環(huán)境;名字叫ZStack?for?Alibaba?Cloud,據(jù)工作人員介紹目前已有業(yè)務(wù)系統(tǒng)運(yùn)行在基于華芯通CPU的云平臺(tái)上,云平臺(tái)就是ZStack。熱心的工作人員帶我去華芯通的專柜進(jìn)行詳細(xì)參觀。
?
?
?
看到實(shí)物那一刻,我發(fā)現(xiàn)這個(gè)跟x86架構(gòu)的服務(wù)器區(qū)別并不大,之前一直以為它是一個(gè)類似路由器這樣的小盒子。沒想到ARM服務(wù)器工藝已和x86服務(wù)器自造工藝無(wú)太大差別。
第二節(jié)?國(guó)產(chǎn)云平臺(tái)
???ZStack作為國(guó)內(nèi)為數(shù)不多的自研云平臺(tái),根據(jù)官網(wǎng)信息已發(fā)布基于國(guó)產(chǎn)CPU架構(gòu)的版本,那么完全可以實(shí)現(xiàn)基于國(guó)產(chǎn)CPU架構(gòu)來(lái)構(gòu)建國(guó)產(chǎn)云平臺(tái)。
?
ZStack架構(gòu):
?
??這架構(gòu)圖摘自他們的產(chǎn)品白皮書,從架構(gòu)上看整個(gè)邏輯還是比較清晰,各組件依賴度并不高,不會(huì)因?yàn)楣芾砜刂乒?jié)點(diǎn)故障而影響業(yè)務(wù)系統(tǒng)。經(jīng)過仔細(xì)研究ZStack架構(gòu)發(fā)現(xiàn)以下特點(diǎn):
?全異步架構(gòu):異步消息、異步方法、異步HTTP調(diào)用
?無(wú)狀態(tài)服務(wù):單次請(qǐng)求不依賴其他請(qǐng)求
?無(wú)鎖架構(gòu):一致性哈希算法。
?進(jìn)程內(nèi)微服務(wù):微服務(wù)解耦。
再看看ZStack的功能架構(gòu)圖:
?
從圖里可以發(fā)現(xiàn),服務(wù)之間的交互統(tǒng)一走消息隊(duì)列,整個(gè)拓?fù)浣Y(jié)構(gòu)不再緊密,實(shí)現(xiàn)星狀的架構(gòu),各服務(wù)之間只有消息的交互,服務(wù)之間基本獨(dú)立,添加或者刪除某個(gè)服務(wù)不會(huì)影響整個(gè)架構(gòu)(只會(huì)失去某些功能)。
回到文章的主題上,了解到以上信息后,我們決定使用華芯通CPU+ZStack國(guó)產(chǎn)化云平臺(tái)來(lái)實(shí)現(xiàn)容器平臺(tái)管理方案敲定后,接下來(lái)就是走借測(cè)流程。
??通過之前展會(huì)聯(lián)系的華芯通負(fù)責(zé)人幫忙,在等了2、3個(gè)星期之后,機(jī)器寄到了單位。
?
上圖是他們的工程機(jī),但做工已經(jīng)非常精細(xì),完全不輸給主流大廠的X86服務(wù)器。接下來(lái)先部署云平臺(tái),之前提到的ZStack是國(guó)產(chǎn)化云計(jì)算平臺(tái)的先行者,核心引擎也是完全開源的,筆者通過ZStack的官方網(wǎng)站(http://www.zstack.io/product/enterprise/),下載了他們的iso系統(tǒng),并根據(jù)用戶手冊(cè)的圖文教程做了燒錄,不得不說(shuō),整個(gè)文檔做的非常清晰,很快就完成了準(zhǔn)備工作,下面就按照文檔進(jìn)入安裝過程。
?
3、安裝云平臺(tái)
3.1啟動(dòng)ARM服務(wù)器,從U盤啟動(dòng)
通過Console連接看到如下一些信息,這是ARM服務(wù)器在進(jìn)行自檢。
?
直到出現(xiàn)以下信息:
?
按Delete或者ESC建進(jìn)入BIOS設(shè)置。
3.2?ARM服務(wù)器BIOS基本設(shè)置
3.2.1修改時(shí)間
?
3.2.2快速選擇引導(dǎo)設(shè)備
?
選擇引導(dǎo)設(shè)備后按回車鍵,快速引導(dǎo)。
3.2.3使用基于VNC方式安裝ZStack
當(dāng)選擇引導(dǎo)設(shè)備后,將進(jìn)入啟動(dòng)項(xiàng)選擇界面,如下圖所示:
?
選擇using?VNC模式進(jìn)行引導(dǎo)啟動(dòng);
?
選擇usingVNC模式引導(dǎo)啟動(dòng),即可實(shí)現(xiàn)通過VNC圖形模式進(jìn)行安裝;
?
表示啟動(dòng)VNC服務(wù),并自動(dòng)從DHCP工具獲取IP地址同時(shí)自動(dòng)分配默認(rèn)VNC端口5901;當(dāng)出現(xiàn)這個(gè)界面即可使用VNC?viewer客戶端進(jìn)行連接。
?
?
?
3.2.4安裝設(shè)置
A.?選擇安裝模式
?
?
目前ZStack?For ARM有3種安裝模式分別對(duì)應(yīng)為:
?企業(yè)版管理節(jié)點(diǎn)模式
? 計(jì)算節(jié)點(diǎn)模式
? 專家模式
可根據(jù)實(shí)施規(guī)劃進(jìn)行選擇部署,選擇建議:
??如果在實(shí)施方案中將管理節(jié)點(diǎn)獨(dú)立,則第一次安裝時(shí)應(yīng)選擇管理節(jié)點(diǎn)模式;
??如果用承載云主機(jī),則安裝模式為計(jì)算節(jié)點(diǎn);
?
根據(jù)實(shí)際情況選擇好對(duì)應(yīng)的安裝模式,然后點(diǎn)擊Done按鈕;
B.?配置磁盤分區(qū):
??選擇磁盤:
?
?
選擇用于安裝ZStack的系統(tǒng)盤。
??配置分區(qū)
?
??自動(dòng)分區(qū)。
下面就分區(qū)模式進(jìn)行說(shuō)明:
分區(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)卡,點(diǎn)擊Configure按鈕進(jìn)行配置;
設(shè)置密碼并開始安裝:
?
?
各模式安裝部署步驟都大同小異,官網(wǎng)可以直接下載用戶手冊(cè)。安裝完后的Web?UI,非常簡(jiǎn)潔大方,整個(gè)安裝過程超級(jí)簡(jiǎn)單,以前一直都是使用OpenStack的,而這回使用ZStack 不到30分鐘部署成功,1個(gè)小時(shí)內(nèi)3個(gè)節(jié)點(diǎn)全部部署成功,還順帶初始化了環(huán)境。
?
?
安裝部署結(jié)束后,可以看到還有網(wǎng)絡(luò)拓?fù)涔δ?
安裝總結(jié):
底層硬件是ARM服務(wù)器,云平臺(tái)底層也是基于ARM64位的系統(tǒng)。安裝部署超級(jí)方便,管理控制層與業(yè)務(wù)層完全獨(dú)立,就是說(shuō)如果管控節(jié)點(diǎn)宕掉,根本就不影響業(yè)務(wù)系統(tǒng)的正常運(yùn)行,這一點(diǎn)是OpenStack無(wú)法實(shí)現(xiàn)的。在測(cè)試過程中嘗試各種斷電關(guān)機(jī)測(cè)試,整個(gè)平臺(tái)運(yùn)行依然不受影響,穩(wěn)定性非常高。目前在ZStack?For?ARM?云平臺(tái)上輕松跑了16個(gè)ARM架構(gòu)的云主機(jī)。
?
第三節(jié)?基于ZStack云主機(jī)構(gòu)建K8S集群
這里要提一下,為什么我們不直接使用物理ARM服務(wù)器部署K8S集群,這跟單位測(cè)試場(chǎng)景有關(guān)系,既要使用云主機(jī)透?jìng)鱃PU計(jì)算卡進(jìn)行大量的計(jì)算,又要實(shí)現(xiàn)容器管理平臺(tái)。況且國(guó)外主流的K8S集群通常是跑在虛擬機(jī)里面的,運(yùn)行在虛擬機(jī)里面的好處有很多,比如可以實(shí)現(xiàn)資源定制分配、利用云平臺(tái)API接口可以快速生成K8S集群Node節(jié)點(diǎn)、更好的靈活性以及可靠性;在ZStack?ARM云平臺(tái)上可以同時(shí)構(gòu)建IaaS+PaaS混合平臺(tái),滿足不同場(chǎng)景下的需求。
?由于篇幅有限下面先介紹一下如何在基于ZStack?For ARM平臺(tái)中云主機(jī)部署K8S集群,整個(gè)部署過程大概花1小時(shí)(這主要是訪問部分國(guó)外網(wǎng)絡(luò)時(shí)不是很順暢)。
集群環(huán)境介紹:
| 主機(jī)名 | 角色 | 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)建的平臺(tái)上的云主機(jī):
?
?
ZStack云主機(jī)K8S集群架構(gòu)
1、準(zhǔn)備工作
配置主機(jī)名
hostnamectl set-hostname K8S-Master
hostnamectl set-hostname K8S-Node1
hostnamectl set-hostname K8S-Node2
hostnamectl set-hostname K8S-Node3
?
所有云主機(jī)上關(guān)閉swap分區(qū) 否則會(huì)報(bào)錯(cuò);該操作只需在云主機(jī)環(huán)境下執(zhí)行,物理機(jī)環(huán)境無(wú)需操作。
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對(duì)docker鏡像下載進(jìn)行加速。
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í)行完上面命令后,如果中途不報(bào)錯(cuò)會(huì)出現(xiàn)類似以下信息:
??kubeadm join 172.120.194.196:6443 --token oyf6ns.whcoaprs0q7growa --discovery-token-ca-cert-hash sha256:30a459df1b799673ca87f9dcc776f25b9839a8ab4b787968e05edfb6efe6a9d2
這段信息主要是提示如何注冊(cè)其他節(jié)點(diǎn)到K8S集群。
2.5 配置kubectl
Kubectl是管理K8S集群的命令行工具,因此需要對(duì)kubectl運(yùn)行環(huán)境進(jì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)前測(cè)試環(huán)境采用Flannel模式。
先將Flannel的yaml文件下載到本地,進(jìn)行編輯,編輯的主要目的是將原來(lái)X86架構(gòu)的鏡像名稱,改為ARM架構(gòu)的。讓其能夠在ZStack?ARM云環(huán)境正常運(yù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í)行上面命令后會(huì)正常情況下會(huì)有如下輸出:
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注冊(cè)節(jié)點(diǎn)到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é)點(diǎn)狀態(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é)點(diǎn)是NotReady 是因每個(gè)節(jié)點(diǎn)都需要啟動(dòng)若干個(gè)組件,這些組件都是在Pod中運(yùn)行,且需要到Google下載鏡像。使用下面命令查看Pod運(yùn)行狀況:
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
在整個(gè)過程中如果發(fā)現(xiàn)狀態(tài)為Pending、ContainerCreateing、ImagePullBackOff等狀態(tài)都表示Pod還未就緒,只有Running狀態(tài)才是正常的。要做的事情只有等待。
kubectl get nodes 再次查看節(jié)點(diǎn)狀態(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é)點(diǎn)均為?Ready狀時(shí),此時(shí)就可以使用這個(gè)集群了
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 時(shí)執(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的時(shí)候會(huì)報(bào)錯(cuò):
?
這是因?yàn)镵8S在1.6版本以后啟用了RBAC訪問控制策略,可以使用kubectl或Kubernetes API進(jìn)行配置。使用RBAC可以直接授權(quán)給用戶,讓用戶擁有授權(quán)管理的權(quán)限,這樣就不再需要直接觸碰Master Node。按照上面部署步驟則可以避免。
?
?
?
至此,基于ARM環(huán)境的K8S集群就部署完成了。
?
?
?
?
第四節(jié)?全篇總結(jié)
先說(shuō)說(shuō)關(guān)于ZStack安裝部署的一些心得,整個(gè)ZStack?For?ARM平臺(tái)部署到業(yè)務(wù)環(huán)境構(gòu)建的過程,都是比較流暢的。ZStack產(chǎn)品化程度高,安裝過程非常簡(jiǎn)單,基本上按照官方部署文檔1個(gè)小時(shí)內(nèi)就能完成3臺(tái)規(guī)模的云平臺(tái)搭建及平臺(tái)初始化工作。
ZStack云平臺(tái)采用獨(dú)特的異步架構(gòu),大大提升了平臺(tái)響應(yīng)能力,使得批量并發(fā)操作不再成為煩惱;管理層面與業(yè)務(wù)層面獨(dú)立,不會(huì)因?yàn)楣芾砉?jié)點(diǎn)意外宕機(jī)導(dǎo)致業(yè)務(wù)中斷;平臺(tái)內(nèi)置大量實(shí)用性很高的功能,極大方便了在測(cè)試過程中運(yùn)維任務(wù);版本升級(jí)簡(jiǎn)單可靠,完全實(shí)現(xiàn)5分鐘跨版本無(wú)縫升級(jí),經(jīng)實(shí)測(cè)升級(jí)過程中完全不影響業(yè)務(wù)正常運(yùn)行。通過升級(jí)后能實(shí)現(xiàn)異構(gòu)集群管理,也就是說(shuō)在ARM服務(wù)器上構(gòu)建管理節(jié)點(diǎn),可以同時(shí)管理ARM集群中的資源,也能管理X86架構(gòu)集群中的資源;同時(shí)實(shí)現(xiàn)高級(jí)SDN功能。
而基于ZStack云主機(jī)構(gòu)建K8S集群時(shí),我們團(tuán)隊(duì)在選擇方案的時(shí)候,也拿物理機(jī)和云主機(jī)做過一系列對(duì)比,對(duì)比之后發(fā)現(xiàn)當(dāng)我用ZStack云主機(jī)部署K8S集群的時(shí)候更加靈活、可控。具體的可以在以下幾個(gè)方面體現(xiàn):
1、ZStack云主機(jī)天生隔離性好
???對(duì)容器技術(shù)了解的人應(yīng)該清楚,多個(gè)容器公用一個(gè)Host?Kernel;這樣就會(huì)遇到隔離性方面的問題,雖然隨著技術(shù)發(fā)展,目前也可以使用Linux系統(tǒng)上的防護(hù)機(jī)制實(shí)現(xiàn)安全隔離,但是從某個(gè)層面講并不是完全隔離,而云主機(jī)方式受益于虛擬化技術(shù),天生就有非常好的隔離性,從而可以進(jìn)一步保障安全。ZStack就是基于KVM虛擬化技術(shù)架構(gòu)自研。
2、受益于ZStack云平臺(tái)多租戶
??在物理服務(wù)器上運(yùn)行的大堆容器要實(shí)現(xiàn)資源自理,所謂資源自理就是各自管理自己的容器資源,那么這個(gè)時(shí)候問題就來(lái)了,一臺(tái)物理機(jī)上有成千上萬(wàn)個(gè)容器怎么去細(xì)分管理范圍呢?這個(gè)時(shí)候云平臺(tái)的多租戶管理就派上用處了,每個(gè)租戶被分配到相應(yīng)的云主機(jī),各自管理各自的云主機(jī)以及容器集群。同時(shí)還能對(duì)不同人員權(quán)限進(jìn)行控制管理。在本次測(cè)試的ZStack?For?ARM云平臺(tái),就可以實(shí)現(xiàn)按企業(yè)組織架構(gòu)方式進(jìn)行資源、權(quán)限管理,同時(shí)還能實(shí)現(xiàn)流程審批,審批完成后自動(dòng)創(chuàng)建所需的云主機(jī);據(jù)說(shuō)后面發(fā)布的ZStack2.5.0版本還有資源編排功能。
3.ZStack云平臺(tái)靈活性、自動(dòng)化程度高
通過ZStack,可以根據(jù)業(yè)務(wù)需求,對(duì)云主機(jī)進(jìn)行資源定制,減少資源浪費(fèi)。同時(shí)根據(jù)自身業(yè)務(wù)情況調(diào)整架構(gòu)實(shí)現(xiàn)模式,比如:有計(jì)算密集型業(yè)務(wù),此時(shí)可以借助GPU透?jìng)鞴δ?#xff0c;將GPU透?jìng)鞯皆浦鳈C(jī),能快速實(shí)現(xiàn)計(jì)算任務(wù),避免過多繁瑣配置。
另外目前各種云平臺(tái)都有相應(yīng)API接口,可以方便第三方應(yīng)用直接調(diào)用,從而實(shí)現(xiàn)根據(jù)業(yè)務(wù)壓力自動(dòng)進(jìn)行資源伸縮。但是對(duì)于物理服務(wù)器來(lái)說(shuō)沒什么完整的API接口,基本上都是基于IPMI方式進(jìn)行管理,而且每個(gè)廠商的IPMI還不通用,很難實(shí)現(xiàn)資源的動(dòng)態(tài)伸縮。說(shuō)到API接口,我了解到的ZStack云平臺(tái),具備全API接口開放的特點(diǎn)。可以使容器集群根據(jù)業(yè)務(wù)壓力自動(dòng)伸縮。
4、可靠性非常好
??為什么這么說(shuō)呢?其實(shí)不難理解,計(jì)劃內(nèi)和計(jì)劃外業(yè)務(wù)影響少。當(dāng)我們對(duì)物理服務(wù)器進(jìn)行計(jì)劃內(nèi)維護(hù)時(shí),那些單容器運(yùn)行的業(yè)務(wù)必定會(huì)受影響,此時(shí)可以借助云平臺(tái)中的熱遷移功能,遷移的過程中可實(shí)現(xiàn)業(yè)務(wù)不中斷。對(duì)于計(jì)劃外停機(jī),對(duì)業(yè)務(wù)影響基本上都是按天算的,損失不可言表。如果采用云平臺(tái)方式業(yè)務(wù)中斷時(shí)間將會(huì)縮短到分鐘級(jí)別。
上面簡(jiǎn)單分享了一下用云主機(jī)構(gòu)建K8S集群的一些優(yōu)點(diǎn),當(dāng)然也有一些缺點(diǎn),在我看來(lái)缺點(diǎn)無(wú)非就是性能有稍微點(diǎn)損失,總之利大于弊。可以在規(guī)劃時(shí)規(guī)避掉這個(gè)問題,比如可以將性能型容器資源集中放到物理Node上,這樣就可以完美解決了。
最后再說(shuō)說(shuō)在ZStack?ARM架構(gòu)的云主機(jī)上部署K8S需要注意的地方,為大家提供一些參考。
1、默認(rèn)Get下來(lái)的yaml配置文件,里面涉及的image路徑都是x86架構(gòu)的amd64,需要將其改成arm64。
2、在創(chuàng)建集群的時(shí)候,如果采用flannel網(wǎng)絡(luò)模式則--pod-network-cidr一定要為?10.244.0.0/16,否則Pod網(wǎng)可能不通。
3、云主機(jī)環(huán)境一定要執(zhí)行sudo swapoff -a?不然創(chuàng)建K8S集群的時(shí)候就會(huì)報(bào)錯(cuò)。
以上就是我本次的主要分享內(nèi)容,歡迎大家關(guān)注交流。(qq:410185063;mail:zts@viczhu.com)。
總結(jié)
以上是生活随笔為你收集整理的ARM全国产云平台部署容器实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 百度百科制作不求人:APP词条制作流程攻
- 下一篇: C# 中AutoMapper的使用方法