内容简介:本文风哥教程参考Linux官方文档、Red Hat Enterprise Linux官方文档、Ansible Automation Platform官方文档、Docker官方文档、Kubernetes官方文档和Podman官方文档等内容,详细介绍了相关技术的配置和使用方法。
风哥提示:
本文档介绍Kubernetes微服务架构部署实战案例。
Part01-微服务架构
1.1 架构设计
[root@k8s-master ~]# cat > /root/fgedu-microservice.txt << 'EOF' FGEDU微服务架构项目 =================== 1. 服务组件 - API Gateway: 统一入口 - User Service: 用户服务 - Order Service: 订单服务 - Product Service: 商品服务 - Message Queue: 消息队列 2. 技术栈 - 服务框架: Spring Boot - 服务发现: Kubernetes Service - 配置中心: ConfigMap - 链路追踪: Jaeger - 监控: Prometheus + Grafana 3. 通信方式 - 同步: REST API - 异步: RabbitMQ/Kafka - 服务发现: DNS 4. 高可用设计 - 多副本部署 - 服务熔断 - 限流降级 - 故障隔离 EOF
Part02-部署消息队列
2.1 RabbitMQ部署
[root@k8s-master ~]# kubectl create namespace fgedu-microservice
namespace/fgedu-microservice created
# 部署RabbitMQ
[root@k8s-master ~]# cat > fgedu-rabbitmq.yaml << 'EOF'
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: fgedu-rabbitmq
namespace: fgedu-microservice
spec:
serviceName: fgedu-rabbitmq
replicas: 3
selector:
matchLabels:
app: fgedu-rabbitmq
template:
metadata:
labels:
app: fgedu-rabbitmq
spec:
containers:
- name: rabbitmq
image: rabbitmq:3.12-management
ports:
- containerPort: 5672
name: amqp
- containerPort: 15672
name: management
env:
- name: RABBITMQ_ERLANG_COOKIE
value: "fgedu-rabbitmq-cluster"
- name: RABBITMQ_NODENAME
value: "rabbit@$(hostname)"
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
livenessProbe:
exec:
command:
- rabbitmqctl
- status
initialDelaySeconds: 60
periodSeconds: 30
readinessProbe:
exec:
command:
- rabbitmqctl
- status
initialDelaySeconds: 20
periodSeconds: 10
volumeMounts:
- name: data
mountPath: /var/lib/rabbitmq
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: fgedu-nfs-storage
resources:
requests:
storage: 10Gi
---
apiVersion: v1
kind: Service
metadata:
name: fgedu-rabbitmq
namespace: fgedu-microservice
spec:
ports:
- port: 5672
targetPort: 5672
name: amqp
- port: 15672
targetPort: 15672
name: management
clusterIP: None
selector:
app: fgedu-rabbitmq
---
apiVersion: v1
kind: Service
metadata:
name: fgedu-rabbitmq-lb
namespace: fgedu-microservice
spec:
type: NodePort
ports:
- port: 15672
targetPort: 15672
nodePort: 30672
name: management
selector:
app: fgedu-rabbitmq
EOF
[root@k8s-master ~]# kubectl apply -f fgedu-rabbitmq.yaml
statefulset.apps/fgedu-rabbitmq created
service/fgedu-rabbitmq created
service/fgedu-rabbitmq-lb created
# 查看RabbitMQ状态
[root@k8s-master ~]# kubectl get pods -n fgedu-microservice -l app=fgedu-rabbitmq
NAME READY STATUS RESTARTS AGE
fgedu-rabbitmq-0 1/1 Running 0 2m
fgedu-rabbitmq-1 1/1 Running 0 1m
fgedu-rabbitmq-2 1/1 Running 0 30s
Part03-部署微服务
3.1 用户服务部署
[root@k8s-master ~]# cat > fgedu-user-service.yaml << 'EOF' apiVersion: v1 kind: ConfigMap metadata: name: fgedu-user-config namespace: fgedu-microservice data: application.yml: | server: port: 8080 spring: datasource: url: jdbc:mysql://fgedu-mysql:3306/fgedudb username: fgedu password: fgedu123 rabbitmq: host: fgedu-rabbitmq port: 5672 username: guest password: guest management: endpoints: web: exposure: include: health,info,metrics --- apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-user-service namespace: fgedu-microservice spec: replicas: 3 selector: matchLabels: app: fgedu-user-service template: metadata: labels: app: fgedu-user-service spec: containers: - name: user-service image: fgedu/user-service:1.0.0 ports: - containerPort: 8080 volumeMounts: - name: config mountPath: /app/config readOnly: true env: - name: SPRING_CONFIG_LOCATION value: classpath:/,file:/app/config/ - name: JAVA_OPTS value: "-Xms256m -Xmx512m" resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 5 volumes: - name: config configMap: name: fgedu-user-config --- apiVersion: v1 kind: Service metadata: name: fgedu-user-service namespace: fgedu-microservice spec: ports: - port: 8080 targetPort: 8080 selector: app: fgedu-user-service EOF [root@k8s-mast学习交流加群风哥QQ113257174er ~]# kubectl apply -f fgedu-user-service.yaml configmap/fgedu-user-config created deployment.apps/fgedu-user-service created service/fgedu-user-service created # 部署订单服务 [root@k8s-master ~]# cat > fgedu-order-service.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-order-service namespace: fgedu-microservice spec: replicas: 3 selector: matchLabels: app: fgedu-order-service template: metadata: labels: app: fgedu-order-service spec: containers: - name: order-service image: fgedu/order-service:1.0.0 ports: - containerPort: 8080 env: - name: USER_SERVICE_URL value: "http://fgedu-user-service:8080" - name: PRODUCT_SERVICE_URL value: "http://fgedu-product-service:8080" - name: RABBITMQ_HOST value: "fgedu-rabbitmq" resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: fgedu-order-service namespace: fgedu-microservice spec: ports: - port: 8080 targetPort: 8080 selector: app: fgedu-order-service EOF [root@k8s-master ~]# kubectl apply -f fgedu-order-service.yaml deployment.apps/fgedu-order-service created service/fgedu-order-service created # 部署商品服务 [root@k8s-master ~]# cat > fgedu-product-service.yaml << 'EOF' apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-product-service namespace: fgedu-microservice spec: replicas: 3 selector: matchLabels: app: fgedu-product-service template: metadata: labels: app: fgedu-product-service spec: containers: - name: product-service image: fgedu/product-service:1.0.0 ports: - containerPort: 8080 env: - name: REDIS_HOST value: "fgedu-redis" resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: name: fgedu-product-service namespace: fgedu-microservice spec: ports: - port: 8080 targetPort: 8080 selector: app: fgedu-product-service EOF [root@k8s-master ~]# kubectl apply -f fgedu-product-service.yaml deployment.apps/fgedu-product-service created service/fgedu-product-service created
Part04-部署API网关
4.1 Spring Cloud Gateway
[root@k8s-master ~]# cat > fgedu-api-gateway.yaml << 'EOF' apiVersion: v1 kind: ConfigMap metadata: name: fgedu-gateway-config namespace: fgedu-microservice data: application.yml: | server: port: 8080 spring: cloud: gateway: routes: - id: user-service uri: lb://fgedu-user-service predicates: - Path=/api/user/** filters: - StripPrefix=1 - id: order-service uri: lb://fgedu-order-service predicates: - Path=/api/order/** filters: - StripPrefix=1 - id: product-service uri: lb://fgedu-product-service predicates: - Path=/api/product/** filters: - StripPrefix=1 discovery: locator: enabled: true management: endpoints: web:from PG视频:www.itpux.com exposure: include: health,info,metrics,gateway --- apiVersion: apps/v1 kind: Deployment metadata: name: fgedu-api-gateway namespace: fgedu-microservice spec: replicas: 2 selector: matchLabels: app: fgedu-api-gateway template: metadata: labels: app: fgedu-api-gateway spec: containers: - name: gateway image: fgedu/api-gateway:1.0.0 ports: - containerPort: 8080 volumeMounts: - name: config mountPath: /app/config readOnly: true resources: requests: cpu: 200m memory: 256Mi limits: cpu: 500m memory: 512Mi livenessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8080 initialDelaySeconds: 10 periodSeconds: 5 volumes: - name: config configMap: name: fgedu-gateway-config --- apiVersion: v1 kind: Service metadata: name: fgedu-api-gateway namespace: fgedu-microservice spec: type: LoadBalancer ports: - port: 80 targetPort: 8080 selector: app: fgedu-api-gateway --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: fgedu-api-ingress namespace: fgedu-microservice spe更多学习教程公众号风哥教程itpux_comc: ingressClassName: nginx rules: - host: api.fgedu.net.cn http: paths: - path: / pathType: Prefix backend: service: name: fgedu-api-gateway port: number: 80 EOF [root@k8s-master ~]# kubectl apply -f fgedu-api-gateway.yaml configmap/fgedu-gateway-config created deployment.apps/fgedu-api-gateway created service/fgedu-api-gateway created ingress.networking.k8s.io/fgedu-api-ingress created # 查看所有服务 [root@k8s-master ~]# kubectl get all -n fgedu-microservice NAME READY STATUS RESTARTS AGE pod/fgedu-rabbitmq-0 1/1 Running 0 10m pod/fgedu-rabbitmq-1 1/1 Running 0 9m pod/fgedu-rabbitmq-2 1/1 Running 0 8m pod/fgedu-user-service-abc12-xyz789 1/1 Running 0 5m pod/fgedu-user-service-abc12-abc12 1/1 Running 0 5m pod/fgedu-user-service-abc12-def34 1/1 Running 0 5m pod/fgedu-order-service-abc12-xyz789 1/1 Running 0 4m pod/fgedu-order-service-abc12-abc12 1/1 Running 0 4m pod/fgedu-order-service-abc12-def34 1/1 Running 0 4m pod/fgedu-product-service-abc12-xyz789 1/1 Running 0 3m pod/fgedu-product-service-abc12-abc12 1/1 Running 0 3m pod/fgedu-product-service-abc12-def34 1/1 Running 0 3m pod/fgedu-api-gateway-abc12-xyz789 1/1 Running 0 2m pod/fgedu-api-gateway-abc12-abc12 1/1 Running 0 2m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/fgedu-rabbitmq ClusterIP None
service/fgedu-rabbitmq-lb NodePort 10.96.100.100
service/fgedu-user-service ClusterIP 10.96.101.100
service/fgedu-order-service ClusterIP 10.96.102.100
service/fgedu-product-service ClusterIP 10.96.103.100
service/fgedu-api-gateway LoadBalancer 10.96.104.100
- 使用ConfigMap管理服务配置
- 配置健康检查保证服务可用
- 使用API Gateway统一入口
- 配置服务熔断和限流
- 使用消息队列解耦服务
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
