kubernetes快速安装部署实践目录
简介
实践kubernetns的第一步即安装部署测试环境。
本文采用官方推荐的kubeadm(官方英文文档:link)快速搭建一套多节点kubernetes集群环境,从而上手熟悉和学习kubernetes项目。
本文持续更新中,最近更新时间2020-07-31。
kubernetes部署方式
- kubeadm,官方推荐的部署方案,也是本文采用的方案。
优点:部署简单快速,理论上只需要两条部署命令即可部署一套kubernetes的测试环境。
缺点:仍不算是完善的部署方案,比较不适合在生产环境直接使用。 - kubespray,据说目前较适合用于生产环境部署的方案,待补充。
- 手动部署,如手动部署kubernetes-master和kubernetes-node。更进一步可以直接手动部署kube-apiserver等基本组件。
优点:完全自由
缺点:要求对kubernetes很熟悉,不适合新手。
本文目标
部署一套测试的kubernetes环境(1.16.0版本),包含以下两种节点:
- 控制节点,单节点部署,主要组件如下,
- etcd
- kube-apiserver
- kube-sheduler
- kube-control-manager
- kubelet
- kubectl
- coredns(插件)
- flannel(插件)
- docker(容器环境,版本docker-ce-19.03.12-3.el7,建议使用18.09版本)
- 工作节点,多节点部署,主要组件如下,
- kubelet
- kube-proxy
- flannel(插件)
- docker(容器环境,版本docker-ce-19.03.12-3.el7,建议使用18.09版本)
安装前准备(所有机器均操作)
机器和系统准备
虚拟机:vmware(实体机更佳),2G内存以上,2个CPU以上,2-3台
Centos7系统,本文使用系统如下,
系统相关配置(待补充一键运行脚本)
- 主机重命名(建议)
# hostnamectl set-hostname $主机名 hostnamectl set-hostname k8s-master
- 网络配置,保证多台机器可互相通信,略
- 关闭防火墙(推荐,否则需要额外配置放通kubernetes使用的端口)
systemctl stop firewalld systemctl disable firewalld
- 关闭SElinux(必选,因为kubelet不支持)
#临时关闭 setenforce 0 #永久关闭,重启生效。该命令本质是改配置文件,可以先cat文件查看原有内容 sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
- 关闭交换分区(建议,影响kubelet运行,也可能导致部署失败)
#临时关闭 swapoff -a #永久关闭,重启生效。该命令本质是改配置文件,可以先cat文件查看原有内容 sed -i.bak '/swap/s/^/#/' /etc/fstab
- 配置使得iptables可以发现linux网桥流量(必选,原因待确认)
#检查br_netfilter模块是否加载,docker启动后,一般该模块会自动加载 lsmod |grep br_netfilter # 如果模块不存在,则加载 modprobe br_netfilter #添加sysctl配置文件,新增sysctl配置 cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF # 配置生效 sudo sysctl --system
安装docker,运行,并设置开机自启
由于一般yum源的docker包都是开发的最新版本,因此以下添加了阿里云的镜像源从而获取到稳定版本的docker包。
安装的docker版本为2020-07月目前最新的稳定版本docker-ce-19.03.12-3.el7。目前判断该版本和kubernetes 1.16.0版本可能存在不兼容情况。如果有测试到不兼容的场景,可以根据kubernetes发布版本的发布内容选择合适的docker版本。根据kubeadm提示,目前kubernetes1.16.0版本有测试的最高docker版本为18.09版本。
#安装镜像源管理的依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
#设置镜像源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#查看docker的版本
yum list docker-ce --showduplicates | sort -r
#安装指定版本的docker
yum install docker-ce-19.03.12-3.el7
#设置docker开机自启,并启动docker
systemctl enable docker
systemctl start docker
安装kubeadm、kubelet、kubectl
同样由于kubeadm的官方源国内无法访问,所以为了顺利安装kubeadm、kubelet、kubectl组件,本文更改使用了阿里云的yum源。
- 创建/etc/yum.repos.d/kubernetes.repo文件
#将以下内容写入上述文件
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
- 安装对应组件
#安装对应包,指定版本v1.16.0,目前测试v1.17.x和v1.18.x版本均无法从阿里云镜像下包,原因未知 yum install kubeadm-1.16.0 kubelet-1.16.0 kubectl-1.16.0 #yum install kubeadm kubelet kubectl,不指定版本则默认安装最新为1.18.x版本 #设置kubelet启动,开机自启 systemctl start kubelet systemctl enable kubelet
集群部署
由于是使用kubeadm工具进行部署,理论上我们只需要在控制节点执行kubeadm init命令、工作节点执行kubeadm joint命令即可完成部署。实际具体步骤如下,
控制节点部署
kubeadm init
-
(可选)提前下载kubeadm部署所需要的docker镜像
#提前下载所需要的相关镜像,检查kubeadm镜像源的连通性 kubeadm config images pull
如果出现上述错误,即可能是无法联通k8s.gcr.io(国内基本无法访问),则可以尝试使用阿里云镜像源,增加–image-repository配置,kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.16.0
如下即表示镜像下载成功,
-
执行kubeadm init命令进行控制节点初始化
#执行kubeadm init命令进行控制节点初始化 kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version=v1.16.0 --pod-network-cidr=10.8.0.0/16 #备注1:pod-network-cidr为容器网络所需要的参数,后续部署flannel插件时需要使用 #备注2:image-repository同样使用了阿里云源,如果第1步未执行的话 #备注3:kubernetes-version和我们上述部署的kubeadm、kubelet等组件版本保持一致(建议)。
命令输出如下图,请关注红框部分,其输出即为后续需要做的操作。
关键:请保存kubeadm init的输出内容
配置kubectl
上述kubeadm执行成功之后,etcd、kube-apiserver、kube-scheduler、kube-control-manager部件其实已经以docker容器的形式部署并运行在控制节点上,可以对外提供服务了。根据上图红框的提示,我们配置kubectl后就可以执行kubernetes相关命令了。
#kubectl需要经过配置后才能与kube-apiserver正常通信,从而执行命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
#上述命令本质上就是拷贝/etc/kubernetes/admin.conf配置到该用户目录$HOME/.kube/config下
此时就可以执行kubectl命令测试了,比如执行kubectl get node查询kubernetes集群节点,可以看到当前本控制节点已经加入集群,然而状态是NotReady,原因为还未部署容器网络插件。
配置容器网络插件flannel
上一节kubectl get node命令获取到控制节点的状态为NotReady,原因为还未部署容器网络,因此kubernetes认为节点还处于不可用状态,因此接下去我们就先部署容器网络插件,当前选择flannel,因为部署简单。另外有macvlan等插件也可以选择,可以参考文档(待链接)。
由于本文选择的flannel插件部署方式也是在控制节点上以docker容器形式部署进行服务的,而flannel的docker镜像不容易下载,直接使用以下命令部署会因为flannel镜像无法下载而导致部署失败(理论上部署flannel只需要这么一条命令即可),
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
因此,我们选择了从github的flannel项目中手动下载flannel镜像的方式来避开flannel部署失败的问题。
-
从github上flannel项目(链接:https://github.com/coreos/flannel/releases)下载flannel镜像
-
上传至虚拟机,手动将flannel镜像导入docker
# 导入镜像 docker load -i flannel.v0.12.0-amd64.docker # 查询镜像 docker image list
-
下载flannel.yml文件,用于部署的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
备注:如果上述下载失败,一般是由于raw.githubusercontent.com这个地址无法解析,可以检查下dns,甚至是直接将该地址对应的IP写入host文件中。
-
修改flanne.yml文件,主要是为了适配kubeadm init时指定的pod-network-cidr配置
-
部署flannel
kubectl apply -f kube-flannel.yml
-
再次查询节点状态,
备注:上图是在部署完成之后查的状态,因此master和node1节点状态均为Ready。
至此,控制节点部署完成,接下去开始部署工作节点
工作节点部署
kubeadm join
-
工作节点的系统配置、安装前准备和控制节点保持一致
-
工作节点只需要执行kubeadm join命令即可加入kubernetes集群,命令来源为控制节点执行kubeadm init时最后输出的部分!
kubeadm join 192.168.50.202:6443 --token dav0mt.nfk8kj3a6wfhup6k --discovery-token-ca-cert-hash sha256:bff27c7dc1b259d966b119ba39999d9399b7bf000061e9fe06bc66b7026113ee
备注:如果忘了kubeadm init的输出,则需要在控制节点重新生成。待补充解决方法。 -
此时在控制节点上,执行kubectl get node -o wide则可以看到新加进来的节点,但是状态仍然为NotReady,原因同控制节点部署中一样为容器网络插件还未初始化。
容器网络部署flannel
- 在工作节点上也导入flannel镜像,步骤同控制节点
- 无需再特殊操作,稍等一会再查询集群节点状态即可。如果状态未自动恢复,可以考虑在控制节点上重新apply kube-flannel.yml。
至此,工作节点部署完成,其他工作节点部署和本工作节点部署方式一致
部署后检查和测试
节点状态
当前测试环境中,我们部署了一台控制节点、一台工作节点组成了节点集群(后续会再部署1台工作节点)。使用kubectl get node -o wide命令我们已经可以查询到节点信息和节点状态,
kubectl get nodes -o wide
组件状态
kubeadm的安装方式是将各个k8s组件以容器的方式部署在主机上的,通过kubectl我们即可查询到所有节点上的组件部署情况和运行情况,
kubectl get pods --all-namespaces -o wide
同样在控制节点上我们使用docker ps命令也能看到本节点上相关组件信息,
以kube-apiserver组件为例,通过ps命令我们即可以看到kube-apiserver的进程(docker拉起的进程),
创建资源测试
上述过程中我们已经搭建了一套kubernetes测试系统,接下去就创建个资源来熟悉下kubernetes的功能。以下以deployment资源为例,创建和管理2个centos容器。
备注:为方便测试,我在环境中又新加了一台工作节点,当前环境为1控制节点、2工作节点的环境。
-
创建deployment的配置文件centos_deployment1.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: centos labels: app: centos spec: replicas: 2 selector: matchLabels: app: centos template: metadata: labels: app: centos spec: containers: - name: centos image: centos imagePullPolicy: IfNotPresent command: [ "/bin/bash", "-c", "--" ] args: [ "while true; do sleep 30; done;" ]
-
执行kubectl命令根据配置文件创建对应资源
kubectl create -f centos-deployment1.yaml
-
之后就可以通过kubectl查询到所创建出来的deployment资源,由于副本数为2,因此创建了2个centos的容器,分别调度在2台工作节点上。
备注:如果查询到容器状态异常,则可以使用kubectl logs $name,查询下问题原因然后进行排查。一般是容器镜像无法下载,可以采用手动导入的方式,再重新执行kubectl apply -f centos-deployment1.yaml命令更新。
-
进入容器,测试两台容器的连通性
kubectl exec -it centos-666b67cd79-mwt22 /bin/bash