ARM全國產雲平台部署容器實戰


如何基於國產CPU的雲平台構建容器管理平台? 

 

目錄

第一節 基於國產CPU的服務器 2

第二節 國產雲平台 6

1、安裝雲平台 9

1.1啟動ARM服務器,從U盤啟動 9

1.2ARM服務器BIOS基本設置10

第三節 基於ZStack雲主機構建K8S集群 18

1、准備工作 20

2、安裝部署 21

2.1安裝Docker 21

2.3 安裝kubelet、kubeadm、kubectl 22

2.4用kubeadm創建集群 22

2.5 配置kubectl 22

2.6 安裝Pod網絡 23

2.7注冊節點到K8S集群 29

2.8部署kubernetes-dashboard 30

第四節 全篇總結 40

 

 

如何基於國產CPU的雲平台構建容器管理平台?(上篇)

 

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

 

第一節 基於國產CPU的服務器

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

一個偶然機會參加2018年貴州大數據博覽會,參會過程中發現一個有意思的事情,就是在阿里雲展台看到國產雲平台+國產芯片宣傳字樣。

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客

 於是上前跟現場的工作人員進行簡單的溝通,了解到國產CPU是由華芯通設計開發,這顆芯片內置48顆物理核心,單核心2.6GHz64Bit、 支持虛擬化!沒想到這顆CPU居然支持虛擬化,看來距離我的想法又進一步,起碼已經有硬件可以實現了。還了解到目前已經有國產雲平台具備商用環境;名字叫ZStack for Alibaba Cloud,據工作人員介紹目前已有業務系統運行在基於華芯通CPU的雲平台上,雲平台就是ZStack。熱心的工作人員帶我去華芯通的專櫃進行詳細參觀。

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

看到實物那一刻,我發現這個跟x86架構的服務器區別並不大,之前一直以為它是一個類似路由器這樣的小盒子。沒想到ARM服務器工藝已和x86服務器自造工藝無太大差別。

第二節 國產雲平台

   ZStack作為國內為數不多的自研雲平台,根據官網信息已發布基於國產CPU架構的版本,那么完全可以實現基於國產CPU架構來構建國產雲平台。

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ZStack架構:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

  這架構圖摘自他們的產品白皮書,從架構上看整個邏輯還是比較清晰,各組件依賴度並不高,不會因為管理控制節點故障而影響業務系統。經過仔細研究ZStack架構發現以下特點:

 全異步架構:異步消息、異步方法、異步HTTP調用

 無狀態服務:單次請求不依賴其他請求

 無鎖架構:一致性哈希算法。

 進程內微服務:微服務解耦。

再看看ZStack的功能架構圖:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

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

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

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

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

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

 

3、安裝雲平台

3.1啟動ARM服務器,從U盤啟動

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

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

直到出現以下信息:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

Delete或者ESC建進入BIOS設置。

3.2 ARM服務器BIOS基本設置

3.2.1修改時間

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

3.2.2快速選擇引導設備

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

選擇引導設備后按回車鍵,快速引導。

3.2.3使用基於VNC方式安裝ZStack

當選擇引導設備后,將進入啟動項選擇界面,如下圖所示:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

選擇using VNC模式進行引導啟動;

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

選擇usingVNC模式引導啟動,即可實現通過VNC圖形模式進行安裝;

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

表示啟動VNC服務,並自動從DHCP工具獲取IP地址同時自動分配默認VNC端口5901;當出現這個界面即可使用VNC viewer客戶端進行連接。

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

 

 

3.2.4安裝設置

A. 選擇安裝模式

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

 

目前ZStack For ARM有3種安裝模式分別對應為:

?企業版管理節點模式

? 計算節點模式

? 專家模式

可根據實施規划進行選擇部署,選擇建議:

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

如果用承載雲主機,則安裝模式為計算節點;

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

根據實際情況選擇好對應的安裝模式,然后點擊Done按鈕;

B. 配置磁盤分區:

? 選擇磁盤:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

 

選擇用於安裝ZStack的系統盤。

? 配置分區

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

? 自動分區。

下面就分區模式進行說明:

分區模式有UEFI 模式和Legacy模式兩種,應與BIOS設置的引導模式一致。

? UEFI 模式

       /boot:創建分區 1GB

      /boot/efi:創建分區 500MB

      swap(交換分區):創建分區 32GB

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

? 網絡設置:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

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

設置密碼並開始安裝:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

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

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

安裝部署結束后,可以看到還有網絡拓撲功能 

安裝總結:

底層硬件是ARM服務器,雲平台底層也是基於ARM64位的系統。安裝部署超級方便,管理控制層與業務層完全獨立,就是說如果管控節點宕掉,根本就不影響業務系統的正常運行,這一點是OpenStack無法實現的。在測試過程中嘗試各種斷電關機測試,整個平台運行依然不受影響,穩定性非常高。目前在ZStack For ARM 雲平台上輕松跑了16ARM架構的雲主機。ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客

 

第三節 基於ZStack雲主機構建K8S集群

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

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

集群環境介紹:

主機名

角色

IP地址

配置

系統版本

K8S-Master

Master

172.120.194.196

8vCPU\16G內存

Ubuntu-1804-aarch64

K8S-Node1

Node

172.120.194.197

8vCPU\16G內存

Ubuntu-1804-aarch64

K8S-Node2

Node

172.120.194.198 

8vCPU\16G內存

Ubuntu-1804-aarch64

K8S-Node3

Node

172.120.194.199

8vCPU\16G內存

Ubuntu-1804-aarch64

在本環境中用於構建K8S集群所需的資源,為基於ZStack構建的平台上的雲主機:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

ZStack雲主機K8S集群架構

1、准備工作

配置主機名

hostnamectl set-hostname K8S-Master

hostnamectl set-hostname K8S-Node1

hostnamectl set-hostname K8S-Node2

hostnamectl set-hostname K8S-Node3

 

所有雲主機上關閉swap分區 否則會報錯;該操作只需在雲主機環境下執行,物理機環境無需操作。

sudo swapoff -a   

2、安裝部署

2.1安裝Docker

# step 1: 安裝必要的一些系統工具

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

使用daoclouddocker鏡像下載進行加速。

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

2.2安裝go環境

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創建集群

初始化Master

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

執行完上面命令后,如果中途不報錯會出現類似以下信息:

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

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

2.5 配置kubectl

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

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網絡

為了讓K8S集群的Pod之間能夠正常通訊,必須安裝Pod網絡,Pod網絡可以支持多種網絡方案,當前測試環境采用Flannel模式。

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

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

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

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注冊節點到K8S集群

分別在K8S-Node1K8S-Node2K8S-Node3

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

 

kubectl get nodes 查看節點狀態

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

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

kubectl get pod --all-namespaces  正常情況應該是如下的狀態:

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

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

kubectl get nodes 再次查看節點狀態

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

當所有節點均為 Ready狀時,此時就可以使用這個集群了

2.8部署kubernetes-dashboard

克隆kubernetes-dashboard yaml文件

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

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

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

修改完成后執行 

kubectl  -n kube-system create -f .

執行命令的正常輸出:

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的狀態

kubectl get pod --all-namespaces

 

NAMESPACE     NAME                                    READY     STATUS    RESTARTS   AGE

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

 

當狀態為running 時執行下面命令 查看端口

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的時候會報錯:

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

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

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

 

ARM全國產雲平台部署容器實戰 - 王九日 - 王九日的博客 

至此,基於ARM環境的K8S集群就部署完成了。

 

 

 

 

第四節 全篇總結

先說說關於ZStack安裝部署的一些心得,整個ZStack For ARM平台部署到業務環境構建的過程,都是比較流暢的。ZStack產品化程度高,安裝過程非常簡單,基本上按照官方部署文檔1個小時內就能完成3台規模的雲平台搭建及平台初始化工作。

ZStack雲平台采用獨特的異步架構,大大提升了平台響應能力,使得批量並發操作不再成為煩惱;管理層面與業務層面獨立,不會因為管理節點意外宕機導致業務中斷;平台內置大量實用性很高的功能,極大方便了在測試過程中運維任務;版本升級簡單可靠,完全實現5分鍾跨版本無縫升級,經實測升級過程中完全不影響業務正常運行。通過升級后能實現異構集群管理,也就是說在ARM服務器上構建管理節點,可以同時管理ARM集群中的資源,也能管理X86架構集群中的資源;同時實現高級SDN功能。

而基於ZStack雲主機構建K8S集群時,我們團隊在選擇方案的時候,也拿物理機和雲主機做過一系列對比,對比之后發現當我用ZStack雲主機部署K8S集群的時候更加靈活、可控。具體的可以在以下幾個方面體現:

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

   對容器技術了解的人應該清楚,多個容器公用一個Host Kernel;這樣就會遇到隔離性方面的問題,雖然隨着技術發展,目前也可以使用Linux系統上的防護機制實現安全隔離,但是從某個層面講並不是完全隔離,而雲主機方式受益於虛擬化技術,天生就有非常好的隔離性,從而可以進一步保障安全。ZStack就是基於KVM虛擬化技術架構自研。

2、受益於ZStack雲平台多租戶

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

3.ZStack雲平台靈活性、自動化程度高

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

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

4、可靠性非常好

  為什么這么說呢?其實不難理解,計划內和計划外業務影響少。當我們對物理服務器進行計划內維護時,那些單容器運行的業務必定會受影響,此時可以借助雲平台中的熱遷移功能,遷移的過程中可實現業務不中斷。對於計划外停機,對業務影響基本上都是按天算的,損失不可言表。如果采用雲平台方式業務中斷時間將會縮短到分鍾級別。

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

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

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

2、在創建集群的時候,如果采用flannel網絡模式則--pod-network-cidr一定要為 10.244.0.0/16,否則Pod網可能不通。

3、雲主機環境一定要執行sudo swapoff -a 不然創建K8S集群的時候就會報錯。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM