第三章:环境准备——Linux服务器基础、Docker与Kubernetes环境搭建

好,咱们进入正题。这一章说白了就是“搭台子”。你想想看,多云管理平台再牛,也得跑在实实在在的服务器上。我个人习惯是先把Linux基础打牢,再往上装Docker和Kubernetes。这套组合拳打好了,后面部署平台就跟喝水一样简单。

3.1 Linux服务器基础配置

我遇到过不少新手,上来就装Kubernetes,结果网络不通、磁盘不够、防火墙乱配,折腾两天还没跑起来。嗯,这里咱们稳一点,先把地基夯实。

3.1.1 操作系统选型与初始化

我个人推荐Ubuntu 20.04 LTS或CentOS 7.9。为什么?因为社区支持好,踩坑的人多,你遇到问题一搜就有答案。我曾经在生产环境吃过CentOS 8停止维护的亏,后来全切到Ubuntu LTS了。

装完系统后,第一件事就是更新源和内核:

# Ubuntu
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget vim net-tools

# CentOS
sudo yum update -y
sudo yum install -y curl wget vim net-tools
我的小技巧: 装完系统先配好hostname和hosts文件。我习惯用「k8s-master-01」「k8s-node-01」这种命名,一目了然。

3.1.2 关闭防火墙与Swap

Kubernetes对网络和内存管理有严格要求。说白了,它希望自己掌控一切,你那些iptables规则和swap分区反而会捣乱。

# 关闭防火墙(Ubuntu用ufw,CentOS用firewalld)
sudo ufw disable        # Ubuntu
sudo systemctl stop firewalld && sudo systemctl disable firewalld  # CentOS

# 关闭Swap
sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
注意: 关闭swap是硬性要求。我曾经在测试环境忘了关,结果kubelet一直报错,排查了半小时才发现是swap没关。别踩这个坑。

3.1.3 配置内核参数

为了让容器网络正常工作,需要调整一些内核参数。这里直接上我常用的配置:

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
vm.swappiness = 0
EOF

sudo sysctl --system

为什么要设vm.swappiness = 0?说白了就是告诉内核:尽量别用swap,内存不够就报错,别把进程卡死。我在生产环境见过因为swap导致Pod OOM的案例,调了这个参数后再没出现过。

3.2 Docker环境搭建

Kubernetes从1.24版本开始默认使用containerd作为容器运行时,但Docker依然是很多人的首选。我个人习惯装Docker,因为调试方便,而且大部分镜像都是Docker格式。

3.2.1 安装Docker Engine

这里用官方脚本一键安装,省心:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

装完后把当前用户加入docker组,省得每次敲sudo:

sudo usermod -aG docker $USER
newgrp docker
验证安装: 运行 docker versiondocker run hello-world,看到版本信息和欢迎消息就说明装好了。

3.2.2 配置Docker加速器

国内拉取镜像经常超时,我建议配置镜像加速器。这里以阿里云为例:

sudo mkdir -p /etc/docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
  "registry-mirrors": ["https://你的加速器地址.mirror.aliyuncs.com"],
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "3"
  }
}
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker

注意那个cgroupdriver=systemd,这是Kubernetes推荐的配置。我曾经用默认的cgroupfs,结果kubelet一直报驱动不匹配,改过来就好了。

3.3 Kubernetes环境搭建

终于到重头戏了。搭建K8s集群,我推荐用kubeadm工具。它帮你把最复杂的证书、组件配置都自动化了。

3.3.1 安装kubeadm、kubelet、kubectl

# 添加Kubernetes仓库
sudo apt update && sudo apt install -y apt-transport-https
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF

sudo apt update
sudo apt install -y kubelet=1.28.0-00 kubeadm=1.28.0-00 kubectl=1.28.0-00
sudo apt-mark hold kubelet kubeadm kubectl
版本锁定:apt-mark hold 锁定版本,防止意外升级导致集群崩溃。我在生产环境见过自动升级后API不兼容的惨案。

3.3.2 初始化Master节点

初始化前,先拉取必要的镜像:

sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers

然后初始化:

sudo kubeadm init \
  --apiserver-advertise-address=192.168.1.100 \
  --image-repository=registry.aliyuncs.com/google_containers \
  --kubernetes-version=v1.28.0 \
  --pod-network-cidr=10.244.0.0/16 \
  --service-cidr=10.96.0.0/12

初始化成功后,会输出一段kubeadm join命令,记得保存好,那是Worker节点加入集群的凭证。

3.3.3 配置kubectl

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

验证一下:

kubectl get nodes
# 应该看到Master节点状态为NotReady(还没装网络插件)

3.3.4 安装网络插件

我推荐Flannel,简单稳定:

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

等一两分钟,再查看节点状态:

kubectl get nodes
# 应该看到Master节点状态变为Ready
排错小技巧: 如果节点一直NotReady,用 kubectl describe nodejournalctl -u kubelet -f 查看日志。我遇到过因为Pod CIDR冲突导致网络不通的情况,改一下--pod-network-cidr就好了。

3.3.5 添加Worker节点

在Worker节点上重复前面的Linux基础配置和Docker安装步骤,然后执行Master节点输出的join命令:

sudo kubeadm join 192.168.1.100:6443 --token xxxxx --discovery-token-ca-cert-hash sha256:xxxxx

在Master节点查看:

kubectl get nodes
# 应该看到所有节点都是Ready状态

3.4 验证环境

最后,跑一个简单的Nginx部署来验证整个环境:

kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get pods,svc

如果看到Pod运行中,Service有外部端口,那就说明环境搭建成功了。

总结一下: 这一章我们完成了Linux基础配置、Docker安装、Kubernetes集群搭建。这套环境就是多云管理平台的运行基础。下一章,我们就要在这个集群上部署真正的管理平台了。

嗯,环境准备这块其实不难,就是步骤多。你按我的顺序来,一步都不要跳。我当初第一次搭集群时,就是跳过了内核参数配置,结果网络插件死活起不来。后来老老实实重来一遍,十分钟搞定。