文章目录
1、环境陈述2、前期准备2.1、将一个 SpringCloud 微服务运行 以 jar 方式运行2.2、为 SpringCloud 项目生成 Docker 镜像2.3、推送镜像2.4、从宿主机访问 k8s(minikube) 发布的 redis 服务2.5、k8s(minikube) 部署mysql 3、本期关键3.1、打 jar 包需要修改的地方3.2、打一个新 jar3.3、为 k8s 生成自定义镜像3.3.1、把 bestcxx-starter.jar 复制到一个新文件夹内3.3.2、定义 Dockerfile 文件的内容3.3.3、在 k8s 中构造自定义镜像 3.4、在 minukube 中运行自定义镜像3.4.1、直接编写 bestcxx-starter-deployment.yaml3.4.2、运行 bestcxx-starter-deployment.yaml3.4.3、访问 k8s 中的服务 3.5、在 Kuboard 中查看自定义容器运行状态3.6、通过隧道端口访问 k8s 中自定义镜像容器的 web 服务
1、环境陈述
docker 驱动部署 minikube ,为单节点 k8s。
在 k8s 中已经部署了 mysql 和 redis. mysql 已完成数据结构初始化。
具体服务的 mysql-service 和 redis-service
➜ ~ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d4hmysql-service NodePort 10.102.114.64 <none> 3306:30002/TCP 2d23hredis-service NodePort 10.108.203.83 <none> 6379:30001/TCP 3d4h
2、前期准备
2.1、将一个 SpringCloud 微服务运行 以 jar 方式运行
将一个 SpringCloud 微服务运行 以 jar 方式运行
2.2、为 SpringCloud 项目生成 Docker 镜像
为 SpringCloud 项目生成 Docker 镜像
2.3、推送镜像
把自己的镜像推送到 DockerHub
把镜像推送到私有化 Docker 仓库
2.4、从宿主机访问 k8s(minikube) 发布的 redis 服务
从宿主机访问 k8s(minikube) 发布的 redis 服务
2.5、k8s(minikube) 部署mysql
k8s(minikube) 部署mysql
3、本期关键
本期的关键在于:
第一、在把 springcloud 项目的 jar 打包为镜像时,需要通过 k8s 中服务的依赖名称进行 mysql 和 redis 的访问。
第二、如何把本地的 镜像 直接推送到 k8s 中,这样的好处是节约一些流量——当然,我们也可以推送到远程仓库去,然后像依赖普通镜像一样去运行。
3.1、打 jar 包需要修改的地方
为 SpringCloud 提供一个新的配置文件
通过这个配置文件,对应镜像将通过服务名去获取 redis 和 mysql 服务
➜ ~ kubectl get svcNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEkubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d5hmysql-service NodePort 10.102.114.64 <none> 3306:30002/TCP 3dredis-service NodePort 10.108.203.83 <none> 6379:30001/TCP 3d5h
只需要把之前 ip:端口修改为 k8s服务名:k8s内部端口
具体来说就是
#url: jdbc:mysql://k8s 中 mysql service name:对应 port/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true url: jdbc:mysql://mysql-service:3306/test?characterEncoding=utf8&useSSL=true&serverTimezone=UTC&rewriteBatchedStatements=true
对 redis 依赖中,host 由 127.0.0.1=> redis-service host: redis-service # k8s 中 redis service name port: 6379 # k8s 中 redis service port
3.2、打一个新 jar
我们在新配置文件中修改 3.1 中的内容,起名为 application-k8s.yml
获取到 bestcxx-starter.jar
apiVersion: apps/v1kind: Deploymentmetadata: name: your-deploymentspec: replicas: 1 template: metadata: labels: app: your-app spec: containers: - name: your-container image: your-image:latest env: - name: SPRING_PROFILES_ACTIVE value: "k8s"
3.3、为 k8s 生成自定义镜像
3.3.1、把 bestcxx-starter.jar 复制到一个新文件夹内
Dockerfile 和 bestcxx-starter-deployment.yaml 文件内容下面介绍
3.3.2、定义 Dockerfile 文件的内容
以openjdk 镜像为基础,生成新的自定义镜像
# 使用官方的Java运行时作为父镜像FROM openjdk:8-jre-alpine# 将当前目录下的可执行jar包复制到容器中的/app目录下ADD bestcxx-starter.jar /app/bestcxx-starter.jar# 声明容器运行时需要开放的端口EXPOSE 8080# 设置容器启动时执行的命令ENTRYPOINT ["java", "-jar", "/app/bestcxx-starter.jar"]
3.3.3、在 k8s 中构造自定义镜像
可能因为网络问题失败,因此提前运行 docker pull openjdk:8-jre-alpine ,一次即可
这里 eval $(minikube docker-env) 首次可能会失败,docker context ls 结果有 default报错后继续执行一次即可,
➜ bestcxx-k8s docker context ls NAME TYPE DESCRIPTION DOCKER ENDPOINT KUBERNETES ENDPOINT ORCHESTRATORdefault * moby Current DOCKER_HOST based configuration tcp://127.0.0.1:53255 https://127.0.0.1:53258 (default) swarmdesktop-linux moby unix:///Users/wujie/.docker/run/docker.sock ➜ bestcxx-k8s eval $(minikube docker-env) ➜ bestcxx-k8s docker pull openjdk:8-jre-alpine ➜ bestcxx-k8s docker build -t bestcxx-starter-k8s:0.0.5 .
然后查看本地镜像 ➜ bestcxx-k8s docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbestcxx-starter-k8s 0.0.5 1b869a695cae 6 minutes ago 129MB··· 其余略
3.4、在 minukube 中运行自定义镜像
3.4.1、直接编写 bestcxx-starter-deployment.yaml
自定义镜像为 web 服务,内部定义的server port 为 8080
直接引用上面生成的镜像 bestcxx-starter-k8s:0.0.5
apiVersion: apps/v1kind: Deploymentmetadata: name: bestcxx-starter-deployment labels: app: bestcxx-starterspec: replicas: 1 selector: matchLabels: app: bestcxx-starter template: metadata: labels: app: bestcxx-starter spec: containers: - name: bestcxx-starter image: bestcxx-starter-k8s:0.0.5 # 这里更新具体 tag 版本号 ports: - containerPort: 8080---apiVersion: v1kind: Servicemetadata: name: bestcxx-starter-servicespec: type: NodePort selector: app: bestcxx-starter ports: - port: 8080 # 服务端口 targetPort: 8080 # 目标容器端口 nodePort: 30003 # 宿主机端口(可选)
3.4.2、运行 bestcxx-starter-deployment.yaml
➜ bestcxx-k8s kubectl apply -f bestcxx-starter-deployment.yamldeployment.apps/bestcxx-starter-deployment createdservice/bestcxx-starter-service created
3.4.3、访问 k8s 中的服务
因为我们是通过 docker 部署 minikube,因此,需要开启隧道端口访问 NodePort 服务
查看服务,可以看到 bestcxx-starter-service 已经启动➜ bestcxx-k8s kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEbestcxx-starter-service NodePort 10.99.247.239 <none> 8080:30003/TCP 8skubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d6hmysql-service NodePort 10.102.114.64 <none> 3306:30002/TCP 3dredis-service NodePort 10.108.203.83 <none> 6379:30001/TCP 3d6h
在 k8s 中构造本地镜像
为 bestcxx-starter-service 开启隧道端口
minikube service bestcxx-starter-service
3.5、在 Kuboard 中查看自定义容器运行状态
可以用于查看容器运行的日志信息