把springboot项目弄到K8S集群上,并开放端口供外部访问

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

 

 

一个简单的架构图,方便理解

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(k8s)