1. Kubernetes 1.23 集群部署概述
在Ubuntu 22.04上部署Kubernetes 1.23集群是一个相对成熟稳定的选择,特别是对于需要长期维护的生产环境。Kubernetes 1.23版本是最后一个官方支持Docker作为容器运行时的版本,这使得它成为许多传统部署场景的理想选择。
我选择这个特定版本组合有几个重要考虑:
- Ubuntu 22.04 LTS提供5年的长期支持,确保系统层面的稳定性
- Kubernetes 1.23与Docker的兼容性经过充分验证
- 这个组合有丰富的社区支持和问题解决方案
本次部署采用1个Master节点和2个Worker节点的架构,这是最小的高可用配置,能够满足大多数开发和测试环境的需求。Master节点将运行控制平面组件(API Server、Controller Manager、Scheduler等),而Worker节点则运行实际的工作负载。
2. 环境准备与系统配置
2.1 主机规划与网络设置
在开始之前,我们需要规划好集群的主机配置。以下是本次部署的节点规划:
| 主机名 | IP地址 | 角色 | CPU | 内存 | 磁盘 |
|---|---|---|---|---|---|
| master | 192.168.183.4 | Master | 2核 | 4GB | 20GB |
| node1 | 192.168.183.11 | Worker | 2核 | 4GB | 20GB |
| node2 | 192.168.183.15 | Worker | 2核 | 4GB | 20GB |
注意:生产环境建议Master节点配置不低于4核8GB,Worker节点根据工作负载需求调整
首先在所有节点上设置主机名和hosts解析:
bash复制# 在master节点
sudo hostnamectl set-hostname master
# 在node1节点
sudo hostnamectl set-hostname node1
# 在node2节点
sudo hostnamectl set-hostname node2
然后编辑/etc/hosts文件,添加所有节点的IP和主机名映射:
bash复制cat >> /etc/hosts << EOF
192.168.183.4 master
192.168.183.11 node1
192.168.183.15 node2
EOF
2.2 系统基础配置
Kubernetes对Linux系统有一些特定的要求,我们需要在所有节点上进行以下配置:
- 关闭交换分区(Kubernetes不支持swap):
bash复制# 临时关闭
swapoff -a
# 永久关闭
sed -i '/swap/s/^/#/' /etc/fstab
- 启用IP转发和优化内核参数:
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
- 确保时间同步:
bash复制sudo apt -y install ntpdate
ntpdate ntp.aliyun.com
- 安装常用工具:
bash复制sudo apt update
sudo apt install -y vim lrzsz unzip wget net-tools tree bash-completion telnet
3. Docker安装与配置
3.1 Docker版本选择
由于Kubernetes 1.23是最后一个官方支持Docker的版本,我们需要特别注意Docker版本的选择。经过测试,Docker 20.10.14与Kubernetes 1.23的兼容性最佳。
安装步骤如下:
- 卸载旧版本Docker(如果有):
bash复制for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do
sudo apt-get remove $pkg
done
- 安装依赖包:
bash复制sudo apt-get -y install ca-certificates curl gnupg lsb-release
- 添加Docker官方GPG密钥:
bash复制curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
- 添加Docker软件源:
bash复制sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
- 安装特定版本的Docker:
bash复制sudo apt install docker-ce=5:20.10.14~3-0~ubuntu-jammy \
docker-ce-cli=5:20.10.14~3-0~ubuntu-jammy \
containerd.io -y
3.2 Docker优化配置
为了提高Docker的性能和稳定性,我们需要进行一些优化配置:
- 配置Docker镜像加速器:
bash复制sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://0c105db5188026850f80c001def654a0.mirror.swr.myhuaweicloud.com",
"https://5tqw56kt.mirror.aliyuncs.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
- 重启Docker使配置生效:
bash复制sudo systemctl daemon-reload
sudo systemctl restart docker
sudo systemctl enable docker
- 将当前用户加入docker组(避免每次使用sudo):
bash复制sudo usermod -aG docker $USER
注意:用户需要重新登录才能使组权限生效
4. Kubernetes组件安装
4.1 配置Kubernetes源
由于国内访问官方源较慢,我们使用阿里云的镜像源:
bash复制# 安装必要工具
sudo apt-get install -y apt-transport-https ca-certificates curl
# 添加GPG密钥
curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
# 添加Kubernetes源
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-get update
4.2 安装Kubernetes组件
我们需要安装三个核心组件:
- kubeadm:集群安装工具
- kubelet:节点代理
- kubectl:集群管理命令行工具
bash复制# 安装特定版本
sudo apt-get install -y kubelet=1.23.0-00 kubeadm=1.23.0-00 kubectl=1.23.0-00
# 锁定版本,防止意外升级
sudo apt-mark hold kubelet kubeadm kubectl docker docker-ce docker-ce-cli
# 验证版本
kubelet --version
kubeadm version
kubectl version --client
4.3 初始化Master节点
- 生成初始化配置文件:
bash复制kubeadm config print init-defaults > init-config.yaml
- 修改配置文件:
yaml复制apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.183.4 # 修改为master节点IP
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
imagePullPolicy: IfNotPresent
name: master
taints: null
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 使用国内镜像源
kind: ClusterConfiguration
kubernetesVersion: 1.23.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16 # 与flannel网络插件匹配
scheduler: {}
- 拉取所需镜像(可选,如果网络通畅可以跳过):
bash复制kubeadm config images pull --config=init-config.yaml
- 初始化集群:
bash复制sudo kubeadm init --config=init-config.yaml
初始化成功后,会输出加入集群的命令,类似:
bash复制kubeadm join 192.168.183.4:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:3da189f0dae13af003293308bd0581d9919ba7cd18acd5af67f61ef835868890
- 配置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
5. Worker节点加入集群
在每个Worker节点上执行Master节点初始化时输出的join命令:
bash复制kubeadm join 192.168.183.4:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:3da189f0dae13af003293308bd0581d9919ba7cd18acd5af67f61ef835868890
在Master节点上验证节点状态:
bash复制kubectl get nodes
此时节点状态应为NotReady,因为尚未安装网络插件。
6. 网络插件安装与配置
6.1 安装Flannel网络插件
Flannel是一个简单可靠的Kubernetes网络解决方案,我们选择它是因为:
- 配置简单,易于维护
- 社区支持良好
- 性能满足大多数场景需求
安装步骤:
- 下载flannel配置文件:
bash复制wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
- 修改配置文件中的网络参数(确保与init-config.yaml中的podSubnet一致):
yaml复制net-conf.json: |
{
"Network": "10.244.0.0/16",
"EnableNFTables": false,
"Backend": {
"Type": "vxlan"
}
}
- 应用配置:
bash复制kubectl apply -f kube-flannel.yml
6.2 验证网络状态
等待几分钟后,检查集群状态:
bash复制kubectl get nodes
kubectl get pods -n kube-flannel
kubectl get pods -n kube-system
所有节点状态应为Ready,且所有Pod都应处于Running状态。
7. 集群功能验证
7.1 部署测试应用
部署一个简单的Nginx应用来验证集群功能:
bash复制kubectl create deployment nginx --image=nginx
kubectl expose deployment nginx --port=80 --type=NodePort
检查服务状态:
bash复制kubectl get svc nginx
访问测试:
bash复制curl http://<任意节点IP>:<NodePort>
7.2 启用kubectl自动补全
为了方便使用,可以启用kubectl命令自动补全:
bash复制echo 'source <(kubectl completion bash)' >> ~/.bashrc
source ~/.bashrc
8. 安装KubePi管理面板
KubePi是一个轻量级的Kubernetes管理面板,提供可视化操作界面:
bash复制docker run --privileged -d --restart=unless-stopped -p 80:80 1panel/kubepi
访问http://<master节点IP>,使用默认凭据登录:
- 用户名:admin
- 密码:kubepi
首次登录后,导入Kubernetes配置:
bash复制cat ~/.kube/config
9. 常见问题与解决方案
9.1 节点NotReady状态
可能原因及解决方案:
- 网络插件未正确安装:重新应用flannel配置
- 防火墙阻止通信:检查并配置防火墙规则
- 节点资源不足:检查节点资源使用情况
9.2 Pod无法正常启动
排查步骤:
- 查看Pod描述信息:
bash复制kubectl describe pod <pod-name>
- 查看Pod日志:
bash复制kubectl logs <pod-name>
- 检查节点Docker服务状态
9.3 镜像拉取失败
解决方案:
- 检查镜像地址是否正确
- 配置正确的镜像加速器
- 手动拉取镜像到各个节点
10. 维护与升级建议
10.1 日常维护
- 定期备份关键配置:
bash复制# 备份etcd数据
sudo docker run --rm -v /var/lib/etcd:/var/lib/etcd -v $(pwd):/backup \
k8s.gcr.io/etcd:3.5.1-0 etcdctl snapshot save /backup/etcd-snapshot-$(date +%Y%m%d).db \
--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
# 备份kubeconfig
cp -r /etc/kubernetes /backup/kubernetes-$(date +%Y%m%d)
- 监控集群状态:
bash复制kubectl top nodes
kubectl get events --sort-by='.metadata.creationTimestamp'
10.2 升级注意事项
- 升级前务必备份所有关键数据
- 先升级kubeadm工具,再升级控制平面,最后升级节点
- 测试环境验证后再在生产环境执行升级
- 关注Kubernetes官方发布的已知问题和解决方案
通过以上步骤,我们成功在Ubuntu 22.04上部署了一个稳定可用的Kubernetes 1.23集群。这个配置适合中小型开发和测试环境使用。对于生产环境,建议考虑增加Master节点实现高可用,并根据工作负载特点调整节点资源配置和网络插件选择。