1.用idea创建一个project,new project->spring initializr->添加一个spring web,groupId随便取,artifactId取test,点finish即可,不要用webflux
2.新建一个controller,随便写个web接口,如
@GetMapping("/{args}")
public String helloWorld(@PathVariable("args") String s){
return "hello world:"+s;
}
3.配置application.properties
server.servlet.context-path=/test
server.port=8080
4.install打包,在target目录下会生成一个jar包
5.新建一个文件,文件名为Dockerfile,文件内容为
FROM java:8
VOLUME /tmp
ADD test-1.0.0.jar app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
6.把jar包和Dockerfile上传到集群内每一台机器上的同一个路径上,kubectl get nodes -o wide,查看所有的集群信息。
7.在每台机器上敲命令:
cd jar包和Dockerfile的路径
docker build -t test .
如果本机docker上没有java8镜像的话,会去镜像地址docker.io上pull,这个过程非常慢,需要手动修改镜像
vi /etc/docker/daemon.json
按i
输入{"registry-mirrors": ["你的镜像地址"]}
按esc(键盘最右上方)
输入:wq
这时候会在本地docker上 产生一个本地镜像,test,tag为latest
8.在master节点机器上编写一个yml文件,文件名随便,这里取pod,后缀是yml或yaml,文件中的-表示为数组。内容是
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: nmsl #pod名,自定义
spec:
replicas: 3 #一个镜像生成pod个数,可以用做负载均衡
template:
metadata:
labels:
app: test #pod标签,用于service识别不同的pod
spec:
containers:
- image: test:latest #容器使用的镜像,如果是本地镜像保证每台机器上都要有
name: test
#拉取策略,默认Aways远程拉取,Never只从本地拉取,IfNotPresent优先本地拉取,没有就远程
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080 #容器的端口
protocol: TCP
一定要注意使用本地镜像,那么集群内每台机器都要有这个镜像。
9.在master节点上敲命令
kubectl create -f pod.yml
生成3个pod,通过命令
kubectl get pod -o wide
查看具体的pod信息
k8s为每个pod生成一个虚拟ip用来内部访问,如果status不是running代表fail了,通过
kubectl describe pod nmsl
查看具体的日志,来解决问题。
如果需要删除,则敲命令
kubectl delete -f pod.yml
通过文件来删除pod
10.在master节点机器上编写一个yml文件,文件名随便,这里取service,后缀是yml或yaml,内容是
kind: Service #首字母一定要大写
apiVersion: v1
metadata:
name: test-service #服务名称,注意不要出现大写字母
spec:
#服务类型,默认是ClusterIp集群内部容器访问地址,会生成一个虚拟IP 与pod不在一个网段
#NodePort会在宿主机上映射一个端口,供外部应用访问模式,就是开放端口给外部访问服务
#LoadBalancer使用负载均衡,三者的功能是叠加的,如loadBalancer=clusterIp+NodePort+负载均衡
type: NodePort
selector:
app: test #对应pod.yml内的标签名
ports:
- protocol: TCP
nodePort: 31111 #集群开放的端口,端口号应该>=30000
port: 6666 #service内部之间互访的端口
targetPort: 8080 #docker容器本身开放的端口
11.在master节点上敲命令
kubectl apply -f service.yml
生成service,敲命令
kubectl describe svc test-service
查看指定service的状态,敲命令
kubectl get service -o wide
获取所有service的具体信息。
deployment(pod)和service都有自己的命名空间namespace,通过
kubectl get namespace
查看所有的命名空间,通过
kubectl get service --namespace=default
查看default内的service,通过
kubectl get deployment --namespace=default
查看default内pod,如果在创建service时未指定namespace,则默认是default命名空间内
metadata
name: pod或service名
namespace: 指定namespace
在pod.yml和service.yml文件通过以上的修改就可以指定命名空间 了,如把所有开放的服务放在一个命名空间里。
需要注意的是pod与对应的service应该放在一个命名空间内。
现在你可以通过浏览器来访问集群内test服务了
http://集群任意节点ip:31111/test/xxx
一个简单的架构图,方便理解