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

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的原創文章,請關注公衆號"汪子熙":

相關文章
相關標籤/搜索