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檔案:

使用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
也能成功連接配接: