1. Kubernetes安装前的环境准备
在开始Kubernetes安装之前,我们需要确保基础环境已经准备就绪。作为一个在生产环境部署过数十个Kubernetes集群的老兵,我强烈建议不要跳过这个环节,否则后续会出现各种"玄学"问题。
1.1 系统要求检查
首先确认你的主机满足以下最低要求:
- 操作系统:Ubuntu 16.04+/CentOS 7+/Debian 9+(个人推荐Ubuntu 20.04 LTS)
- CPU:至少2核(生产环境建议4核以上)
- 内存:至少2GB(生产环境建议8GB以上)
- 磁盘:至少20GB可用空间
- 网络:每个节点能互相通信,且能访问外网
重要提示:所有节点需要确保时间同步,建议安装NTP服务。我在实际部署中遇到过因为时间不同步导致的证书验证失败问题,排查了整整一天!
1.2 基础服务配置
在所有节点上执行以下操作:
# 关闭swap(Kubernetes 1.8+要求) sudo swapoff -a # 永久禁用,编辑/etc/fstab注释swap行 sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab # 关闭SELinux(兼容性问题高发区) sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config # 配置防火墙规则(如果使用firewalld) sudo firewall-cmd --permanent --add-port=6443/tcp sudo firewall-cmd --permanent --add-port=2379-2380/tcp sudo firewall-cmd --permanent --add-port=10250/tcp sudo firewall-cmd --permanent --add-port=10251/tcp sudo firewall-cmd --permanent --add-port=10252/tcp sudo firewall-cmd --reload1.3 容器运行时安装
Kubernetes支持多种容器运行时,但Docker仍然是最成熟的选择。安装Docker CE版本:
# Ubuntu示例 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt-get update sudo apt-get install -y docker-ce=5:19.03.15~3-0~ubuntu-focal # 配置Docker使用systemd作为cgroup driver(必须!) sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF sudo systemctl enable docker && sudo systemctl daemon-reload && sudo systemctl restart docker2. Kubernetes组件安装与配置
2.1 安装kubeadm、kubelet和kubectl
在所有节点上执行:
# 添加Kubernetes源 sudo apt-get update && sudo apt-get install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list deb https://apt.kubernetes.io/ kubernetes-xenial main EOF sudo apt-get update # 安装指定版本(这里选择1.22.5稳定版) sudo apt-get install -y kubelet=1.22.5-00 kubeadm=1.22.5-00 kubectl=1.22.5-00 sudo apt-mark hold kubelet kubeadm kubectl # 防止自动升级2.2 初始化控制平面节点
选择一个节点作为master(现在叫control-plane节点),执行初始化:
sudo kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=<节点内网IP> \ --kubernetes-version=v1.22.5 \ --image-repository=registry.aliyuncs.com/google_containers实战经验:国内用户一定要指定
--image-repository使用阿里云镜像,否则会因为网络问题导致镜像拉取失败。我在第一次部署时没注意这点,等了两个小时才发现卡在镜像下载。
成功后会输出类似以下信息:
Your Kubernetes control-plane has initialized successfully! To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config按照提示配置kubectl:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config2.3 安装网络插件
Kubernetes需要网络插件才能实现Pod间通信。这里选择Flannel:
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml检查安装状态:
kubectl get pods -n kube-system # 等待所有Pod状态变为Running3. 工作节点加入集群
3.1 获取加入命令
在master节点上查看加入命令:
kubeadm token create --print-join-command会输出类似:
kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef3.2 在工作节点上执行加入命令
在每个工作节点上执行上面获取的命令(需要sudo权限):
sudo kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef成功后会显示:
This node has joined the cluster: * Certificate signing request was sent to apiserver and a response was received. * The Kubelet was informed of the new secure connection details.3.3 验证集群状态
回到master节点,执行:
kubectl get nodes应该能看到所有节点状态为Ready。如果看到NotReady,通常是网络插件还没完全启动,等待几分钟再检查。
4. 常见问题排查与优化
4.1 安装过程中的典型错误
问题1:kubeadm init卡住
- 检查docker是否正常运行:
sudo systemctl status docker - 查看具体日志:
journalctl -xeu kubelet - 常见原因:镜像拉取失败,可以手动拉取:
sudo kubeadm config images pull --image-repository=registry.aliyuncs.com/google_containers
问题2:节点无法加入集群
- 检查6443端口是否开放:
telnet <master-ip> 6443 - 检查token是否过期(默认24小时):
kubeadm token list - 重新生成token:
kubeadm token create --print-join-command
4.2 生产环境优化建议
高可用部署:生产环境应该部署多个control-plane节点,使用负载均衡器访问API Server。
证书管理:kubeadm默认证书有效期1年,建议使用
kubeadm alpha certs renew定期更新,或配置外部证书。资源预留:为系统进程和Kubernetes组件预留资源,编辑
/var/lib/kubelet/config.yaml:systemReserved: cpu: "500m" memory: "500Mi" kubeReserved: cpu: "500m" memory: "500Mi"日志收集:配置
/etc/docker/daemon.json中的日志轮转,避免磁盘被日志占满。
4.3 常用诊断命令
# 查看集群状态 kubectl get cs # 查看事件(排查Pod创建失败等问题) kubectl get events --sort-by='.metadata.creationTimestamp' # 查看组件日志 journalctl -u kubelet -f kubectl logs -n kube-system <pod-name> # 诊断网络问题 kubectl run -it --rm --image=nicolaka/netshoot test -- /bin/bash # 在容器内执行ping/nslookup等命令5. 后续配置建议
集群安装完成后,建议进行以下配置:
安装Dashboard(可选):
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.3.1/aio/deploy/recommended.yaml kubectl proxy # 然后访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/配置存储:根据需求安装NFS/CSI驱动或云厂商的存储插件。
配置Ingress Controller:如Nginx Ingress:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.0.4/deploy/static/provider/cloud/deploy.yaml配置监控:安装Prometheus Operator或使用云厂商的监控服务。
经过以上步骤,你应该已经成功部署了一个生产可用的Kubernetes集群。记住,Kubernetes的安装只是开始,真正的挑战在于日常运维和优化。建议从简单的应用开始部署,逐步熟悉各种资源和控制器的工作原理。