Linux云原生微服务架构搭建:从零开始部署与验证
很多朋友想尝试在Linux上搭建云原生微服务架构,但又被一大堆新概念吓住。
其实只要理清思路,跟着步骤走,你也能在自己的服务器上跑起来一个简单的微服务示例。
本文会从零开始,带你完成环境准备、代码容器化、Kubernetes部署以及最后的验证,每一步都给出可直接执行的命令和配置。
搭建前的环境准备
你需要一台Linux服务器(CentOS 7/8或Ubuntu 20.04+均可,虚拟机或云主机都行)。
为了在本地跑Kubernetes,推荐使用minikube,它能在单机上启动一个完整的K8s集群。
先安装Docker:
# CentOS
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install docker-ce docker-ce-cli containerd.io -y
sudo systemctl start docker && sudo systemctl enable docker
接着安装kubectl和minikube:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
chmod +x minikube && sudo mv minikube /usr/local/bin/
启动minikube(驱动选docker):minikube start --driver=docker。
看到Done!就代表环境就绪。
kubectl is now configured
编写并容器化微服务代码
我们准备两个简单的Python Flask服务:user-service(返回用户信息)和order-service(返回订单信息,并调用user-service)。
先在服务器上创建项目目录:
mkdir microservices && cd microservices
mkdir user-service order-service
user-service的app.py:
from flask import Flask, jsonify
app = Flask(__name__)
@app.route('/user')
def get_user():
return jsonify({"id": 1, "name": "Alice"})
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
对应的Dockerfile:
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install flask
COPY . .
CMD ["python", "app.py"]
注意requirements.txt里只写flask。
同样方式创建order-service,区别是它额外调用user-service(通过环境变量USER_SERVICE_URL获取用户信息)。
构建镜像:
cd user-service && docker build -t user-service:v1 .
cd ../order-service && docker build -t order-service:v1 .
构建完成后,用minikube image load user-service:v1 order-service:v1将镜像加载到minikube的Docker环境。
在Kubernetes中部署服务
每个服务都需要一个Deployment和一个Service。
创建user-deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-deployment
spec:
replicas: 1
selector:
matchLabels:
app: user
template:
metadata:
labels:
app: user
spec:
containers:
- name: user
image: user-service:v1
ports:
- containerPort: 5000
再创建user-service.yaml(类型为ClusterIP,供内部调用):
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user
ports:
- protocol: TCP
port: 5000
targetPort: 5000
用相同方式创建order-deployment.yaml和order-service.yaml(其中order-service的Service类型设为NodePort,方便外部访问)。
在order-deployment的环境变量中指定USER_SERVICE_URL=http://user-service:5000。
然后应用所有YAML:
kubectl apply -f user-deployment.yaml -f user-service.yaml
kubectl apply -f order-deployment.yaml -f order-service.yaml
几分钟后,用kubectl get pods查看所有Pod是否Running。
常见问题与避坑经验
- 镜像拉取失败:如果minikube内的容器无法拉取本地镜像,一定要先用
minikube image load把镜像导入。也可以设置imagePullPolicy为Never。 - Pod一直Pending:检查资源是否足够:
kubectl describe pod。minikube默认分配2核CPU和2G内存,如果不够,启动时加参数--cpus=4 --memory=4096。 - 服务之间调用不通:确保Service名称和端口正确,且在同一个Namespace。可以在order-service Pod内用
curl http://user-service:5000/user测试。 - 外部无法访问order-service:如果Service类型用了NodePort,先通过
minikube service order-service --url获取访问地址,通常是http://192.168.49.2:随机端口。
验证微服务架构是否正常工作
执行以下命令获取order-service的访问地址:
minikube service order-service --url
在浏览器或通过curl访问该URL下的/order路径(假设order-service的/order会返回订单信息并包含用户数据),例如:curl http://192.168.49.2:32456/order。
返回的JSON应该包含订单详情和用户数据,这证明两个微服务已经通过Kubernetes内部的Service发现成功通信,一个完整的Linux云原生微服务架构搭建完成。
如果你在搭建过程中遇到其他问题,建议先核对环境版本(Docker 20+、Kubernetes 1.24+),然后按照本文的避坑点逐个排查。
掌握了这套流程,以后部署更复杂的云原生微服务架构也会轻松很多。