第三章:环境准备——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
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
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 version 和 docker 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
kubectl describe node 和 journalctl -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有外部端口,那就说明环境搭建成功了。
嗯,环境准备这块其实不难,就是步骤多。你按我的顺序来,一步都不要跳。我当初第一次搭集群时,就是跳过了内核参数配置,结果网络插件死活起不来。后来老老实实重来一遍,十分钟搞定。