1. 前言
我们在前面的几篇文章中讲解了Kubernetes的相关概念,接下来我们进入实战,从零搭建Kubernetes集群。
2. 集群搭建方式
Kubernetes集群的搭建方式主要有以下几种:
1.kubeadm
优点:
- 易于使用:
kubeadm
提供了简单的命令行工具来初始化和管理Kubernetes集群。 - 社区支持:由于是官方提供的工具,因此有广泛的社区支持和文档。
- 版本控制:可以轻松升级和降级Kubernetes版本。
- 自定义:支持自定义配置,可以根据需求调整集群设置。
- 缺点:
- 生产就绪:默认配置可能不适合生产环境,需要额外的配置和调优。
- 学习曲线:对于新手来说,可能需要一定时间来理解和学习
kubeadm
的工作原理。
2.Minikube
- 优点:
- 易于启动:适合快速启动一个本地的Kubernetes环境进行开发和测试。
- 无需外部依赖:可以在个人电脑上运行,不需要额外的物理或虚拟机。
- 缺点:
- 单节点:仅适用于单节点集群,不适合生产环境。
- 功能有限:某些Kubernetes功能可能无法在Minikube中完全支持。
3.Kind (Kubernetes in Docker)
- 优点:
- 快速部署:可以在Docker容器中运行Kubernetes集群,非常适合本地开发和测试。
- 无需虚拟机:与Minikube类似,Kind也不需要额外的虚拟机。
- 缺点:
- Docker依赖:依赖于Docker环境,不支持其他容器运行时。
- 同样适用于单节点环境,不适合生产部署。
4.手动搭建
- 优点:
- 完全控制:可以完全自定义集群的每个组件和配置。
- 理解深入:通过手动搭建,可以更深入地理解Kubernetes的内部结构和组件交互。
- 缺点:
- 复杂性:手动搭建过程复杂,容易出错。
- 维护困难:升级和故障排查需要更多的手工操作。
5.自动化工具(如Ansible, Terraform)
- 优点:
- 自动化:可以自动化集群的部署和配置过程,减少人为错误。
- 可重复:脚本可以重复使用,便于管理多个集群。
- 缺点:
- 学习成本:需要学习额外的工具和脚本语言。
- 维护脚本:随着集群的变化,脚本可能需要更新和维护。
6.托管服务(如GKE, EKS, AKS)
- 优点:
- 管理简单:云提供商管理Kubernetes的控制平面,用户只需管理工作节点。
- 高可用:通常提供高可用性和自动扩展功能。
- 与云服务集成:与云提供商的其他服务(如存储、网络)集成良好。
- 缺点:
- 成本:可能需要支付额外的费用。
- 云提供商依赖:锁定到特定的云提供商。
每种搭建方式都有其适用场景和优缺点。选择哪种方式取决于你的需求、资源、技能和预算。对于学习和测试环境,我们采用kubeadm来搭建集群
3. 环境说明
- 操作系统:CentOs7.6
- Docker:20+
- k8s:1.23.6
- 主节点云服务器:4H8G
- 从节点云服务器:4H4G
云服务器最低配置推荐:2核,2G内存,20G硬盘,学习的话购买2H2G的就够用啦
4. 利用kubeadm初始化Master结点
4.1. 初始操作
关闭防火墙
systemctl stop firewalld systemctl disable firewalld
关闭 selinux
sed -i 's/enforcing/disabled/' /etc/selinux/config # 永久 setenforce 0 # 临时
关闭swap,关闭完swap后要重启一遍机器!
swapoff -a # 临时 sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
根据规划设置主机名
hostnamectl set-hostname 这里填你的主机名(随便起,比如k8s-master)
在master添加hosts配置
cat >> /etc/hosts << EOF 192.168.113.120 k8s-master 192.168.113.121 k8s-node1 192.168.113.122 k8s-node2 EOF
将桥接的IPv4流量传递到iptables的链
cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
让上述配置生效
sysctl --system
同步机器时间
yum install ntpdate -y ntpdate time.windows.com
4.2 安装基础软件(全部结点都要安装)
安装docker(使用官方的自动脚本)
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
启动docker
sudo systemctl start docker
添加阿里云镜像源
cat > /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
安装kubeadm、kubelet、kubectl
yum install -y kubelet-1.23.6 kubeadm-1.23.6 kubectl-1.23.6 systemctl enable kubelet
配置关闭 Docker 的 cgroups(不关闭后面启动会报错),修改 /etc/docker/daemon.json(如果没有这个文件就手动创建),加入以下内容
{"exec-opts": ["native.cgroupdriver=systemd"]}
重启docker
systemctl daemon-reload systemctl restart docker
4.3. 部署Kubernetes Master结点
初始化master结点,其中apiserver-advertise-address改为自己的公网地址即可
kubeadm init \ --apiserver-advertise-address=192.168.113.120 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.6 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16
初始化成功会提示control-plane has initialized successfully!
如果遇到如下报错,提示端口被占用
可输入kubeadm reset指令清除上次初始化生成的配置,再次调用init初始化即可
安装成功后,复制如下配置并执行
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
输入kubectl get nodes来测试结点是否配置启动成功,如果显示下述信息,那么代表你master已经启动好啦~
5. 总结
本次我们先简单的搭建了Master结点,下一次我们将继续部署从节点,并部署CNI网络插件,实现不同结点间的相互通信。