Kubernetes中部署Nacos项目(八)

博客 分享
0 302
优雅殿下
优雅殿下 2022-01-25 21:54:32
悬赏:0 积分 收藏

Kubernetes中部署Nacos项目(八)

传统的nacos的部署很简单就是改配置文件然后在bin目录执行命令就可以启动单节点或集群,这个内容我在我阿里体系的文章中也有说明,感兴趣的可以自己去看,这个我就不做说明,下面我直接说在k8s中怎么玩

一、生成文件夹

mkdir nacos

进入文件夹

cd nacos

因为nacos主要就是起服务间通信用的,所以这块如果要验证nacos搭建的有没有用最好是准备两个项目注册到nacos中进行通信,所针对两个项目再创建两个文件 夹

mkdir demo1mkdir demo2

二、上传项目编写Dockerfile文件

进入第一个项目文件夹

cd demo1

上传对应项目到对应文件夹中,然后编写Dockerfile文件

vi Dockerfile
FROM openjdk:8-jre-alpineCOPY demo1-0.0.1-SNAPSHOT.jar /demo1.jarENTRYPOINT ["java","-jar","/demo1.jar"]

另一个项目操作一样

三、根据Dockerfile创建image

docker build -t demo1-image:v1.0 .docker build -t demo2-image:v1.0 .

四、将镜像推送到镜像仓库

登录阿里云镜像仓库

docker login --username=xxx@qq.com registry.cn-hangzhou.aliyuncs.com

打标签

docker tag demo1-image:v1.0 ghy/demo1-image:v1.0

上传

docker push ghy/demo1-image:v1.0

另一个项目操作一样

五、编写Kubernetes配置文件

vi demo1.yaml
# 以Deployment部署PodapiVersion: apps/v1kind: Deploymentmetadata:   name: userspec:   selector:     matchLabels:       app: demo1  replicas: 1  template:     metadata:      labels:         app: demo1    spec:       containers:       - name: demo1        image: ghy/demo1-image:v1.0        ports:         - containerPort: 8080---# 创建Pod的ServiceapiVersion: v1kind: Servicemetadata:   name: demo1spec:   ports:   - port: 80    protocol: TCP    targetPort: 8080  selector:     app: demo1---# 创建Ingress,定义访问规则,一定要记得提前创建好nginx ingress controllerapiVersion: extensions/v1beta1kind: Ingressmetadata:   name: demo1spec:   rules:   - host: k8s.demo.ghy    http:       paths:       - path: /        backend:           serviceName: demo1          servicePort: 80

启动脚本

kubectl apply -f demo1.yaml

另一个项目操作一样

 六、查看资源

这些都是老命令就不说了

kubectl get podskubectl get pods -o widekubectl get svckubectl get ingress

七、查看nacos的注册地址

会发现注册到nacos的ip地址全都是pod的ip地址;于是得出结论,默认情况下k8s中的服务会用pod的ip地址进行注册 ,由前面知识可知,这个集群在集群内的访问是没问题的;但如果一个服务在K8S中另一个服务不在K8S中,两个服务的通信是无法互通的;这时候怎么搞;

解决思路:

  • 可以将pod启动时所在的宿主机的ip写到容器中,也就是pod id和宿主机ip有一个对应关系
  • pod和宿主机使用host网络模式,也就是pod直接用宿主机的ip,但是如果服务高可用会有端口冲突问题(可以使用pod的调度策略,尽可能在高可用的情况下,不会将pod调度在同一个worker中)

八、脚本改良解决上述问题

演示一个host网络模式的方式,修改demo1.yaml文件;我的思路是我的每一个pod在启动时都去获取宿主机的ip地址,当进行服务注册时,把宿主机的ip地址交给nacos,并且将自己的端口和宿主机的端口对应,但是这种方式要自己写配置文件,或者是要自己写一个挂载,相对来说还是比较麻烦的;那么怎么省掉这个麻烦的过程呢,下面就用业界现在比较推荐的方式host网络模式进行改;这个方式其实很简单,他就是将里面的容器都共享宿主主机的ip地址,这么一搞里面的pod controlller就没有了自己的Ip了,完全是宿主主机的ip了,但这里还有一个问题,那就是端口问题,随着服务的启动数量越来越多,宿主主机的ip冲突问题就出来了,这时候就要用到调度策略了,例如冲突了就端口加1,一个一个试;

修改demo1.yaml文件

 

# 以Deployment部署PodapiVersion: apps/v1kind: Deploymentmetadata:   name: userspec:   selector:     matchLabels:       app: demo1  replicas: 1  template:     metadata:      labels:         app: demo1    spec: 
# 主要是加上这句话
hostNetwork:true containers:
- name: demo1 image: ghy/demo1-image:v1.0 ports: - containerPort: 8080---# 创建Pod的ServiceapiVersion: v1kind: Servicemetadata: name: demo1spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: demo1---# 创建Ingress,定义访问规则,一定要记得提前创建好nginx ingress controllerapiVersion: extensions/v1beta1kind: Ingressmetadata: name: demo1spec: rules: - host: k8s.demo.ghy http: paths: - path: / backend: serviceName: demo1 servicePort: 80

 就加这一句话就搞定了,后面用的ip就是宿主机的ip了

这短短的一生我们最终都会失去,不妨大胆一点,爱一个人,攀一座山,追一个梦
posted @ 2022-01-25 20:58 童话述说我的结局 阅读(11) 评论(0) 编辑 收藏 举报
回帖
    优雅殿下

    优雅殿下 (王者 段位)

    2018 积分 (2)粉丝 (47)源码

    小小码农,大大世界

     

    温馨提示

    亦奇源码

    最新会员