k8s部署springcloud之gateway项目
VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp。提前安装好harbor,我们的java项目的镜像都是放在harbor里面的。我们所有的pod secret service都是放在dev的命名空间下的。直接通过服务的名称.命名空间.svc.cluster.local 去访问。service的名称.命名空间.svc.clus
机器配置
192.168.10.106=n1
192.168.10.107=n2
192.168.10.108=m1
k8s使用的1.26版本
前置条件
提前安装好harbor,我们的java项目的镜像都是放在harbor里面的
k8s部署springcloud之kuncun项目-CSDN博客
k8s部署springcloud之order项目-CSDN博客
项目创建
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dmg</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>gateway</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.7.6</spring-boot.version>
<spring-cloud-alibaba.version>2021.0.5.0</spring-cloud-alibaba.version>
<spring-cloud.version>2021.0.5</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--在2021.的版本使用gateway的时候,必须引入loadbalancer,否则转发不生效 会报503的错误-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.dmg.gateway.GatewayApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
application.properties
注册中心这里我配置的是k8s中的nacos的地址
使用的是无头服务,不需要ip和8848端口
直接通过服务的名称.命名空间.svc.cluster.local 去访问
#转发到kuncun服务 spring.cloud.gateway.routes[0].id=kucun-route spring.cloud.gateway.routes[0].uri=lb://kucun spring.cloud.gateway.routes[0].predicates[0]=Path=/kucun/** spring.cloud.gateway.routes[0].filters[0]=StripPrefix=1 ##转发到order服务 spring.cloud.gateway.routes[1].id=order-route spring.cloud.gateway.routes[1].uri=lb://order spring.cloud.gateway.routes[1].predicates[0]=Path=/order/** #忽略第一层前缀 spring.cloud.gateway.routes[1].filters[0]=StripPrefix=1 server.port=9000 spring.application.name=gateway # Nacos认证信息 spring.cloud.nacos.discovery.username=nacos spring.cloud.nacos.discovery.password=nacos # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口 spring.cloud.nacos.discovery.server-addr=nacos-svc.dev.svc.cluster.local # 注册到 nacos 的指定 namespace,默认为 public spring.cloud.nacos.discovery.namespace=public #让gateway通过nacos实现自动路由转发 设置为false不会被他影响 spring.cloud.gateway.discovery.locator.enabled=false
GatewayApplication
package com.dmg.gateway;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
项目打包
把jar包上传到下面的目录中
mkdir -p /opt/gateway
创建Dockerfile文件
cd /opt/gateway/
vim Dockerfile
# 基础镜像使用java
FROM java:8
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
# 将jar包添加到容器中并更名为app.jar
ADD gateway-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
ENTRYPOINT ["java","-jar","app.jar"]
#暴露9000端口作为微服务
EXPOSE 9000
把jar打成docker镜像
docker build -t gateway:0.1 .
对生成好的镜像打标签,然后推送到harbor仓库中
docker images
打标签
docker tag 926d3b57c852 192.168.10.108:80/public/gateway:0.1
登录harbor
docker login -u admin -p Harbor12345 192.168.10.108:80
向harbor推送镜像
docker push 192.168.10.108:80/public/gateway:0.1
public项目在harbor提前创建好
创建命名空间
我们所有的pod secret service都是放在dev的命名空间下的
kubectl create ns dev
创建secret,用于登录harbor
命名空间是dev
kubectl create secret docker-registry harbor-secret --namespace=dev --docker-server=192.168.10.108:80 --docker-username=admin --docker-password=Harbor12345
查看secret
kubectl get secret -n dev
创建pod
使用harbor镜像仓库地址拉取gateway项目
并且通过secret登录harbor
vim gateway-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: gateway
namespace: dev
spec:
selector:
matchLabels:
app: gateway
replicas: 1
template:
metadata:
labels:
app: gateway
spec:
imagePullSecrets:
- name: harbor-secret
containers:
- name: gateway
image: 192.168.10.108:80/public/gateway:0.1
imagePullPolicy: Always
ports:
- containerPort: 9000
执行
kubectl apply -f gateway-pod.yaml
查看pod
kubectl get pods -o wide -n dev
创建service 集群内访问
type: ClusterIP 只能集群内部访问,不能在浏览器访问
就是为了以后,使用vue访问 service服务
targetPort 是pod的端口 要和pod绑定 这样才能访问到pod
port 是service的端口
cat > gateway-svc.yaml <<-'EOF'
apiVersion: v1
kind: Service
metadata:
name: gateway-svc
namespace: dev
spec:
type: ClusterIP
selector:
app: gateway
ports:
- name: http
protocol: TCP
#集群内部访问的端口
port: 9000
#pod的端口
targetPort: 9000
EOF
执行
kubectl apply -f gateway-svc.yaml
查看svc
kubectl get svc -o wide -n dev
通过节点ip 在浏览器查看nacos控制台
http://192.168.10.106:31266/nacos
我们可以在pod容器里面通过 service的名称 和ip 进行访问
查看pod容器和svc地址
kubectl get pod,svc -n dev -o wide
进入pod容器
kubectl exec --stdin --tty gateway-545bcdf69c-8pctz -n dev -- sh
通过service的名称和ip进行访问
service的名称.命名空间.svc.cluster.local
curl gateway-svc.dev.svc.cluster.local:9000/order/bb
curl gateway-svc.dev.svc.cluster.local:9000/kucun/getList
curl 172.16.32.98:9000/kucun/aa
查看pod日志
kubectl logs -f gateway-545bcdf69c-8pctz -n dev
创建service 浏览器访问
type设置为 NodePort
nodePort设置30003(端口限制在30000-32767之间)用于浏览器访问的端口
cat > gateway-svc.yaml <<-'EOF'
apiVersion: v1
kind: Service
metadata:
name: gateway-svc
namespace: dev
spec:
type: NodePort
selector:
app: gateway
ports:
- name: http
protocol: TCP
port: 9000
targetPort: 9000
nodePort: 30003
EOF
执行
kubectl delete -f gateway-svc.yaml
kubectl apply -f gateway-svc.yaml
浏览器使用节点ip访问
http://192.168.10.106:30003/kucun/aa
http://192.168.10.106:30003/order/bb
如果你的k8s 拉取pod失败,可以参考下面的解决
更多推荐
所有评论(0)