如何簡潔優雅地部署PostgreSQL和Pgweb?

RancherLabs發表於2020-08-25

本文轉自Rancher Labs

介紹PostgreSQL和Pgweb

PostgreSQL是一款以可靠性和效能為人所熟知的開源資料庫。它在很多行業和應用程式中都有應用,尤其是web開發人員的最愛。從node.js到Django再到Rails和Spring,所有主流web框架均原生支援PostgreSQL,所以其適應性在整個網際網路的網站後臺系統中是相當廣泛的。

與任何資料庫一樣,開發人員需要工具來使用它們。Pgweb是一個開源的、基於web的PostgreSQL客戶端。它有一個非常簡潔的介面,讓你可以連線到任何PostgreSQL例項來瀏覽資料表,執行查詢和匯出資料。對於輕量級的資料庫工作來說,它比pgAdmin等應用程式更加輕量級和方便。

在安全方面,向網際網路開放資料庫埠是一個糟糕的想法。需要快速訪問除錯執行在Kubernetes叢集上的生產資料庫的開發人員可以通過多種方式設定Pgweb來保證資料庫的安全,並保持其安全態勢。例如,將Pgweb部署到與資料庫相同的叢集中,並將其公開暴露,同時保持資料庫埠只能在網路內部訪問。將Pgweb放在Oauth2代理後面,以獲得額外的一層認證,然後就可以從任何地方超級簡單和超級安全地訪問資料庫了。

Pgweb可以在Linux、macOS或Windows上本地執行,但我們今天要探討的是將它部署到你的Kubernetes叢集中。在這篇文章中,我們將把Pgweb映象作為一個pod部署到我們的叢集中,使用Kubernetes服務暴露它,部署PostgreSQL並暴露它(但只在叢集內以獲得最大的安全性),然後連線到資料庫。最後,我們將通過Rancher作為工作負載重新部署一切,看看Rancher讓你的應用程式啟動和執行變得多麼容易。

前期準備

要完成本文的教程指南,你需要提前準備以下東西:

部署Pgweb

建立一個名為pgweb.yaml的新檔案,將以下內容貼上進去,然後應用該檔案來部署你的pod和服務。

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: pgweb
  name: pgweb
spec:
  containers:
    - image: sosedoff/pgweb
      name: pgweb
      ports:
        - containerPort: 8081
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: pgweb
  name: pgweb-svc
spec:
  ports:
    - port: 8081
      targetPort: 8081
      protocol: TCP
  type: NodePort
  selector:
    run: pgweb
kubectl apply -f pgweb.yaml
pod/pgweb created
service/pgweb-svc created

然後獲取服務資訊,找到正在使用的節點埠;在本文中,它是31338。你的可能會有所不同,但一般會在30000-32767範圍內。

kubectl get svc pgweb-svc
NAME            TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
pgweb-svc       NodePort   10.96.47.248   <none>        8081:31338/TCP   9s

現在在瀏覽器中進入一個該埠上的節點的公共IP。找到你的公關IP以及根據你的設定開啟必要的防火牆埠,如果一切順利,你將會看到Pgweb登入頁面。

如果你在訪問節點埠時遇到問題,埠轉發(port forwarding)在緊要關頭也能發揮作用。

現在我們需要一個資料庫來訪問。

使用示例資料部署PostgreSQL

與Pgweb類似,我們將使用一個YAML manifest在Kubernetes中部署PostgreSQL。這個稍微有些困難。我們將保留預設的ClusterIP服務型別,因為我們不希望從叢集外部訪問資料庫。否則,我們所有為了保障安全的設定都是白搭。

我們正在使用的映象是一個標準的PostgreSQL映象,但是已經預載了樣本國家的資料:

https://hub.docker.com/r/ghusta/postgres-world-db

複製以下內容到postgres.yaml中並應用該manifest:

apiVersion: v1
kind: Pod
metadata:
  labels:
    run: postgres
  name: postgres
spec:
  containers:
    - image: ghusta/postgres-world-db
      name: postgres
      ports:
        - containerPort: 5432
---
apiVersion: v1
kind: Service
metadata:
  labels:
    run: postgres
  name: postgres-svc
spec:
  ports:
    - port: 5432
      targetPort: 5432
      protocol: TCP
  selector:
    run: postgres
kubectl apply -f postgres.yaml
pod/postgres created
service/postgres-svc created

通過叢集DNS連線到資料庫

現在回到我們的Pgweb登入頁面,用以下資訊登入:

  • Host:postgres-svc.default.svc.cluster.local

  • 使用者名稱:world

  • 密碼:world123

  • 資料庫:world-db

  • SSL模式:Disable

現在你已經連線到資料庫,點選左側表格中的“city”:

請注意我們所使用的host名稱。這是Kubernetes的內部DNS在工作,允許你通過名字而不是pod IP連線到服務。第一部分是服務名稱,我們在postgres.yaml檔案中定義了它。第二部分是你的服務所部署的名稱空間——本例中為default。接下來,svc明確說明我們使用的是服務名稱(你也可以通過名稱指定pod)。最後,cluster.local是叢集的預設DNS名。這種架構可以輕鬆地將pod連線在一起,並利用服務如何優雅地處理副本和隔離離線的pod。

回到Pgweb,點選頂部的 "Query",嘗試查詢資料庫中的New Zealand。

SELECT * FROM city WHERE country_code like 'NZL'

或者查詢擁有超過80年曆史的城市:

SELECT * FROM country WHERE life_expectancy > 80

你可以花費盡可能多的時間來檢視資料,就好像你是一個開發人員正在為一個連線到這個資料庫的應用程式排除故障一樣。當你準備好繼續時,從你的叢集中刪除資源,以便進行下一步:

kubectl delete -f pgweb.yaml
kubectl delete -f postgres.yaml

使用Rancher重新部署

現在我們將重新部署相同的配置,不過這一次我們將使用Rancher來部署工作負載而不是Kubernetes manifest檔案。

  • 在【Global】檢視中,開啟你要部署工作負載的專案(如果你沒有建立其他專案,預設專案也可以)。

  • 我們可以匯入YAML檔案,但這一次我們試試全程使用GUI來構建我們的配置,點選【Deploy】

  • 將其命名為pgweb,並設定Docker映象為sosedoff/pgweb

  • 點選【Add Port】,將其命名為pgweb-svc並設定容器埠為8080

  • 點選【Launch】,Rancher將把你的Pod部署到叢集中

  • 現在對PostgreSQL pod重複以上步驟,起一個合適的名字並使用ghusta/postgres-world-db作為映象。容器埠為5432,並將服務型別更改為Cluster IP

  • 在該頁面上列出你的工作負載,你將看到分配給Pgweb叢集的節點埠,使用該埠訪問Pgweb登入頁面,並使用同一憑據登入。

  • 回到你的terminal,執行kubectl get podskubectl get svc以檢視Rancher部署的pod和服務。

結 論

在本文中,我們已經瞭解了Web開發人員的首選資料庫PostgreSQL和Pgweb客戶端。我們首先使用manifest檔案手動將其部署到我們的Kubernetes叢集,然後使用Rancher重新部署。兩相比較,我們可以看到Rancher能夠消除部署和編輯應用程式pods所涉及的一些開銷。希望你可以從部署這些資源中獲得經驗,在設定其他應用程式在多個 pod 之間進行通訊(如 WordPress 或自定義 Web 應用程式)的過程中利用這些經驗進一步實踐。

在你的叢集公共IP上訪問Pgweb和連線資料庫,這與通過Kubernetes manifest檔案部署兩者時的工作原理是一樣的。

相關文章