K8s集群搭建

Kubernetes是目前最火的容器编排工具,其安装部署有很多种方式,比如可以通过直接编译二进制文件的方式,或者通过kubeadm的方式,以及使用目前很火的使用rancher的方式等。今天这里来介绍一下使用kubeadm的方式进行安装。我这里使用的操作系统为ubuntu16.04,这个集群由1个Master和2个Node节点组成

一、安装kubeadm和Docker

curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -

cat <<EOF> /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

apt-get update

apt-get install -y docker.io kubeadm

二、部署Master节点

安装完成kubeadm后,就可以通过使用命令kubeadm init来直接安装Master节点了,但是也可以修改一些kubeadm的默认参数,使用yaml文件来安装和部署K8s。例如,配置文件(kubeadm.yaml)内容如下所示:

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
controllerManager:
    extraArgs:
        horizontal-pod-autoscaler-use-rest-clients: "true"
        horizontal-pod-autoscaler-sync-period: "10s"
        node-monitor-grace-period: "10s"
apiServer:
    extraArgs:
        runtime-config: "api/all=true"

使用上面的配置文件进行安装时,就需要使用--config参数:

kubeadm init --config kubeadm.yaml

直接使用上述命令进行部署的时候,由于GWF的关系,可能会出现无法拉取镜像的问题,要想解决这些问题,主要有两种方法:

  • 手动从docker hub上拉取镜像:用docker直接从docker hub上把相应的镜像pull下来,然后再重新打tag。
  • 直接修改kubeadm的配置文件

2.1 手动从Docker Hub上拉取需要的镜像

首先介绍一种比较复杂的方式

2.1.1 查看依赖的景象

K8s安装依赖的主要有pause等7个镜像(取决于具体的版本),想要查看所依赖的镜像及其版本号,可以使用如下命令进行查看:

$ kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.18.9
k8s.gcr.io/kube-controller-manager:v1.18.9
k8s.gcr.io/kube-scheduler:v1.18.9
k8s.gcr.io/kube-proxy:v1.18.9
k8s.gcr.io/pause:3.2
k8s.gcr.io/etcd:3.4.3-0
k8s.gcr.io/coredns:1.6.7

2.1.2 拉取镜像

这里我选择了一个我比较喜欢的镜像gotok8s,因为都有MD5作为验证,所以也不必太过于担心安全性的问题:

docker pull gotok8s/kube-apiserver:v1.18.6
docker pull gotok8s/kube-proxy:v1.18.6
docker pull gotok8s/kube-controller-manager:v1.18.6
docker pull gotok8s/kube-scheduler:v1.18.6
docker pull gotok8s/pause:3.2
docker pull gotok8s/coredns:1.6.7
docker pull gotok8s/etcd:3.4.3-0

拉取上述镜像到本地后,就可以使用docker tag命令来修改上述镜像的名称了,其命令为:

docker tag <image_id> <new_tag>

2.2 直接修改Kubeadm的配置文件

上面的步骤比较繁琐,也可以直接修改刚才编写的kubeadm.yaml文件,在其最后添加一行,使其变为:

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
controllerManager:
    extraArgs:
        horizontal-pod-autoscaler-use-rest-clients: "true"
        horizontal-pod-autoscaler-sync-period: "10s"
        node-monitor-grace-period: "10s"
apiServer:
    extraArgs:
        runtime-config: "api/all=true"
kubernetesVersion: "v1.18.6"
imageRepository: docker.io/gotok8s

2.3 修改hosts文件

在hosts文件中添加如下内容:

127.0.0.1 master

2.4 安装网络插件

可选择的网络查件很多,我们这里使用了weave插件,其安装方法如下:

kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

因为各个组件的安装方法不尽相同,而且安装方法也在随时变化,建议在安装前还是要查看一下官网或者github的说明。

安装完成网络插件后,系统会提示:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

以及Work节点加入K8s的方法:

kubeadm join 192.168.32.98:6443 --token x1gr7l.dh278sujy91c8jvg \
    --discovery-token-ca-cert-hash sha256:21e1d7145514212060361a120a5811017f647c1ab2236ba24b44c61f4d10c387

2.5 其他注意事项

2.5.1 关闭swap

在K8s中要求必须关闭swap分区,因此需要执行:

swapoff -a

同时注释掉/etc/fstab中与swap相关的分区信息

2.5.2 coredns CrashLoopBackOff错误

要解决这个问题,主要参考了这篇文章:

https://linuxroutes.com/resolution-kube-system-coredns-crashloopbackoff-error/

具体做法如下:

  • kubectl -n kube-system edit configmap coredns

  • 在打开的配置文件中,找到loop这一行,并将其注释掉

  • 删除掉含有core-dns的pods:

    kubectl -n kube-system delete pod -l k8s-app=kube-dns
    

2.5.3 kube-proxy-***** ImagePullBackOff

这个我弄了好久,终于搞清楚了,原因是在work node上也要拉取k8s.gcr.io/kube-proxy的镜像

三、部署Work节点

部署Work节点就比较简单了,只需要完成以下几个步骤:

  1. 按照一中的方法,安装Docker和Kubeadm
  2. 按照2.4的提示,执行
kubeadm join