傳統的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了