4. Kubernetes集群安装

4.1 master节点部署

4.1.1 提前下载所需镜像

看一下kubernetes v1.15.1需要哪些镜像:

$ kubeadm config images list --kubernetes-version=v1.15.1

k8s.gcr.io/kube-apiserver:v1.15.1

k8s.gcr.io/kube-controller-manager:v1.15.1

k8s.gcr.io/kube-scheduler:v1.15.1

k8s.gcr.io/kube-proxy:v1.15.1

k8s.gcr.io/pause:3.1

k8s.gcr.io/etcd:3.3.10

k8s.gcr.io/coredns:1.3.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的镜像。

默认会使用coredns,但是coredns目前没有1.2.2版的arm架构镜像,所以通过指定--feature-gates CoreDNS=false来使用kubedns(1.15.1版本执行会提示feature-gate key is deprecated: CoreDNS;命令执行失败,暂时先按照所有资源拉取镜像)

1.由于gcr.io被墙,从阿里云镜像地址下载:

sudo docker pull registry.us-west-1.aliyuncs.com/mayi_space/kube-apiserver:v1.15.1

sudo docker pull registry.us-west-1.aliyuncs.com/mayi_space/kube-controller-manager:v1.15.1

sudo docker pull registry.us-west-1.aliyuncs.com/mayi_space/kube-scheduler:v1.15.1

sudo docker pull registry.us-west-1.aliyuncs.com/mayi_space/kube-proxy:v1.15.1

sudo docker pull registry.us-west-1.aliyuncs.com/mayi_space/pause:3.1

sudo docker pull registry.us-west-1.aliyuncs.com/mayi_space/etcd:3.3.10

sudo docker pull registry.us-west-1.aliyuncs.com/mayi_space/coredns:1.3.1

2.重新打回k8s.gcr.io的镜像tag:

由于yaml文件里指定的镜像都不带-arm,所以,还需要将镜像中的-arm去掉

sudo docker tag registry.us-west-1.aliyuncs.com/mayi_space/kube-apiserver:v1.15.1 k8s.gcr.io/kube-apiserver:v1.15.1

sudo docker tag registry.us-west-1.aliyuncs.com/mayi_space/kube-controller-manager:v1.15.1 k8s.gcr.io/kube-controller-manager:v1.15.1

sudo docker tag registry.us-west-1.aliyuncs.com/mayi_space/kube-scheduler:v1.15.1 k8s.gcr.io/kube-scheduler:v1.15.1

sudo docker tag registry.us-west-1.aliyuncs.com/mayi_space/kube-proxy:v1.15.1 k8s.gcr.io/kube-proxy:v1.15.1

sudo docker tag registry.us-west-1.aliyuncs.com/mayi_space/pause:3.1 k8s.gcr.io/pause:3.1

sudo docker tag registry.us-west-1.aliyuncs.com/mayi_space/etcd:3.3.10 k8s.gcr.io/etcd:3.3.10

sudo docker tag registry.us-west-1.aliyuncs.com/mayi_space/coredns:1.3.1 k8s.gcr.io/coredns:1.3.1

4.1.2 kubeadm init初始化集群

1.加载所需的内核模块:

$ sudo modprobe br_netfilter

设置开机自动加载,打开/etc/rc.local,加入如下内容:

modprobe br_netfilter

2.部署:

sudo kubeadm init --apiserver-advertise-address=192.168.1.101 --pod-network-cidr=172.16.0.0/16 --service-cidr=10.233.0.0/16 --kubernetes-version=v1.15.1 --feature-gates CoreDNS=false

3.部署成功会输出如下内容:

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube

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

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

You should now deploy a pod network to the cluster.

Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:

https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node

as root:

kubeadm join 192.168.1.192:6443 --token gomx6b.u5or5yxkm8orths8 --discovery-token-ca-cert-hash sha256:24fa1c34e97b14f85b06726e5f4d1987c61da978e2f740d829280a84f54aa8f2

记下其中的token,加入node节点时会用到。

备注:

确保没有设置http_proxy和https_proxy代理,kubeadm init过程首先会检查代理服务器,确定跟kube-apiserver等的 http/https 连接方式,如果有代理设置可能会有问题导致不能访问自身和内网。 需要在/etc/profile中增加kubeadm init指定的apiserver-advertise-address、pod-network-cidr、service-cidr三个地址段到no_proxy里后重试:export no_proxy=10.142.232.155,192.168.0.0/16,10.233.0.0/16

集群初始化如果遇到问题,可以使用下面的命令进行清理再重新初始化:

sudo kubeadm reset

4.1.3 检查kubelet使用的cgroup driver

kubelet启动时指定的cgroup driver需要和docker所使用的保持一致。

1.查看 Docker 使用的 cgroup driver:

$ docker info | grep -i cgroup

-> Cgroup Driver: cgroupfs

可以看出docker 17.03默认使用的Cgroup Driver为cgroupfs。

2.查看kubelet指定的cgroup driver

Kubernetes文档中kubelet的启动参数--cgroup-driver string Driver that the kubelet uses to manipulate cgroups on the host. Possible values: 'cgroupfs', 'systemd' (default "cgroupfs")。默认值为cgroupfs。yum安装kubelet、kubeadm时生成10-kubeadm.conf文件中可能将这个参数值改成了systemd。

查看kubelet的配置文件(1.12.0版本的封装在/var/lib/kubelet/kubeadm-flags.env文件中),如果是默认的cgroupfs,不需要修改。否则需要修改/etc/default/kubelet(或者/var/lib/kubelet/kubeadm-flags.env)文件:

$ sudo vim /etc/default/kubelet

KUBELET_KUBEADM_EXTRA_ARGS=--cgroup-driver=$ sudo systemctl daemon-reload

$ sudo systemctl restart kubelet

参考:https://kubernetes.io/docs/setup/independent/install-kubeadm/#configure-cgroup-driver-used-by-kubelet-on-master-node

4.1.4 创建kubectl使用的kubeconfig文件

$ mkdir -p $HOME/.kube

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

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

创建完成即可使用kubectl操作集群。

4.1.5 设置master参与工作负载

使用kubeadm初始化的集群,将master节点做了taint(污点),使得默认情况下(不设置容忍)Pod不会被调度到master上。这里搭建的是测试环境可以使用下面的命令去掉master的taint,使master参与工作负载:

$ kubectl taint nodes --all node-role.kubernetes.io/master-

node/raspberrypi untainted

备注:

本部分参考:https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm-init/

4.2 网络部署

可以选择不同的网络插件,但是calico目前没有32位arm的镜像(只有arm64),本文介绍flannel的部署。

4.2.1 flannel网络部署

flannel的部署只会初始化一些cni的配置文件,并不会部署cni的可执行文件,需要手动部署,所以flannel部署分为两步:

CNI插件部署

flannel组价部署

步骤一.CNI插件部署(所有节点)

1.创建cni插件目录

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

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

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

步骤二.flannel部署

1.获取yaml文件

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

2.修改配置文件

<1>保留arm的daemonset,删除其他架构的daemonset

<2>修改其中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

可以参考这个issue:https://github.com/coreos/flannel/issues/1044

3.提前下载所需镜像

下载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-arm

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/

4.3 slave节点部署

同样按照上述步骤安装好docker、kubelet,然后在slave节点上执行以下命令即可加入集群:

kubeadm join 192.168.1.192:6443 --token 4k5jyn.2ss2zcn44c7e7zc1 --discovery-token-ca-cert-hash sha256:0e3e9348b5372aceedab8ca5f3e6537d5eaf7134dce24523f512c0ef2f1a54f6

---------------------

版权声明:本文为CSDN博主「liukuan73」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/liukuan73/article/details/83150473

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐