使用 containerd 作为容器运行时在 Kubernetes 集群中部署 Java 项目,需完成环境准备、项目容器化、集群部署及配置管理等一系列步骤。以下是详细流程:
一、环境准备
-
节点要求:
- 确保所有节点(Master 和 Worker)操作系统兼容(如 CentOS 7/8 或 Ubuntu)。
- 每台节点至少具备 2GB 内存、2 个 CPU 核心和 30GB 硬盘空间。
- 集群内所有节点网络互通,且能够访问外网以下载镜像和依赖。
-
关闭 Swap:
- 执行
swapoff -a命令临时关闭 Swap。 - 编辑
/etc/fstab文件,注释掉所有 Swap 相关行以永久禁用。
- 执行
-
配置防火墙和 SELinux:
- 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld。 - 将 SELinux 设置为 permissive 模式:
setenforce 0,并编辑/etc/selinux/config文件设置SELINUX=permissive。
- 关闭防火墙:
-
配置桥接流量:
- 加载
br_netfilter模块:modprobe br_netfilter。 - 创建
/etc/sysctl.d/k8s.conf文件,添加以下内容:
bashnet.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1- 执行
sysctl -p /etc/sysctl.d/k8s.conf使配置生效。
- 加载
二、安装和配置 containerd
-
安装 containerd:
- 下载 containerd 安装包(如
cri-containerd-cni-<VERSION>-linux-amd64.tar.gz)。 - 解压安装包到根目录:
tar -C / -xzf cri-containerd-cni-<VERSION>-linux-amd64.tar.gz。
- 下载 containerd 安装包(如
-
配置 containerd:
- 创建
/etc/containerd/config.toml文件:containerd config default | sudo tee /etc/containerd/config.toml。 - 编辑配置文件,设置
SystemdCgroup = true以使用 systemd cgroup 驱动。
- 创建
-
启动 containerd:
- 执行
systemctl daemon-reload。 - 启动 containerd:
systemctl enable --now containerd。
- 执行
三、使用 kubeadm 部署 Kubernetes 集群
-
安装 kubeadm、kubelet 和 kubectl:
- 添加 Kubernetes yum 源(如阿里云镜像源)。
- 安装指定版本的 kubeadm、kubelet 和 kubectl:
yum install -y kubelet-<VERSION> kubeadm-<VERSION> kubectl-<VERSION>。 - 启动 kubelet 并设置开机自启:
systemctl enable --now kubelet。
-
初始化 Master 节点:
- 执行
kubeadm init --pod-network-cidr=<CIDR>(如10.244.0.0/16)初始化集群。 - 根据提示配置 kubectl,以便在 Master 节点上管理集群。
- 执行
-
加入 Worker 节点:
- 在 Master 节点上执行
kubeadm token create --print-join-command获取加入集群的命令。 - 在每个 Worker 节点上执行该命令以加入集群。
- 在 Master 节点上执行
四、部署 Java 项目
-
容器化 Java 项目:
- 编写 Dockerfile 文件,定义如何构建 Java 应用的镜像。例如:
dockerfileFROM openjdk:11-jre-slim WORKDIR /app COPY target/my-java-app.jar /app/my-java-app.jar ENTRYPOINT ["java", "-jar", "/app/my-java-app.jar"]- 构建镜像:
docker build -t my-java-app:latest .。
-
推送镜像到镜像仓库(可选):
- 如果集群节点无法直接访问构建镜像的节点,可以将镜像推送到镜像仓库(如 Docker Hub、阿里云容器镜像服务等)。
- 推送镜像:
docker push <镜像仓库地址>/my-java-app:latest。
-
创建 Kubernetes 部署配置文件:
- 编写 Deployment YAML 文件(如
deployment.yaml),定义如何部署 Java 应用。例如:
yamlapiVersion: apps/v1 kind: Deployment metadata: name: my-java-app spec: replicas: 3 selector: matchLabels: app: my-java-app template: metadata: labels: app: my-java-app spec: containers: - name: my-java-app image: my-java-app:latest # 如果使用镜像仓库,则替换为镜像仓库地址 ports: - containerPort: 8080 - 编写 Deployment YAML 文件(如
-
创建 Kubernetes 服务配置文件:
- 编写 Service YAML 文件(如
service.yaml),定义如何暴露 Java 应用。例如:
yamlapiVersion: v1 kind: Service metadata: name: my-java-app-service spec: selector: app: my-java-app type: LoadBalancer ports: - protocol: TCP port: 80 targetPort: 8080 - 编写 Service YAML 文件(如
-
部署 Java 应用:
- 执行
kubectl apply -f deployment.yaml部署 Java 应用。 - 执行
kubectl apply -f service.yaml暴露 Java 应用。
- 执行
五、验证和管理
-
验证部署:
- 执行
kubectl get pods查看 Pod 状态。 - 执行
kubectl get services查看服务状态和外部访问地址。
- 执行
-
访问 Java 应用:
- 根据 Service 类型(如 LoadBalancer)和外部访问地址访问 Java 应用。
-
管理 Java 应用:
- 使用
kubectl命令进行滚动更新、扩缩容等操作。 - 集成日志收集工具(如 Fluentd)和监控系统(如 Prometheus)来收集和分析日志,监控应用性能和健康状态。
- 使用