1. 项目概述
在云计算和容器化技术大行其道的今天,Kubernetes已经成为事实上的容器编排标准。作为一名长期在Linux环境下工作的系统管理员,我最近在Ubuntu 20.04 LTS上成功部署了Kubernetes 1.23版本,整个过程虽然遇到不少坑,但最终收获颇丰。本文将详细记录这次部署的全过程,包括环境准备、组件安装、集群初始化、网络配置等关键步骤,并分享我在实际操作中积累的经验和技巧。
Kubernetes 1.23版本带来了不少新特性,比如默认启用CSI存储驱动、PodSecurityPolicy的替代方案PodSecurity等,这些改进使得集群管理更加高效和安全。选择Ubuntu作为部署平台,是因为它在企业环境中广泛使用,稳定性好,社区支持完善。通过本文,你将学会如何在Ubuntu上从零开始搭建一个生产可用的Kubernetes 1.23集群。
2. 环境准备与系统配置
2.1 硬件与系统要求
在开始之前,我们需要准备至少两台Ubuntu服务器(一台master和至少一台worker节点)。以下是推荐的最低配置:
- CPU:2核或以上
- 内存:2GB(master节点建议4GB)
- 磁盘:20GB可用空间
- 操作系统:Ubuntu 20.04 LTS或22.04 LTS
注意:生产环境应根据实际负载需求适当提高配置,特别是内存和CPU资源。
2.2 系统基础配置
在所有节点上执行以下操作:
- 更新系统软件包:
bash复制sudo apt update && sudo apt upgrade -y
- 禁用交换分区(Kubernetes要求):
bash复制sudo swapoff -a
sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- 加载必要的内核模块:
bash复制sudo modprobe overlay
sudo modprobe br_netfilter
- 设置内核参数:
bash复制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
EOF
sudo sysctl --system
- 安装基础依赖:
bash复制sudo apt install -y apt-transport-https ca-certificates curl gnupg lsb-release
3. 容器运行时安装与配置
3.1 安装Docker
Kubernetes 1.23支持多种容器运行时,这里我们选择Docker作为示例:
- 添加Docker官方GPG密钥:
bash复制curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
- 添加Docker仓库:
bash复制echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
- 安装Docker引擎:
bash复制sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
- 配置Docker使用systemd作为cgroup驱动(Kubernetes要求):
bash复制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
- 重启Docker并设置开机启动:
bash复制sudo systemctl enable docker && sudo systemctl daemon-reload && sudo systemctl restart docker
3.2 验证容器运行时
运行以下命令验证Docker安装是否成功:
bash复制sudo docker run hello-world
如果看到"Hello from Docker!"的消息,说明安装正确。
4. Kubernetes组件安装
4.1 安装kubeadm、kubelet和kubectl
在所有节点上执行以下步骤:
- 添加Kubernetes官方GPG密钥:
bash复制sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
- 添加Kubernetes仓库:
bash复制echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
- 安装Kubernetes 1.23.x版本组件:
bash复制sudo apt update
sudo apt install -y kubelet=1.23.* kubeadm=1.23.* kubectl=1.23.*
sudo apt-mark hold kubelet kubeadm kubectl
提示:使用apt-mark hold可以防止这些包被意外升级,这在生产环境中尤为重要。
4.2 初始化Master节点
在master节点上执行以下命令初始化集群:
bash复制sudo kubeadm init --pod-network-cidr=10.244.0.0/16 --kubernetes-version=1.23.0
参数说明:
--pod-network-cidr:指定Pod网络的CIDR范围,这里使用Flannel网络的默认值--kubernetes-version:明确指定1.23.0版本
初始化完成后,你会看到类似下面的输出:
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
按照提示执行这些命令来配置kubectl。
4.3 安装Pod网络插件
Kubernetes需要网络插件才能实现Pod间的通信。这里我们选择Flannel:
bash复制kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
验证网络插件是否安装成功:
bash复制kubectl get pods -n kube-system
你应该能看到flannel相关的Pod处于Running状态。
5. Worker节点加入集群
5.1 获取加入命令
在master节点上,运行以下命令获取worker节点加入集群的命令:
bash复制kubeadm token create --print-join-command
这会输出类似如下的命令:
code复制kubeadm join 192.168.1.100:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef
5.2 在Worker节点上执行加入命令
在每个worker节点上,运行上一步获取的kubeadm join命令。加入成功后,在master节点上运行:
bash复制kubectl get nodes
你应该能看到所有节点列出,状态为Ready。
6. 集群验证与基本操作
6.1 验证集群状态
运行以下命令检查集群组件状态:
bash复制kubectl get componentstatuses
kubectl get all --all-namespaces
6.2 部署测试应用
部署一个简单的Nginx应用来测试集群:
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc nginx
访问该服务:
bash复制curl http://<node-ip>:<node-port>
你应该能看到Nginx的欢迎页面。
7. 常见问题与解决方案
7.1 初始化失败问题
问题1:kubeadm init卡在"waiting for the control plane to become ready"
解决方案:
- 检查网络插件是否正确安装
- 查看kubelet日志:
journalctl -xeu kubelet - 确保所有必要的端口已开放(6443, 10250等)
问题2:cgroup驱动不匹配
解决方案:
确保Docker和kubelet使用相同的cgroup驱动(建议都使用systemd):
bash复制sudo sed -i 's/^ExecStart=\/usr\/bin\/kubelet.*/& --cgroup-driver=systemd/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl daemon-reload
sudo systemctl restart kubelet
7.2 节点NotReady问题
问题:worker节点加入后状态为NotReady
解决方案:
- 检查网络插件Pod是否在所有节点上运行
- 验证网络连接:
ping <master-ip> - 检查kubelet日志:
journalctl -xeu kubelet
7.3 镜像拉取失败
问题:Pod状态为ImagePullBackOff
解决方案:
- 检查镜像名称是否正确
- 如果使用私有仓库,确保配置了正确的imagePullSecrets
- 可以手动拉取镜像:
docker pull <image-name>
8. 生产环境优化建议
8.1 安全加固
- 启用RBAC(默认已启用)
- 限制kubelet权限:
bash复制sudo sed -i 's/^ExecStart=\/usr\/bin\/kubelet.*/& --authorization-mode=Webhook --client-ca-file=\/etc\/kubernetes\/pki\/ca.crt/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl daemon-reload
sudo systemctl restart kubelet
- 使用PodSecurity替代已废弃的PodSecurityPolicy:
bash复制kubectl label --overwrite ns default pod-security.kubernetes.io/enforce=baseline
8.2 性能优化
- 调整kubelet资源配置:
bash复制sudo sed -i 's/^ExecStart=\/usr\/bin\/kubelet.*/& --kube-reserved=cpu=500m,memory=500Mi --system-reserved=cpu=500m,memory=500Mi/' /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
sudo systemctl daemon-reload
sudo systemctl restart kubelet
- 配置etcd调优参数(在/var/lib/kubelet/config.yaml中设置)
8.3 高可用配置
对于生产环境,建议配置多master节点实现高可用:
- 准备至少3台master节点
- 使用外部etcd集群或堆叠etcd拓扑
- 配置负载均衡器(如HAProxy)为API server提供单一入口点
- 使用以下命令初始化高可用集群:
bash复制kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" --upload-certs --pod-network-cidr=10.244.0.0/16
9. 维护与升级
9.1 日常维护命令
查看集群状态:
bash复制kubectl get nodes
kubectl get pods -A
kubectl top nodes
kubectl top pods
查看组件日志:
bash复制journalctl -xeu kubelet
kubectl logs -n kube-system <pod-name>
9.2 升级策略
Kubernetes 1.23的升级步骤:
- 首先升级kubeadm:
bash复制sudo apt update
sudo apt install kubeadm=1.23.x-00
sudo kubeadm upgrade plan
sudo kubeadm upgrade apply v1.23.x
- 然后升级kubelet和kubectl:
bash复制sudo apt install kubelet=1.23.x-00 kubectl=1.23.x-00
sudo systemctl daemon-reload
sudo systemctl restart kubelet
提示:升级前务必备份重要数据,并在测试环境验证升级过程。
10. 经验分享与实用技巧
在实际部署过程中,我积累了一些非常有用的经验:
- 离线环境部署:对于没有互联网访问的环境,可以预先下载所有需要的镜像:
bash复制kubeadm config images pull --kubernetes-version=v1.23.0
docker save $(docker images -q) -o k8s-images.tar
然后在目标机器上使用docker load -i k8s-images.tar导入。
- 自定义镜像仓库:如果无法访问gcr.io,可以配置kubeadm使用自定义仓库:
bash复制kubeadm init --image-repository=your-registry.example.com
- 资源清理:如果初始化失败需要重新开始,可以运行:
bash复制kubeadm reset
sudo rm -rf /etc/cni/net.d /etc/kubernetes /var/lib/etcd
-
日志收集:配置集中式日志收集(如EFK栈)对于生产环境至关重要。
-
监控告警:部署Prometheus和Grafana监控集群健康状态。
-
备份策略:定期备份etcd数据:
bash复制ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 \
--cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/server.crt \
--key=/etc/kubernetes/pki/etcd/server.key \
snapshot save snapshot.db
-
网络性能优化:对于高性能场景,考虑使用Calico或Cilium替代Flannel。
-
存储配置:提前规划存储方案,考虑使用CSI驱动连接云存储或本地存储系统。
-
节点维护:正确排空节点后再进行维护:
bash复制kubectl drain <node-name> --ignore-daemonsets --delete-emptydir-data
kubectl uncordon <node-name>
- 证书管理:定期检查证书过期时间:
bash复制kubeadm certs check-expiration
kubeadm certs renew all