集群部署
ip: 192.168.171.4 ,192.168.171.5 ,192.168.171.6
1.设置主机名
bash
# 在 192.168.171.4 执行
hostnamectl set-hostname k8s-master
# 在 192.168.171.5 执行
hostnamectl set-hostname k8s-node1
# 在 192.168.171.6 执行
hostnamectl set-hostname k8s-node2
2.配置 hosts
bash
cat <<EOF >> /etc/hosts
192.168.171.4 k8s-master
192.168.171.5 k8s-node1
192.168.171.6 k8s-node2
EOF
- 关闭 SELinux
bash
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/'
/etc/selinux/config
-
关闭 Swap
bash# 临时关闭 swapoff -a && sysctl -w vm.swappiness=0 # 永久关闭(注释掉 swap 行) sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab -
防火墙
bash
sudo firewall-cmd --permanent --zone=public \
--add-port=6443/tcp \
--add-port=10250/tcp \
--add-port=10251/tcp \
--add-port=10252/tcp \
--add-port=10255/tcp \
--add-port=8472/udp
sudo firewall-cmd --reload
sudo firewall-cmd --list-ports
6.开启 iptables 桥接流量
bash
modprobe br_netfilter
cat <<EOF | tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
- 时间同步
bash
yum install -y ntpdate
ntpdate time.windows.com
8.确保节点互通(验证)
bash
ping -c 3 192.168.171.4
ping -c 3 192.168.171.5
ping -c 3 192.168.171.6
9.所有节点安装 Docker
bash
# 安装 yum 工具
yum install -y yum-utils
# 添加阿里云 Docker 源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 安装指定版本
yum install -y docker-ce-20.10.24 docker-ce-cli-20.10.24
# 配置镜像加速 + systemd cgroup driver
mkdir -pv /etc/docker
tee /etc/docker/daemon.json <<- 'EOF'
{
"registry-mirrors" : [
"https://hmhv5tp5.mirror.aliyuncs.com" ,
"https://mirror.baidubce.com" ,
"https://do.nark.eu.org" ,
"https://do.nark.eu.org" ,
"https://dc.j8.work" ,
"https://docker.m.daocloud.io" ,
"https://dockerproxy.com" ,
"https://docker.mirrors.ustc.edu.cn" ,
"https://docker.nju.edu.cn" ,
"https://dockerhub.icu" ,
"https://docker.chenby.cn" ,
"https://docker.1panel.live" ,
"https://docker.awsl9527.cn" ,
"https://docker.anyhub.us.kg" ,
"https://dhub.kubesre.xyz" ,
"https://docker.m.daocloud.io" ,
"https://docker.xuanyuan.me" ,
"https://docker.1ms.run"
],
"exec-opts" : [ "native.cgroupdriver=systemd" ]
}
EOF
# 启动 Docker
systemctl daemon-reload
systemctl enable --now docker.service
systemctl restart docker.service
# 验证
docker info | grep Cgroup
- 所有节点安装 kubeadm、kubelet、kubectl
bash
# 配置阿里云 K8s 源
cat <<EOF > /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
EOF
# 安装
yum install -y kubeadm-1.23.17-0 kubelet-1.23.17-0 kubectl-1.23.17-0
# 启动 kubelet(此时会不断重启,属于正常现象,初始化后恢复)
systemctl enable --now kubelet
11.Master 节点初始化
bash
cat <<EOF > /root/kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.171.4
bindPort: 6443
nodeRegistration:
name: k8s-master
criSocket: /var/run/dockershim.sock
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.23.17
imageRepository: registry.aliyuncs.com/google_containers
controlPlaneEndpoint: 192.168.171.4:6443
networking:
dnsDomain: jiazhong.com
serviceSubnet: 10.200.0.0/16
podSubnet: 10.100.0.0/16
etcd:
local:
dataDir: /var/lib/etcd-k8s
extraArgs:
listen-client-urls: "https://127.0.0.1:12379,https://192.168.171.4:12379"
advertise-client-urls: "https://192.168.171.4:12379"
listen-peer-urls: "https://192.168.171.4:12380"
initial-advertise-peer-urls: "https://192.168.171.4:12380"
initial-cluster: "k8s-master=https://192.168.171.4:12380"
apiServer:
extraArgs:
etcd-servers: "https://192.168.171.4:12379"
EOF
执行初始化
bash
kubeadm init --config=/root/kubeadm-config.yaml
初始化成功后,按提示执行
bash
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
保存好最后输出的 kubeadm join 命令,Worker 节点需要用到。如果丢失,可用以下命令重新获取:
bash
# 重新生成 token
kubeadm token create --print-join-command
12.Worker 节点加入集群
在 192.168.171.5 和 192.168.171.6 上分别执行 Master 输出的 join 命令,格式如下(请使用你实际生成的):
kubeadm join 192.168.171.4:6443 --token ekpkts.vzru73gs96sr0ywe \
--discovery-token-ca-cert-hash sha256:72ba95d8a2721f7630de48b62637de2ce3f5c9dbda4134592ed5906be34adaaa
Master 上查看节点
bash
kubectl get nodes
-
部署 Flannel 网络插件(Master 执行)(网络原因github连接不上)
bashmkdir -p /apps/kubernetes/cni/flannel cd /apps/kubernetes/cni/flannel # 下载 wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml # 修改 Pod CIDR 为 10.100.0.0/16 sed -i 's|"Network": "10.244.0.0/16"|"Network": "10.100.0.0/16"|g' kube-flannel.yml # 部署 kubectl apply -f kube-flannel.yml等待所有 Pod 变为
Running
bash
kubectl get pods -n kube-flannel
kubectl get nodes
使用 systemd service post‑exec 强制设置 docker0 mtu=1450
bash
cat > /etc/docker/daemon.json <<'EOF'
{
"mtu": 1450,
"registry-mirrors": ["https://hub-mirror.aliyuncs.com"]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d
cat > /etc/systemd/system/docker.service.d/fix-mtu.conf <<'EOF'
[Service]
ExecStartPost=/sbin/ip link set dev docker0 mtu 1450
EOF
关闭 nftables、firewalld
systemctl stop nftables && systemctl disable nftables systemctl stop firewalld && systemctl disable firewalld
14.创建测试服务
bash
kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
15.查看服务
bash
kubectl get po,svc
输出示例中会有类似 80:3xxxx/TCP 的端口映射,用任意节点 IP + 该端口访问测试:
bash
curl 192.168.171.4:3xxxx
curl 192.168.171.5:3xxxx
curl 192.168.171.6:3xxxx
16.在其他节点使用 kubectl
bash
# 在 Master 上复制证书
scp /etc/kubernetes/admin.conf k8s-node1:/etc/kubernetes/
scp /etc/kubernetes/admin.conf k8s-node2:/etc/kubernetes/
# 在 Node1/Node2 上配置环境变量
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> ~/.bash_profile
source ~/.bash_profile
17.开启命令自动补全
bash
# 临时生效
source <(kubectl completion bash)
# 永久生效
echo "source <(kubectl completion bash)" >> ~/.bashrc
-
重要检查:确保 PG 集群不受影响
bash# 检查 Patroni 状态 su - postgres -c "patronictl -c /etc/patroni/patroni.yml list" # 检查 PG etcd(注意:这是你的 PG etcd,不是 K8s 的) ETCDCTL_API=3 etcdctl endpoint health --endpoints=192.168.171.4:2379,192.168.171.5:2379,192.168.171.6:2379 # 检查 K8s etcd(仅 Master 有,监听 12379/12380) ETCDCTL_API=3 etcdctl endpoint health --endpoints=https://192.168.171.4:12379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key
19.常用命令速查
bash
# 查看节点
kubectl get nodes
# 查看所有命名空间 Pod
kubectl get pods -A
# 查看 kube-system Pod
kubectl get pods -n kube-system
# 查看组件状态
kubectl get cs
# 查看 Flannel Pod
kubectl get pods -n kube-flannel
# 查看 K8s etcd 静态 Pod 日志(Master)
kubectl logs -n kube-system etcd-k8s-master
# 或
crictl ps | grep etcd
docker logs <etcd-container-id> # 如使用 docker