机器配置
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 .
对生成好的镜像打标签,然后推送到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
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镜像仓库地址拉取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
创建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
通过节点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 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
查看pod日志
kubectl logs -f kucun-6d855688c9-5jf74 -n dev
创建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