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: 84spring:
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,测试结果