Kubeadm快速部署kubernetes
本文基于kubeadm快速部署一套Kubernetes集群用于个人学习和测试,针对国内网络环境选择合适的镜像源,减少镜像下载时间,并安装calico网络插件。
环境准备
本次环境由两台虚拟机来部署,安装CentOS7.6系统:
主机名 | IP |
---|---|
master | 10.0.0.3 |
node1 | 10.0.0.4 |
配置hostname与host
分别在两台主机上执行命令,修改主机名:
1 | 10.0.0.3节点 |
hostnamectl 命令会替换
/etc/hostname
文件中的主机名,保证重启后主机名还是生效;hostname 命令可以临时修改主机名,重启后失效。
两台机器都要配置host,允许主机通过主机名直接通信,/etc/hosts
文件添加一下配置:
1 | 10.0.0.3 master |
关闭防火墙
1 | systemctl stop firewalld |
关闭selinux
1 | sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config # 永久 需重启 |
关闭swap
1 | swapoff -a |
若要启用swap设备,则需要在集群初始化时添加 --ignore-preflight-errors=swap
,可忽略因swap设备导致的报错。
关闭ipv6
1 | echo net.ipv6.conf.all.disable_ipv6=1 >> /etc/sysctl.conf |
将桥接的ipv4流量传递到iptables
1 | cat >/etc/sysctl.d/kubernetes.conf << EOF |
这个不知道什么意思但是通过Kubeadm安装Kubenetes集群时会校验。这里也搜到一篇文章说明
net.bridge.bridge-nf-call-iptables的作用
参数作用,不明所以。
安装Docker
容器运行时是运行容器的基础,有多种可选的容器运行时,这里选择kubernetes默认的Docker。
1 | 安装 yum-utils |
并且配置Docker的Cgroup Driver为systemd:
1 | vi /etc/docker/daemon.json |
什么是cgroups?
首先说下容器是什么?容器是一个视图隔离、资源可限制、独立文件系统的进程集合。cgroups(Control Groups) 是 linux 内核提供的一种机制,作用就是可以对资源进行限制。此外,视图隔离是通过namespace实现,而文件系统是通过chroot实现。
为什么要修改Cgroup Driver?
Docker默认的Cgroup Driver是cgroupfs,而Kubernetes 推荐使用 systemd 来代替 cgroupfs。如果不修改,那么同时运行有两个cgroup控制管理器,当资源有压力的情况时,有可能出现不稳定的情况。并且在kubeadm init时也会出现警告。
master节点配置免密登录node节点
1 | ssh-keygen -t rsa # 一路默认回车即可 |
集群部署
安装kubeadm、kubelet、kubectl
以下操作在所有节点进行
添加阿里云YUM源
1
2
3
4
5
6
7
8
9cat >/etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF指定版本安装软件,这里安装1.19.8版本,1.20不再把Docker作为默认的容器运行时,所以这里选择1.19版本
1
2yum install -y kubelet-1.19.8 kubeadm-1.19.8 kubectl-1.19.8
systemctl enable kubeletMaster节点安装
1 | kubeadm init --kubernetes-version=1.19.8 --image-repository=registry.aliyuncs.com/google_containers |
安装成功之后,按照提示执行下列命令:
1 | mkdir -p $HOME/.kube |
同时要记住打印出的下列命令,用于添加Node节点:
1 | kubeadm join 10.0.0.3:6443 --token j91yvn.qvhw9t0n0nvjd9j7 \ |
若没注意,可通过kubeadm token list
查看当前的token,默认有效期为24小时,若忘记token或token过期,可使用命令kubeadm token create --print-join-command
重新生成,若初始有问题可通过命令kubeadm reset
重置。
启动kubelet:
1 | systemctl start kubelet |
Node节点安装
1 | systemctl start kubelet |
安装calico
master与node节点安装好之后,获取一下节点信息:
1 | kubectl get nodes |
可以看到master节点与node1节点都处于NotReady状态。查看kubelet的状态:
1 | systemctl status kubelet |
No networks found in /etc/cni/net.d
这行错误信息表示节点没有CNI网络插件,这是因为kubeadm目标是在不安装其他功能插件的基础上,建立一个通过Kubernetes一致性测试Kubernetes Conformance tests的最小可行集群。它在设计上并不会安装网络解决方案,而是需要用户自行安装第三方符合CNI的网络解决方案(如:flannel,calico,weave network等)。
fannel和calico算是目前网络实现最热门的2个插件,经过简单的对比,calico在性能更好以外,还可以与服务网格 Istio 集成,所以毫不犹豫的选择calico。
1 | curl https://docs.projectcalico.org/manifests/calico.yaml -o calico.yaml |
1 | kubectl apply -f calico.yaml |
安装好calico相关组件之后,再次查看节点状态变为Ready:
再查看基础应用:
到此,一个kubenetes集群就搭建完毕,可以在该集群上创建deployment部署应用,创建service暴露服务了。