国际惯例,以helloworld工程为例,从restful工程开发,打包,docker镜像制作。Ingress+service+pod的方式发布服务的例子。
由于没有远程镜像服务器,采用本地镜像的方式加载服务。
镜像设置成本地策略:
spec:
containers:
- name: **********
image: **********
imagePullPolicy: IfNotPresent
1.生成命名空间
在开发之前,我们先了解一下k8s的命名空间,命名空间可以帮助我们管理和隔离pod等组件,增加权限租户管理等操作。
以本文为例,创建一个名为dwayne的命名空间,新建一个create-namespace.yaml文件,内容如下
apiVersion: v1
kind: Namespace
metadata:
name: dwayne
labels:
name: dwayne
执行kubectl apply -f create-namespace.yaml
设置成默认命名空间
kubectl config set-context $(kubectl config current-context) --namespace=dwayne
2.helloworld工程
工程很简单,一个get接口/helloworld,返回json
package com.example.demo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AController {
@RequestMapping(value = "helloworld", method = RequestMethod.GET)
public Response hello() {
Response res = new Response();
res.setMsg("helloworld");
return res;
}
}
打包成jar包,demo-0.0.1-SNAPSHOT.jar
3.生成docker镜像
在节点服务器(所有节点)上新建目录作为工作目录,将jar包上传到节点服务器,并在同一目录下编辑Dockerfile:
FROM java:8
VOLUME /tmp
ADD demo-0.0.1-SNAPSHOT.jar /demo-0.0.1-SNAPSHOT.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/demo-0.0.1-SNAPSHOT.jar"]
保存Dockerfile,退出,执行docker build命令
docker build -t demo-hello-world-master .
生成demo-hello-world-master,先打个tag,方便后续使用:
docker tag demo-hello-world-master dw/demo-hello-world-master
4.部署service
这里部署两个helloworld服务实例(replicas: 2)。部署在dwayne命名空间,yaml文件内容如下:
apiVersion: v1
kind: Service
metadata:
name: helloworld-master
namespace: dwayne
spec:
type: NodePort
selector:
app: helloworld
release: master
ports:
- port: 7071
targetPort: 17001
nodePort: 30002
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: helloworld-master
namespace: dwayne
spec:
replicas: 2
selector:
matchLabels:
app: helloworld
release: master
template:
metadata:
labels:
app: helloworld
release: master
spec:
containers:
- name: demo-hello-world-master
image: dw/demo-hello-world-master
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 17001
应用之后,查看pod,有两个实例:
5.Ingress部署
service只设置了containerPort,没有暴露外网接口,本文使用ingress进行服务端口暴露和服务负载
5.1Ingress基础组件安装
Ingress有多种实现,本文采用ingress-nginx实现,执行deploy.yaml
deploy.yaml
链接: https://caiyun.139.com/m/i?105CpmCT95tE3
提取码:Ja0K
5.2设置服务负载
ingress.yaml
链接: https://caiyun.139.com/m/i?105CqQ7HZpuvc 提取码:nG9h
文件中,指定了服务的hostname,host: www.helloworld.com,访问时需要绑定ip使用hostname访问,默认是80端口: