首页 > 其他分享 >Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)

时间:2022-10-20 23:37:13浏览次数:79  
标签:03 springboot Kubernetes nacos wordpress user pod k8s order

@[toc]

一、前言

本文使用两个机器 192.168.100.150 是master节点,192.168.100.151 是node1 节点,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar

演示三个示例,第一个示例wordpress博客系统是指将别人的镜像部署在k8s;第二个示例springboot项目在第一个示例的基础上再进一步,是指自己从零开始写一个web项目生成jar然后打成镜像,最后部署在k8s;第三个示例在第二个示例的基础上再进一步,是模拟搭建不在springcloud中的两个独立的springboot的web工程,然后打包成镜像部署在k8s上,并且两个服务作为nacos-client注册到nacos-server上,一个服务可以拿到另一个服务在nacos-server上详情信息。

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_02

二、wordpress博客系统

第一个示例wordpress博客系统是指将别人的镜像部署在k8s,wordpress 需要访问 mysql,做博客。

2.1 开发流程

(1)创建wordpress命名空间

kubectl create namespace wordpress

(2)创建wordpress-db.yaml文件 (比较大,放在CSDN资源文件中下载)

(3)根据wordpress-db.yaml创建资源[mysql数据库]

kubectl apply -f wordpress-db.yaml
kubectl get pods -n wordpress # 记得获取ip,因为wordpress.yaml文件中要修改
kubectl get svc mysql -n wordpress
kubectl describe svc mysql -n wordpress

(4)创建wordpress.yaml文件:(比较大,放在CSDN资源文件中下载) (5)根据wordpress.yaml创建资源[wordpress]

kubectl apply -f wordpress.yaml    #修改其中mysql的ip地址,其实也可以使用service的name:mysql
kubectl get pods -n wordpress
kubectl get svc -n wordpress # 获取到转发后的端口,如30063

(6)访问测试 win访问 wordpress ,注意找到 wordpress 的pod所在的宿主机是哪个 (不一定是master节点,我这里就是 node1 节点,所以就是 192.168.100.151 ),然后还要找到暴露出来的nodePort端口号 30000以上那个

2.2 效果演示

先切换命名空间:kubectl config set-context --current --namespace=wordpress

然后 kubetl get all 查看两个服务 wordpress-db.yaml 和 wordpress.yaml 是否正常

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_03

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_04

k8s开发中,如果没有达到自己想要的效果,需要查看pod的日志定位问题,方法如下: (1) 如果pod还没有达到running状态,则使用 kubectl describe pod 具体pod名称查看 (同理 kubectl describe nodes 具体node名称 也可以查看node为什么没有 Ready 状态) (2) 如果pod已经达到running状态,则使用 kubectl logs 具体pod名称 查看运行日志。 小结:kubectl describe pod 具体pod名称查看 查看pod启动日志;kubectl logs 具体pod名称 查看运行日志。

win上连接数据库成功,表示 wordpress-db.yaml 成功,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_05

win上访问 wordpress所在宿主机ip:wordpress暴露的宿主机端口 成功,选择语言并进行安装,先选择语言,如下:

然后安装,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_06

安装好了,看到了主界面,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_07

三、自己写一个springboot项目生成镜像部署到K8S集群中

现在开始第二个示例,在第一个示例的基础上再进一步,是指自己从零开始写一个web项目生成jar然后打成镜像,最后部署在k8s。

3.1 开发流程

​流程​​:确定服务-->编写Dockerfile制作镜像-->上传镜像到仓库-->编写K8S文件-->创建

(1)准备Spring Boot项目springboot-demo

@RestController
public class K8SController {
@RequestMapping("/k8s")
public String k8s(){
return "hello K8s!";
}
}

(2)生成xxx.jar,并且上传到虚拟机的springboot-demo目录

mvn clean pakcage

(3)编写Dockerfile文件

mkdir springboot-demo

cd springboot-demo

vi Dockerfile

FROM openjdk:8-jre-alpine
COPY springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
ENTRYPOINT ["java","-jar","/springboot-demo.jar"]

(4)根据Dockerfile创建image

docker build -t springboot-demo-image .

(5)使用docker run创建container

docker run -d --name s1 springboot-demo-image

(6)访问测试

curl ip:8080/k8s

(7)将镜像推送到镜像仓库

# 登录阿里云镜像仓库
docker login --username=自己在阿里云上的账号 registry.cn-hangzhou.aliyuncs.com

docker tag springboot-demo-image 自己在阿里云上镜像仓库:v1.0

docker push 自己在阿里云上镜像仓库:v1.0

(8)编写Kubernetes配置文件 (比较大,放在CSDN资源文件中下载)

vi springboot-demo.yamlkubectl apply -f springboot-demo.yaml

(9)查看资源

kubectl get pods
kubectl get pods -o wide
curl pod_id:8080/k8s
kubectl get svc
kubectl scale deploy springboot-demo --replicas=5

(10)win配置hosts文件

192.168.100.151 tomcat.jack.com

(11)win浏览器访问

http://tomcat.jack.com/k8s

3.2 效果演示

首先需要自己从零开始新建一个springboot项目,使用springboot新建项目很简单的,三步操作,如下,第一步:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_08

第二步,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_09

第三步,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_10

好了,这就是新建的springboot项目,只有一个controller端口,@RestController默认返回的是字符串,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_11

Idea下面的Terminal中,输入mvn clean package,然后到target目录下取出刚刚生成的jar包,传递到centos机器上(我这里是centos7版本),如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_12

新建一个spring-boot目录,将jar包放在这个目录下,然后在同级目录下 vi Dockerfile 新建一个文件,如下:

FROM openjdk:8-jre-alpine
COPY springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
ENTRYPOINT ["java","-jar","/springboot-demo.jar"]

然后运行 ​​docker build -t springboot-demo-image .​​​ ,就可以在本地生成一个名为 springboot-demo-image 的镜像,可以使用 ​​docker images | grep springboot​​​ 查看,然后运行镜像成为容器 ​​docker run -d --name s1 springboot-demo-image​​ ,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_13

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_14

这里是因为没有使用docker push ,将本地镜像推送到阿里云,所以才需要在另一个 w1 节点也打一个镜像,下面的nacos的例子会将镜像推送到阿里云,演示这种情况

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_15

运行效果:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_16

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_17

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_18

四、部署Nacos项目

现在在第二个示例的基础上再进一步,是模拟搭建不在springcloud中的两个独立的springboot的web工程,然后打包成镜像部署在k8s上,并且两个服务作为nacos-client注册到nacos-server上,一个服务可以拿到另一个服务在nacos-server上详情信息。

4.1 传统方式启动两个服务(user和order)

4.1.1 开发流程

(1)准备两个Spring Boot项目,名称为user和order,表示两个服务 (比较大,放在CSDN资源文件中下载)

(2)下载部署nacos server1.0.0 (比较大,放在CSDN资源文件中下载)

​github​​​:<​​https://github.com/alibaba/nacos/releases​​>

01  上传nacos-server-1.0.0.tar.gz到阿里云服务器39:/usr/local/nacos

02 解压:tar -zxvf

03 进入到bin目录执行:sh startup.sh -m standalone [需要有java环境的支持]

04 浏览器访问:39.100.39.63:8848/nacos

05 用户名和密码:nacos

(3)将应用注册到nacos,记得修改Spring Boot项目中application.yml文件

01 将user/order服务注册到nacos

02 user服务能够找到order服务

(4)启动两个Spring Boot项目,然后查看nacos server的服务列表

(5)为了验证user能够发现order的地址

访问localhost:8080/user/test,查看日志输出,从而测试是否可以ping通order地址

4.1.2 效果演示

安装好nacos和jdk,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_19

nacos传统方式部署在centos上面(我这里是centos7),需要配置好jdk,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_20

启动nacos,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_21

注意,如果是第二次启动nacos,bin目录下会多一些目录和文件,如 derby.log logs目录 work目录,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_22

win上登录nacos,chrome中输入 192.168.100.150:8848 ,账号密码都是nacos/nacos,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_23

启动nacos之后,然后idea本地启动两个服务,就被注册到nacos上了,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_24

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_25

访问 user 工程的 /user/test 接口,可以得到 nacos-server 上的 order 工程的详细信息,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_26

注意一下nacos-server的停止,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_27

4.2 两个服务(user和order)都是K8s中的Pod

​思考​​:如果将user和order都迁移到K8s中,那服务注册与发现会有问题吗?

(1)生成xxx.jar,并且分别上传到master节点的user和order目录

resources/nacos/jar/xxx.jar

mvn clean pakcage

(2)来到对应的目录,编写Dockerfile文件

vi Dockerfile

FROM openjdk:8-jre-alpine
COPY user-0.0.1-SNAPSHOT.jar /user.jar
ENTRYPOINT ["java","-jar","/user.jar"]
FROM openjdk:8-jre-alpine
COPY order-0.0.1-SNAPSHOT.jar /order.jar
ENTRYPOINT ["java","-jar","/order.jar"]

(3)根据Dockerfile创建image

docker build -t user-image:v1.0 .
docker build -t order-image:v1.0 .

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_28

order也是一样的,如下:

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_spring_29

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_30

(4)将镜像推送到镜像仓库

# 登录阿里云镜像仓库
docker login [email protected] registry.cn-hangzhou.aliyuncs.com

docker tag user-image:v1.0 registry.cn-hangzhou.aliyuncs.com/itcrazy2016/user-image:v1.0

docker push registry.cn-hangzhou.aliyuncs.com/itcrazy2016/user-image:v1.0

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_docker_31

如何验证 docker push 成功了?两种方案:一是到阿里云的镜像仓库去查看,一是到另一个机器上docker pull 看是否成功(注意阿里云的镜像仓库需要设置为公开,才能docker pull成功的,私有的需要登录才能docker pull)。

Kubernetes_03_手把手打镜像并运行到k8s容器上(亲测可用)_jar_32

(5) 有了镜像,接下来就是yaml文件,则编写Kubernetes配置文件vi user.yaml/order.yaml

kubectl apply -f user.yaml/order.yaml

(6)查看资源

kubectl get pods
kubectl get pods -o wide
kubectl get svc
kubectl get ingress

(7)查看nacos server上的服务信息

可以发现,注册到nacos server上的服务ip地址为pod的ip,比如192.168.80.206/192.168.190.82注意:注册到nacos server上的服务ip地址为pod的ip,不是service的ip,这里pod的端口都用8080 9090,service的端口都用80

(8)访问测试

# 01 集群内
curl user-pod-ip:8080/user/test
kubectl logs -f <pod-name> -c <container-name> [主要是为了看日志输出,证明user能否访问order]

# 02 集群外,比如win的浏览器,可以把集群中原来的ingress删除掉
http://k8s.demo.gper.club/user/test

结论:如果服务都是在K8s集群中,最终将pod ip注册到了nacos server,那么最终服务通过pod ip发现so easy。

4.3 user传统和order迁移K8s

假如user现在不在K8s集群中,但是order在K8s集群中

比如user使用本地idea中的,order使用上面K8s中的

(1)启动本地idea中的user服务

(2)查看nacos server中的user服务列表

(3)访问本地的localhost:8080/user/test,并且观察idea中的日志打印,发现访问的是order的pod id,此时肯定是不能进行服务调用的,怎么解决呢?

(4)解决思路

之所以访问不了,是因为order的pod ip在外界访问不了,即 k8s集群内ip在集群外的win上的idea是访问不了的,怎么解决呢?01 可以将pod启动时所在的宿主机的ip写到容器中,也就是pod id和宿主机ip有一个对应关系02 pod和宿主机使用host网络模式,也就是pod直接用宿主机的ip,但是如果服务高可用会有端口冲突问题[可以使用pod的调度策略,尽可能在高可用的情况下,不会将pod调度在同一个worker中]

(5)我们来演示一个host网络模式的方式,修改order.yaml文件

修改之后apply之前可以看一下各个节点的9090端口是否被占用

lsof -i tcp:9090

...
metadata:
labels:
app: order
spec:
# 主要是加上这句话,注意在order.yaml的位置
hostNetwork: true
containers:
- name: order
image: registry.cn-hangzhou
...

(6)kubectl apply -f order.yaml

  • kubectl get pods -o wide --->找到pod运行在哪个机器上,比如w2
  • 查看w2上的9090端口是否启动

(7)查看nacos server上order服务

可以发现此时用的是w2宿主机的9090端口

(8)本地idea访问测试

localhost:8080/user/test

五、尾声

手把手打镜像并运行到k8s容器上(亲测可用),完成了。

天天打码,天天进步!!

标签:03,springboot,Kubernetes,nacos,wordpress,user,pod,k8s,order
From: https://blog.51cto.com/u_15287666/5780771

相关文章

  • k8s安装redmine
    ​课程内容:各种k8s部署方式。包括minikube部署,kubeadm部署,kubeasz部署,rancher部署,k3s部署。包括开发测试环境部署k8s,和生产环境部署k8s。腾讯课堂连接地址https://ke.qq.com......
  • AGC033
    A\((\texttt{Easy}\1/1)\)答案就是每次可以上下左右走,白点到黑点距离最小值的最大值,BFS即可。时间复杂度\(\mathcal{O}(HW)\)。B\((\texttt{Easy}\2/1)\)......
  • [AGC031F] Walk on Graph
    linkSolution非常厉害的题捏,可惜我什么都想不到/kk我们首先转化一下,我们对于\(s\tot\)计算这个长度变为\(t\tos\)每次加入一个\(w\),当前权值\(x\)就变为\(2x+......
  • Kubernetes创建pod
    1创建tomcat的相关配置,配置tomcat的镜像和对外暴露的接口mkdir/usr/local/k8scd/usr/local/k8s/touchmytomcat.rc.yamltouchmytomcat.svc.yamlmytomcat.rc.ya......
  • Kubernetes单机安装
    Kubernetes单机安装1关闭Centos防火墙systemctldisablefirewalldsystemctlstopfirewalld2安装之前建议update一下保证yum是最新版本yumupdate3安装etcd......
  • Kubernetes环境搭建
    一、在Kubernetes环境搭建过程中,会创建CA、admin、etcd等等证书,创建证书的过程中需要注意当前系统的时间,否则很可能因为生成证书时间同其他系统时间差别,造成证书验证失败。......
  • 【Kubernetes】K8s笔记(十):Service 解决服务发现的关键问题
    目录0.打造Service对象的动机1.Service的工作原理2.使用YAML描述Service3.在Kubernetes中使用Service4.以域名方式使用Service5.让Service对外暴露服务......
  • k8s 安装 metrics-server
     wgethttps://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml [root@k8s-master01k8s]#catcomponents.yamlapiVersion:......
  • Kubernetes--管理Pod对象的容器(3)
    共享节点的网络名称空间同一个Pod对象的各容器均运行于一个独立的、隔离的Network名称空间中,共享同一个网络协议栈及相关的网络设备。也有一些特殊的Pod对象需要运行于所......
  • k8s基础篇 pod(二)创建
    2.如何创建一个Pod资源Pod是Kubernetes中最基本的部署调度单元,可以包含container,逻辑上表示某种应用的一个实例。例如一个web站点应用由前端、后端及数据库构建而成,这三个组......