springcloud搭建实战<九>【kubernet+docker部署项目】

环境

masker 节点: vm1:192.168.160.100+centos7+docker 19.03.13+kubelet v1.16.0

node 节点:   vm2:192.168.160.130+centos7+docke 19.03.13+kubelet v1.16.0

node 节点:  vm3:192.168.160.140+centos7+docker 19.03.13+kubelet v1.16.0

已有springcloud 项目,详见前几篇文章,开发环境测试通过~

git地址 [email protected]:chenlu4ever/springcloud_demo.git

springcloud搭建实战<九>【kubernet+docker部署项目】_第1张图片


目录

环境

一、eureka注册中心部署步骤

1、application-stg.yml

2、pom.xml

3、打包上传服务器

4、生成镜像文件,并上传docker hub库

5、k8s部署文件 cloud_discovery.yaml

1)查看k8s的apiVersion

2)、创建cloud_discovery.yaml文件,内容如下:

3)、执行

3)、查看pod和service信息


大致操作如下:开发环境(win10)用idea打包,上传测试master服务器(centos7),用docker生成images ,并上传至docker hub 。

PS:具体一些细节可以参考之前的文章

springcloud搭建实战<七>【kubernet集群环境安装】

springcloud搭建实战<六>【Docker部署-远程镜像】

springcloud搭建实战<五>【Docker部署-本地镜像】

一、eureka注册中心单点部署

我以eureka注册中心项目:cloud_discovery, 部署单个节点 (实际为了注册中心高可用性,应当互相注册,部署多个节点,这个之后再优化)

1、application-stg.yml

spring:
  application:
    name: eureka-server #服务名称,自定义
  security:
    user:
      name:  user #配置BASIC认证登录的账号
      password: 123456 #配置BASIC认证登录的密码
server:
  port: 8080 #指定该Eureka实例的端口

eureka:
  server:
    renewal-percent-threshold: 0.49 #设置心跳正常的阀值,默认为1,测试时可以调低
  client:
    register-with-eureka: false #禁止注册自身 (集群配置才为true)
    fetch-registry: false #因为该服务没有注册到其他注册中心,所以关闭从注册中心拉取服务列表。 (集群配置才为true)
    #如果是服务注册中心集群,需要开启,开启就是去掉该配置,采用默认配置即可
    service-url:
      defaultZone: http://user:123456@localhost:8080/eureka/ #服务注册中心地址,http://账号:密码@主机名称:端口/Eureka/

2、pom.xml



    4.0.0
    
        com.cloud
        springcloud_demo
        1.0-SNAPSHOT
         
    
    com.cloud
    cloud_discovery
    0.0.1-SNAPSHOT
    cloud_discovery
    jar
    Demo project for Spring Boot

    
        UTF-8
        UTF-8
        1.8
        Hoxton.SR8
    

    
        
        
            org.springframework.boot
            spring-boot-starter-web
        
        
        
            org.springframework.cloud
            spring-cloud-starter-netflix-eureka-server
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
            
                
                    org.junit.vintage
                    junit-vintage-engine
                
            
        
    

    
        
            
                org.springframework.cloud
                spring-cloud-dependencies
                ${spring-cloud.version}
                pom
                import
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
            
                com.spotify
                dockerfile-maven-plugin
                1.4.13
                
                    ${project.artifactId}
                    
                        target/${project.build.finalName}.jar
                    
                
            
        
    


3、打包上传服务器

我直接用idea的maven插件打包,上传masker 节点: vm1:192.168.160.100

并在同级文件夹下创建Dockerfile文件

FROM java:8
ARG JAR_FILE
ADD cloud_discovery-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
EXPOSE 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

4、生成镜像文件,并上传docker hub库

# 生成image
docker build -t chenlu4ever/cloud_discovery-0.0.1-snapshot  .

#上传
docker push chenlu4ever/cloud_discovery-0.0.1-snapshot

 可以参考:springcloud搭建实战<六>【Docker部署-远程镜像】

5、k8s部署文件 cloud_discovery.yaml

1)查看k8s的apiVersion

kubectl api-versions

springcloud搭建实战<九>【kubernet+docker部署项目】_第2张图片

2)、创建cloud_discovery.yaml文件,内容如下:

---
apiVersion: apps/v1  #指定api版本标签
kind: Deployment  #定义资源的类型/角色,deployment为控制器
metadata:  #定义资源的元数据信息
  name: cloud-discovery-deployment  #定义资源的名称,在同一个namespace空间中必须是唯一的
  labels:  #定义资源标签
    app: cloud-discovery
spec:
  replicas: 1  #定义副本数量
  selector:   #定义选择器
    matchLabels:  #匹配上面的标签
      app: cloud-discovery
  template:
    metadata:
      labels:
        app: cloud-discovery
    spec:
      containers:  #定义容器信息
      - name: cloud-discovery  #容器名,与标签名要相同
        image: chenlu4ever/cloud_discovery-0.0.1-snapshot:latest  #容器使用的镜像以及版本
        ports:
        - containerPort: 8080  #定义容器的对外端口
---
apiVersion: v1
kind: Service
metadata:
  name: cloud-discovery-service
  labels:
   app: cloud-discovery
spec:
  type: NodePort
  selector:
    app: cloud-discovery
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 31071  #外部访问端口

4)、执行

kubectl create -f cloud_discovery.yaml 

PS:记录下,第一次我cloud_discovery.yaml文件中的项目名称出现了下划线,于是报了如下异常

springcloud搭建实战<九>【kubernet+docker部署项目】_第3张图片

5)、查看pod和service信息

kubectl get pods -o wide
kubectl get svc -o wide

看下服务是否正常启动

#查看pod日志
kubectl logs -f cloud-discovery-deployment-76b7c74744-nh6nq

注意:有两个IP端口,一个用于内部,一个用于外部。

K8S集群内部是使用clusterIp+port进行通讯,如上图所示,使用kubectl get svc命令查询到服务的cluster-ip:10.107.119.189,端口port:8080,

需要修改provider和consumer的application文件

外部访问:http://192.168.160.100:30191/

注意端口号,为service的端口

springcloud搭建实战<九>【kubernet+docker部署项目】_第4张图片

二、provider集群部署(指定)

我以eureka生成项目:cloud_provider, 部署指定2个节点 ,

1)、修改application注册中心,这里地址配置为eureka的k8s service地址

apllication.yml文件

server:
  port: 8090

spring:
  application:
    name: cloud-provider

eureka:
  client:
    service-url:
      defaultZone: http://10.107.119.189:8080/eureka/
  instance:
    prefer-ip-address: true

2)、用idea打包,并上传服务器,创建Dockerfile

FROM java:8
ARG JAR_FILE
ADD cloud_provider-0.0.1-SNAPSHOT.jar app.jar
# 运行jar包
RUN bash -c 'touch /app.jar'
EXPOSE 8090
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

3)、部署指定节点

我希望provider部署到指定节点 vm1 和 vm3上

注意:遇到一个巨坑,我的注册中心部署在vm2上,我把provider部署到 vm2 和 vm3上,按照下面步骤执行,最终发现,vm2上的provider报错,连接不上注册中心的IP。。。。

猜猜原因是同一个node上,好像是不能通过service访问的。将部署节点换过就好了。疑问未解决~只能遗留,后续看看能补充不!

采用nodeSelector标签配置。

1、查看当前集群标签

# 查看当前集群节点标签信息
kubectl get nodes --show-labels

2、给node添加标签

# 添加标签语法
kubectl label nodes  = 
# 修改标签语法: 需要加上--overwrite参数:
kubectl label nodes  = --overwrite
# 删除标签语法
kubectl label nodes  -

将vm2/vm3 添加type=provider标签

4)部署文件 cloud_provider.yaml

记得将部署nodeSelector配置上:nodeSelector

---
apiVersion: apps/v1  #指定api版本标签
kind: Deployment  #定义资源的类型/角色,deployment为控制器
metadata:  #定义资源的元数据信息
  name: cloud-provider-deployment  #定义资源的名称,在同一个namespace空间中必须是唯一的
  labels:  #定义资源标签
    app: cloud-provider
spec:
  replicas: 2  #定义副本数量
  selector:   #定义选择器
    matchLabels:  #匹配上面的标签
      app: cloud-provider
  template:
    metadata:
      labels:
        app: cloud-provider
    spec:
      containers:  #定义容器信息
      - name: cloud-provider  #容器名,与标签名要相同
        image: chenlu4ever/cloud_provider-0.0.1-snapshot:latest  #容器使用的镜像以及版本
        ports:
        - containerPort: 8090  #定义容器的对外端口
      nodeSelector:  
        type: provider   #调度到拥有 label 为 type=provider 的节点
---
apiVersion: v1
kind: Service
metadata:
  name: cloud-provider-service
  labels:
   app: cloud-provider
spec:
  type: NodePort
  selector:
    app: cloud-provider
  ports:
  - port: 8090
    targetPort: 8090
    nodePort: 31072  #外部访问端口

PS:部署多个节点,镜像地址写的是本地镜像,所以要在其他节点上pull镜像。

5)执行yaml

kubectl create -f cloud_provider.yaml

springcloud搭建实战<九>【kubernet+docker部署项目】_第5张图片

6) 访问

查看注册中心:http://192.168.160.100:31071/

springcloud搭建实战<九>【kubernet+docker部署项目】_第6张图片

访问provider接口:http://192.168.160.100:31072/sayHi

三、customer集群部署

customer部署三台机子

部署步骤一样,customer配置文件apllication需要和provider一样改下。

修改下yaml文件

---
apiVersion: apps/v1  #指定api版本标签
kind: Deployment  #定义资源的类型/角色,deployment为控制器
metadata:  #定义资源的元数据信息
  name: cloud-consumer-deployment  #定义资源的名称,在同一个namespace空间中必须是唯一的
  labels:  #定义资源标签
    app: cloud-consumer
spec:
  replicas: 3  #定义副本数量
  selector:   #定义选择器
    matchLabels:  #匹配上面的标签
      app: cloud-consumer
  template:
    metadata:
      labels:
        app: cloud-consumer
    spec:
      containers:  #定义容器信息
      - name: cloud-consumer  #容器名,与标签名要相同
        image: chenlu4ever/cloud_provider-0.0.1-snapshot:latest  #容器使用的镜像以及版本
        ports:
        - containerPort: 8091  #定义容器的对外端口
---
apiVersion: v1
kind: Service
metadata:
  name: cloud-consumer-service
  labels:
   app: cloud-consumer
spec:
  type: NodePort
  selector:
    app: cloud-consumer
  ports:
  - port: 8091
    targetPort: 8091
    nodePort: 31073  #外部访问端口

最终pod和service如下

springcloud搭建实战<九>【kubernet+docker部署项目】_第7张图片

四、笔记

1、yaml文件service配置

参考:k8s之Services:创建nodeport clusterip services

service主要有三种类型:一种叫clusterIP,一种叫nodePort,一种叫外部的LoadBalancer

  •  ClusterIP: 仅仅使用一个集群内部的IP地址 - 这是默认值。选择这个值意味着你只想这个服务在集群内部才可以被访问到。
  • l  NodePort: 在集群内部IP的基础上,在集群的每一个节点的端口上开放这个服务。你可以在任意:NodePort地址上访问到这个服务。
  • l  LoadBalancer: 在使用一个集群内部IP地址和在NodePort上开放一个服务之外,向云提供商申请一个负载均衡器,会让流量转发到这个在每个节点上以:NodePort的形式开放的服务上。

2、CrashLoopBackOff

参考:https://www.jianshu.com/p/bcc05427990d

全网最详细的 K8s Service 不能访问排查流程

3、

springcloud搭建实战<九>【kubernet+docker部署项目】_第8张图片

你可能感兴趣的:(#,SpringCloud,#,kubernetes,实战,kubernetes,spring,cloud,docker)