加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 服务器 > 系统 > 正文

Kubernetes 有状态应用基础概念Nginx部署

发布时间:2021-11-06 02:09:31 所属栏目:系统 来源:互联网
导读:无状态与有状态 Deployment控制器设计原则:管理的所有Pod一模一样,提供同一个服务,也不考虑在哪台Node运行,可随意扩容和缩容。这种应用称为无状态,例如Web服务 但是,在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之
无状态与有状态
Deployment控制器设计原则:管理的所有Pod一模一样,提供同一个服务,也不考虑在哪台Node运行,可随意扩容和缩容。这种应用称为“无状态”,例如Web服务
 
但是,在实际的场景中,并不能满足所有应用,尤其是分布式应用,会部署多个实例,这些实例之间往往有依赖关系,例如主从关系、主备关系,这种应用称为“有状态”,例如MySQL主从、Etcd集群、redis-cluster 等等
 
2、StatefulSet 控制器概述
StatefulSet控制器用于部署有状态应用,满足一些有状态应用的需求:
 
Pod有序的部署、扩容、删除和停止
 Pod分配一个稳定的且唯一的网络标识
 Pod分配一个独享的存储
3、StatefulSet 控制器:网络标识
稳定的网络标识:
 
使用无头服务 Headless Service(相比普通Service只是将spec.clusterIP定义为None,也就是没有clusterIP,使用endport 来通信)来维护Pod网络身份,会为每个Pod分配一个数字编号并且按照编号顺序部署。还需要在StatefulSet添加serviceName: “nginx”字段指定StatefulSet控制器要使用这个Headless Service。
 
稳定主要体现在主机名和Pod A记录:
 
主机名:<statefulset名称>-<编号>
Pod DNS A记录:<statefulset名称-编号>.<service-name> .<namespace>.svc.cluster.local (POD 之间通过DNS A 记录通信)
例如: web-0.web.default.svc.cluster.local
 
备注:
 
A记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录
CNAME记录: 如果将域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务商提供的一个域名
MX记录: 建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录
NS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录
TXT记录: 可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录
AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录
案例:
 
通过创建一个 nginx 应用的statefluset 控制器
 
创建 Headless Service ,定义 clusterIP: None (表示K8S 不会在给这个service 去颁发一个clusterIP 了;相比 deployment 控制器 的每个POD 都是相同的,而 statefuset 控制器的每个POD 都是有状态的
 
需要单独去访问 )
 
[root@master-1 statefulset]# vim service.yaml  
apiVersion: v1
kind: Service
metadata:
  name: web
spec:
  clusterIP: None
  ports:
  - protocol: TCP
    port: 80
  selector:
    app: nginx
 
[root@master-1 statefulset]# kubectl apply -f service.yaml  
 
[root@master-1 statefulset]# kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
web          ClusterIP   None         <none>        80/TCP    8m18s
 
#创建statefulset,指定serviceName
 
[root@master-1 statefulset]# cat statefulset.yaml  
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "web"
  replicas: 3  
  selector:
    matchLabels:
      app: nginx  
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx  
        ports:
        - containerPort: 80
          name: web
           
 
[root@master-1 statefulset]# kubectl apply -f statefulset.yaml
statefulset.apps/web created
 
 
#发现pod名称 带有序号
[root@master-1 statefulset]# kubectl get pods
NAME    READY   STATUS    RESTARTS   AGE
web-0   1/1     Running   0          16s
web-1   1/1     Running   0          13s
web-2   1/1     Running   0          6s
 
 
 
 
#查了POD的主机名
主机名 默认与 POD 名一致,即使POD 飘逸到其他node 上 或者删除后重建  主机名 都是和POD  名一致。有个稳定的主机名
 
 
 
可以看到解析出3条记录出来,解析出对应的三个Pod IP记录,其他Pod可使用这个名称访问
 
 
模拟测试删除这些 pod ,升级镜像版本,发现pod ip虽然发生变化,但是 主机名,Pod DNS A记录 不会发生变化
/ # nslookup web
Server:    10.0.0.2
Address 1: 10.0.0.2 kube-dns.kube-system.svc.cluster.local
 
Name:      web
Address 1: 10.244.2.116 web-2.web.default.svc.cluster.local
Address 2: 10.244.2.115 web-0.web.default.svc.cluster.local
Address 3: 10.244.1.66  web-1.web.default.svc.cluster.local
这个就验证了 statefulset 的 Pod是 有序的部署、扩容、删除和停止 且 给每一个POD 分配一个稳定的且唯一的网络标识
 
4、StatefulSet 控制器:独享存储
独享存储:StatefulSet的存储卷使用VolumeClaimTemplate创建,称为卷申请模板,当StatefulSet使用VolumeClaimTemplate创建一个PersistentVolume时,
 
同样也会为每个Pod分配并创建一个编号的PVC,每个PVC绑定对应的PV,从而保证每个Pod都拥有独立的存储。
 
在创建StatefulSet 控制器 独享存储前,需要先定义好存储卷,使用pv 作为持久化存储卷,后端存储为NFS
 
这里采用动态PV 的方式(NFS server 搭建的过程省略)
 
一、部署NFS服务器
#服务器安装nfs服务,提供nfs存储功能
1、安装nfs-utils
yum install nfs-utils (centos)
或者  apt-get install nfs-kernel-server (ubuntu)
 
2、启动服务
systemctl enable nfs-server
systemctl start nfs-server
 
3、创建共享目录完成共享配置
mkdir /home/nfs   #创建共享目录
 
4、编辑共享配置
vim /etc/exports                                            
#语法格式:    共享文件路径     客户机地址(权限)     #这里的客户机地址可以是IP,网段,域名,也可以是任意*
/home/nfs  *(rw,async,no_root_squash)
服务自检命令  
exportfs -arv
 
 
5、重启服务
systemctl restart nfs-server
 
 
6、本机查看nfs 共享目录
#showmount -e 服务器IP地址 (如果提示命令不存在,则需要yum install showmount)
 
showmount -e 127.0.0.1
/home/nfs/nginx *
 
 
 
7、客户端模拟挂载[所有k8s的节点都需要安装客户端]
[root@master-1 ~]# yum install nfs-utils (centos)
或者  apt-get install nfs-common (ubuntu)
[root@master-1 ~]# mkdir /test
[root@master-1 ~]# mount -t nfs 172.16.201.209:/home/nfs /test
 
#取消挂载
[root@master-1 ~]# umount /test
二、配置PV 动态供给(NFS StorageClass),创建pvc
#部署NFS实现自动创建PV插件: 一共设计到4个yaml 文件 ,官方的文档有详细的说明
 

 
#直接访问pod IP 测试内容:

删除statefulset
 
删除statefulset 有两张方法,级联删除 和 非级联删除
 
使用非级联删除 statefulset 时,statefulset 的POD 不会被删除
使用级联删除时,statefulset 和 pod 都会被删除
(1)、非级联删除
 
使用kubectl  delete statefulset XXXX 删除 statefulset ,只需要提供 --cascade=false 参数,就会采用非联机删除,此时删除statefulset 不会删除pod
 
kubectl delete statefulset web --cascade=false
 
 
(2)、级联删除
省略 --cascade=false 参数 即可
 
kubectl delete statefulset web  

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读