使用amd64架构master节点管理arm架构kubernetes集群

1. master节点部署

1.1 基础部署

参照Ubuntu-18.04使用kubeadm安装kubernetes-1.12.0的4.1(含)章节以前的步骤部署好amd64架构的kubernetes master节点。

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

2.到release页面下载二进制文件

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

添加了如下插件:

[docker@k8s ]$ 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 基础部署

参照树莓派3B+使用kubeadm部署kubernetes-1.12.0前三章部署好基础环境

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

添加了如下插件:

[docker@k8s ]$ 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
使用amd64架构master节点管理arm架构kubernetes集群_第1张图片


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

支付宝:                                                      
使用amd64架构master节点管理arm架构kubernetes集群_第2张图片

你可能感兴趣的:(kubernetes)