文章目录
- 参考内容
- 1.集群搭建的三种方式
- 2.minikube
- 3.云服务器可视化搭建
- 4.裸机搭建
1.集群搭建的三种方式
- [minikube]
K8S集群模拟器,部署时只需要一台机器(即只有一个节点),Master和Worker都在一起,仅作测试使用; - [云服务器可视化搭建]
如果机器都是云服务器,则可以通过云平台(阿里云、腾讯云等)可视化搭建,只需要简单几步就可以快速搭建好一个集群; - [裸机安装]
需要至少两台机器(Master × 1 + Worker
2.minikube
minikube运行时,模拟启动了一个Ubuntu系统,并基于此系统搭建了一个Master与Worker都在同一台机器的模拟集群。
- [安装minikube] 可以直接在网站上下载安装包,也可以在PowerShell中通过指令下载:
- [minikube常用指令]
# 启动集群
minikube start
# 查看节点。kubectl 是一个用来跟 K8S 集群进行交互的命令行工具
kubectl get node
# 停止集群
minikube stop
# 清空集群
minikube delete --all
# 安装集群可视化 Web UI 控制台
minikube dashboard
3.云服务器可视化搭建
大部分云平台(腾讯云、阿里云等)都支持可视化搭建集群。可参考视频 2.安装Kubernetes集群 按步骤搭建。
4.裸机搭建
先准备好两台机器(云服务器或虚拟机都可以),分别为:
- Master:内网IP - 192.168.245.174
- Worker1:内网IP - 192.168.245.175
- [所有节点 - 配置主机名]
为了方便集群节点间的直接调用,使用vim
指令编辑 /etc/hosts
# 编辑 /etc/hosts
vim /etc/hosts
- [所有节点 - 同步时间]
kubernetes要求集群中的节点时间必须精确一致,使用chronyd服务从网络同步各主机的时间;
# 启动chronyd服务
systemctl start chronyd
# 让chronyd服务开机自启
systemctl enable chronyd
- [所有节点 - 禁用iptable和firewalld服务]
kubernetes 和 docker 在运行的中会产生大量的 iptables 规则,为了不让系统规则跟它们混淆,直接关闭系统的规则。
# 关闭firewalld服务
systemctl stop firewalld
systemctl disable firewalld
# 关闭iptables服务
systemctl stop iptables
systemctl disable iptables
- [所有节点 - 禁用selinux]
selinux是linux系统下的一个安全服务,如果不关闭它,在安装集群中会产生各种各样的奇葩问题。
- 使用
vim
编辑 /etc/selinux/config
# 编辑 /etc/selinux/config
vim /etc/selinux/config
- 使用下方指令重启主机;
# 重启主机
shutdown -r now
- [所有节点 - 禁用swap分区]
swap分区指的是虚拟内存分区,它的作用是物理内存使用完,之后将磁盘空间虚拟成内存来使用,启用swap设备会对系统的性能产生非常负面的影响,因此kubernetes要求每个节点都要禁用swap设备,但是如果因为某些原因确实不能关闭swap分区,就需要在集群安装过程中通过明确的参数进行配置说明;
- 使用
vim
编辑 /etc/fstab
# 编辑/etc/fstab
vim /etc/fstab
- 使用下方指令重启主机;
# 重启主机
shutdown -r now
- [所有节点 - 修改Linux的内核参数]
- 使用
vim
创建 /etc/sysctl.d/kubernetes.conf
vim /etc/sysctl.d/kubernetes.conf
并在其中添加如下配置,并通过:wq
保存修改;
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
- 输入下方指令重新加载配置;
# 重新加载配置
sysctl -p
# 加载网桥过滤模块
modprobe br_netfilter
- [所有节点 - 配置ipvs功能]
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块;
# 1.安装ipset和ipvsadm
yum install ipset ipvsadm -y
# 2.添加需要加载的模块写入脚本文件
cat <<EOF> /etc/sysconfig/modules/ipvs.modules
#!/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
- [所有节点 - 安装Docker]
# 1.下载Docker镜像源
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 在默认情况下使用Vgroup Driver为cgroupfs,而Kubernetes推荐使用systemd来替代cgroupfs
mkdir /etc/docker
cat <<EOF> /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://kn0t2bca.mirror.aliyuncs.com"]
}
EOF
# 5.启动Docker
systemctl restart docker
systemctl enable docker
- [所有节点 - 安装Kubernetes组件]
- 添加K8S镜像源,通过
vim
创建 /etc/yum.repos.d/kubernetes.repo,
vim /etc/yum.repos.d/kubernetes.repo
添加如下配置:
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgchech=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
- 安装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,通过
vim
编辑 /etc/sysconfig/kubelet,
vim /etc/sysconfig/kubelet
添加如下配置:
KUBELET_CGROUP_ARGS="--cgroup-driver=systemd"
KUBE_PROXY_MODE="ipvs"
- 设置kubelet开机自启
systemctl enable kubelet
- [所有节点 - 拉取集群镜像]
# 在安装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
- [Master - 安装网络插件]
- 输入下方指令安装网络插件;
# 安装下方指令安装网络插件
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 通过
vim
创建并配置文件 /etc/cni/net.d/10-flannel.conf;
# 逐级创建目录
mkdir /etc/cni
mkdir /etc/cni/net.d
# 创建配置文件
vim /etc/cni/net.d/10-flannel.conf
{
"name":"cbr0",
"cniVersion":"0.3.1",
"type":"flannel",
"deledate":{
"hairpinMode":true,
"isDefaultGateway":true
}
}
- 重置kubeadm,重启机器
# 在master节点之外的节点进行操作
kubeadm reset
# 重启机器
shutdown -r now
- [Master - 将k8s的Master与本机绑定]
# 添加环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
# 使新添加的环境变量生效
source /etc/profile
- [Master - 创建集群]
在Master节点执行下方指令,注意替换 **–apiserver-advertise-address **参数的值为Master机器的IP地址
kubeadm init \
--apiserver-advertise-address=192.168.245.174 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.17.4 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
随后会输出加入集群的指令,我们将其记录起来,后续Worker节点加入集群时需要用到;
- [Worker1 - 加入集群]
- Worker1节点输入下方指令进行各项网络配置,随后重启服务器;
# 打开IP转发功能
echo "1" > /proc/sys/net/ipv4/ip_forward
# 重置kubeadm
kubeadm reset -y
# 其他网络配置
systemctl stop kubelet
systemctl stop docker
rm -rf /var/lib/cni/
rm -rf /var/lib/kubelet/*
rm -rf /etc/cni/
ifconfig cni0 down
ifconfig flannel.1 down
ifconfig docker0 down
ip link delete cni0
ip link delete flannel.1
# 重启kubelet
systemctl restart kubelet
# 重启docker
systemctl restart docker
# 重启服务器
shutdown -r now
- 复制方才创建集群时输出的指令,在Worker1节点中执行以加入集群:
# SHA256的值是各有不同的
kubeadm join 192.168.245.174:6443 --token iq6c98.d621qyvp9652ix2c \
--discovery-token-ca-cert-hash sha256:d872f1a0656a172e14f95231dd3xxxxxxxxxxxxxxxebadab11cb1a95954f0ec7
- [Master - 重新部署网络]
# 重新部署网络
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- [Master - 查看结果]
kubectl get nodes