实践kubernetns的第一步即安装部署测试环境。
本文采用官方推荐的kubeadm(官方英文文档:link)快速搭建一套多节点kubernetes集群环境,从而上手熟悉和学习kubernetes项目。
本文持续更新中,最近更新时间2020-07-31。
部署一套测试的kubernetes环境(1.16.0版本),包含以下两种节点:
虚拟机:vmware(实体机更佳),2G内存以上,2个CPU以上,2-3台
Centos7系统,本文使用系统如下,
# hostnamectl set-hostname $主机名
hostnamectl set-hostname k8s-master
systemctl stop firewalld
systemctl disable firewalld
#临时关闭
setenforce 0
#永久关闭,重启生效。该命令本质是改配置文件,可以先cat文件查看原有内容
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
#临时关闭
swapoff -a
#永久关闭,重启生效。该命令本质是改配置文件,可以先cat文件查看原有内容
sed -i.bak '/swap/s/^/#/' /etc/fstab
#检查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
由于一般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的官方源国内无法访问,所以为了顺利安装kubeadm、kubelet、kubectl组件,本文更改使用了阿里云的yum源。
#安装对应包,指定版本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部署所需要的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执行成功之后,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,原因为还未部署容器网络插件。
上一节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文件中。
部署flannel
kubectl apply -f kube-flannel.yml
至此,控制节点部署完成,接下去开始部署工作节点
工作节点的系统配置、安装前准备和控制节点保持一致
工作节点只需要执行kubeadm join命令即可加入kubernetes集群,命令来源为控制节点执行kubeadm init时最后输出的部分!
kubeadm join 192.168.50.202:6443 --token dav0mt.nfk8kj3a6wfhup6k --discovery-token-ca-cert-hash sha256:bff27c7dc1b259d966b119ba39999d9399b7bf000061e9fe06bc66b7026113ee
此时在控制节点上,执行kubectl get node -o wide则可以看到新加进来的节点,但是状态仍然为NotReady,原因同控制节点部署中一样为容器网络插件还未初始化。
至此,工作节点部署完成,其他工作节点部署和本工作节点部署方式一致
当前测试环境中,我们部署了一台控制节点、一台工作节点组成了节点集群(后续会再部署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