Kubernetes中部署Nacos項目(八)
- 2022 年 1 月 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了