kubernetes下的Nginx加Tomcat三部曲之二:細說開發
本文是《kubernetes下的Nginx加Tomcat三部曲》的第二章,在《kubernetes下的Nginx加Tomcat三部曲之一:極速體驗》一文我們快速部署了Nginx和Tomcat,達到以下效果:
本文我會詳細說明在kubernetes部署上述網路服務時,需要做哪些具體的工作;
列舉步驟
需要以下操做才能在kubernetes上部署Nginx加Tomcat的服務:
1. 開發Tomcat上的web工程和Docker映象;
2. 讓kubernetes的機器用上web工程的Docker映象;
3. 開發Tomcat對應的deployment指令碼;
4. 開發Tomcat對應的service指令碼;
5. 開發Nginx對應的Docker映象;
6. 讓kubernetes的機器用上Nginx的Docker映象
7. 開發Nginx對應的deployment指令碼;
8. 開發Nginx對應的service指令碼;
9. 開發啟動上述pod和service的指令碼;
10. 開發停止並清除上述pod和service的指令碼
指令碼檔案下載
本次體驗所需的deployment和service資源是通過指令碼建立的,這個指令碼可以通過以下兩種方式中的任意一種下載:
1. CSDN下載(無法設定免費下載,只能委屈您用掉兩個積分了):http://download.csdn.net/download/boling_cavalry/10235034
2. GitHub下載,地址和連結資訊如下表所示:
名稱 | 連結 | 備註 |
---|---|---|
git倉庫地址(ssh) | [email protected]:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |
這個git專案中有多個目錄,本次所需的資源放在k8s_nginx_tomcat_resource,如下圖紅框所示:
下到的k8stomcatcluster20180201.tar是個壓縮包,複製到可以執行kubectl命令的ubuntu電腦上,然後解壓開,是個名為k8stomcatcluster的資料夾;
Spring boot的web工程原始碼下載
GitHub下載,地址和連結資訊如下表所示:
名稱 | 連結 | 備註 |
---|---|---|
git倉庫地址(ssh) | [email protected]:zq2599/blog_demos.git | 該專案原始碼的倉庫地址,ssh協議 |
這個git專案中有多個目錄,本次的web工程原始碼放在k8stomcatdemo,如下圖紅框所示:
接下來我們開始實戰開發吧;
開發環境
本次實戰開發環境的具體資訊如下:
1. 作業系統:Ubuntu16;
2. Docker版本:17.03.2-ce;
3. JDK:1.8.0_151;
4. maven:3.3.3;
Tomcat上的web工程和Docker映象
web工程用來提供http服務,返回當前機器的IP地址給瀏覽器,完整原始碼請參照前面下載的k8stomcatdemo工程,這裡我們還是重新建立一次;
1. 建立一個springboot工程,pom.xml內容如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bolingcavalry</groupId>
<artifactId>k8stomcatdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>k8stomcatdemo</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!--新增的docker maven外掛-->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.12</version>
<!--docker映象相關的配置資訊-->
<configuration>
<!--映象名,這裡用工程名-->
<imageName>bolingcavalry/${project.artifactId}</imageName>
<!--TAG,這裡用工程版本號-->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<!--映象的FROM,使用java官方映象-->
<baseImage>java:8u111-jdk</baseImage>
<!--該映象的容器啟動後,直接執行spring boot工程-->
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!--構建映象的配置資訊-->
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
</project>
可以看到這是個普通的springboot的web工程,唯一不同的是多了一個maven外掛:docker-maven-plugin,使用該外掛我們可以將maven工程製作成docker映象;
2. 整個工程只有一個Controller,開通一個http介面,將當前伺服器IP地址返回,原始碼如下:
@RestController
public class ServerInfo {
@RequestMapping(value = "/getserverinfo", method = RequestMethod.GET)
public String getUserInfoWithRequestParam(){
return String.format("server : %s, time : %s", getIPAddr(), new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}
/**
* 獲取本機IP地址
* @return
*/
private static String getIPAddr(){
String hostAddress = null;
try{
InetAddress address = InetAddress.getLocalHost();
hostAddress = address.getHostAddress();
}catch (UnknownHostException e){
e.printStackTrace();
}
return hostAddress;
}
}
以上就是工程的關鍵原始碼;
3. 在pom.xml所在目錄執行mvn clean package -DskipTests docker:build,會編譯構建工程,並且在本地製作好映象檔案,如下:
root@maven:/usr/local/work/github/blog_demos# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
bolingcavalry/k8stomcatdemo latest 1d41d9980a0b 43 hours ago 658 MB
bolingcavalry/k8stomcatdemo 0.0.1-SNAPSHOT c91bc368a729 46 hours ago 658 MB
讓kubernetes的機器用上web工程的Docker映象
現在的映象只存在於開發和構建web工程的電腦上,為了讓kubernetes的node機器能用上這個映象,可以用以下幾種方式實現:
1. 用docker push命令將本機映象推送到hub.docker.com網站,這樣其他機器都可以通過docker pull命令取得了,我就是用的這種方法,需要在hub.docker.com上註冊;
2. 用docker save命令匯出映象檔案,再用docker load命令匯入;
3. kubernetes所在機器安裝java和maven環境,將工程在這裡編譯構建;
4. 使用docker私有倉庫,例如搭建區域網私有倉庫或者阿里雲私有倉庫,參考《maven構建docker映象三部曲之三:推送到遠端倉庫(內網和阿里雲)》;
Tomcat對應的deployment指令碼
用yaml檔案將詳情配置好,再用kubectl命令執行這個配置就能建立pod,這個web應用映象的配置檔名為tomcat.yaml,內容如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcathost
spec:
replicas: 3
template:
metadata:
labels:
name: tomcathost
spec:
containers:
- name: tomcathost
image: bolingcavalry/k8stomcatdemo:0.0.1-SNAPSHOT
tty: true
ports:
- containerPort: 8080
將上述指令碼的幾個關鍵點列舉一下:
1. version用extensions/v1beta1;
2. kind用Deployment,支援升級映象和滾動升級;
3. 使用的映象bolingcavalry/k8stomcatdemo:0.0.1-SNAPSHOT,是我從本地push到hub.docker.com上去的;
4. 建立的容器對外暴露了8080埠;
Tomcat對應的service指令碼
建立了tomcat的pod之後,為了能在kubernetes環境中給其他service使用,需要將這些pod包裝為service,這裡是通過tomcat-svc.yaml檔案來配置的,內容如下:
apiVersion: v1
kind: Service
metadata:
name: tomcathost
spec:
type: ClusterIP
ports:
- port: 8080
selector:
name: tomcathost
將上述指令碼的幾個關鍵點列舉一下:
1. 服務對應的pod是tomcathost;
2. type用ClusterIP,為內部service呼叫提供統一IP地址;
2. 服務對外暴露了pod的8080埠;
Nginx對應的Docker映象
- 定製的Nginx映象和Nginx官方映象相比,唯一的區別就是nginx.conf檔案不同,我們用的nginx.conf內容如下:
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
#include /etc/nginx/conf.d/*.conf;
upstream tomcat_client {
server tomcathost:8080;
}
server {
server_name "";
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
location / {
proxy_pass http://tomcat_client;
proxy_redirect default;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
}
以上配置中,新增的upstream對應的IP地址是tomcathost,這是tomcat的service名稱,在Nginx執行的時候,通過tomcathost就能訪問到tomcat的Pod;
- 製作Docker映象的Dockerfile檔案內容如下,每行都有註釋就不再多說了:
# First docker file from bolingcavalry
# VERSION 0.0.1
# Author: bolingcavalry
#基礎映象
FROM nginx:stable
#作者
MAINTAINER BolingCavalry <[email protected]>
#定義工作目錄
ENV WORK_PATH /etc/nginx
#定義conf檔名
ENV CONF_FILE_NAME nginx.conf
#刪除原有配置檔案
RUN rm $WORK_PATH/$CONF_FILE_NAME
#複製新的配置檔案
COPY ./$CONF_FILE_NAME $WORK_PATH/
#給shell檔案賦讀許可權
RUN chmod a+r $WORK_PATH/$CONF_FILE_NAME
- 將nginx.conf和Dockerfile放在同一個目錄,然後執行命令docker build -t bolingcavalry/nginx-with-tomcat-host:0.0.1 .,就能構建映象檔案了,如下:
[email protected]:/usr/local/work/nginx# docker build -t bolingcavalry/nginx-with-tomcat-host:0.0.1 .
Sending build context to Docker daemon 14.51 MB
Step 1/7 : FROM nginx:stable
---> dfe062ee1dc8
Step 2/7 : MAINTAINER BolingCavalry <[email protected]>
---> Using cache
---> 93f4bf154c55
Step 3/7 : ENV WORK_PATH /etc/nginx
---> Using cache
---> d0158757fc9c
Step 4/7 : ENV CONF_FILE_NAME nginx.conf
---> Using cache
---> 7a18a8b417d6
Step 5/7 : RUN rm $WORK_PATH/$CONF_FILE_NAME
---> Using cache
---> f6f27d25539d
Step 6/7 : COPY ./$CONF_FILE_NAME $WORK_PATH/
---> Using cache
---> 33075a2b0379
Step 7/7 : RUN chmod a+r $WORK_PATH/$CONF_FILE_NAME
---> Using cache
---> 58ce530e160b
Successfully built 58ce530e160b
讓kubernetes的機器用上Nginx的Docker映象
這一步和之前的web工程的映象放到kubernetes一樣,有多種方式,我用的還是通過docker push推送到hub.docker.com網站,再在kubernetes上pull下來;
Nginx對應的deployment指令碼
用yaml檔案將詳情配置好,再用kubectl命令執行這個配置就能建立pod,這個web應用映象的配置檔名為nginx.yaml,內容如下:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: ng
spec:
replicas: 1
template:
metadata:
labels:
name: ng
spec:
containers:
- name: ng
image: bolingcavalry/nginx-with-tomcat-host:0.0.1
ports:
- containerPort: 80
以上配置中有幾點要注意:
1. 使用映象是剛才建立的nginx映象bolingcavalry/nginx-with-tomcat-host:0.0.1;
2. pod容器建立後,對外暴露80埠;
Nginx對應的service指令碼
通過service定義的yaml檔案nginx-svc.yam,將前面建立的nginx的pod包裝為service:
apiVersion: v1
kind: Service
metadata:
name: ng
spec:
type: NodePort
ports:
- port: 80
nodePort: 30006
selector:
name: ng
以上配置中有幾點要注意:
1. type使用NodePort,這樣可以通過節點機器的IP訪問此service;
2. 將節點機器的30006埠和pod的80埠繫結,因此,外部訪問節點IP+30006埠就能訪問到此Nginx服務了;
啟動上述pod和service的指令碼
接下來我們建立一個shell指令碼start_all.sh,將上述的tomcat和nginx的pod以及service全部建立和啟動:
kubectl create -f tomcat.yaml
kubectl create -f tomcat-svc.yaml
kubectl create -f nginx.yaml
kubectl create -f nginx-svc.yaml
echo ""
echo "nginx and tomcat running now"
如上所示,通過kubectl create -f加檔名,就能建立好yaml檔案中定義的pod和service;
停止並清除上述pod和service的指令碼
建立一個shell指令碼stop_all.sh,能夠將上述的tomcat和nginx的pod以及service全部清除掉:
kubectl delete service tomcathost
kubectl delete deployment tomcathost
kubectl delete service ng
kubectl delete deployment ng
echo "nginx and tomcat stop now"
如上所示,其實就是通過kubectl delete命令將指定的pod和service資源刪除;
以上就是在kubernetes搭建整個Nginx加Tomcat環境的所有資源,您就可以用這些像《kubernetes下的Nginx加Tomcat三部曲之一:極速體驗》文中那樣去搭建和體驗kubernetes下的Nginx加Tomcat;
下一章,我們會在此環境的基礎上實戰Tomcat服務的擴容,並修改web工程的程式碼,再建立新的映象,並且將kubernetes環境下線上升級新的web工程服務;
相關推薦
kubernetes下的Nginx加Tomcat三部曲之二:細說開發
本文是《kubernetes下的Nginx加Tomcat三部曲》的第二章,在《kubernetes下的Nginx加Tomcat三部曲之一:極速體驗》一文我們快速部署了Nginx和Tomcat,達到以下效果: 本文我會詳細說明在kubernetes部署上述網
Docker下的Spring Cloud三部曲之二:細說Spring Cloud開發
本文是《Docker下的Spring Cloud三部曲》系列的第二篇,詳細講解上一篇例項中用到的eureka、provider、consumer等三個應用的開發過程; 環境資訊 回顧一下實戰環境,如下圖: 原始碼地址 上圖的eureka、
自定義spring boot starter三部曲之二:實戰開發
本文是《自定義spring boot starter三部曲》的第二篇,上一篇中我們通過學習spring cloud的starter,對spring boot的starter有了初步瞭解,也設計好了實戰內容,今天就來一起實現; 三部曲文章連結 《自定義spring boot
Docker下Java檔案上傳服務三部曲之二:服務端開發
本章是《Docker下Java檔案上傳服務三部曲》的第二篇,上一章《Docker下Java檔案上傳服務三部曲之一:準備環境》我們把客戶端準備好了,Tomcat容器也部署好了,今天就來開發和部署檔案服務的後臺應用吧; 本章實戰內容概要 本章要建立三個w
Docker下dubbo開發,三部曲之二:本地環境搭建
在上一篇文章《Docker下dubbo開發,三部曲之一:極速體驗》中,我們快速體驗了dubbo服務的註冊、發現、呼叫,今天我們一起在本地製作一套這樣的環境,經過這次實戰,大家就可以根據實際需求對自己的環境量身定製了。 基礎架構 整個環境由四個容器組成,梳
Docker下實戰zabbix三部曲之二:監控其他機器
在上一章《Docker下實戰zabbix三部曲之一:極速體驗》中,我們快速安裝了zabbix server,並登入管理頁面查看了zabbix server所在機器的監控資訊,但是在實際場景中,應該是對應用伺服器做監控,所以今天我們來實戰將應用伺服器的監控加入到zabbix server中。 全系列文章連結:
spring4.1.8初始化原始碼學習三部曲之二:setConfigLocations方法
本章是學習spring4.1.8初始化原始碼的第二篇,前一章《spring4.1.8初始化原始碼學習三部曲之一:AbstractApplicationContext構造方法》對AbstractApplicationContext的初始化做了分析,本章我們聚焦
maven構建docker映象三部曲之二:編碼和構建映象
在《maven構建docker映象三部曲之一:準備環境》中,我們在vmware上準備好了ubuntu16虛擬機器,並且裝好了docker、jdk8、maven等必備工具,現在我們來開發一個java web工程,再用docker-maven-plugin外掛來
elasticsearch實戰三部曲之二:文件操作
本文是《elasticsearch實戰三部曲》系列的第二篇,上一篇文章我們動手熟悉了索引相關的基本操作,現在一起來熟悉文件相關的操作; 系列文章連結 《elasticsearch實戰三部曲之一:索引操作》; 《elasticsearch實戰三部曲之二:文件操作》;
Kubernetes持久卷實戰兩部曲之二:細說開發
在上一章《Kubernetes持久卷實戰兩部曲之一:極速體驗》我們體驗了K8S環境下基於NFS的持久卷讀寫,今天我們一起來了解整個體驗環境背後的細節; 全文概要 要完成上一章的體驗,需要做以下事情: 1. 建立PV; 2. 建立PVC; 3. 開發we
Docker下RabbitMQ延時佇列實戰兩部曲之二:細說開發
本章是《Docker下RabbitMQ延時佇列實戰兩部曲》的終篇,上一章《Docker下RabbitMQ延時佇列實戰兩部曲之一:極速體驗》我們快速體驗了延時佇列的生產和消費,今天來實戰整個開發過程; SpringBoot框架下進行RabbitMQ開發,相關
Tomcat學習之二:tomcat安裝、配置及目錄檔案說明
一、下載JDK和Tomcat 二、安裝JDK 點選JDK應用程式預設安裝即可,記下JDK的安裝目錄(例如:C:\Program Files\Java\jdk1.7.0_45)。 三、配置JDK和Tomcat 1. 配置JDK
實戰maven私有倉庫三部曲之二:上傳到私有倉庫
在上一章《實戰maven私有倉庫三部曲之一:搭建和使用》我們搭建了maven私有倉庫,並體驗了私有倉庫快取jar包的能力,避免了局域網內開發人員去遠端中央倉庫下載的痛苦等待,本章我們再來體驗私有倉庫的另一個功能:儲存二方庫; 使用場景 mvndemos
CDH5部署三部曲之二:部署和設定
### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ### 本
Flink on Yarn三部曲之二:部署和設定
### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; 本文是《
CDH+Kylin三部曲之二:部署和設定
### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###
CoProcessFunction實戰三部曲之二:狀態處理
### 歡迎訪問我的GitHub [https://github.com/zq2599/blog_demos](https://github.com/zq2599/blog_demos) 內容:所有原創文章分類彙總及配套原始碼,涉及Java、Docker、Kubernetes、DevOPS等; ###
Kubernetes下web服務的效能測試三部曲之三:橫向擴容
本章是《Kubernetes下web服務的效能測試三部曲》系列的終篇,之前我們用AB和JMeter兩種工具壓測了k8s環境下的Tomcat,並通過調整記憶體和CPU來驗證縱向擴容的效果,本章我們來驗證橫向擴容對吞吐量的影響; 本文地址:http://blog.
Jmockit示例三部曲之二讓我驗證下你是否走對了
上一章節我們主要講的是在執行test case之前,在recorded階段進行“期望”(可能會有些看不懂這個“期望”,實際上就是指對被mock的方法進行錄製,希望被引用的方法返回自己設定的值,或者欄位設定為自己設定的值)。這些“期望”是否真的在test case執行時發生了
CentOS7 下調教mysql記實 之二
rac hang general username sta roo warnings 普通用戶 pan 導入SQL後,普通用戶不能調用存儲過程,root可以。 解決: mysql> update mysql.proc set Definer=‘username@%‘;