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 端口訪問即可。