# Kubernetes容器交付介紹
如何在k8s集群中部署Java項目
## 容器交付流程
- 開發代碼階段
- 編寫代碼
- 編寫Dockerfile【打鏡像做準備】
- 持續交付/集成
- 代碼編譯打包
- 制作鏡像
- 上傳鏡像倉庫
- 應用部署
- 環境準備
- Pod
- Service
- Ingress
- 運維
- 監控
- 故障排查
- 應用升級
## k8s部署Java項目流程
- 制作鏡像【Dockerfile】
- 上傳到鏡像倉庫【Dockerhub、阿里云、網易】
- 控制器部署鏡像【Deployment】
- 對外暴露應用【Service、Ingress】
- 運維【監控、升級】
## k8s部署Java項目
### 準備Java項目
第一步,準備java項目,把java進行打包【jar包或者war包】

### 依賴環境
在打包java項目的時候,我們首先需要兩個環境
- java環境【JDK】
- maven環境
然后把java項目打包成jar包
```bash
mvn clean install
```

### 編寫Dockerfile文件
Dockerfile 內容如下所示
```bash
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD ./target/demojenkins.jar demojenkins.jar
ENTRYPOINT ["java","-jar","/demojenkins.jar", "&"]
```
### 制作鏡像
在我們創建好Dockerfile文件后,我們就可以制作鏡像了
我們首先將我們的項目,放到我們的服務器上

然后執行下面命令打包鏡像
```bash
docker build -t java-demo-01:latest .
```
等待一段后,即可制作完成我們的鏡像

最后通過下面命令,即可查看我們的鏡像了
```BASH
docker images;
```
### 啟動鏡像
在我們制作完成鏡像后,我們就可以啟動我們的鏡像了
```bash
docker run -d -p 8111:8111 java-demo-01:latest -t
```
啟動完成后,我們通過瀏覽器進行訪問,即可看到我們的java程序
```bash
http://192.168.177.130:8111/user
```
### 推送鏡像
下面我們需要將我們制作好的鏡像,上傳到鏡像服務器中【阿里云、DockerHub】
首先我們需要到 阿里云 [容器鏡像服務](https://cr.console.aliyun.com/cn-hangzhou/instances/repositories),然后開始創建鏡像倉庫

然后選擇本地倉庫

我們點擊我們剛剛創建的鏡像倉庫,就能看到以下的信息

#### 登錄鏡像服務器
使用命令登錄
```bash
docker login --username=XXXXXXX@163.com registry.cn-shenzhen.aliyuncs.com
```
然后輸入剛剛我們開放時候的注冊的密碼
#### 鏡像添加版本號
下面為我們的鏡像添加版本號
```bash
# 實例
docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/mogublog/java-project-01:[鏡像版本號]
# 舉例
docker tag 33f11349c27d registry.cn-shenzhen.aliyuncs.com/mogublog/java-project-01:1.0.0
```
操作完成后

#### 推送鏡像
在我們添加版本號信息后,我們就可以推送我們的鏡像到阿里云了
```bash
docker push registry.cn-shenzhen.aliyuncs.com/mogublog/java-project-01:1.0.0
```

操作完成后,我們在我們的阿里云鏡像服務,就能看到推送上來的鏡像了

### 控制器部署鏡像
在我們推送鏡像到服務器后,就可以通過控制器部署鏡像了
首先我們需要根據剛剛的鏡像,導出yaml
```bash
# 導出yaml
kubectl create deployment javademo1 --image=registry.cn-
shenzhen.aliyuncs.com/mogublog/java-project-01:1.0.0 --dry-run -o yaml > javademo1.yaml
```
導出后的 javademo1.yaml 如下所示
```bash
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: javademo1
name: javademo1
spec:
replicas: 1
selector:
matchLabels:
app: javademo1
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: javademo1
spec:
containers:
- image: registry.cn-shenzhen.aliyuncs.com/mogublog/java-project-01:1.0.0
name: java-project-01
resources: {}
status: {}
```
然后通過下面命令,通過yaml創建我們的deployment
```bash
# 創建
kubectl apply -f javademo1.yaml
# 查看 pods
```

或者我們可以進行擴容,多創建幾個副本
```bash
kubectl scale deployment javademo1 --replicas=3
```

然后我們還需要對外暴露端口【通過service 或者 Ingress】
```bash
# 對外暴露端口
kubectl expose deployment javademo1 --port=8111 --target-port=8111 --type=NodePort
# 查看對外端口號
kubectl get svc
```

然后通過下面的地址訪問
```bash
# 對內訪問
curl http://10.106.103.242:8111/user
# 對外訪問
http://192.168.177.130:32190/user
```
### 運維
....
- Kubernetes簡介
- 搭建K8S集群前置知識
- 使用kubeadm方式搭建K8S集群
- 使用二進制方式搭建K8S集群
- Kubeadm和二進制方式對比
- Kubernetes集群管理工具kubectl
- Kubernetes集群YAML文件詳解
- Kubernetes核心技術Pod
- Kubernetes核心技術Controller
- Kubernetes核心技術Service
- Kubernetes控制器Controller詳解
- Kubernetes配置管理
- Kubernetes集群安全機制
- Kubernetes核心技術Ingress
- Kubernetes核心技術Helm
- Kubernetes持久化存儲
- Kubernetes集群資源監控
- Kubernetes搭建高可用集群
- Kubernetes容器交付介紹
- 使用kubeadm-ha腳本一鍵安裝K8S
- Kubernetes可視化界面kubesphere
- Kubernetes配置默認存儲類
- 使用Rancher搭建Kubernetes集群
- Kubernetes中的CRI