在上一篇(二)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访问集群外数据库出现超时连接的问题,其中涉及到数据库连接,虚机内核等各个情况。如果有疑问,欢迎留言区留言。
本文参考: