机器配置

192.168.10.106=n1

192.168.10.107=n2

192.168.10.108=m1

k8s使用的1.26版本

前置条件


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


项目创建

数据库表

CREATE TABLE `sys_role` (
   `id` int NOT NULL AUTO_INCREMENT,
   `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
   `code` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL,
   PRIMARY KEY (`id`)
 ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;

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>kucun</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>kucun</name>
    <description>kucun</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>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 添加MyBatisPlus的依赖 -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>
        <!-- MySQL数据 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <!-- druid  连接池-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.14</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <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.kucun.KucunApplication</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 去访问

server.port=8083
spring.application.name=kucun
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
spring.cloud.nacos.discovery.server-addr=nacos-svc.dev.svc.cluster.local
spring.cloud.nacos.discovery.namespace=public



spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://192.168.10.107:30306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=true
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

mybatis-plus.mapper-locations=classpath:mapper/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl


spring.redis.port=30379
spring.redis.host=192.168.10.107
spring.redis.password=

KuCunController

package com.dmg.kucun.controller;


import com.dmg.kucun.entity.SysRole;
import com.dmg.kucun.service.SysRoleService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
public class KuCunController {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Autowired
    private SysRoleService sysRoleService;

    /**
     * 获取角色数据
     */
    @GetMapping("getList")
    public List<SysRole> list(){
        System.out.println("进入库存的list了");
        return sysRoleService.getList();
    }

    @GetMapping("/aa")
    public String aa(){
        stringRedisTemplate.opsForValue().set("username","zhangsan");
        String username = stringRedisTemplate.opsForValue().get("username");
        System.out.println("进来了");
        return username;
    }
}

SysRoleMapper

package com.dmg.kucun.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.dmg.kucun.entity.SysRole;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface SysRoleMapper extends BaseMapper<SysRole> {
 
}

SysRole

package com.dmg.kucun.entity;


import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@TableName("sys_role")
@Data
public class SysRole {
    private Integer id;
 
    /**
    * 角色名称
    */
    private String name;
 
    /**
    * 角色编码
    */
    private String code;
}

SysRoleService

package com.dmg.kucun.service;

import com.dmg.kucun.entity.SysRole;

import java.util.List;

public interface SysRoleService{
 
 
    List<SysRole> getList();
}

SysRoleServiceImpl

package com.dmg.kucun.service.impl;

import com.dmg.kucun.dao.SysRoleMapper;
import com.dmg.kucun.entity.SysRole;
import com.dmg.kucun.service.SysRoleService;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@Service
public class SysRoleServiceImpl implements SysRoleService {

    @Resource
    private SysRoleMapper sysRoleMapper;

    @Override
    public List<SysRole> getList() {
        return sysRoleMapper.selectList(null);
    }
 
 
}

KucunApplication

package com.dmg.kucun;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class KucunApplication {

    public static void main(String[] args) {
        SpringApplication.run(KucunApplication.class, args);
    }

}

项目打包

把jar包上传到下面的目录中

mkdir -p /opt/kucun

创建Dockerfile文件

cd /opt/kucun/
vi Dockerfile
 # 基础镜像使用java
 FROM java:8
 # VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
 VOLUME /tmp
 # 将jar包添加到容器中并更名为app.jar
 ADD kucun-0.0.1-SNAPSHOT.jar app.jar
 # 运行jar包
 ENTRYPOINT ["java","-jar","app.jar"]
 #暴露8083端口作为微服务
 EXPOSE 8083

把jar打成docker镜像 

docker build -t kucun:0.1 .

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_容器

对生成好的镜像打标签,然后推送到harbor仓库中

docker images

打标签
 docker tag c08310024caf 192.168.10.108:80/public/kucun:0.1
  
 登录harbor
 docker login -u admin -p Harbor12345 192.168.10.108:80
  
 向harbor推送镜像
 docker push 192.168.10.108:80/public/kucun:0.1

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_容器_02

 public项目在harbor提前创建好 

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_kubernetes_03

创建命名空间

我们所有的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镜像仓库地址拉取kucun项目

并且通过secret登录harbor

vi kucun-pod.yaml
apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: kucun
   namespace: dev
 spec:
   selector:
     matchLabels:
       app: kucun
   replicas: 1
   template:
     metadata:
       labels:
         app: kucun
     spec:
       imagePullSecrets:
        - name: harbor-secret
       containers:
        - name: kucun
          image: 192.168.10.108:80/public/kucun:0.1
          imagePullPolicy: Always
          ports:
          - containerPort: 8083

执行

kubectl apply -f kucun-pod.yaml

查看pod

kubectl get pods -o wide -n dev

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_java_04

创建service 集群内访问

type: ClusterIP 只能集群内部访问,不能在浏览器访问

就是为了以后,使用vue访问 service服务

targetPort 是pod的端口 要和pod绑定 这样才能访问到pod

port 是service的端口

cat > kucun-svc.yaml <<-'EOF'
 apiVersion: v1
 kind: Service
 metadata:
   name: kucun-svc
   namespace: dev
 spec:
   type: ClusterIP
   selector:
     app: kucun
   ports:
   - name: http
     protocol: TCP
     #集群内部访问的端口
     port: 8083
     #pod的端口
     targetPort: 8083
 EOF

执行

kubectl apply -f kucun-svc.yaml 

查看svc

kubectl get svc -o wide -n dev 

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_容器_05

通过节点ip 在浏览器查看nacos控制台

http://192.168.10.106:31266/nacos

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_kubernetes_06

我们可以在pod容器里面通过 service的名称 和ip 进行访问

查看pod容器和svc地址

kubectl get pod,svc -n dev -o wide

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_java_07

进入pod容器

kubectl exec --stdin --tty kucun-6d855688c9-5jf74  -n dev -- sh

通过service的名称和ip进行访问

service的名称.命名空间.svc.cluster.local

curl kucun-svc.dev.svc.cluster.local:8083/aa
 curl 172.16.32.244:8083/getList

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_云原生_08

查看pod日志

kubectl logs -f kucun-6d855688c9-5jf74 -n dev

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_容器_09

创建service 浏览器访问

type设置为 NodePort

nodePort设置30001(端口限制在30000-32767之间)用于浏览器访问的端口

cat > kucun-svc.yaml <<-'EOF'
 apiVersion: v1
 kind: Service
 metadata:
   name: kucun-svc
   namespace: dev
 spec:
   type: NodePort
   selector:
     app: kucun
   ports:
   - name: http
     protocol: TCP
     port: 8083
     targetPort: 8083
     nodePort: 30001
 EOF

执行

kubectl delete -f kucun-svc.yaml
kubectl apply -f kucun-svc.yaml

浏览器使用节点ip访问

http://192.168.10.107:30001/getList

 

springcloud整合zipkin 使用k8s部署 k8s部署springcloud项目_spring_10

如果你的k8s 拉取pod失败,可以参考下面的解决