此实验可以了解到几个知识点
推荐先去搭建下Zookeeper分布式服务。更加方便此次实验
二进制部署Zookeeper分布式服务
一、简介StatefulSets特性
优点:
- 稳定的唯一网络标识符。
- 稳定,持久的存储。
- 有序,顺畅的部署和扩展。
- 有序的自动滚动更新。
局限性:
- 给定Pod的存储
必须由PersistentVolume Provisioner根据所请求的进行设置storage class
,或者由管理员预先设置。 - 删除和/或缩小
StatefulSet 不会删除与StatefulSet关联的卷
。这样做是为了确保数据安全
这通常比自动清除所有相关的StatefulSet资源有价值。 - StatefulSet当前
需要无头服务来负责Pod的网络身份
。您负责创建此服务 - 删除StatefulSet时,
StatefulSet不提供对Pod终止的任何保证
。为了实现StatefulSet中Pod的有序且正常的终止,可以在删除之前将StatefulSet缩小为0
。 - 当使用带有默认Pod管理策略的滚动更新时 ,有
可能进入需要人工干预才能修复的损坏状态
OrderedReady
主机 | IP | 提供服务 |
---|---|---|
k8s-masterr | 192.168.11.128 | NFS |
k8s-node1 | 192.168.11.129 | - |
k8s-node2 | 192.168.11.130 | - |
二、搭建NFS文件共享服务
1、搭建NFS服务
2、创建提供给有状态服务的卷
mkdir -p /nfs{1,2,3}
3、共享nfs1、2、3文件目录
cat <<EOF > /etc/exports
/nfs1 192.168.11.0/24(rw,no_root_squash,async)
/nfs2 192.168.11.0/24(rw,no_root_squash,async)
/nfs3 192.168.11.0/24(rw,no_root_squash,async)
EOF
4、重新加载nfs共享文件
exportfs -arv
三、创建PV存储卷
1、创建PersistentVolume卷(仅NFS和HostPath支持回收策略)
stspv.yaml
apiVersion: v1
kind: PersistentVolume #设置控制器为PV
metadata:
name: nfsv1 #定义pv名称
labels:
name: nfsv1
spec:
nfs: #定义存储类型为nfs
path: /nfs1 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
storageClassName: nfs #存储类名
persistentVolumeReclaimPolicy: Retain #卷的策略(保留)
accessModes: #访问模式
- ReadWriteOnce #该卷可以通过单个节点以读写方式安装
capacity: #容量
storage: 3Gi #存储大小
---
apiVersion: v1
kind: PersistentVolume #设置控制器为PV
metadata:
name: nfsv2 #定义pv名称
labels:
name: nfsv2
spec:
nfs: #定义存储类型为nfs
path: /nfs2 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
storageClassName: nfs #存储类名
persistentVolumeReclaimPolicy: Retain #卷的策略(保留)
accessModes: #访问模式
- ReadWriteOnce #该卷可以通过单个节点以读写方式安装
capacity: #容量
storage: 3Gi #存储大小
---
apiVersion: v1
kind: PersistentVolume #设置控制器为PV
metadata:
name: nfsv3 #定义pv名称
labels:
name: nfsv3
spec:
nfs: #定义存储类型为nfs
path: /nfs3 #nfs共享路径
server: 192.168.11.128 #nfs共享服务service
storageClassName: nfs #存储类名
persistentVolumeReclaimPolicy: Retain #卷的策略(保留)
accessModes: #访问模式
- ReadWriteOnce #该卷可以通过单个节点以读写方式安装
capacity: #容量
storage: 3Gi #存储大小
2、生成提供服务PV卷yaml文件并且查看
kubectl apply -f stspv.yaml && kubectl get pv
四、部署Zookeeper分布式服务
1、书写yaml配置文件
vim zookeeper.yaml
apiVersion: v1
kind: Service
metadata:
name: zk-hs
labels:
app: zk
spec:
ports:
- port: 2888
name: server
- port: 3888
name: leader-election
clusterIP: None
selector:
app: zk
---
apiVersion: v1
kind: Service
metadata:
name: zk-cs
labels:
app: zk
spec:
ports:
- port: 2181
name: client
selector:
app: zk
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:
name: zk-pdb
spec:
selector:
matchLabels:
app: zk
maxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: zk
spec:
selector:
matchLabels:
app: zk
serviceName: zk-hs
replicas: 3
updateStrategy:
type: RollingUpdate
podManagementPolicy: OrderedReady #OrderedReady顺序创建及逆序删除Pod,Parallel同时创建删除Pod(sfs.spec.podManagementPolicy)
template:
metadata:
labels:
app: zk
spec:
#terminationGracePeriodSeconds: 10
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: "app"
operator: In
values:
- zk
topologyKey: "kubernetes.io/hostname"
containers:
- name: kubernetes-zookeeper
imagePullPolicy: Always
image: "mirrorgooglecontainers/kubernetes-zookeeper:1.0-3.4.10"
resources:
requests:
memory: "1Gi"
cpu: "0.5"
ports:
- containerPort: 2181
name: client
- containerPort: 2888
name: server
- containerPort: 3888
name: leader-election
command:
- sh
- -c
- "start-zookeeper \
--servers=3 \
--data_dir=/var/lib/zookeeper/data \
--data_log_dir=/var/lib/zookeeper/data/log \
--conf_dir=/opt/zookeeper/conf \
--client_port=2181 \
--election_port=3888 \
--server_port=2888 \
--tick_time=2000 \
--init_limit=10 \
--sync_limit=5 \
--heap=512M \
--max_client_cnxns=60 \
--snap_retain_count=3 \
--purge_interval=12 \
--max_session_timeout=40000 \
--min_session_timeout=4000 \
--log_level=INFO"
readinessProbe:
exec:
command:
- sh
- -c
- "zookeeper-ready 2181"
initialDelaySeconds: 10
timeoutSeconds: 5
livenessProbe:
exec:
command:
- sh
- -c
- "zookeeper-ready 2181"
initialDelaySeconds: 10
timeoutSeconds: 5
volumeMounts:
- name: data
mountPath: /var/lib/zookeeper
securityContext: #限制不可信容器的行为,保护系统和其他容器不受其影响
runAsUser: 1000 #user ID
fsGroup: 1000 #volume FSGroup
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: "nfs"
resources:
requests:
storage: 1Gi
2、生成zk服务yaml文件并且查看服务调度(pod会调度到不同的节点
)
kubectl apply -f zookeeper.yaml && kubectl get pod -o wide -w
OK,查看详细信息日志
kubectl logs zk-0
3、修改共享文件的属主属组并且查看其中权限
chown -R 1000:1000 /nfs{1,2,3} && cd / && ls -al |grep nfs && cd -
4、再次查看服务(如果有3个node节点可跳过
)
kubectl get pod -o wide -w
查看zk-2 Pod的详细情况
kubectl describe po zk-2
3、去除k8s-master节点上的污
kubectl taint node k8s-master node-role.kubernetes.io/master:NoSchedule- && kubectl describe nodes k8s-master
再次查看服务是否全部允许
kubectl get pod -o wide
4、查看PV与PVC情况
kubectl get pv,pvc
五、查看zookeeper是否正常运行服务
1、查看Pod的Hostname(主机名采用的形式<statefulset name>-<ordinal index>
)
for i in 0 1 2; do kubectl exec zk-$i -- hostname; done
2、查看你每个Pod的myid值
for i in 0 1 2; do echo "主机zk-$i myid值";kubectl exec zk-$i -- cat /var/lib/zookeeper/data/myid; done
这里大家可以发现一个规律了吧有序,顺畅的部署和扩展
,里面的myid同时也是有序的。
3、检查服务是否真的运行同时分配到了对应的角色
for i in 0 1 2 ;do echo 当前输出是zk-$i的信息 ; kubectl exec -it zk-$i -- /opt/zookeeper/bin/zkServer.sh status;done
六、zookeeper配置对比文件分析(可跳过)
1、对比zookeeper中的zoo.cfg文件
二进制部署zookeeper:
kubernets部署zookeeper:
OK,对此我们进行展开说明
statefulset篇章有个网络格式说明,如下图
1、查看zk服务的Pod的域
for i in 0 1 2; do kubectl exec zk-$i -- hostname -f; done
可以看下就是kubernets部署zookeeper中zoo.cfg文件内容
2、查看本地解析的hosts文件
for i in 0 1 2 ;do echo 当前输出是zk-$i的本地解析信息:; kubectl exec -it zk-$i -- cat /etc/hosts|tail -n 1;echo -e " ";done
OK,可以看到hosts里面做了域名解析,IP会变化但是域名固定的。不管Pod删除,更新,重新生成只是IP变化域名不会有所变化,zookeeper配置文件只需要去解析本机的域名对应去IP即可。具体可查看生成的格式:<hostname>.<service>.<ns>.svc.<zone>
DNS的服务发现
七、测试数据是否可读写
1、 zk-0执行zkCli.sh脚本以写入数据
kubectl exec zk-0 zkCli.sh create /hello world
2、 zk-1执行zkCli.sh脚本以读取数据
kubectl exec zk-1 zkCli.sh get /hello
测试OK。可以正常读写
八、测试是否具有持久存储
1、删除zk StatefulSet服务
kubectl delete statefulset zk && kubectl get pods -w -l app=zk
2、重新生成zk有状态服务并且查看状态
kubectl apply -f zookeeper.yaml && kubectl get po -w
发现一个点了吗? 再次生成Pod是从zk-0开始创建最后才创建zk-2。可以回去看下第一次生成Pod是从后面倒序创建。
3、zk-2再次读取数据
kubectl exec zk-2 zkCli.sh get /hello
OK,测试确实具有可持久性。
后期的探针、容忍、维护可按官方文档进行操作。