Kubernetes中部署Nacos项目(八)
传统的nacos的部署很简单就是改配置文件然后在bin目录执行命令就可以启动单节点或集群,这个内容我在我阿里体系的文章中也有说明,感兴趣的可以自己去看,这个我就不做说明,下面我直接说在k8s中怎么玩
一、生成文件夹
mkdir nacos
进入文件夹
cd nacos
因为nacos主要就是起服务间通信用的,所以这块如果要验证nacos搭建的有没有用最好是准备两个项目注册到nacos中进行通信,所针对两个项目再创建两个文件 夹
mkdir demo1
mkdir demo2
二、上传项目编写Dockerfile文件
进入第一个项目文件夹
cd demo1
上传对应项目到对应文件夹中,然后编写Dockerfile文件
vi Dockerfile
FROM openjdk:8-jre-alpine COPY demo1-0.0.1-SNAPSHOT.jar /demo1.jar ENTRYPOINT ["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部署Pod apiVersion: apps/v1 kind: Deployment metadata: name: user spec: 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的Service apiVersion: v1 kind: Service metadata: name: demo1 spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: demo1 --- # 创建Ingress,定义访问规则,一定要记得提前创建好nginx ingress controller apiVersion: extensions/v1beta1 kind: Ingress metadata: name: demo1 spec: rules: - host: k8s.demo.ghy http: paths: - path: / backend: serviceName: demo1 servicePort: 80
启动脚本
kubectl apply -f demo1.yaml
另一个项目操作一样
六、查看资源
这些都是老命令就不说了
kubectl get pods kubectl get pods -o wide kubectl get svc kubectl 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部署Pod apiVersion: apps/v1 kind: Deployment metadata: name: user spec: 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的Service apiVersion: v1 kind: Service metadata: name: demo1 spec: ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: demo1 --- # 创建Ingress,定义访问规则,一定要记得提前创建好nginx ingress controller apiVersion: extensions/v1beta1 kind: Ingress metadata: name: demo1 spec: rules: - host: k8s.demo.ghy http: paths: - path: / backend: serviceName: demo1 servicePort: 80
就加这一句话就搞定了,后面用的ip就是宿主机的ip了