Kubernetes中部署Nacos專案(八)

童話述說我的結局 發表於 2022-01-25
Kubernetes

傳統的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 [email protected] 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了