1. 程式人生 > >使用amd64架構master節點管理arm架構kubernetes叢集

使用amd64架構master節點管理arm架構kubernetes叢集

1. master節點部署

1.1 基礎部署

1.2 網路部署

1.2.1 flannel網路部署

flannel的部署只會初始化一些cni的配置檔案,並不會部署cni的可執行檔案,需要手動部署,所以flannel部署分為兩步:

  • CNI外掛部署
  • flannel組價部署

步驟一.CNI外掛部署(所有節點)

1.建立cni外掛目錄

sudo mkdir -p /opt/cni/bin
cd /opt/cni/bin
sudo wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-amd64-v0.7.1.tgz

3.在/opt/cni/bin目錄下解壓即安裝好

sudo tar -zxvf cni-plugins-amd64-v0.7.1.tgz

添加了如下外掛:

[[email protected] ]$ ll /opt/cni/bin
總用量 65716
-rwxr-xr-x 1 root   root    4028260 4月  12 17:21 bridge
-rwxr-xr-x 1 root   root   10232415 4月  12 17:22 dhcp
-rwxr-xr-x 1 root   root    2856252 4月  12 17:21 flannel
-rwxr-xr-x 1 root   root    3127363 4月  12 17:21 host-device
-rwxr-xr-x 1 root   root    3036768 4月  12 17:22 host-local
-rwxr-xr-x 1 root   root    3572685 4月  12 17:21 ipvlan
-rwxr-xr-x 1 root   root    3084347 4月  12 17:21 loopback
-rwxr-xr-x 1 root   root    3613497 4月  12 17:21 macvlan
-rwxr-xr-x 1 root   root    3550877 4月  12 17:21 portmap
-rwxr-xr-x 1 root   root    3993428 4月  12 17:21 ptp
-rwxr-xr-x 1 root   root    2641877 4月  12 17:22 sample
-rwxr-xr-x 1 root   root    2850029 4月  12 17:21 tuning
-rwxr-xr-x 1 root   root    3568537 4月  12 17:21 vlan

步驟二.flannel部署

1.獲取yaml檔案

$ wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

2.修改配置檔案
<1>修改其中net-conf.json中的Network引數使其與kubeadm init時指定的--pod-network-cidr保持一致。
<2>這裡v0.10.0版有一個bug,需要為啟動flannel的daemonset新增toleration,以允許在尚未Ready的節點上部署flannel pod:

      tolerations:
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      #新增下面這個toleration
      - key: node.kubernetes.io/not-ready
        operator: Exists
        effect: NoSchedule   

<3>將原有的nodeSelector註釋掉,允許在包括arm架構的板子上部署flannel

#      nodeSelector:
#        beta.kubernetes.io/arch: amd64     

3.映象下載
master節點上下載yaml檔案中所需amd64架構的映象。quay.io映象被牆下不了可以從這裡下載, 之後再打回原tag。

docker pull jmgao1983/flannel:v0.10.0-amd64
docker tag jmgao1983/flannel:v0.10.0-amd64 quay.io/coreos/flannel:v0.10.0-amd64

4.部署

kubectl apply -f kube-flannel.yml

部署好後集群可以正常運行了。

備註:

假如網路部署失敗或出問題需要重新部署,執行以下內容清除生成的網路介面:
sudo ifconfig cni0 down
sudo ip link delete cni0
sudo ifconfig flannel.1 down
sudo ip link delete flannel.1
sudo rm -rf /var/lib/cni/

2. slave節點部署

2.1 基礎部署

2.2 構建Kubernetes叢集

將arm架構的樹莓派加入已建好的x64架構kubernetes-master節點,組成異構叢集,使用x64架構的master管理arm架構的開發版節點。

2.2.1 提前下載所需映象

看一下kubernetes v1.12.0需要哪些映象:

$ kubeadm config images list --kubernetes-version=v1.12.0 --feature-gates CoreDNS=false

k8s.gcr.io/kube-apiserver:v1.12.0
k8s.gcr.io/kube-controller-manager:v1.12.0
k8s.gcr.io/kube-scheduler:v1.12.0
k8s.gcr.io/kube-proxy:v1.12.0
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.2.24
k8s.gcr.io/k8s-dns-kube-dns:1.14.13
k8s.gcr.io/k8s-dns-sidecar:1.14.13
k8s.gcr.io/k8s-dns-dnsmasq-nanny:1.14.13

slave節點只需要kube-proxy和pause這兩個映象就行了。

備註:

  1. 1.12.0版本之前,映象形式是需要帶體系結構名的:映象字首-${ARCH}:tag,如k8s.gcr.io/kube-proxy-arm:v1.11.2,從1.12.0開始,不再帶體系結構名。但是後來發現使用不帶體系結構的映象是不行的,會報錯standard_init_linux.go:190: exec user process caused "exec format error",還是要用帶-arm的映象。
  2. 預設會使用coredns,但是coredns目前沒有1.2.2版的arm架構映象,所以通過指定--feature-gates CoreDNS=false來使用kubedns

1.由於gcr.io被牆,從anjia0532映象地址下載:

docker pull anjia0532/google-containers.kube-proxy-arm:v1.12.0
docker pull anjia0532/google-containers.pause-arm:3.1

2.重新打回k8s.gcr.io的映象tag:
由於yaml檔案裡指定的映象都不帶-arm,所以,還需要將映象中的-arm去掉

docker tag anjia0532/google-containers.kube-proxy-arm:v1.12.0 k8s.gcr.io/kube-proxy:v1.12.0
docker tag anjia0532/google-containers.pause-arm:3.1 k8s.gcr.io/pause:3.1

2.2.2 flannel網路元件部署

flannel的部署只會初始化一些cni的配置檔案,並不會部署cni的可執行檔案,需要手動部署,所以flannel部署分為兩步:

  • CNI外掛部署
  • flannel組價部署

步驟一.CNI外掛部署(所有節點)

1.建立cni外掛目錄

sudo mkdir -p /opt/cni/bin && cd /opt/cni/bin

2.到release頁面下載arm架構二進位制檔案

sudo wget https://github.com/containernetworking/plugins/releases/download/v0.7.1/cni-plugins-arm-v0.7.1.tgz

3.在/opt/cni/bin目錄下解壓即安裝好

sudo tar -zxvf cni-plugins-arm-v0.7.1.tgz

添加了如下外掛:

[[email protected] ]$ ll /opt/cni/bin
總用量 60032
-rwxr-xr-x 1 root root  3653505 4月  12  2018 bridge
-rw-r--r-- 1 pi   pi   16051784 9月  27 17:37 cni-plugins-arm-v0.7.1.tgz
-rwxr-xr-x 1 root root  8843152 4月  12  2018 dhcp
-rwxr-xr-x 1 root root  2600302 4月  12  2018 flannel
-rwxr-xr-x 1 root root  2886491 4月  12  2018 host-device
-rwxr-xr-x 1 root root  2812425 4月  12  2018 host-local
-rwxr-xr-x 1 root root  3300255 4月  12  2018 ipvlan
-rwxr-xr-x 1 root root  2819115 4月  12  2018 loopback
-rwxr-xr-x 1 root root  3303763 4月  12  2018 macvlan
-rwxr-xr-x 1 root root  3232319 4月  12  2018 portmap
-rwxr-xr-x 1 root root  3651705 4月  12  2018 ptp
-rwxr-xr-x 1 root root  2392245 4月  12  2018 sample
-rwxr-xr-x 1 root root  2602702 4月  12  2018 tuning
-rwxr-xr-x 1 root root  3300211 4月  12  2018 vlan

4.將master節點上的/etc/cni資料夾拷貝到開發版相同目錄。

步驟二.flannel部署

只要下載好flannel所需映象就可以了,daemonset啟動的flannel會自動在開發板上建立好flannel pod。

下載arm架構的映象,並重新打tag成x64的,以騙過daemonset:

docker pull fishead/quay.io.coreos.flannel:v0.10.0-arm
docker tag fishead/quay.io.coreos.flannel:v0.10.0-arm quay.io/coreos/flannel:v0.10.0-amd64

2.3 kubeadm join加入叢集

$ sudo kubeadm join 192.168.1.175:6443 --token c6bo2p.zxkibq1kabcatnfr --discovery-token-ca-cert-hash sha256:e0ab2c29fe3bc09a6a981c102e68fd312dba64443ac5642d9e0c5c37c915f0b2 --ignore-preflight-errors RequiredIPVSKernelModulesAvailable

備註:其中的token,是建立master節點時生成的。

加入成功顯示如下資訊:

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the master to see this node join the cluster.

此時在master節點可以看到樹莓派接入進來了,並執行正常:


再給樹莓派設定一下角色:

$ kubectl label node raspberrypi node-role.kubernetes.io/node=

備註:

  1. 確保沒有設定http_proxy和https_proxy代理
  2. 加入節點如果遇到問題,可以使用下面的命令進行清理再重新初始化:
    sudo kubeadm reset

3.試用

在筆記本的master節點往arm節點發佈一個nginx試試:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-test
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx-test
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-test
spec:
  ports:
  - name: nginx-test
    port: 80
    targetPort: 80
  selector:
    app: nginx

效果:

更多精彩內容,請訂閱本人微信公眾號:K8SPractice
這裡寫圖片描述

如果覺得我的文章對您有用,請隨意打賞。您的支援將鼓勵我繼續創作!

支付寶: