1. Kubernetes集群部署概述
在当今云原生技术蓬勃发展的时代,Kubernetes已成为容器编排领域的事实标准。作为一名长期从事Linux系统管理和云平台搭建的工程师,我经常需要在Ubuntu服务器上部署Kubernetes集群。本文将详细介绍在Ubuntu 22.04系统上部署Kubernetes 1.23版本的全过程,特别适合那些需要在生产环境或开发测试环境中快速搭建K8s集群的技术人员。
Kubernetes 1.23版本是一个长期支持版本(LTS),虽然它已经不再是最新版本,但在许多企业环境中仍然被广泛使用。选择这个版本的主要原因是它对Docker作为容器运行时的支持,因为从Kubernetes 1.24版本开始,官方移除了对Docker的直接支持,转而使用containerd作为默认容器运行时。
2. 环境准备与系统配置
2.1 服务器规划与网络设置
在开始部署前,我们需要准备三台Ubuntu 22.04服务器,配置如下:
| 操作系统 | 配置 | 主机名 | IP地址 | 所需软件组件 |
|---|---|---|---|---|
| Ubuntu 22.04 | 2C4G | master | 192.168.79.10 | Docker CE、kube-apiserver、kube-controller-manager、kube-scheduler、kubelet、Etcd、kube-proxy |
| Ubuntu 22.04 | 2C4G | node1 | 192.168.79.20 | Docker CE、kubectl、kube-proxy、Flannel |
| Ubuntu 22.04 | 2C4G | node2 | 192.168.79.30 | Docker CE、kubectl、kube-proxy、Flannel |
注意:在实际生产环境中,建议master节点使用更高配置,如4C8G或更高,因为控制平面组件会消耗较多资源。
2.2 基础系统配置
在所有三台服务器上,我们需要执行以下基础配置:
修改主机名
bash复制# 在master节点执行
sudo hostnamectl set-hostname master
# 在node1节点执行
sudo hostnamectl set-hostname node1
# 在node2节点执行
sudo hostnamectl set-hostname node2
配置hosts解析
bash复制# 在所有节点执行相同的hosts配置
sudo tee -a /etc/hosts <<EOF
192.168.79.10 master
192.168.79.20 node1
192.168.79.30 node2
EOF
这个步骤非常重要,因为Kubernetes组件之间需要通过主机名进行通信。确保所有节点都能正确解析彼此的主机名。
2.3 系统优化与依赖安装
安装常用工具
bash复制sudo apt update && sudo apt upgrade -y
sudo apt install -y vim lrzsz unzip wget net-tools tree bash-completion telnet
这些工具虽然不是Kubernetes运行所必需的,但在日常管理和问题排查中非常有用。
关闭交换分区
Kubernetes不支持使用交换分区,我们需要永久禁用swap:
bash复制# 临时关闭
sudo swapoff -a
# 永久关闭
sudo sed -i '/swap/s/^/#/' /etc/fstab
内核参数优化
bash复制cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
这些内核参数对于Kubernetes网络正常工作至关重要:
bridge-nf-call-iptables和bridge-nf-call-ip6tables确保网桥流量经过iptables处理ip_forward启用IP转发,这是Pod间通信的基础
时间同步
bash复制sudo apt install -y ntpdate
sudo ntpdate ntp.aliyun.com
集群节点间的时间同步非常重要,否则可能导致证书验证失败等各种奇怪问题。在生产环境中,建议配置chronyd或ntpd服务持续同步时间。
3. Docker安装与配置
3.1 卸载旧版本Docker
在安装新版本Docker前,先清理可能存在的旧版本:
bash复制for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove $pkg -y
done
3.2 安装Docker依赖
bash复制sudo apt update
sudo apt install -y ca-certificates curl gnupg lsb-release
3.3 添加Docker官方GPG密钥
bash复制curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
这里使用阿里云镜像源加速下载。
3.4 添加Docker软件源
bash复制echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
3.5 安装特定版本Docker
由于Kubernetes 1.23对Docker版本有特定要求,我们需要安装兼容的20.10版本:
bash复制sudo apt update
sudo apt install -y docker-ce=5:20.10.14~3-0~ubuntu-jammy docker-ce-cli=5:20.10.14~3-0~ubuntu-jammy containerd.io
注意:新版本Docker可能与Kubernetes 1.23不兼容,这是许多初学者常犯的错误。
3.6 配置Docker用户组
bash复制sudo usermod -aG docker $USER
newgrp docker
这将允许当前用户无需sudo即可运行docker命令,需要重新登录生效。
3.7 配置Docker加速器
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://kfwkfulq.mirror.aliyuncs.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
这里除了配置镜像加速器外,还做了以下重要配置:
- 设置cgroup驱动为systemd,与kubelet保持一致
- 配置日志轮转,防止日志文件过大
- 使用overlay2存储驱动,这是生产环境推荐配置
4. Kubernetes组件安装
4.1 配置Kubernetes APT源
bash复制sudo apt install -y apt-transport-https ca-certificates curl
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt update
4.2 安装指定版本Kubernetes组件
bash复制sudo apt install -y kubelet=1.23.0-00 kubeadm=1.23.0-00 kubectl=1.23.0-00
sudo apt-mark hold kubelet kubeadm kubectl
这里我们明确指定安装1.23.0版本,并使用apt-mark hold锁定版本,防止意外升级导致兼容性问题。
4.3 验证安装
bash复制kubelet --version
kubeadm version
kubectl version --client
5. Kubernetes集群初始化
5.1 生成初始化配置文件
bash复制kubeadm config print init-defaults > init-config.yaml
5.2 修改初始化配置
编辑init-config.yaml文件,主要修改以下部分:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.79.10 # 修改为master节点IP
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: master # 确保与主机名一致
---
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
imageRepository: registry.aliyuncs.com/google_containers # 使用国内镜像源
kubernetesVersion: 1.23.0 # 指定版本
networking:
podSubnet: 10.244.0.0/16 # 与后续Flannel配置一致
5.3 预拉取镜像
bash复制kubeadm config images pull --config=init-config.yaml
这一步可以提前下载所需镜像,避免初始化时因网络问题失败。
5.4 初始化集群
bash复制sudo kubeadm init --config=init-config.yaml
初始化成功后,会输出类似以下信息:
code复制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
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.79.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:277ee959ffdec4bbe720e408ec0a093e15b61ad9d008147d4e9987c44772c5d3
5.5 配置kubectl
bash复制mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
6. 节点加入集群
在worker节点(node1和node2)上执行master节点初始化成功后输出的join命令:
bash复制sudo kubeadm join 192.168.79.10:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:277ee959ffdec4bbe720e408ec0a093e15b61ad9d008147d4e9987c44772c5d3
7. 网络插件安装
7.1 安装Flannel网络插件
bash复制kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
7.2 验证集群状态
bash复制kubectl get nodes
kubectl get pods -A
等待所有Pod状态变为Running,集群部署就完成了。
8. 常见问题与解决方案
8.1 初始化时卡住
如果kubeadm init命令卡在某个步骤,可以尝试:
- 检查网络连接,确保能访问所需镜像仓库
- 查看具体卡住的组件日志:journalctl -xeu kubelet
- 确认所有前置条件满足(swap关闭、内核参数正确等)
8.2 节点NotReady状态
如果节点长时间处于NotReady状态:
- 检查kubelet服务是否正常运行:systemctl status kubelet
- 查看kubelet日志:journalctl -xeu kubelet
- 确认网络插件是否正常部署
8.3 Pod网络问题
如果Pod间无法通信:
- 确认Flannel或其他网络插件已正确安装
- 检查节点防火墙规则,确保没有阻断Pod网络流量
- 验证网络插件配置与kubeadm初始化时指定的podSubnet一致
9. 生产环境建议
- 考虑使用高可用部署模式,部署多个master节点
- 配置集群自动扩缩容(CA)
- 设置合理的资源请求和限制
- 实施网络策略控制Pod间通信
- 定期备份etcd数据
- 考虑使用更成熟的网络插件如Calico,提供更丰富的网络策略功能
通过以上步骤,我们成功在Ubuntu 22.04上部署了一个Kubernetes 1.23集群。这套配置经过多次实践验证,可以作为开发测试环境使用,也可以作为生产环境的基础配置。根据实际需求,可能还需要进一步配置存储、监控、日志等附加组件。