完整的3 Master + 3 Node K8s集群部署步骤。包括:
- 实例准备和网络规划
- 系统环境配置
- Kubernetes组件安装
- 高可用集群配置
涵盖从ECS实例创建到Kubernetes集群部署的全过程。
构建3 Master + 3 Node K8s集群完整步骤
一、基础设施规划与准备
1.1 实例配置推荐
- Master节点(3个) :推荐使用
ecs.g9i.2xlarge(8核CPU,32GB内存)- 用途:运行Kubernetes控制平面组件
- 数量:3个以实现高可用
- Node节点(3个) :推荐使用
ecs.c9i.2xlarge(8核CPU,16GB内存)- 用途:运行应用程序Pod
- 数量:3个以提供足够的计算资源
1.2 存储配置
- 系统盘:建议使用ESSD云盘,容量40GB以上
- 数据盘:根据应用需求,可额外挂载ESSD云盘作为持久化存储
1.3 网络规划
- VPC:创建独立的VPC用于K8s集群
- 安全组:开放必要端口(6443、2379-2380、10250-10252、30000-32767)
二、环境初始化
2.1 创建ECS实例
- 登录阿里云控制台,进入ECS实例创建页面
- 选择上述推荐的实例规格
- 镜像选择:推荐使用Alibaba Cloud Linux 3或Ubuntu 20.04
- 网络配置:选择同一VPC和交换机
- 安全组:创建包含K8s所需端口的安全组
2.2 系统配置(所有节点执行)
bash
# 关闭防火墙
sudo systemctl stop firewalld
sudo systemctl disable firewalld
# 关闭SELinux(如果是CentOS/Alibaba Cloud Linux)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 关闭swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 配置内核参数
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
# 加载所需模块
sudo modprobe ip_vs
sudo modprobe ip_vs_rr
sudo modprobe ip_vs_wrr
sudo modprobe ip_vs_sh
# 安装ipset和ipvsadm
sudo yum install ipset ipvsadm -y
2.3 配置hosts文件(所有节点执行)
bash
# 编辑/etc/hosts文件,添加所有节点的IP和主机名映射
sudo vi /etc/hosts
# 添加以下内容(替换为实际IP)
192.168.1.10 master1
192.168.1.11 master2
192.168.1.12 master3
192.168.1.20 node1
192.168.1.21 node2
192.168.1.22 node3
三、安装Docker或Containerd
3.1 安装Containerd(推荐)
bash
# 安装containerd
sudo yum install -y containerd.io
# 配置containerd
sudo mkdir -p /etc/containerd
sudo containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置文件,设置SystemdCgroup = true
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
# 启动并设置开机自启
sudo systemctl restart containerd
sudo systemctl enable containerd
四、安装Kubernetes组件
4.1 配置Kubernetes YUM源
bash
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-\$basearch
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
4.2 安装kubelet、kubeadm、kubectl
bash
# 设置SELinux为permissive模式(有效禁用它)
sudo setenforce 0
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 设置kubelet开机自启但不启动
sudo systemctl enable kubelet
五、高可用集群部署
5.1 在第一个Master节点初始化集群
bash
# 初始化第一个master节点
sudo kubeadm init \
--control-plane-endpoint "LOAD_BALANCER_DNS:6443" \
--upload-certs \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=MASTER1_IP
# 配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
5.2 安装HAProxy和Keepalived(可选,用于API Server高可用)
在每个Master节点上安装并配置HAProxy和Keepalived:
bash
# 安装HAProxy
sudo yum install -y haproxy
# 配置HAProxy (/etc/haproxy/haproxy.cfg)
global
log /dev/log local0
log /dev/log local1 notice
daemon
defaults
mode http
log global
retries 2
timeout connect 3000ms
timeout client 50000ms
timeout server 50000ms
frontend kubernetes-frontend
bind *:6443
mode tcp
option tcplog
default_backend kubernetes-backend
backend kubernetes-backend
mode tcp
balance roundrobin
server master1 MASTER1_IP:6443 check
server master2 MASTER2_IP:6443 check
server master3 MASTER3_IP:6443 check
5.3 加入其他Master节点
bash
# 在第二个和第三个Master节点执行以下命令
sudo kubeadm join LOAD_BALANCER_IP:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash> \
--control-plane --certificate-key <key>
5.4 加入Worker节点
bash
# 在所有Worker节点执行以下命令
sudo kubeadm join LOAD_BALANCER_IP:6443 --token <token> \
--discovery-token-ca-cert-hash sha256:<hash>
六、配置网络插件
6.1 安装Flannel网络插件
bash
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
或者安装Calico:
bash
kubectl create -f https://projectcalico.docs.tigera.io/manifests/tigera-operator.yaml
kubectl create -f https://projectcalico.docs.tigera.io/manifests/custom-resources.yaml
七、验证集群状态
7.1 检查节点状态
bash
kubectl get nodes
7.2 检查系统Pod状态
bash
kubectl get pods -n kube-system
八、部署常用组件
8.1 部署Metrics Server
bash
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
# 修改Metrics Server配置以允许不安全连接
kubectl patch deployment metrics-server -n kube-system -p '{"spec":{"template":{"spec":{"containers":[{"name":"metrics-server","args":["--cert-dir=/tmp","--secure-port=4443","--kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname","--kubelet-use-node-status-port","--metric-resolution=15s","--kubelet-insecure-tls"]}]}'
8.2 部署Dashboard(可选)
bash
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
# 创建管理员用户
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
EOF
cat <<EOF | kubectl apply -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
EOF
# 获取访问令牌
kubectl -n kubernetes-dashboard get secret $(kubectl -n kubernetes-dashboard get sa/admin-user -o jsonpath="{.secrets[0].name}") -o go-template="{{.data.token | base64decode}}"
九、安全加固建议
- 限制API Server访问:配置RBAC权限控制
- 启用审计日志:记录所有API请求
- 定期更新:及时升级Kubernetes版本
- 备份策略:定期备份etcd数据
十、监控与维护
- 部署Prometheus + Grafana监控栈
- 配置日志收集系统(如EFK)
- 设置告警机制
- 制定灾难恢复计划
这个完整的部署方案涵盖了从基础设施准备到集群部署的所有关键步骤。按照这些步骤操作,将能够成功构建一个高可用的3 Master + 3 Node K8s集群。