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

也可以直接用賬號密碼明文登錄

docker login --username=qlq04**** -p=yourpwd 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 端口訪問即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM