一、资源简介
1.1 Pod
- pod是k8s中的最小单元。
- 一个pod中可以运行一个容器,也可以运行多个容器。
- 运行多个容器,这些容器是一起被调度的。
- pod的生命周期是短暂的,不会自愈,是用完就销毁的实体。
- 所以一般使用Controller来创建和管理pod。
1.2 Pod控制器
- Replication Controller:简称rc,第一代pod副本控制器。
- rc对于标签选择只支持"="和"!="。
- ReplicaSet:简称rs,第二代pod副本控制集。
- rs和rc的区别是,对标签不仅支持"="和"!=",还支持"in"、"notin"。
- Deployment:简称deploy,第三代pod控制器,除了有rs的功能之外,还有更多高级的功能,例如:滚动升级、回滚等。
1.3 Service
- service解耦了服务和应用。
- 常用service有两种:集群内部的service,通过selector指定pod,自动创建endpoints;集群外部的service,手动创建endpoints,指定外部服务的ip,端口和协议。
- kube-proxy监听这k8s-apiserver,一旦service资源发生变化(调k8s-api修改srevice信息),kube-proxy就会生成对应的负载调度的调整,保证service的最新状态。
1.4 Volume
- 数据和镜像解耦,容器间的数据共享。
- k8s抽象出来的一个对象,用来保存数据,做存储用。
- emptyDir:本地临时卷,当pod被分配给节点时,首先创建emptyDir卷,并且只要该pod在该节点上运行,卷就会存在;正如卷的名字所述,它最初是空的;pod中的容器可以读取和写入emptyDir卷中的相同文件,尽管该卷可以挂载到容器中的相同或不同路径上;无论pod由于任何原因从节点删除时,emptyDir中的数据会被永久删除。
- hostPath:本地卷,将主机节点的文件系统中的文件或目录挂载到集群中,pod删除的时候,卷不会被删除。
- nfs:共享卷,允许将现有的nfs(网络文件系统)共享挂载到您的容器中。不像emptyDir,当删除pod时,nfs卷的内容被保留,卷仅仅是被卸载;这意味着nfs卷可以预填充数据,并且可以在pod之间“切换”数据;nfs可以被多个写入者同时挂载。
- configMap:配置文件,配置信息和镜像解耦,将配置信息放到configMap对象中,然后在pod的对象中导入configmap对象,实现导入配置的操作。
1.5 PV/PVC
- PersistentVolume:实现pod和storage的解耦,这样修改storage的时候不需要修改pod,也可以实现存储胡和应用权限的隔离;PV是由管理员设置的存储,是集群中的一部分;就想节点是集群中的资源一样,PV也是集群中的资源。PV是Volume之类的卷插件,但是有独立于使用PV的pod的生命周期;此API对象包含存储实现的细节,即NFS,ISCSI或特定于云供应商的存储系统。
- PersistentVolumeClaim:PVC是用户存储的请求。它与pod相似;pod消耗节点资源,PVC消耗PV资源;pod可以请求特定级别的资源(CPU和内存),声明可以请求特定的大小和访问模式。
1.6 StatefulSet
- 为了解决有状态服务的问题,它管理的pod拥有固定的pod名称,主机名,启停顺序。
1.7 DaemonSet
- 在当前集群中每个节点运行同一个pod,当有新的节点加入集群时也会为新的节点配置相同的pod,当节点从集群中移除时,其pod也会被kubernetes回收,但是删除DaemonSet将删除其创建的所有pod。
二、NodePort和SVC
2.1 SVC
- pod控制器只能通过pod的ip去访问,如果pod重建,ip会变换,所以可以用svc的方式,svc会分配一个内部的ClusterIP,也可以通过svc的域名访问,前提是域名能够被解析。
2.2 NodePort
- svc默认模式是ClusterIP模式,只能在集群内的pod中访问,如果想要从集群外部访问,需要创建nodeport模式,可以指定端口,不指定端口,会随机分配一个端口,该端口集群内所有节点上都会监听,包括master节点。
- 集群外部访问时,会先访问节点上的nodeport端口(主机上的端口),然后nodeport端口转发给svc的端口,svc的端口转发给容器的target端口。
三、NFS
3.1 安装nfs
环境:CentOS系统
- 在服务端安装nfs-server
yum install -y nfs-server
- 在node端安装nfs-utils
yum install -y nfs-utils
- 编辑服务端/etc/exports文件,设置共享目录
# 注:*和()之间不能有空格,设置读写权限
DIR *(rw,no_root_squash)
- node端使用命令查看分享的目录
showmount -e SERVER_IP
- 编写yaml文件
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: ng-deploy-80
template:
metadata:
labels:
app: ng-deploy-80
spec:
containers:
- name: ng-deploy-80
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: /usr/share/nginx/html/mysite
name: my-nfs-volume
volumes:
- name: my-nfs-volume
nfs:
server: SERVER_IP # 替换为nfs server端ip
path: DIR # 替换为nfs server端共享目录
四、探针
4.1 探针三种处理方式
- ExecAction:在容器内执行指定命令,如果命令退出时返回码为0则认为诊断成功。
- TCPSocketAction:对指定端口上的容器的ip地址进行TCP检查,如果端口打开,则认为诊断成功。
- HTTPGetAction:对指定的端口与和路径上的ip地址执行HTTPGet请求,如果响应码的状态大于等于200且小于400,则认为诊断成功。
4.2 LivenessProbe
- livenessProbe:存活探针
- 检测容器是否正在运行,如果存活探测失败,则kubelet会杀死容器,并且容器将会受到其重启策略的影响,如果容器不提供存活探针,则默认状态为success,用于控制是否重启pod。
4.3 ReadinessProbe
- readinessProbe:就绪探针
- 如果就绪探测失败,端点控制器将从与pod匹配的所有service的端点中删除该pod的ip地址,初始延迟之前就绪探针默认为Failure(失败),如果容器不提供就绪探针,则默认状态为success,用于控制pod是否添加至service。