一、准备环境
- 硬件要求:至少 2 台机器(1 主节点,1 工作节点),建议最小硬件配置:2核CPU、2G内存、20G硬盘。
- 操作系统:CentOS 7/8,确保所有节点的操作系统版本一致。
- 网络配置:确保节点间网络互通,关闭防火墙或开放必要端口。
二、初始化配置
2.1 设置主机名
- 在主节点上设置主机名:
hostnamectl set-hostname master
- 在工作节点上设置主机名:
hostnamectl set-hostname worker1
2.2 关闭防火墙
关闭防火墙可以避免阻碍节点之间的网络通信,确保集群的正常运行。
# 关闭防火墙
systemctl stop firewalld
# 禁止防火墙开机自启
systemctl disable firewalld
2.3 关闭 SELinux
关闭 SELinux 可以简化 Kubernetes 集群的配置和维护,避免潜在的权限问题。
# 临时关闭 SELinux
setenforce 0
# 永久关闭 SELinux
sed -i 's/enforcing/disabled/' /etc/selinux/config
# 重启系统使更改生效
reboot
2.4 禁用交换分区(swap)
Kubernetes 官方建议在所有集群节点上禁用 swap 分区,以确保容器可以充分利用主机的物理内存,并避免因为交换空间导致的性能问题。
# 临时关闭 Swap
swapoff -a
# 永久关闭 Swap
sed -ri 's/.*swap.*/#&/' /etc/fstab
# 验证 Swap 是否已关闭
free -h
2.5 设置主机解析
在主节点上编辑/etc/hosts
文件,添加所有节点的IP和主机名。
sudo vi /etc/hosts
# 例如:
# 192.168.1.100 master
# 192.168.1.101 worker1
# 192.168.1.102 worker2
2.6 配置网络
加载br_netfilter模块并设置内核参数。
# 加载 `br_netfilter` 模块
sudo modprobe br_netfilter
# 将br_netfilter模块写入到k8s.conf配置文件
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
# 将桥接的IPv4流量传递到iptables的链
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
2.7 时间同步
yum install ntpdate -y
ntpdate time.windows.com
三、安装依赖工具
需要在所有节点上安装以下工具:
- Docker
- kubeadm
- kubelet
3.1 安装 Docker(容器运行时)
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
# 下载安装包
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
# 安装指定版本的docker
yum -y install docker-ce-18.06.1.ce-3.el7
# 启动并启用 Docker
systemctl enable docker && systemctl start docker
# 验证 Docker 是否安装成功
docker --version
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"]
}
EOF
3.2 添加 Kubernetes 仓库
默认使用的是谷歌的像源配置,国内访问不了,这里换成阿里云的镜像源。
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
3.3 安装 kubeadm、kubelet 和 kubectl
由于版本更新频繁,这里指定版本号部署:
yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0
systemctl enable kubelet
# 验证安装
kubeadm version
kubectl version --client
四、初始化Master节点
在主节点上执行以下命令初始化集群:
kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=<主节点IP> \
--image-repository=registry.aliyuncs.com/google_containers
- –pod-network-cidr:指定 Pod 网络的 CIDR,Flannel 插件需要此参数。
- –apiserver-advertise-address=<主节点IP>:主节点IP为主机的实际内外ip
- 初始化完成后,会提示kubectl配置的相关的命令,以及 kubeadm join 命令,用于后续将工作节点加入集群。
4.1 配置 kubectl
在主节点上执行初始化Master节点成功时对应的 kubectl 配置命令。
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4.2 检查主节点状态
kubectl get nodes
- 此时主节点状态应为 NotReady,因为尚未安装网络插件。
4.3 部署网络插件
选择并安装网络插件(如 Flannel):
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
等待几分钟后,检查主节点状态:
kubectl get nodes
- 此时主节点状态应变为 Ready
五、工作节点加入集群
-
获取加入命令(在主节点执行)
kubeadm token create --print-join-command
-
在每个工作节点上运行初始化时输出的 kubeadm join 命令:
sudo kubeadm join <主节点IP>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
- <主节点IP>:主节点的 IP 地址。
- 和 :初始化主节点时输出的值。
-
检查节点状态
在主节点上运行以下命令,查看节点是否成功加入:kubectl get nodes
- 所有节点状态应为 Ready。
六、验证集群
6.1 部署测试应用
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
6.2 查看服务信息
kubectl get svc nginx
输出示例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.96.123.123 <none> 80:30001/TCP 10s
6.3 访问应用
通过工作节点的 IP 和 NodePort 访问应用:
http://<工作节点IP>:30001
七、管理和维护
7.1 升级集群
# 升级 kubeadm
sudo apt-get update
sudo apt-get install -y kubeadm
# 升级主节点
sudo kubeadm upgrade apply v1.28.0 # 替换为目标版本
# 升级 kubelet 和 kubectl
sudo apt-get install -y kubelet kubectl
sudo systemctl restart kubelet
7.2 备份和恢复
-
备份 etcd 数据:
kubectl exec -n kube-system etcd-master-node -- etcdctl snapshot save /tmp/etcd-backup.db
-
恢复 etcd 数据:
kubectl exec -n kube-system etcd-master-node -- etcdctl snapshot restore /tmp/etcd-backup.db
7.3 监控和日志
- 使用 Prometheus 和 Grafana 监控集群。
- 使用 kubectl logs 查看 Pod 日志。