机器配置

192.168.10.106=n1

192.168.10.107=n2

192.168.10.108=m1

k8s使用的1.26版本

前置条件

k8s 1.26集群安装-CSDN博客

提前安装好harbor,我们的java项目的镜像都是放在harbor里面的

docker安装harbor-CSDN博客

k8s部署nacos-CSDN博客

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失败,可以参考下面的解决

解决k8s 1.26版本拉取harbor失败-CSDN博客

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐