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节点就比较简单了,只需要完成以下几个步骤:
- 按照一中的方法,安装Docker和Kubeadm
- 按照2.4的提示,执行
kubeadm join