k8s 部署微服务示例

发布时间 2023-11-03 09:24:45作者: Ba11ooner

k8s 部署微服务示例

api-project 为例,以封装完成的镜像和 Jar 包作为起点的 k8s 部署微服务流程示例

预备工作

  • api-backend:提供数据库对齐的基础 CRUD 服务,信息管理后端,数据库相关,已封装成镜像并上传至镜像仓库
  • api-interface:提供独立的简单接口调用服务,数据库无关,已封装成镜像并上传至镜像仓库
  • api-gateway:提供请求转发服务,需要引入 configMap,已封装成 Jar 包

具体流程

命名空间创建
kubectl create namespace 2024-graduation-design-test
常用操作别名
alias kggt='kubectl get all -n 2024-graduation-design-test -o wide'
alias kcgt='kubectl -n 2024-graduation-design-test'
部署 api-interface
配置文件声明
---
apiVersion: v1
kind: Service
metadata:
  name: api-interface-service
  namespace: 2024-graduation-design-test
  labels:
    app: api-interface
spec:
  type: NodePort
  ports:
    - port: 8100
      targetPort: 8100
  selector:
    app: api-interface
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-interface
  namespace: 2024-graduation-design-test
  labels:
    app: api-interface

spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-interface
  template:
    metadata:
      labels:
        app: api-interface
    spec:
      imagePullSecrets:
        - name: registry-auth-secret
      containers:
        - name: api-interface-pod
          image: 172.16.17.46:8085/library/xxx/api-project/api-interface:v1
          ports:
            - containerPort: 8100
配置文件加载
kubectl apply -f api-interface.yaml 
测试
kggt # 查询分配的 NodePort
curl http://172.16.17.38:NodePort/api/interface/name/get?name="Ba11ooner"
部署 api-backend
配置文件声明
---
apiVersion: v1
kind: Service
metadata:
  name: api-backend-service
  namespace: 2024-graduation-design-test
  labels:
    app: api-backend
spec:
  type: NodePort
  ports:
    - port: 8080
      targetPort: 8080
  selector:
    app: api-backend
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-backend
  namespace: 2024-graduation-design-test
  labels:
    app: api-backend

spec:
  replicas: 3
  selector:
    matchLabels:
      app: api-backend
  template:
    metadata:
      labels:
        app: api-backend
    spec:
      imagePullSecrets:
        - name: registry-auth-secret
      containers:
        - name: api-backend-pod
          image: 172.16.17.46:8085/library/xxx/api-project/api-backend:v1
          ports:
            - containerPort: 8080
配置文件加载
kubectl apply -f api-backend.yaml 
测试
kggt # 查询分配的 NodePort
curl http://172.16.17.38:NodePort/api/backend/user/hello
部署 api-gateway
Dockerfile 编写
FROM openjdk:8

COPY target/api-gateway-0.0.1-SNAPSHOT.jar .
EXPOSE 8090
CMD ["java", "-jar", "api-gateway-0.0.1-SNAPSHOT.jar", "--spring.config.location=/path/application.yaml"]
docker images | grep api-gateway
docker build -t xxx/api-gateway:v1 . 
镜像打包
# 打标签
docker tag xxx/api-gateway:v1 172.16.17.46:8085/library/xxx/api-project/api-gateway:v1
# 推送
docker push 172.16.17.46:8085/library/xxx/api-project/api-gateway:v1
动态配置
kggt # 查询分配的 NodePort

键值对创建,即配置文件创建

server:
  port: 8090
spring:
  application:
    name: api-gateway
  main:
    allow-bean-definition-overriding: true
  cloud:
    gateway:
      globalcors: # 跨域处理
        corsConfigurations:
          '[/**]':
            allowedOrigins:
              - "http://172.16.17.37:5500"
              - "http://localhost:8000"
            allowedMethods:
              - GET
              - POST
            allowedHeaders: "*"
            allowCredentials: true
      default-filters:
        - AddResponseHeader=source, api-gateway # 流量染色,说明响应源于 api-gateway
      routes:
        - id: backend_route # 请求转发到 api-backend
          uri: http://172.16.17.38:NodePort
          predicates:
            - Path=/api/backend/**
        - id: interface_route # 请求转发到 api-interface
          uri: http://172.16.17.38:NodePort
          predicates:
            - Path=/api/interface/**
dubbo:
  application:
    name: consumer-client
  registry:
    address: nacos://172.16.17.37:8848
    username: nacos
    password: nacos
api: #测试用
  client:
    access-key: 5ad1086d8f347665f184ab61ebe37c87
    secret-key: ef4e4ac32b5bad82682baf50fb2e7dd3

键值对加载

kcgt create configmap api-gateway-config --from-file=application.yaml=/path

configMap 使用,即配置文件声明

---
apiVersion: v1
kind: Service
metadata:
  name: api-gateway-service
  namespace: 2024-graduation-design-test
  labels:
    app: api-gateway
spec:
  type: NodePort
  ports:
    - port: 8090
      targetPort: 8090
  selector:
    app: api-gateway
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: api-gateway
  namespace: 2024-graduation-design-test
  labels:
    app: api-gateway

spec:
  replicas: 1
  selector:
    matchLabels:
      app: api-gateway
  template:
    metadata:
      labels:
        app: api-gateway
    spec:
      imagePullSecrets:
        - name: registry-auth-secret
      containers:
        - name: api-gateway-pod
          image: 172.16.17.46:8085/library/xxx/api-project/api-gateway:v1
          ports:
            - containerPort: 8090
            
# 将 configMap 中的文件加载到容器中
          volumeMounts: # 加载数据卷
            - name: config
              mountPath: "/path" # 目标路径
              readOnly: true # 是否只读
      volumes: # 引用configmap
      - name: config # 指定数据卷名称,随意设置
        configMap: # 指定数据卷类型为 configMap
          name: api-gateway-config # 指定要加载的 configMap 名称
          items: 
          - key: "application.yaml" # configMap 中的 key
            path: "application.yaml" # 将 key 的 value 转换成文件
配置文件加载
kubectl apply -f api-gateway.yaml
测试
kggt # 查询分配的 NodePort
curl http://172.16.17.39:NodePort/api/backend/user/hello
curl http://172.16.17.39:NodePort/invoke/get?name=Ba11ooner
curl http://172.16.17.39:NodePort/api/interface/name/get?name="Ba11ooner"
部署流程总结
  1. 准备镜像文件
    • 本地镜像
    • 远程镜像:使用前提是做好镜像仓库的配置
  2. 编写 k8s 资源配置文件
  3. 载入 k8s 资源配置文件

知识补充

镜像上传
#一、微服务工程打包
mvn clean package
#二、docker镜像构建 本地构建 进入travelservice服务的文件夹
docker build -t travelservice:v1.0.0 .
#三、镜像打标签
docker tag travelservice:v1.0.0 172.16.17.46:8085/library/travelservice:v1.0.0
#四、推送到harbor镜像仓库
docker push 172.16.17.46:8085/library/travelservice:v1.0.0
#五、运行本地的yaml文件 进入yaml文件所在文件夹
kubectl apply -f yaml
镜像调试
k8s 资源状态查询
kcg describe deployment xxx-api-project
Pod 内部日志查看
kubectl logs -f test-k8s