Kubernetes(K8S) 入门进阶实战完整教程-02k8s集群环境的搭建
本章主要介绍如何搭建Kubernetes的集群环境
环境规划
- 集群类型
● Kubernetes集群大致分为两类:一主多从和多主多从。
● 一主多从:一个Master节点和多台Node节点,搭建简单,但是有单机故障风险,适合用于测试环境。
● 多主多从:多台Master和多台Node节点,搭建麻烦,安全性高,适合用于生产环境。
为了测试方便,本次搭建的是一主多从类型的集群。 - 安装方式
● kubernetes有多种部署方式,目前主流的方式有kubeadm、minikube、二进制包。
● ① minikube:一个用于快速搭建单节点的kubernetes工具。
● ② kubeadm:一个用于快速搭建kubernetes集群的工具。
● ③ 二进制包:从官网上下载每个组件的二进制包,依次去安装,此方式对于理解kubernetes组件更加有效。
们需要安装kubernetes的集群环境,但是又不想过于麻烦,所以选择kubeadm方式 - 主机规划
| 角色 | IP地址 | 操作系统 | 配置 |
| ------ | -------------- | ------------------------- | ---------------- ------|
| Master | 192.168.18.100 | CentOS7.8+,基础设施服务器 | 2核CPU,2G内存,50G硬盘 |
| Node1 | 192.168.18.101 | CentOS7.8+,基础设施服务器 | 2核CPU,2G内存,50G硬盘 |
| Node2 | 192.168.18.102 | CentOS7.8+,基础设施服务器 | 2核CPU,2G内存,50G硬盘 |
环境搭建
本次环境搭建需要三台CentOS服务器(一主二从),然后在每台服务器中分别安装Docker(20.10.16)、kubeadm(1.24.0)、kubectl(1.24.0)和kubelet(1.24.0)。
环境初始化
注意:三台机器上需要都执行下面的步骤
- 检查操作系统的版本
kubeadm的方式安装kubernetes集群要求centos必须大于等于7.5版本
cat /etc/centos-release
- 主机名解析
为了方便后面集群节点间的直接调用,需要配置一下主机名解析,企业中推荐使用内部的DNS服务器。
cat >> /etc/hosts << EOF
192.168.10.100 master
192.168.10.101 node1
192.168.10.102 node2
EOF
- 时间同步
kubernetes要求集群中的时间节点必须精确一致,这里直接使用chronyd服务从网络同步时间
systemctl start chronyd // 使用chronyd从网络同步时间
systemctl enable chronyd // 设置开机自启动
date // 查看三台机器的时间是否一致
- 禁用iptables和firewalld服务
kubernetes和docker在运行中会产生大量的iptables规则,为了不让系统规则跟她们混淆,直接关闭系统的规则
- 关闭firewalld服务
systemctl stop firewalld // 关闭防火墙
systemctl disable firewalld
- 关闭iptables服务(由于我们安装的这个系统没有iptables,所以这两步可以省略)
systemctl stop iptables
systemctl disable iptables
- 禁用selinux
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题
# 编辑/etc/selinux/config文件,修改SELINUX的值为disabled
# 注意修改完毕之后,需要重启linux服务
SELINUX=disabled
- 禁用swap分区
swap分区指的是虚拟内存分区,它的作用是在物理内存使用完毕之后,将磁盘空间虚拟成内存来使用,
启用swap设备会对系统性能产生非常负面的影响,因此Kubernetes要求每个节点都禁用swap设备,
但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明
# 编辑分区配置文件/etc/fstab, 注释掉swap分区一行
# 注意修改完毕之后需要重启linux服务
UUID=2b656af8-658c-4698-a3a1-30f715017156 /boot
xfs defaults 0 0
# /dev/mapper/centos-swap swap swap defaults
- 修改linux的内核参数
# 修改linux内核参数,添加网桥过滤和地址转发功能
# 编辑/etc/sysctl.d/kubernetes.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
# 重新加载配置,注意在终端中执行
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
# 查看网桥过滤模块是否加载成功
lsmod | grep br_netfilter
- 配置ipvs功能
在kubernetes中service有两种代理模型,一种是基于iptables的,另一种是基于ipvs的,
两者比较的话,ipvs的性能要更高一些,但是如果要使用它,需要手动载入ipvs模块
# 1. 安装ipset和ipvsadm
yum -y install ipset ipvsadm
# 2. 添加需要加载的模块写入脚本文件
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF
# 3. 为脚本文件添加执行权限
chmod +x /etc/sysconfig/modules/ipvs.modules
# 4. 执行脚本文件
/bin/bash /etc/sysconfig/modules/ipvs.modules
# 5. 查看对应的模块是否加载成功
lsmod | grep -e ip_vs -e nf_conntrack_ipv4
- 重启服务器
上面8步完成之后,需要重启linux服务器
reboot
集群所需组件安装
注意:三台服务器上都需要执行
- 安装docker
# 1. 切换镜像源
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 2. 查看当前镜像源中支持的docker版本
yum list docker-ce --showduplicates
# 3. 安装特定版本的docker-ce
# 必须指定--setopt=obsoletes=0,否则yum会自动安装更高版本
yum install --setopt=obsoletes=0 docker-ce-18.06.3.ce-3.el7 -y
# 4. 添加一个配置文件
# docker在默认情况下使用Cgroup Driver为cgroupfs, 而kubernetes推荐使用systemd来代替cgroupfs
mkdir /etc/docker
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://3b8ygbtk.mirror.aliyuncs.com"]
}
EOF
# 5. 启动docker
systemctl start docker
systemctl enable docker
- 安装kubernetes组件
# 由于kubernetes的镜像源在国外,非常慢,这里切换成国内的阿里云镜像源
# 编辑/etc/yum.repos.d/kubernetes.repo, 添加下面配置
[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
# 安装kubeadm kubelet kubectl
# 由于版本更新频繁,这里指定版本号部署:
yum install --setopt=obsoletes=0 kubeadm-1.17.4-0 kubelet-1.17.4-0 kubectl-1.17.4-0 -y
# 配置kubelet的cgroup
# 为了实现Docker使用的cgroup drvier和kubelet使用的cgroup drver一致,建议修改"/etc/sysconfig/kubelet"文件的内容:
# 编辑/etc/sysconfig/kubelet, 添加下面配置(原有文件里面有一行直接删除掉就可以)
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
# 设置kubelet开机自启,由于没有生成配置文件,集群初始化后自动启动
systemctl enable kubelet
集群安装
- 准备集群镜像
注意:准备集群镜像需要在3台机器上全部执行
# 在安装kubernetes集群之前,必须要提前准备好集群所需的镜像,所需可以通过下面命令查看
kubeadm config images list
# 下载镜像
# 此镜像在kubernetes仓库中,由于网络原因无法下载,下面提供了一种替代方案
images=(
kube-apiserver:v1.17.4
kube-controller-manager:v1.17.4
kube-scheduler:v1.17.4
kube-proxy:v1.17.4
pause:3.1
etcd:3.4.3-0
coredns:1.6.5
)
for imageName in ${images[@]} ; do
docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
docker tag registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName k8s.gcr.io/$imageName
docker rmi registry.cn-hangzhou.aliyuncs.com/google_containers/$imageName
done
- 下面开始对集群进行初始化,并将node节点加入到集群当中
注意:下面的操作只需要在master节点上操作即可
# 创建集群
kubeadm init \
--kubernetes-version=v1.17.4 \
--pod-network-cidr=10.244.0.0/16 \
--service-cidr=10.96.0.0/12 \
--apiserver-advertise-address=192.168.10.100
# 看到这句说,说明集群初始化成功:`Your Kubernetes control-plane has initialized successfully!`
# 根据k8s提示,创建必要文件
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 根据k8s提示,将另外两个node节点加入到集群当中
# 注意下面的命令只在两个node节点中执行
kubeadm join 192.168.10.100:6443 --token du7irt.08qlafw25zwfawde \
--discovery-token-ca-cert-hash sha256:69e684ff624fd4d87f60f7bc65dcc54633517bcb161b3229613de4874bc97a09
# 查看集群状态
kubectl get nodes
网络插件安装
kubernetes支持多种网络插件,比如flannel、calico、canal等等,任选一种使用即可,本次使用flannel
注意:下面操作依旧只在master节点执行即可,插件使用的是DaemonSet控制器,它会在每个节点上都运行
# 获取flannel的配置文件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 千万注意:有的文章说,修改文件中的quay.io仓库为quay-mirror.qiniu.com,前外不要修改,因为quay-mirror.qiniu.com根本访问不了了
# 如果网络允许的话,直接wget下载的直接使用就可以了(亲测有效),改了反而报错。
# 使用配置文件启动flannel
kubectl apply -f kube-flannel.yml
# 稍等片刻,再次查看集群节点状态
kubectl get nodes
# 查看部署CNI网络插件进度
kubectl get pods -n kube-system
# 查看集群健康状态
kubectl get cs
# 查看集群信息
kubectl cluster-info
至此kubernetes的集群环境搭建完成。
集群环境测试-服务部署
在Kubernetes集群中部署一个Nginx程序,测试下集群是否正常工作。
# 部署nginx
kubectl create deployment nginx --image=nginx:1.14-alpine
# 暴露端口
kubectl expose deployment nginx --port=80 --type=NodePort
# 查看服务状态
kubectl get pods,svc
# 使用浏览器访问一下试试吧:
# 注意: ip地址就是node节点的ip地址,port是上面查看服务状态获取到的端口
http://192.168.10.100:31704/
分类:
kubernetes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)