使用k8s部署SpringCloud微服务

Spring Cloud 和 Kubernetes 各自解决了分布式系统中的一些挑战。Spring Cloud 主要关注于构建微服务架构的开发体验,而 Kubernetes 则专注于容器编排、自动化部署、扩展以及管理容器化的应用。两者结合使用可以提供一个非常强大且灵活的平台来运行微服务架构的应用程序。

一、准备k8s环境

1、创建k8s集群

本项目以阿里云ACK为例,创建如下集群:

2、配置kubectl客户端

1)准备一台ECS作为客户端(需配备公网IP),创建~/.kube/config配置文件,粘贴集群连接信息;

2)测试连接:kubectl get pods/nodes

3)创建ACR访问凭证:

kubectl create secret docker-registry mysecret     --docker-server=registry.cn-chengdu.aliyuncs.com     --docker-username=xxxx     --docker-password=xxxxxx     --docker-email=xxxx@xx.com

二、准备容器镜像(以config模块为例)

1、修改配置文件:vim config/src/main/resources/application.yml

server:
  port: 84

spring:
  application:
    name: cloud-config
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xxxx/cloud-config.git
          username: xxxx
          password: xxxxxx

2、构建项目:mvn clean install    #此步骤会产生一个可执行的jar包

3、创建镜像

1)创建工作目录:mkdir config/docker  && cd config/docker

2)准备jar包:cp config/target/target/config-1.0.0-SNAPSHOT.jar .

3)创建Dockerfile文件:vim Dockerfile

# 基础镜像
FROM registry.cn-chengdu.aliyuncs.com/pod-1/spring:v3

# 设置工作目录
WORKDIR /opt/spring-prod

# 复制 Spring Boot 应用程序源码到容器中
COPY config-1.0.0-SNAPSHOT.jar /opt/spring-prod/config-1.0.0-SNAPSHOT.jar

# 暴露应用端口
EXPOSE 84

# 启动命令
ENTRYPOINT ["java", "-jar", "config-1.0.0-SNAPSHOT.jar"]

4)创建镜像:docker build -t registry.cn-chengdu.aliyuncs.com/xxxx/config:v2 .

5)推送镜像到阿里云ACR仓库:docker push registry.cn-chengdu.aliyuncs.com/xxxx/config:v2

三、创建服务配置中心

1、编写pod文件:vim config-pod.yml

apiVersion: v1
kind: Pod
metadata:
  name: config-server
  labels:
    app: spring-config
spec:
  imagePullSecrets:
  - name: mysecret
  containers:
  - name: config
    image: registry.cn-chengdu.aliyuncs.com/xxxx/config:v2
    ports:
    - containerPort: 84

2、创建pod:kubectl apply -f config-pod.yml

3、编写service文件:vim config-service.yml

apiVersion: v1
kind: Service
metadata:
  name: config-server
spec:
  ports:
    - protocol: TCP
      port: 84
      targetPort: 84
  selector:
    app: spring-config
  type: ClusterIP

4、创建service:kubectl apply -f config-service.yml

四、创建eureka-server、provider与consumer

k8s 本身提供了强大的服务发现机制,能够满足大多数微服务通信的需求。是否仍保留eureka作为服务发现工具,取决于具体的架构设计。

1、创建eureka-server

1)修改本地配置文件:vim eureka/src/main/resources/application.yml

spring:
  application:
    name: eureka-server
  config:
    import: "configserver:http://config-server:84"   

    #此处config-server为k8s中暴露的service名称
  profiles:
    active: dev

2)修改配置中心的配置文件:vim eureka-server.yml

server:

  port: 7001

spring:

  application:

    name: eureka-server

  config:

    import: "optional:configserver:"

    activate:

      on-profile: dev

eureka:

  instance:

    hostname: localhost

  client:

    register-with-eureka: false

    fetch-registry: false

    service-url:

      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

3)构建项目,并创建镜像(参考config的步骤)

4)创建pod与service,service名称为eureka-server(参考config的步骤)

2、创建provider

1)修改本地配置文件(参考eureka-server的步骤)

2)修改配置中心的配置文件:vim provider.yml

server:

  port: 8008

  address: 0.0.0.0

tomcat:

  accesslog:

    enabled: true

    directory: /root/spring/springcloud/provider/logs

    prefix: access_log

    suffix: .log

    buffered: false

    pattern: common

spring:

  application:

    name: provider

  datasource:

    url: jdbc:mysql://10.58.0.1:3306/spring?useSSL=false&serverTimezone=Asia/Shanghai

    #数据库连接地址需要让pod网段能够正常访问

    username: xxx

    password: xxxxxx

    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:

    database-platform: org.hibernate.dialect.MySQL8Dialect

  config:

    import: "optional:configserver:"

    activate:

      on-profile: dev

eureka:

  client:

    service-url:

      defaultZone: http://eureka-server:7001/eureka   

      #此处eureka-server为k8s中暴露的service名称

  instance:

    instance-id: provider1

    prefer-ip-address: true

3)构建项目,并创建镜像(参考config的步骤)

4)创建pod与service,service名称为micro-provider(参考config的步骤)

3、创建consumer

1)修改本地配置文件(参考eureka-server的步骤)

2)修改配置中心的配置文件:vim consumer.yml

3)构建项目,并创建镜像(参考config的步骤)

4)创建pod与service,service类型为nodeport,nodePort为30080(参考config的步骤)

五、访问测试

1、查看pod与service:

2、设置nginx转发规则,将80端口轮询至三台worker节点的30080端口:vim /etc/nginx/nginx.conf

upstream backend-servers {
    server 10.58.118.38:30080;
    server 10.58.118.39:30080;
    server 10.58.118.40:30080;
}

    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        location / {
            proxy_pass http://backend-servers;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

    }

3、启动nginx,浏览器访问ECS公网IP,测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值