news 2026/7/14 5:15:36

从零到一:手动构建高可用K8s+Docker集群(实战指南)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零到一:手动构建高可用K8s+Docker集群(实战指南)

1. 环境准备与基础配置

在开始构建高可用Kubernetes集群之前,我们需要做好充分的环境准备。我建议使用3台及以上配置相同的CentOS 7/8或Ubuntu 20.04 LTS服务器,每台至少4核CPU、8GB内存和50GB磁盘空间。在实际项目中,我曾遇到过内存不足导致kubelet频繁崩溃的情况,所以资源预留很关键。

首先在所有节点上执行基础系统配置:

# 关闭防火墙 systemctl stop firewalld && systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config # 关闭swap swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 设置时区 timedatectl set-timezone Asia/Shanghai # 配置hosts cat >> /etc/hosts <<EOF 192.168.1.101 k8s-master1 192.168.1.102 k8s-master2 192.168.1.103 k8s-master3 192.168.1.201 k8s-node1 192.168.1.202 k8s-node2 EOF

内核参数调优是很多教程会忽略的部分,但这些配置对集群稳定性至关重要:

cat > /etc/sysctl.d/k8s.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 vm.overcommit_memory = 1 vm.panic_on_oom = 0 fs.inotify.max_user_instances = 8192 fs.inotify.max_user_watches = 1048576 fs.file-max = 52706963 fs.nr_open = 52706963 net.ipv6.conf.all.disable_ipv6 = 1 net.netfilter.nf_conntrack_max = 2310720 EOF sysctl -p /etc/sysctl.d/k8s.conf

2. 证书体系设计与签发

Kubernetes重度依赖TLS证书进行组件间通信加密,手动部署时需要特别注意证书的合理规划。我采用Cloudflare的cfssl工具链来生成证书,相比openssl更易用。

首先创建CA证书(在第一个Master节点操作):

mkdir -p /etc/kubernetes/pki cd /etc/kubernetes/pki cat > ca-config.json <<EOF { "signing": { "default": { "expiry": "87600h" }, "profiles": { "kubernetes": { "usages": ["signing", "key encipherment", "server auth", "client auth"], "expiry": "87600h" } } } } EOF cat > ca-csr.json <<EOF { "CN": "Kubernetes", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "Kubernetes", "OU": "CA" } ] } EOF cfssl gencert -initca ca-csr.json | cfssljson -bare ca

接下来为API Server生成证书,特别注意要包含所有可能的访问方式:

cat > kube-apiserver-csr.json <<EOF { "CN": "kube-apiserver", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "Shanghai", "L": "Shanghai", "O": "Kubernetes", "OU": "Kubernetes" } ] } EOF cfssl gencert \ -ca=ca.pem \ -ca-key=ca-key.pem \ -config=ca-config.json \ -hostname=10.96.0.1,192.168.1.101,192.168.1.102,192.168.1.103,127.0.0.1,kubernetes,kubernetes.default,kubernetes.default.svc,kubernetes.default.svc.cluster.local \ -profile=kubernetes \ kube-apiserver-csr.json | cfssljson -bare kube-apiserver

其他组件证书类似方式生成后,需要将CA证书和生成的证书同步到所有节点:

for node in k8s-master2 k8s-master3 k8s-node1 k8s-node2; do rsync -avz /etc/kubernetes/pki/ca* $node:/etc/kubernetes/pki/ rsync -avz /etc/kubernetes/pki/kube-apiserver* $node:/etc/kubernetes/pki/ # 同步其他必要证书... done

3. 核心组件部署与配置

3.1 etcd集群部署

etcd作为Kubernetes的后端存储,必须确保高可用。我采用3节点集群部署:

# 下载etcd二进制包 ETCD_VER=v3.5.0 wget https://github.com/etcd-io/etcd/releases/download/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz tar xvf etcd-${ETCD_VER}-linux-amd64.tar.gz mv etcd-${ETCD_VER}-linux-amd64/{etcd,etcdctl} /usr/local/bin/ # 创建systemd服务文件 cat > /etc/systemd/system/etcd.service <<EOF [Unit] Description=etcd Documentation=https://github.com/coreos/etcd [Service] Type=notify ExecStart=/usr/local/bin/etcd \\ --name=k8s-master1 \\ --data-dir=/var/lib/etcd \\ --initial-advertise-peer-urls=https://192.168.1.101:2380 \\ --listen-peer-urls=https://192.168.1.101:2380 \\ --listen-client-urls=https://192.168.1.101:2379,https://127.0.0.1:2379 \\ --advertise-client-urls=https://192.168.1.101:2379 \\ --initial-cluster-token=etcd-cluster \\ --initial-cluster=k8s-master1=https://192.168.1.101:2380,k8s-master2=https://192.168.1.102:2380,k8s-master3=https://192.168.1.103:2380 \\ --initial-cluster-state=new \\ --client-cert-auth \\ --trusted-ca-file=/etc/kubernetes/pki/ca.pem \\ --cert-file=/etc/kubernetes/pki/etcd.pem \\ --key-file=/etc/kubernetes/pki/etcd-key.pem \\ --peer-client-cert-auth \\ --peer-trusted-ca-file=/etc/kubernetes/pki/ca.pem \\ --peer-cert-file=/etc/kubernetes/pki/etcd.pem \\ --peer-key-file=/etc/kubernetes/pki/etcd-key.pem Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF

启动etcd后验证集群健康状态:

ETCDCTL_API=3 etcdctl \ --endpoints=https://192.168.1.101:2379 \ --cacert=/etc/kubernetes/pki/ca.pem \ --cert=/etc/kubernetes/pki/etcd.pem \ --key=/etc/kubernetes/pki/etcd-key.pem \ endpoint health

3.2 控制平面组件部署

Kubernetes控制平面包含kube-apiserver、kube-controller-manager和kube-scheduler三个核心组件。我采用二进制方式部署:

# 下载Kubernetes二进制文件 K8S_VER=v1.25.0 wget https://dl.k8s.io/${K8S_VER}/kubernetes-server-linux-amd64.tar.gz tar xvf kubernetes-server-linux-amd64.tar.gz cd kubernetes/server/bin cp kube-apiserver kube-controller-manager kube-scheduler kubectl /usr/local/bin/ # 配置kube-apiserver cat > /etc/systemd/system/kube-apiserver.service <<EOF [Unit] Description=Kubernetes API Server Documentation=https://kubernetes.io/docs/concepts/overview/ [Service] ExecStart=/usr/local/bin/kube-apiserver \\ --advertise-address=192.168.1.101 \\ --allow-privileged=true \\ --apiserver-count=3 \\ --audit-log-maxage=30 \\ --audit-log-maxbackup=3 \\ --audit-log-maxsize=100 \\ --audit-log-path=/var/log/kubernetes/audit.log \\ --authorization-mode=Node,RBAC \\ --bind-address=0.0.0.0 \\ --client-ca-file=/etc/kubernetes/pki/ca.pem \\ --enable-admission-plugins=NodeRestriction \\ --enable-bootstrap-token-auth=true \\ --etcd-cafile=/etc/kubernetes/pki/ca.pem \\ --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.pem \\ --etcd-keyfile=/etc/kubernetes/pki/apiserver-etcd-client-key.pem \\ --etcd-servers=https://192.168.1.101:2379,https://192.168.1.102:2379,https://192.168.1.103:2379 \\ --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.pem \\ --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client-key.pem \\ --service-account-key-file=/etc/kubernetes/pki/sa.pub \\ --service-account-signing-key-file=/etc/kubernetes/pki/sa.key \\ --service-account-issuer=https://kubernetes.default.svc.cluster.local \\ --service-cluster-ip-range=10.96.0.0/12 \\ --tls-cert-file=/etc/kubernetes/pki/kube-apiserver.pem \\ --tls-private-key-file=/etc/kubernetes/pki/kube-apiserver-key.pem \\ --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.pem \\ --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.pem \\ --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client-key.pem \\ --requestheader-allowed-names=front-proxy-client \\ --requestheader-extra-headers-prefix=X-Remote-Extra- \\ --requestheader-group-headers=X-Remote-Group \\ --requestheader-username-headers=X-Remote-User Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF

其他控制平面组件配置类似,启动后可以通过kubectl检查状态:

kubectl get componentstatuses

4. 高可用与负载均衡实现

生产环境必须确保控制平面的高可用性。我采用HAProxy+Keepalived方案实现API Server的负载均衡:

# 安装HAProxy yum install -y haproxy # 配置HAProxy cat > /etc/haproxy/haproxy.cfg <<EOF global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults log global mode http option httplog option dontlognull timeout connect 5000 timeout client 50000 timeout server 50000 frontend k8s-api bind *:6443 mode tcp default_backend k8s-api backend k8s-api mode tcp balance roundrobin server k8s-master1 192.168.1.101:6443 check server k8s-master2 192.168.1.102:6443 check server k8s-master3 192.168.1.103:6443 check EOF # 配置Keepalived cat > /etc/keepalived/keepalived.conf <<EOF vrrp_script chk_haproxy { script "killall -0 haproxy" interval 2 weight 2 } vrrp_instance VI_1 { interface eth0 state MASTER virtual_router_id 51 priority 101 virtual_ipaddress { 192.168.1.100/24 } track_script { chk_haproxy } } EOF

5. 工作节点与网络插件部署

工作节点需要部署kubelet和kube-proxy,并安装容器运行时(这里以Docker为例):

# 安装Docker yum install -y yum-utils yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo yum install -y docker-ce docker-ce-cli containerd.io systemctl enable --now docker # 配置kubelet cat > /etc/systemd/system/kubelet.service <<EOF [Unit] Description=Kubernetes Kubelet Documentation=https://kubernetes.io/docs/concepts/overview/ [Service] ExecStart=/usr/local/bin/kubelet \\ --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf \\ --kubeconfig=/etc/kubernetes/kubelet.conf \\ --config=/var/lib/kubelet/config.yaml \\ --container-runtime=remote \\ --container-runtime-endpoint=unix:///run/containerd/containerd.sock \\ --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.7 \\ --node-labels=node-role.kubernetes.io/node= Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target EOF

网络插件选择Calico,它支持网络策略和IP地址管理:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

6. 集群验证与排错

部署完成后需要进行全面验证:

# 检查节点状态 kubectl get nodes -o wide # 检查核心组件状态 kubectl get pods -n kube-system # 部署测试应用 kubectl create deployment nginx --image=nginx kubectl expose deployment nginx --port=80 --type=NodePort # 测试网络连通性 kubectl run busybox --rm -it --image=busybox -- sh wget -qO- nginx

常见问题排查技巧:

  1. kubelet无法启动:检查证书路径和权限
  2. Pod网络不通:检查Calico日志和路由表
  3. API Server不可用:检查etcd集群状态和HAProxy日志
  4. 证书过期:使用cfssl重新生成并分发证书
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 5:15:14

混沌工程的资料

混沌工程是一种通过在分布式系统的生产或类生产环境中&#xff0c;主动、受控地引入故障&#xff0c;以实验方式发现系统潜在弱点、验证其容错与恢复能力&#xff0c;从而提升系统韧性的工程实践方法&#xff0c;由Netflix在2010年前后首创&#xff0c;是保障云原生、微服务架构…

作者头像 李华
网站建设 2026/7/14 5:14:05

一个 CompletableFuture,把 CPU 打满了:默认线程池的线上坑

一个 CompletableFuture&#xff0c;把 CPU 打满了&#xff1a;默认线程池的线上坑接口明明只是想并行查几个服务。 加上 CompletableFuture 后&#xff0c;响应一开始确实快了。 结果高峰期 CPU 打满、接口超时、异步任务堆积&#xff0c;最后发现&#xff1a;所有任务都挤进了…

作者头像 李华
网站建设 2026/7/14 5:13:53

2FA并非万能!这五个漏洞让你账号仍危险

很多人觉得开了 2FA 就万事大吉了。技术上说&#xff0c;2FA 确实能阻止 99% 的自动化攻击。但安全是链条——最薄弱的环节决定整体强度。而这五个漏洞&#xff0c;在大多数人的安全设置中都存在&#xff0c;却很少有人注意到。漏洞一&#xff1a;主邮箱没开 2FA 这是最致命的一…

作者头像 李华
网站建设 2026/7/14 5:12:32

二、使用metasploit攻击windows(“永恒之蓝”漏洞)

前提&#xff1a; 1、已经准备好另一台带着windows7的电脑或者已打开windows7虚拟机&#xff08;用作靶向机&#xff09;&#xff0c;windows7不知道怎么装的可以看我另一篇笔记VMware安装windows7虚拟机-CSDN博客&#xff1b; 2、靶机和kali要处在同一网段&#xff0c;最省事的…

作者头像 李华
网站建设 2026/7/14 5:12:01

C++与OpenCV实战:从HSV颜色空间到轮廓检测的色块识别完整指南

1. 项目概述&#xff1a;从零到一&#xff0c;用C和OpenCV搞定色块识别最近在捣鼓一些视觉相关的自动化小项目&#xff0c;比如让摄像头自动追踪一个特定颜色的物体&#xff0c;或者从一堆零件里把红色的挑出来。这类需求的核心&#xff0c;其实就是一个经典的计算机视觉任务&a…

作者头像 李华
网站建设 2026/7/14 5:11:51

3分钟搞定NCM文件解密:原理、工具与批量转换实战

1. 项目概述&#xff1a;为什么我们需要“解密”NCM文件&#xff1f;如果你是一个网易云音乐的老用户&#xff0c;或者像我一样&#xff0c;喜欢把一些特别钟爱的歌单、专辑下载到本地&#xff0c;以备不时之需&#xff0c;那你大概率遇到过一种情况&#xff1a;从网易云音乐客…

作者头像 李华