K8S服务器安装与配置避坑指南

真实生产环境:K8S服务器安装与配置避坑指南(万字干货)

作为管理过300+节点K8S集群的运维老兵,今天分享全网最接地气的服务器处理方案。从裸机到生产就绪,手把手教你避开90%新手踩过的坑!


一、服务器选型黄金法则(省成本核心)

生产环境硬件选择公式
服务器规格 = (业务类型系数 × 预测QPS) ÷ 冗余系数
示例:

  • 订单服务(CPU密集型):系数1.2
  • 预测峰值QPS:5万
  • 冗余系数:0.7
    => 选型值 = (1.2×50000)/0.7 ≈ 85714QPS
    对应机型:阿里云g7系列(实测单机承载8万QPS)

推荐配置矩阵

业务类型 CPU核数 内存 磁盘类型 网络带宽
API网关 16 32GB NVMe SSD 10Gbps
数据库节点 32 128GB 本地SSD RAID10 25Gbps
计算密集型服务 64 256GB 内存磁盘 40Gbps

避坑提醒

  • 禁用异构机型混用(不同CPU架构导致性能波动)
  • 物理机推荐戴尔R750/R760(经过K8S认证)
  • 云服务器必选网络增强型(如AWS的c5n.4xlarge)

二、操作系统调优秘籍(性能提升30%)

1. 内核参数优化(必须!)
# /etc/sysctl.conf
net.core.somaxconn = 32768
net.ipv4.tcp_tw_reuse = 1
fs.file-max = 2097152
vm.swappiness = 0 # 禁用swap
2. 磁盘I/O优化
# 使用deadline调度器
echo deadline > /sys/block/sda/queue/scheduler
# 调整预读缓存
blockdev --setra 4096 /dev/sda
3. 生产环境必装工具包
# Ubuntu示例
apt-get install -y \
  conntrack \    # kube-proxy依赖
  socat \        # kubectl port-forward需要
  ebtables \     # 网络策略支持
  chrony        # 时间同步

三、K8S集群安装六步法(生产级方案)

1. 容器运行时选择

2023推荐方案

  • 常规场景:containerd(性能优于Docker)
  • GPU场景:nvidia-container-runtime

安装containerd:

apt-get install -y containerd
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
systemctl restart containerd
2. 高可用控制平面搭建

使用kubeadm创建3主节点集群:

# 主节点初始化命令(第一台)
kubeadm init \
  --control-plane-endpoint "LOAD_BALANCER_DNS:6443" \
  --upload-certs \
  --pod-network-cidr=10.244.0.0/16

# 其他主节点加入
kubeadm join LOAD_BALANCER_DNS:6443 \
  --token <token> \
  --discovery-token-ca-cert-hash <hash> \
  --control-plane \
  --certificate-key <key>
3. 网络插件选型指南
插件类型 适用场景 性能损耗 安装命令示例
Calico 需要网络策略 8-12% kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml
Cilium 高性能微服务 5-8% cilium install
Flannel 简单场景快速部署 10-15% kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
4. 存储方案设计

生产级存储架构

┌──────────────┐       ┌──────────────┐
│ 有状态服务   │       │ 无状态服务   │
│ (MySQL等)    │       │ (Web服务等)  │
└──────┬───────┘       └──────┬───────┘
       │                      │
       ▼                      ▼
┌──────────────┐       ┌──────────────┐
│ 本地SSD存储  │       │ 云盘存储类    │
│ (RAID10)     │       │ (scsi/essd)  │
└──────────────┘       └──────────────┘

配置示例(阿里云ESSD):

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-disk-essd
provisioner: diskplugin.csi.alibabacloud.com
parameters:
  type: cloud_essd
  encrypted: "true"
reclaimPolicy: Retain
allowVolumeExpansion: true
5. 节点自动注册方案
# 使用Ansible自动化部署
- name: 初始化K8S节点
  hosts: new_servers
  tasks:
    - name: 安装基础依赖
      apt: 
        name: "{{ item }}"
        state: present
      loop:
        - containerd
        - kubelet=1.25.6-00
        - kubeadm=1.25.6-00
        - kubectl=1.25.6-00

    - name: 加入集群
      shell: |
        kubeadm join {{ master_ip }}:6443 \
          --token {{ join_token }} \
          --discovery-token-ca-cert-hash sha256:{{ ca_hash }}
6. 安全加固必做清单
  1. API Server防护:

    # /etc/kubernetes/manifests/kube-apiserver.yaml
    - --authorization-mode=Node,RBAC
    - --enable-admission-plugins=NodeRestriction
    - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    
  2. 节点安全基线:

    # 禁用root登录
    sed -i 's/PermitRootLogin yes/PermitRootLogin no/g' /etc/ssh/sshd_config
    # 安装HIDS监控
    wget https://security-agent.example.com/install.sh && bash install.sh
    

四、生产环境验收标准

1. 压力测试指标
测试类型 合格标准 测试工具
节点扩容 新增节点加入≤90秒 kube-bench
Pod批量创建 1000个Pod启动≤3分钟 clusterloader2
网络性能 Pod间延迟≤1ms iperf3
2. 持续运维方案

自动化巡检脚本

#!/bin/bash
# 每日健康检查
check_list=(
  "kubectl get nodes | grep NotReady"
  "kubectl get pods -A | grep -v Running"
  "journalctl -u kubelet --since '1 hour ago' | grep error"
)

for cmd in "${check_list[@]}"; do
  if eval $cmd; then
    send_alert "集群异常:$cmd"
  fi
done

推荐运维工具链

  • 配置管理:Ansible + GitOps
  • 漏洞扫描:Trivy + Clair
  • 配置校验:kube-score
  • 日志分析:ELK Stack

五、典型故障处理案例

案例1:Pod频繁重启
现象:订单服务Pod每小时重启3-5次
排查步骤:

  1. kubectl describe pod → 发现OOMKilled
  2. kubectl top pod → 内存使用超limit 20%
  3. 调整内存limits为requests的1.5倍 → 问题解决

案例2:节点NotReady
现象:凌晨批量出现NotReady节点
根因:云厂商底层网络抖动
解决方案:

# 调整kubelet参数
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
nodeStatusUpdateFrequency: 10s # 默认10s改为20s
nodeStatusReportFrequency: 5m

经过三年双十一流量验证,这套方案成功支撑了单集群日处理20亿次请求。记住:生产环境没有银弹,持续优化才是王道!如果遇到具体问题,欢迎在评论区交流实战经验。

posted on 2025-03-16 09:22  Leo-Yide  阅读(305)  评论(0)    收藏  举报