在上一篇(二)Zuul网关的集群搭建与配置 中,我们将网关搭建完毕。有了服务发现及注册,以及网关,一个基本的框架就算搭建完成,接下来就是不同的工程服务,通过容器部署在k8s集群中,注册在Eureka和Zuul网关上就行。

 一.搭建工程服务

首先我们需要搭建好自己的console微服务工程,具体的搭建我这就不具体细说,这里并不需要对我们本身的微服务进行特殊的修改及配置,所有的配置均可以在k8s配置文件中进行灵活的注入修改。

 二. 配置K8s文件

1. 控制器的选择

与Zuul网关相同的,本文将采用最常见的deployment的方式进行部署。

Deployment 是最常用的用于部署无状态服务的方式。Deployment 控制器使得您能够以声明的方式更新 Pod(容器组)和 ReplicaSet(副本集)。例如,以滚动更新为例,假设有 3 个容器组,现需要将他们的容器镜像更新为新的版本。

声明的方式,您只需要执行: 

  • 使用 kubectl 更新 Deployment 定义中 spec.template.spec.containers[ ].image 字段

这边暂不详述滚动更新操作,后续会进行扩展,感兴趣的也可以自己去了解查询。

2. 配置文件详解

(一)console.yaml文件配置

# ------------------- Console ------------------- #
---
apiVersion: v1
kind: Service
metadata:
    labels:
      app: console
    name: console
    namespace: box
spec:
    type: ClusterIP
    ports:
    - port: 8888 #服务端口
      protocol: TCP
      targetPort: 8888 
    selector:
      app: console
---
apiVersion: apps/v1
kind: Deployment
metadata:
    name: console-deployment
    namespace: box
spec:
    selector:
        matchLabels:
         app: console
    replicas: 3
    template:
        metadata:
            labels:
                app: console
        spec:
          containers:
            - name: console
              image: harbor.box.com/box/console
              imagePullPolicy: Always
              ports:
              - containerPort: 8888
              env:
              - name: eureka.client.service-url.defaultZone
                value:
                   "http://eureka-0.eureka.box.svc.cluster.local:8761/eureka,http://eureka-1.eureka.box.svc.cluster.local:8761/eureka,http://eureka-2.eureka.box.svc.cluster.local:8761/eureka"
              volumeMounts:
              - mountPath: /apps/logs/box
                name: box-logs
          volumes:
            - name: box-logs
              hostPath:
                path: /apps/logs/box
          hostAliases:
            - ip: "10.xxx.xxx.xx"
              hostnames:
              - "db.box"
            - ip: "10.xxx.xxx.xxx"
              hostnames:
              - "ga.com"

 采用了deployment的部署方式,同时通过env对容器的环境变量进行配置,这里可以根据自己工程中需要的配置进行添加修改。

这里有采用hostAliases对pod的host进行配置,这样的话方便使用域名进行访问。

当 DNS 配置以及其它选项不合理的时候,通过向 Pod 的 /etc/hosts 文件中添加条目,可以在 Pod 级别覆盖对主机名的解析。在 1.7 版本,用户可以通过 PodSpec 的 HostAliases 字段来添加这些自定义的条目。

建议通过使用 HostAliases 来进行修改,因为该文件由 Kubelet 管理,并且可以在 Pod 创建/重启过程中被重写。

由于本文中部署的环境中,仅需要api-gateway对外暴露服务,其余都是在集群内部访问,因此console工程并不需要对外暴露端口,外部服务通过网关服务进入集群内部,通过服务发现及注册Eureka来找到服务即可。

三. K8s服务运行

在部署了K8s集群的机器上,进行部署操作。环境需具备docker和harbor仓库,其次每个节点对harbor的都可以访问到,否则会导致镜像拉取失败。

1.将jar包上传并打包成镜像并上传至仓库。

docker build -t="harbor.box.com/box/console" .
 
docker push harbor.box.com/box/console

2.启动k8s配置文件


 kubectl apply -f console.yaml

3. 查看pod是否启动:

kubectl get po -n box -o wide

 如果配置文件没有问题的话,那么如下图所示,可以看到工程都已经正常启动 -n 后面的参数可以改成box也就是上文中配置的namespace,这边的截图为我本地项目中跑的namespace名字

4. 查看service 可以看到分配的ip及映射的端口

kubectl get svc -n box -o wide

四. 实现效果

打开eureka界面可以看到工程服务都已经注册上去 同时使用curl接口访问本地ip+映射的端口+服务接口,可以看到成功返回。

五. 总结

到这里 我们就搭建好一个基于k8s集群+docker的SpringCloud组件工程服务集群,下一节我将分享一个现网中遇到的问题,在k8s中pod访问集群外数据库出现超时连接的问题,其中涉及到数据库连接,虚机内核等各个情况如果有疑问,欢迎留言区留言。

本文参考:

http://dockone.io/article/4884

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐