Java教程

k8s部署java项目

本文主要是介绍k8s部署java项目,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1. 部署流程

大概流程如下:

制作镜像 (编写Dockerfile) -》推送镜像仓库(网易、阿里) -》 控制器镜像部署 (Deployment) -》对我暴露应用(Service、Ingress) -》运维监控

2. 测试

1. 测试自己的镜像

  其实就是一个简单的springboot 项目,里面就依赖的一个mysql。

1. 部署mysql

(1) deployment.yaml

apiVersion: apps/v1                             # apiserver的版本
kind: Deployment                                # 副本控制器deployment,管理pod和RS
metadata:
  name: mysql                                   # deployment的名称,全局唯一
spec:
  replicas: 1                                   # Pod副本期待数量
  selector:
    matchLabels:                                # 定义RS的标签
      app: mysql                                # 符合目标的Pod拥有此标签
  strategy:                                     # 定义升级的策略
    type: RollingUpdate                         # 滚动升级,逐步替换的策略
  template:                                     # 根据此模板创建Pod的副本(实例)
    metadata:
      labels:
        app: mysql                              # Pod副本的标签,对应RS的Selector
    spec:
      containers:                               # Pod里容器的定义部分
        - name: mysql                           # 容器的名称
          image: mysql:5.7                      # 容器对应的docker镜像
          volumeMounts:                         # 容器内挂载点的定义部分
            - name: time-zone                   # 容器内挂载点名称
              mountPath: /etc/localtime         # 容器内挂载点路径,可以是文件或目录
            - name: mysql-data
              mountPath: /var/lib/mysql         # 容器内mysql的数据目录
            - name: mysql-logs
              mountPath: /var/log/mysql         # 容器内mysql的日志目录
          ports:
            - containerPort: 3306               # 容器暴露的端口号
          env:                                  # 写入到容器内的环境容量
            - name: MYSQL_ROOT_PASSWORD         # 定义了一个mysql的root密码的变量
              value: "123456"
      volumes:                                  # 本地需要挂载到容器里的数据卷定义部分
        - name: time-zone                       # 数据卷名称,需要与容器内挂载点名称一致
          hostPath:
            path: /etc/localtime                # 挂载到容器里的路径,将localtime文件挂载到容器里,可让容器使用本地的时区
        - name: mysql-data
          hostPath:
            path: /data/mysql/data              # 本地存放mysql数据的目录
        - name: mysql-logs
          hostPath:
            path: /data/mysql/logs              # 本地存入mysql日志的目

(2) service.yaml

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
spec:
  type: NodePort
  ports:
    - port: 3306
      targetPort: 3306
      nodePort: 30006
  selector:
    app: mysql

(3) 创建资源,然后查看service

[root@k8smaster01 ~]# kubectl get svc -o wide | grep mysql
mysql-service    NodePort    10.1.67.176   <none>        3306:30006/TCP   3h20m   app=mysql

然后从外部通过任意节点的30006 端口即可访问到mysql

补充: mysql 由于是linux,默认区分大小写,解决办法如下

(1) 排查问题: 先确定一下数据库

show variables like 'lower%'

显示 lower_case_table_names 0

(2) 解决办法

修改 /etc/mysql/mysql.conf.d/mysqld.cnf

加上 lower_case_table_names=1

(3) 然后重启, 因为docker 容器是一个简易容器,没有vi、没有vim、没有yum, 这里只能复制到宿主机修改再复制到容器

容器复制到宿主机

docker cp 35164f686f5f:/etc/mysql/mysql.conf.d/mysqld.cnf ./

宿主机复制到容器:

docker cp ./mysqld.cnf 35164f686f5f:/etc/mysql/mysql.conf.d/

然后重启容器:

docker restart 35164f686f5f

2. 基于Dockerfile 制作自己的镜像

(1) 目录结构如下

[root@k8snode01 springboot-ssm]# ll -R
.:
total 8
-rw-r--r--  1 root root  150 Jan 29 04:57 Dockerfile
-rw-r--r--. 1 root root 1615 Jan 29 03:40 mysqld.cnf
drwxr-xr-x. 2 root root   32 Jan 29 04:24 target

./target:
total 109272
-rw-r--r--. 1 root root 111890642 Jan 29 04:23 springboot-ssm.jar

(2) Dockerfile 内容如下

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD ./target/springboot-ssm.jar /springboot-ssm.jar
ENTRYPOINT ["java", "-jar", "/springboot-ssm.jar", "&"]

(3) 基于Dockerfile 制作镜像

docker build -t springboot-ssm-01:latest .

(4) 查看镜像

[root@k8snode01 springboot-ssm]# docker images | grep spring
springboot-ssm-01                                    latest              3a8fad2d046a        16 hours ago        217MB

(5) 启动容器

docker run -d -p 8088:8088 springboot-ssm-01 -t

(6) 查看容器

[root@k8snode01 springboot-ssm]# docker ps -a | grep spring
a6c668b13d69        springboot-ssm-01                                     "java -jar /springbo…"   16 hours ago        Up 16 hours                 0.0.0.0:8088->8088/tcp   focused_ramanujan

(7) 测试

外部通过8088 端口正常访问服务即可,测试之后发现mysql 也可以在k8s 集群内部访问到。

2. 推到镜像仓库进行部署

1. 创建镜像仓库

 到阿里云创建仓库, 如下:

 2. 登录到阿里云, 输入自己的登录密码, 替换为自己的账号和密码

docker login --username=qlq04**** registry.cn-hangzhou.aliyuncs.com

3. 打一个tag

语法:

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:[镜像版本号]

打tag:

docker tag 3a8fad2d046a registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:1.0.0

4. 推送

docker push registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:1.0.0

 5. 部署镜像,暴露应用

kubectl create deployment springboot-ssm-01 --image=registry.cn-hangzhou.aliyuncs.com/qlq_repository/springboot-ssm-01:1.0.0

开放端口:

kubectl expose deployment springboot-ssm-01 --port=8088 --target-port=8088 -type=NodePort

然后查看svc 和 deployment, 以及pods:

[root@k8smaster01 ~]# kubectl get pods,svc,deployment | grep spring
pod/springboot-ssm-01-7cbbfd9697-5gh7d              1/1     Running   0          34h
service/springboot-ssm-01   NodePort    10.1.44.205   <none>        8088:31788/TCP   34h
deployment.apps/springboot-ssm-01              1/1     1            1           34h

然后客户端通过 31788 端口访问即可。

 

这篇关于k8s部署java项目的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!