Stateful Set是Kubernetes 1.9版本新引入的一個概念,用於管理有狀態的應用。sql
Kubernetes官方文檔:docker
https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/bootstrap
Manages the deployment and scaling of a set of Pods, and provides guarantees about the ordering and uniqueness of these Pods.api
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.bash
StatefulSet由如下幾個部分組成:服務器
1. 用於定義網絡標誌(DNS domain)的Headless Service網絡
2. 用於建立PersistentVolumes的volumeClaimTemplatesapp
3. 定義具體應用的StatefulSetless
下面我給出了一個實際應用中的StatefulSet的yaml文件:dom
--- 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正在啓動,而且名稱知足命名規範<stateful set name >-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的原創文章,請關注公衆號"汪子熙":