1. 首页 > Linux教程 > 正文

Linux教程FG459-Kubernetes实战案例二

内容简介:本文风哥教程参考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

# 部署API 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 5672/TCP 10m
service/fgedu-rabbitmq-lb NodePort 10.96.100.100 15672:30672/TCP 10m
service/fgedu-user-service ClusterIP 10.96.101.100 8080/TCP 5m
service/fgedu-order-service ClusterIP 10.96.102.100 8080/TCP 4m
service/fgedu-product-service ClusterIP 10.96.103.100 8080/TCP 3m
service/fgedu-api-gateway LoadBalancer 10.96.104.100 80:30080/TCP 2m
风哥针对微服务部署建议:

  • 使用ConfigMap管理服务配置
  • 配置健康检查保证服务可用
  • 使用API Gateway统一入口
  • 配置服务熔断和限流
  • 使用消息队列解耦服务

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息