因为服务需要可缩容,所以不能使用host部署.
涉及两个应用,zuul,basic-info-api
验证,在k8s任意一个node 从zuul 访问 basic-info-api
创建一个SpringBoot应用: basic-info-api
用于检查健康状态的Controller
/** * User: laizhenwei * Date: 2018-04-12 Time: 16:10 */ @RestController @RequestMapping(path = "/") public class Healthz { @Value("${spring.application.name}") private String serviceId; @Autowired private LoadBalancerClient loadBalancer; @GetMapping(path = "/healthz",produces = MediaType.TEXT_PLAIN_VALUE) public String healthz(){ return "ok"; } @GetMapping(path = "/getHost",produces = MediaType.TEXT_PLAIN_VALUE) public String getHost(){ ServiceInstance instance = loadBalancer.choose(serviceId); return instance.getHost(); } }
Application.java
@EnableEurekaClient @EnableCircuitBreaker @SpringBootApplication public class BasicInfoApiApplication { public static void main(String[] args) { SpringApplication.run(BasicInfoApiApplication.class, args); } }
application.yaml
spring:
application:
name: BASIC-INFO-API
profiles:
active: dev
application-test.yaml
eureka:
instance:
appname: ${spring.application.name}
prefer-ip-address: true
#续约更新时间间隔
lease-renewal-interval-in-seconds: 10
#续约到期时间
lease-expiration-duration-in-seconds: 30
client:
serviceUrl:
defaultZone: http://192.168.91.141:8000/eureka/,http://192.168.91.142:8001/eureka/,http://192.168.91.143:8002/eureka/
logging:
config: classpath:logback-test.xml
打包上传到私有仓库
docker build -t ms-basic-info-api . tag ms-basic-info-api 192.168.91.137:5000/ms-basic-info-api docker tag push 192.168.91.137:5000/ms-basic-info-api
Deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: basic-info-api
namespace: ms
spec:
replicas: 1
selector:
matchLabels:
app: basic-info-api
template:
metadata:
labels:
app: basic-info-api
spec:
terminationGracePeriodSeconds: 60
# hostNetwork: true
containers:
- name: basic-info-api
image: 192.168.91.137:5000/ms-basic-info-api
command: ["java"]
args: ["-jar", "/usr/local/basic-info-api.jar","--spring.profiles.active=test","--server.port=8300"]
ports:
- name: http
containerPort: 8300
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8300
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8300
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
---
apiVersion: v1
kind: Service
metadata:
name: basic-info-api
namespace: ms
labels:
app: basic-info-api
spec:
selector:
app: basic-info-api
clusterIP: 172.21.1.2
ports:
- name: http
port: 8300
protocol: TCP
master 执行
kubectl create -f basic-info-api.yaml
查看Eureka页面
创建 zuul 服务
健康检查Controller
/** * User: laizhenwei * Date: 2018-04-12 Time: 16:09 */ @RestController @RequestMapping(path = "/") public class Healthz { @GetMapping(path = "/healthz",produces = MediaType.TEXT_PLAIN_VALUE) public String healthz(){ return "ok"; } }
Application.java
@EnableZuulProxy @EnableEurekaClient @EnableCircuitBreaker @SpringBootApplication public class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class, args); } }
application.yaml
spring:
application:
name: API-GATEWAY
profiles:
active: dev
application-test.yaml
eureka:
instance:
appname: ${spring.application.name}
prefer-ip-address: true
#续约更新时间间隔
lease-renewal-interval-in-seconds: 10
#续约到期时间
lease-expiration-duration-in-seconds: 30
client:
serviceUrl:
defaultZone: http://192.168.91.141:8000/eureka/,http://192.168.91.142:8001/eureka/,http://192.168.91.143:8002/eureka/
logging:
config: classpath:logback-test.xml
打包镜像,上传到私有仓库
docker build -t ms-zuul . docker tag ms-zuul 192.168.91.137:5000/ms-zuul docker push 192.168.91.137:5000/ms-zuul
Deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: zuul
namespace: ms
spec:
replicas: 1
selector:
matchLabels:
app: zuul
template:
metadata:
labels:
app: zuul
spec:
terminationGracePeriodSeconds: 60
containers:
- name: zuul
image: 192.168.91.137:5000/ms-zuul
command: ["java"]
args: ["-jar", "/usr/local/zuul.jar","--spring.profiles.active=test","--server.port=8200"]
ports:
- name: http
containerPort: 8200
livenessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8200
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
readinessProbe:
failureThreshold: 3
httpGet:
path: /healthz
port: 8200
scheme: HTTP
initialDelaySeconds: 20
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 1
---
apiVersion: v1
kind: Service
metadata:
name: zuul
namespace: ms
labels:
app: zuul
spec:
selector:
app: zuul
ports:
- name: http
port: 8200
protocol: TCP
master 执行
kubectl create -f zuul.yaml
查看Eureka
进入k8s任意一个节点 根据zuul访问basic-info-api
curl http://172.20.20.4:8200/basic-info-api/healthz
测试伸缩 与 负载均衡
因刚才重启了一个节点,zuul地址改变了
curl http://172.20.20.6:8200/basic-info-api/getHost
测试负载均衡