Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

阅读: 评论:0

Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

Kubernetes(k8s)实战:Kubernetes(k8s)部署Springboot项目

文章目录

  • 一、练手:k8s部署部署wordpress+mysql
    • 1、创建wordpress命名空间
    • 2、创建mysql数据库
    • 3、创建wordpress应用
    • 4、小结
  • 二、实战:部署自己的springboot项目
    • 1、准备一个springboot项目
    • 2、使用docker打成镜像
    • 3、使用k8s部署springboot
  • 三、实战:部署springcloud项目
    • 1、部署nacos
    • 2、微服务注册到nacos的地址问题
      • (1)使用host模式

一、练手:k8s部署部署wordpress+mysql

wordpress是用于快速搭建博客系统。

1、创建wordpress命名空间

# 创建namespace
kubectl create namespace wordpress
# 查看namespace列表
kubectl get ns

2、创建mysql数据库

# 新建wordpress-db.yaml文件
apiVersion: apps/v1beta1
kind: Deployment
metadata:name: mysql-deploynamespace: wordpresslabels:app: mysql
spec:template:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.6  imagePullPolicy: IfNotPresentports:- containerPort: 3306name: dbportenv:- name: MYSQL_ROOT_PASSWORDvalue: rootPassW0rd- name: MYSQL_DATABASEvalue: wordpress- name: MYSQL_USERvalue: wordpress- name: MYSQL_PASSWORDvalue: wordpressvolumeMounts:- name: dbmountPath: /var/lib/mysqlvolumes:- name: dbhostPath:path: /var/lib/mysql
---
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: wordpress
spec:selector:app: mysqlports:- name: mysqlportprotocol: TCPport: 3306targetPort: dbport

该yaml文件创建一个mysql,并且生成一个service,service对外暴露的端口是3306

# 根据wordpress-db.yaml创建资源[mysql数据库]
kubectl apply -f wordpress-db.yaml
# 查看pod
kubectl get pods -n wordpress -o wide
# 查看详情,查看pod部署进度
kubectl describe pod mysql-deploy-78cd6964bd-smq4k -n wordpress# 记得获取ip,因为wordpress.yaml文件中要修改
[root@m ~]# kubectl get svc mysql -n wordpress
NAME    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
mysql   ClusterIP   10.104.214.22   <none>        3306/TCP   42mkubectl describe svc mysql -n wordpress

3、创建wordpress应用

# 创建wordpress.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:name: wordpress-deploynamespace: wordpresslabels:app: wordpress
spec:template:metadata:labels:app: wordpressspec:containers:- name: wordpressimage: wordpressimagePullPolicy: IfNotPresentports:- containerPort: 80name: wdportenv:- name: WORDPRESS_DB_HOSTvalue: mysql:3306      # 改为service的name,不需要每次都指定ip             - name: WORDPRESS_DB_USERvalue: wordpress- name: WORDPRESS_DB_PASSWORDvalue: wordpress
---
apiVersion: v1
kind: Service
metadata:name: wordpressnamespace: wordpress
spec:type: NodePort # NodePort类型selector:app: wordpressports:- name: wordpressportprotocol: TCPport: 80targetPort: wdport
#  #修改其中mysql的ip地址,其实也可以使用service的name:mysql
kubectl apply -f wordpress.yaml# 查看详情,查看pod部署进度
kubectl describe pod mysql-deploy-78cd6964bd-smq4k -n wordpress[root@m ~]# kubectl get pods -n wordpress -o wide
NAME                                READY   STATUS    RESTARTS   AGE    IP               NODE   NOMINATED NODE   READINESS GATES
mysql-deploy-78cd6964bd-smq4k       1/1     Running   0          71m    192.168.80.193   w2     <none>           <none>
wordpress-deploy-6498447888-c9287   1/1     Running   0          116s   192.168.190.65   w1     <none>           <none># 获取到转发后的端口,如80端口转到本机的30493端口
[root@m ~]# kubectl get svc -n wordpress
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
mysql       ClusterIP   10.104.214.22   <none>        3306/TCP       71m
wordpress   NodePort    10.111.92.1     <none>        80:30493/TCP   2m7s

我们发现,搭建成功了,用浏览器访问192.168.56.101:30493,发现访问成功了!

4、小结

在集群中,pod之间可以通过service 的name进行访问,不仅仅是ip,这就意味着,service中不仅帮我们做了负载均衡,而且做了dns处理。

二、实战:部署自己的springboot项目

1、准备一个springboot项目

访问:localhost:8080/k8s

先试用maven打成一个jar包:

# maven打包
mvn clean pakcage
# 上传到服务器
[root@m spring-boot]# pwd
/root/spring-boot
[root@m spring-boot]# ll
total 17140
-rw-r--r--. 1 root root 17547894 Jul  5 15:54 springboot-demo-0.0.1-SNAPSHOT.jar

注意!这一步通常来说使用jenkins完成,此处我们是手动完成的。

2、使用docker打成镜像

(1)编写Dockerfile:

FROM openjdk:8-jre-alpine
COPY springboot-demo-0.0.1-SNAPSHOT.jar /springboot-demo.jar
ENTRYPOINT ["java","-jar","/springboot-demo.jar"]
# 根据Dockerfile创建image
docker build -t springboot-demo-image .
# 查看是否成功打成了镜像
docker images

(2)将镜像推送至dockerhub
docker镜像深入学习,docker镜像发布公有云与私有云

# 登录阿里云镜像仓库 # 需要输入密码
docker login --username=沙里沟第二小学扛把子 registry-hangzhou.aliyuncsdocker tag springboot-demo-image registry-hangzhou.aliyuncs/cxf01/springboot-demo-image:v1.0
docker push registry-hangzhou.aliyuncs/cxf01/springboot-demo-image:v1.0
# 登录 ,需要输入密码
docker login --username=沙里沟第二小学扛把子 registry-hangzhou.aliyuncs
# 私有云的话,需要在k8s添加凭证
kubectl create secret docker-registry <secret-name> --docker-username=<username> --docker-password=<password> --docker-email=<email> --docker-server=<registry><secret-name> 是您为 secret 指定的名称,例如 my-registry-secret。
<username> 是您在镜像仓库的用户名。
<password> 是您在镜像仓库的密码。
<email> 是与您在镜像仓库的账号相关联的电子邮件。
<registry> 是您的镜像仓库地址。
接下来,您需要在使用该凭证的部署(deployment)或其他相关资源中引用该 secret。可以在相关资源的定义文件中添加以下部分
spec:template:spec:imagePullSecrets:- name: <secret-name>

(3)运行测试

# 运行
docker run -d --name s1 springboot-demo-image # 未做端口映射
# 访问
docker inspect s1
curl 172.17.0.2:8080/k8s  # 未做端口映射,只能访问容器ip

3、使用k8s部署springboot

# 以Deployment部署Pod
# vi springboot-demo.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: springboot-demo
spec: selector: matchLabels: app: springboot-demoreplicas: 1template: metadata:labels: app: springboot-demospec: imagePullSecrets: # 私有云凭证- name: springboot-democontainers: - name: springboot-demoimage: registry-hangzhou.aliyuncs/cxf01/springboot-demo-image:v1.0 # 记得改ports: - containerPort: 8080
---
# 创建Pod的Service service的80端口指向pod的8080
apiVersion: v1
kind: Service
metadata: name: springboot-demo
spec: ports: - port: 80protocol: TCPtargetPort: 8080selector: app: springboot-demo
---
# 创建Ingress,定义访问规则,一定要记得提前创建好nginx ingress controller
apiVersion: extensions/v1beta1
kind: Ingress
metadata: name: springboot-demo
spec: rules: - host: fhttp: paths: - path: /backend: serviceName: springboot-demoservicePort: 80
# 启动
kubectl apply -f springboot-demo.yamlkubectl get pods
kubectl get pods -o wide # 查看pod详细信息 -192.168.80.194
curl 192.168.80.194:8080/k8s
kubectl get svc # 查看service - 10.106.125.90  80:8080
kubectl get ingress # 查看ingress 
# 查看详情,查看pod部署进度
kubectl describe pod springboot-demo-6d88c74d5b-l9m7k
kubectl scale deploy springboot-demo --replicas=5 # 扩容为5个

三、实战:部署springcloud项目

1、部署nacos

(1)下载部署nacos server1.0.0
github:

01 上传nacos-server-1.0.到阿里云服务器:/usr/local/nacos
02 解压:tar -zxvf
03 进入到bin目录执行:sh startup.sh -m standalone [需要有java环境的支持]
04 浏览器访问:192.168.56.100:8848/nacos
05 用户名和密码:nacos

2、微服务注册到nacos的地址问题

我们有微服务user、order,在pod注册到nacos上的地址,默认是pod的内部地址。

如果在同一个k8s集群下,这样部署是没问题的,但是不同k8s集群下,微服务之间就互相不可访问了。

(1)使用host模式

 ...metadata:labels: app: orderspec: # 主要是加上这句话,注意在order.yaml的位置hostNetwork: truecontainers: - name: orderimage: registry-hangzhou
...

如上,加上hostNetwork: true,就会在nacos上注册的ip端口,会映射成宿主机的ip和端口。

本文发布于:2024-01-28 08:12:22,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/17064007486026.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:实战   项目   Kubernetes   k8s   Springboot
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23