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了

posted @ 2022-01-25 20:58  童话述说我的结局  阅读(1286)  评论(0编辑  收藏  举报