Kubernetes SatefulSet(有状态应用部署)
• 部署有状态应用
• 解决Pod独立生命周期,保持Pod启动顺序和唯一性
1. 稳定,唯一的网络标识符,持久存储
2. 有序,优雅的部署和扩展、删除和终止
3. 有序,滚动更新
应用场景:数据库
说明
常规的service
service:一组pod访问策略,提供负载均衡和服务发现
其他:service 会分配一个 CLUSTER-IP 虚拟IP 使整个容器进行通信。
headless service:无头服务
headless service:与service类似,不同点在于clusterIP为None
需要部署一个dns服务器
vim coredns.yaml
------------
*** 略
------------
案例
创建有状态应用
1、vim sts.yaml
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: nginx-statefulset namespace: default spec: # 指定使用的service serviceName: nginx replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
2、创建容器
kubectl create -f sts.yaml
3、查看创建容器以及service、通过dns名称,保证每个固定的身份(pod/nginx-statefulset-x)标识。
kubectl get pods,svc
NAME READY STATUS RESTARTS AGE # statefulset-x 为身份标识 pod/nginx-statefulset-0 1/1 Running 0 16s pod/nginx-statefulset-1 1/1 Running 0 13s pod/nginx-statefulset-2 1/1 Running 0 10s pod/sh-77649dbd59-ppfbx 1/1 Running 0 21m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 5d16h service/nginx ClusterIP None <none> 80/TCP 26s
4、临时启动程序测试解析,通过dns解析唯一标识的容器
kubectl run --image=busybox:1.28.4 -it sh
/ # nslookup nginx-statefulset-0 Server: 10.0.0.2 Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local nslookup: can't resolve 'nginx-statefulset-0'
如此可以比对出效果
StatefulSet与Deployment区别:有身份的!
身份三要素:
• 域名
• 主机名
• 存储(PVC)
ClusterIP A记录格式:<service-name>.<namespace-name>.svc.cluster.local
ClusterIP=None A记录格式:<statefulsetName-index>.<service-name>.svc.cluster.local
示例:web-0.nginx.default.svc.cluster.local