定時任務遷移kubernetes
服務遷移步驟
1.安裝好java
2.安裝好maven
- 項目打包
mvn package
- 測試傳參運行
java -cp cronjob-demo-1.0-SNAPSHOT.jar com.mooc.demo.cronjob。Main
- 編輯Dockfile
FROM 172.17.166.172/kubenetes/openjdk:8-jre-alpine COPY target/cronjob-demo-1.0-SNAPSHOT.jar /cronjob-demo.jar ENTRYPOINT ["java", "-cp", "/cronjob-demo.jar", "com.mooc.demo.cronjob.Main" ]
- 打包並運行測試鏡像
docker build -t cronjob-demo:v1 . docker run -it cronjob-demo:v1
- 修改鏡像tag並上傳
docker tag cronjob-demo:v1 172.17.166.17/kuberneres/cronjob-demo:v1 docker push 172.17.166.17/kuberneres/cronjob-demo:v1
- 制作k8s部署文件
apiVersion: batch/v1beta1 kind: CronJob metadata: name: cronjob-demo spec: schedule: "*/1 * * * *" #分時日月周 successfulJobsHistoryLimit: 3 #成功任務歷史保存個數 suspend: false #是否停止 如果是true cronjob並不會調度起來 concurrencyPolicy: Forbid #並行策略 failedJobsHistoryLimit: 1 #失敗保存個數 jobTemplate: spec: template: metadata: labels: app: cronjob-demo spec: restartPolicy: Never #重啟策略 containers: - name: cronjob-demo image: 172.17.166.172/kubenetes/cronjob:v1
- 查看任務
kubectl apply -f conjob-demo.yaml
kubectl get cronjob
【不熟悉SpringBoot的筒子看過來】SpringBoot快速入門
簡介
SpringBoot使你可以非常容易的創建一個獨立的、生產級的、基於spring的應用。
它大量簡化了使用spring帶來的繁瑣的配置,大部分基於SpringBoot的應用只需要一點點的配置。
特征
- 獨立的spring應用(內置tomcat、jetty,無需部署war包)
- 提供了豐富的"starter"依賴,簡化應用構建配置
- 自動配置spring和第三方依賴庫
- 沒有代碼生成,沒有xml配置
- 提供准生產功能,如指標,健康檢查和外部配置
Quick Start
生成項目
訪問官網:https://start.spring.io/
選擇構建工具,如:Maven Project、Java、Spring Boot 版本 2.1.4 以及一些基本信息,如下圖:
最終會下載到一個demo.zip,解壓后主要目錄結構如下
├── demo
│ ├── pom.xml
│ └── src
│ └── main
│ ├── java
│ │ └── com
│ │ └── example
│ │ └── demo
│ │ └── DemoApplication.java
│ └── resources
│ └── application.properties
在demo基礎上做一個web服務
改造后的pom

<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties>
服務配置 - application.properties
# 服務名 server.name=springboot-web-demo # web服務監聽端口 server.port=8080
增加controller代碼
com.example.demo.DemoController.java
package com.example.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class DemoController { @RequestMapping("/hello") public String sayHello() { return "Hello SpringBoot"; } }
運行&測試
經過以上步驟,一個基於springboot的web服務就搭建好了。
運行方式如下:
- 在IDE中:
直接以DemoApplication做為啟動類。 - 在命令行下:
# 構建fatjar(構建結果在target目錄下) $ cd demo $ mvn clean package # 運行jar包 $ java -jar target/demo-0.0.1-SNAPSHOT.jar
測試:
打開瀏覽器訪問: http://localhost:8080/hello 看看效果吧
springboot的web服務遷移kubernetes
- 打包
mvn package
- Dockerfile編寫
FROM 172.17.166.172/kubenetes/openjdk:8-jre-alpine COPY target/springboot-web-demo-1.0-SNAPSHOT.jar /web-demo.jar ENTRYPOINT ["java" , "-jar" , "/web-demo.jar"]
- build鏡像 測試並上傳鏡像
jar -tf springboot-web-demo-1.0-SNAPSHOT.jar #查看jar包中包含的內容
java -jar springboot-web-demo-1.0-SNAPSHOT.jar #測試包運行是否正常docker build -t springboot-web-demo:v1 .
docker run -it springboot-web-demo:v1
docker tag springboot-web-demo:v1 172.17.166.217/kubernetes/springboot-web-demo:v1
docker push springboot-web-demo:v1 172.17.166.217/kubernetes/springboot-web-demo:v1 - 編輯k8s部署文件並運行
#deploy apiVersion: apps/v1 kind: Deployment metadata: name: web-demo spec: selector: matchLabels: app: springboot-web-demo replicas: 2 template: metadata: labels: app: springboot-web-demo spec: containers: - name: springboot-web-demo image: 172.17.166.217/kubenetes/web:v1 ports: - containerPort: 8080 --- #service apiVersion: v1 kind: Service metadata: name: springboot-web-demo spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: springboot-web-demo type: ClusterIP --- #ingress apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: springboot-web-demo spec: rules: - host: www.cssp.com http: paths: - pathType: Prefix path: / backend: service: name: springboot-web-demo port: number: 80
kubectl apply -f spring-web-demo.yaml kubectl get deploy spring-web-demo kubectl get pod -l app.kubernetes.io/name=spring-web-demo
Dubbo快速入門
簡介
Dubbo是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。
Dubbo源自阿里巴巴,2018年初貢獻給了apache基金會。已經經歷兩年多的孵化。
據悉,2.7.x會作為Dubbo在Apache社區的畢業版本,Dubbo將有機會成為繼RocketMQ后,來自阿里巴巴的又一個Apache頂級項目(TLP)。
架構
dubbo主要有三種角色:
- 服務的提供者
啟動后會把服務的信息寫入注冊中心(服務的ip地址,端口,有哪些接口等) - 服務消費者
訪問注冊中心找到服務提供者的信息,並跟服務提供者建立連接。 - 注冊中心
主要作用是存儲服務的信息,並對服務的變化做通知。
Quick Start
最常見的使用dubbo的方式是基於spring框架。下面的內容也是基於spring框架的配置去演示如何開發一個基於dubbo的應用。
首先我們創建一個根目錄叫:dubbo-demo:
$ mkdir dubbo-demo
$ cd dubbo-demo
然后在根目錄下創建三個子目錄:
- dubbo-demo-api: 服務的api定義
- dubbo-demo-provider: 服務提供者
- dubbo-demo-consumer: 服務消費者
1. 注冊中心 - zookeeper
dubbo常用的注冊中心是zookeeper,首先用docker啟動一個zookeeper服務,暴露出2181端口。
docker run -idt -p 2181:2181 zookeeper:3.5
2. dubbo-demo-api - 服務接口定義
定義服務接口(DemoService.java)
package org.apache.dubbo.demo; public interface DemoService { String sayHello(String name); }
此時工程的結構應該類似這樣:
├── dubbo-demo-api
│ ├── pom.xml
│ └── src
│ └── main
│ └── java
│ └── org
│ └── apache
│ └── dubbo
│ └── demo
│ └── DemoService.java
3. dubbo-demo-provider - 服務提供者
服務實現類(DemoServiceImpl.java)
package org.apache.dubbo.demo.provider; import org.apache.dubbo.demo.DemoService; public class DemoServiceImpl implements DemoService { public String sayHello(String name) { return "Hello " + name; } }
服務啟動類(Provider.java)
package org.apache.dubbo.demo.provider; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Provider { public static void main(String[] args) throws Exception { System.setProperty("java.net.preferIPv4Stack", "true"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo-demo-provider.xml"}); context.start(); System.out.println("Provider started."); System.in.read(); // press any key to exit } }
通過spring配置暴露服務(provider.xml)
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 服務提供者的應用名 --> <dubbo:application name="demo-provider"/> <!-- 把服務注冊到zookeeper --> <dubbo:registry address="zookeeper://${zookeeper_ip_addr}:2181"/> <!-- 使用dubbo協議暴露服務端口20880 --> <dubbo:protocol name="dubbo" port="20880"/> <!-- 服務的實現類 --> <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/> <!-- 聲明要暴露的服務接口 --> <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/> </beans>
配置日志(log4j.xml)
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"> <appender name="stdout" class="org.apache.log4j.ConsoleAppender"> <param name="encoding" value="UTF-8"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] {%p} %c %L - %m%n" /> </layout> </appender> <root> <level value="warn" /> <appender-ref ref="stdout" /> </root> </log4j:configuration>
最終項目結構如下
├── dubbo-demo-provider │ ├── pom.xml │ └── src │ └── main │ ├── java │ │ └── org │ │ └── apache │ │ └── dubbo │ │ └── demo │ │ └── provider │ │ ├── DemoServiceImpl.java │ │ └── Provider.java │ └── resources │ ├── META-INF │ │ └── spring │ │ └── dubbo-demo-provider.xml │ └── log4j.xml
4. dubbo-demo-consumer - 服務消費者
用下面的spring配置引用一個遠程的dubbo服務(consumer.xml)
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://dubbo.apache.org/schema/dubbo" xmlns="http://www.springframework.org/schema/beans" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 消費者應用名 --> <dubbo:application name="demo-consumer"/> <!-- 用zookeeper發現服務 --> <dubbo:registry address="zookeeper://${zookeeper_ip_addr}:2181"/> <!-- 生成遠程服務的代理, 之后demoService就可以像使用本地接口一樣使用了 --> <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/> </beans>
消費者啟動類(Consumer.java)
import org.springframework.context.support.ClassPathXmlApplicationContext; import org.apache.dubbo.demo.DemoService; public class Consumer { public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"META-INF/spring/dubbo-demo-consumer.xml"}); context.start(); // Obtaining a remote service proxy DemoService demoService = (DemoService)context.getBean("demoService"); // Executing remote methods String hello = demoService.sayHello("world"); // Display the call result System.out.println(hello); } }
配置好日志后(同provider),項目結構如下:
├── dubbo-demo-consumer │ ├── pom.xml │ └── src │ └── main │ ├── java │ │ └── org │ │ └── apache │ │ └── dubbo │ │ └── demo │ │ └── consumer │ │ └── Consumer.java │ └── resources │ ├── META-INF │ │ └── spring │ │ └── dubbo-demo-consumer.xml │ └── log4j.xml
5. 完整示例
- provider
$ git clone https://github.com/apache/incubator-dubbo.git $ cd incubator-dubbo
在模塊dubbo-demo-provider下運行org.apache.dubbo.demo.provider.Provider 如果用的IDE是Intellij Idea,需要添加參數:-Djava.net.preferIPv4Stack=true
- consumer
$ git clone https://github.com/apache/incubator-dubbo.git $ cd incubator-dubbo
如果用的IDE是Intellij Idea,需要添加參數:-Djava.net.preferIPv4Stack=true
傳統dubbo服務遷移kubernetes
-
打包
mvn install #進入dubbo api目錄安裝dubbo api mvn package #打包 tar -tf dubbo-demo-1.0-SNPASHOT-assembly.tar.gz 查看包中包含具體資源
- 測試
/bin/start.sh 啟動服務 查看接口是否開放 進程是否存在 telnet ip dubbo端口連接 ls 查看服務 ls com.mooc.demo.api.DemoService 查看有哪些服務接口 invoke com.mooc.demo.api.DemoService.sayHello("Dick")調用接口 /bin/stop.sh 測試停止服務
- 制作dockerfile並測試
FROM hub.mooc.com/kubernetes/openjdk:8-jre-alpine COPY target/ROOT /ROOT ENTRYPOINT ["sh", "/ROOT/bin/start.sh"]
- dubbo服務發現
1.provider向zookeeper注冊,zookeeper返回給consumer容器ip
2.如整體架構都在k8s中則無問題,如consumer在集群之外。
3.provider可將真實宿主機ip通過文件掛載方式configmap掛載到provider evn中。注冊時使用真實ip。缺點(性能消耗不好,使用不方便)
4.provider可使用宿主機網絡,hostnetwork。直接與宿主機共用網絡。缺點端口會增多混亂所以要規划好端口使用問題。
5.優雅退出dubbo優雅退出是系統向程序發送一個SIGTERM信號kill 15終止信號,出發代碼run中方法去執行下線流程。kubelet關閉容器默認也是發送SIGTERM kill 15信號與微服務契合。有可能遇到Pod卡死,處理不了優雅退出的命令或者操作、優雅退出的邏輯有BUG,陷入死循環、代碼問題,導致執行的命令沒有效果。所以可以在prostop中加入腳本向注冊中心通知下線操作。
- k8s部署文件
apiVersion: apps/v1 kind: Deployment metadata: name: dubb-demo spec: selector: matchLabels: app: dubb-demo replicas: 1 template: metadata: labels: app: dubb-demo spec: hostNetwork: true affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - dubb-demo topologyKey: "kubernetes.io/hostname" containers: - name: dubb-demo image: hub.mooc.com/kubernetes/dubbo:v1 ports: - containerPort: 20881 env: - name: DUBBO_PORT value: "20881" #在啟動文件中替換端口
傳統web服務遷移kubernetes
- 打包測試
mvn package
- 構建dockerfile
FROM 172.17.166.217/kubenetes/tomcat:8.0.51-alpine COPY ROOT /usr/local/tomcat/webapps/ROOT COPY dockerfiles/start.sh /usr/local/tomcat/bin/start.sh ENTRYPOINT ["sh" , "/usr/local/tomcat/bin/start.sh"]
- 鏡像測試后將鏡像上傳庫並制作k8s文件
apiVersion: apps/v1 kind: Deployment metadata: name: web-demo spec: selector: matchLabels: app: web-demo replicas: 4 template: metadata: labels: app: web-demo spec: containers: - name: web-demo image: hub.mooc.com/kubernetes/web:v1 ports: - containerPort: 8080
###注默認tomcat啟動是后台運行,容器收不到存活進程會自動退出,要在啟動文件中編輯一個循環指令。類似於
#!/bin/bash sh /usr/local/tomcat/bin/startup.sh tail -f /usr/local/tomcat/logs/catalina.out