1. 程式人生 > >Kubernetes stateful set講解以及一個基於postgreSQL的具體例子

Kubernetes stateful set講解以及一個基於postgreSQL的具體例子

Stateful Set是Kubernetes 1.9版本新引入的一個概念,用於管理有狀態的應用。

Kubernetes官方文件:

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

Manages the deployment and scaling of a set of Pods, and provides guarantees about the ordering and uniqueness of these Pods.

Like a Deployment, a StatefulSet manages Pods that are based on an identical container spec. Unlike a Deployment, a StatefulSet maintains a sticky identity for each of their Pods. These pods are created from the same spec, but are not interchangeable: each has a persistent identifier that it maintains across any rescheduling.

StatefulSet由以下幾個部分組成:

1. 用於定義網路標誌(DNS domain)的Headless Service

2. 用於建立PersistentVolumes的volumeClaimTemplates

3. 定義具體應用的StatefulSet

下面我給出了一個實際應用中的StatefulSet的yaml檔案:

---

apiVersion: apps/v1

kind: StatefulSet

metadata:

name: ads-db-statefulset

labels:

component: ads

module: db

spec
: serviceName: ads-db-service replicas: 1 selector: matchLabels: component: ads module: db template: metadata: labels: component: ads module: db spec: volumes: - name: init secret: secretName: ads-db-secret items: - key: initdb.sql path: initdb.sql containers: - name: ads-db-pod image
: postgres:9.6 ports: - containerPort: 5432 name: ads-db-port volumeMounts: - name: ads-db-volume mountPath: /var/lib/postgresql/data/ - name: init mountPath: /docker-entrypoint-initdb.d/ env: - name: PGDATA valueFrom: configMapKeyRef: name: ads-db-configmap key: pgdata_value - name: POSTGRES_PASSWORD valueFrom: secretKeyRef: name: ads-db-secret key: postgres_password_value volumeClaimTemplates: - metadata: name: ads-db-volume labels: component: ads module: db spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi

使用kubectl get statefulset檢視生成的statefulset:

生成的headless service:

生成的pod:

當我把statefulset yaml檔案裡的replicas從1改成3之後,果然觀察到有兩個新的pod正在啟動,並且名稱滿足命名規範-X。

使用kubectl describe檢視建立的statefulset明細:

statefulSet自動建立的persistentVolumeClaim:

The files belonging to this database system will be owned by user “postgres”.

This user must also own the server process.

The database cluster will be initialized with locale “en_US.utf8”.

The default database encoding has accordingly been set to “UTF8”.

The default text search configuration will be set to “english”.

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data/pgdata … ok

creating subdirectories … ok

selecting default max_connections … 100

selecting default shared_buffers … 128MB

selecting dynamic shared memory implementation … posix

creating configuration files … ok

running bootstrap script … ok

performing post-bootstrap initialization … ok

syncing data to disk … ok

Success. You can now start the database server using:

pg_ctl -D /var/lib/postgresql/data/pgdata -l logfile start

使用下面的命令登入到statefulset提供的postgreSQL伺服器上:

1. kubectl run tester -it --rm --image=postgres:9.6 --env=“PGCONNECT_TIMEOUT=5” --command – bash

看到root$之後,說明我們已經連線上pod了。

使用如下命令列連線postgreSQL伺服器:

psql -h ads-db-statefulset-0.ads-db-service -p 5432 -U adsuser -W ads

當然如果不用命令列,也可以使用pgadmin,以圖形化介面連線statefulSet裡的postgreSQL伺服器:

sudo apt install pgadmin3

進行埠轉發,這樣我們可以使用localhost:5432進行連線:

kubectl port-forward ads-db-statefulset-0 5432:5432

也能成功連線:

要獲取更多Jerry的原創文章,請關注公眾號"汪子熙":