k8s架构以及核心组件介绍:
Master
- API Server (接口中心) j接口服务,基于rest风格开放的k8s接口服务
- kube Controller Manager:管理各个类型的控制器,针对k8s中的各种资源进行管理
- node controller节点控制器:负责在节点出现故障时进行通知和响应
- job controller 任务控制器:监测代表一次性任务的job对象,然后创建pods来运行这些任务直至完成
- EndpointSlice Controller 端点分片控制器:填充端点分片对象(以提供service 和pod之间的连接)
- ServiceAccount Controller 服务账号控制器:为新的命名空间创建默认的服务账号
- cloud Controller Mannager :云控制器管理器,第三方云平台提供的控制器api对接管理功能
- kube Scheduler 调度器 负责将pod基于一定算法将其调用到更合适的节点node上
- ETCD:kv分布式数据库,提供了基于raft算法实现自主的集群高可用
Node:
- Kubelet:负责pod的生命周期、存储、网络
- Kube-Proxy:网络代理 负责service的服务发现以及负载均衡(基于iptables实现)
- Container Runtime:基于docker|continerd|CRI-O的容器运行时环境。(以docker为例,每个节点需要安装docker)
附加组件:
kube-dns:负责为整个集群提供DNS服务 (服务名:ip)
igress controller:为服务提供外网接口
Prometheus:监控
Dashboard UI:图形界面操作
核心概念:
POD:
无状态服务:(如 nginx,不会存储数据到磁盘)
- ReplicationController(RC 新版本废弃):针对某一单一的pod动态更新pod副本数,扩容缩容
- ReplicaSet(RS):动态更新pod副本数,扩容缩容,可以通过selector来选择对哪些label的pod生效,可以指定单个或者一组pod,比RC更加灵活
- Deployment :针对RS的更高层次的封装,提供了更丰富的部署相关功能(自动创建RS/pod,滚动升级/回滚,平滑扩容和缩容,暂停与恢复deployment)
有状态服务:(如 mysql redis 会存储数据到磁盘)
- StatefulSet:稳定持久化存储,稳定的网络标志,有序部署,有序扩展,有序收缩,有序删除(例如,主从顺序)
守护进程:
- DeamonSet:保证在每个node上面都运行一个容器副本,常用来,日志收集logstash,系统监控:Prometheus,系统程序:proxy,dns等
任务/定时任务
- Job
- CronJob
service : pod与pod之间暴露端口的网络通讯
ingress :将k8s内部服务暴露给外网访问的服务
volume:数据卷,共享pod中容器使用的数据,用来持久化数据,比如数据库数据
CSI:容器标准化接口,暴露容器内存储的接口标准,volume 插件实现这套接口
configmap:暴露容器内配置,外部修改,自动更新部署
downwardapi:共享pod信息给里面的容器访问
k8s调用流程:
1.用户通过 kubectl(命令行工具)/Dashboard(可视化界面) 来与Master(api server)通讯进行操作,例如部署新应用
2.Master(api server) 接收到请求,并将其存储到Etcd
3.Master(Watcher和controllers)通过检测到etcd资源变化,进行操作
4.Master(ReplicaSet watcher/controller)检测到新的app,创建新的pod达到期望的实例个数
5.Master(Scheduler)将新的pod分配到Node(Kubelet)
6.Node(Kubelet)检测到pods,通过容器运行时部署它们,回传信息给Master(api server)
7.Node(Kubeproxy) 管理pod网络,服务发现 负载均衡
k8s部署(kubeadmin):
(操作系统centos7,docker 20+,k8s 1.23.6)
1.初始操作(所有节点):三台机器为例 192.168.0.(111 - 113)
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 关闭selinux
sed -i 's/enforcing/disabled/' '/etc/selinux/config' #永久
setenforce 0 #临时
- 关闭swap
swapoff -a # 临时
sed -ri 's/.*swap.*/#&/' /etc/fstab # 永久
- 设置主机名
hostnamectl set-hostname k8s-master|k8s-node1|k8s-node2
- 添加host给每台机器
/etc/hosts
192.168.0.111 k8s-master
192.168.0.112 k8s-node1
192.168.0.113 k8s-node2
- 时间同步
yum install ntpdate -y
ntpdate time.windows.com
2.安装基础软件(所有节点):
- 安装docker
添加源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 添加阿里云源
cat <<EOF > kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enable=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
mv kubernetes.repo /etc/yum.repos.d/
- 安装kubeadmin kubelet kubectl
yum install -y kubelet-1.23.6 kubeadmin-1.23.6 kubectl-1.23.6 docker-ce-20.10.0 docker-ce-cli-20.10.0
systemctl enable kubelet # 设置开机启动
systemctl enable docker
systemctl start kubelet
systemctl start docker
- 修改docker配置 使用systemd作为cgroupdriver
cat <<EOF > daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"registry-mirrors":["https://ud6340vz.mirror.aliyuncs.com"]
}
EOF
mv daemon.json /etc/docker/
systemctl daemon-reload
systemctl restart docker
注:初始化时可能需要tc
yum install -y tc即可
3.初始化master节点(master上执行):
kubeadmin init --image-repository=registry.aliyuncs.com/google_containers
注:初始化完成后会有一个加入命令,可以保存起来。kubeadmin token create --print-join-command #忘记加入命令时可以重新获取
初始化完成后执行下面三个命令:
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
为让其他节点也能使用kubectl工具:
scp /etc/kubernetes/admin.conf root@node1|node2:/etc/kubernetes/admin.conf
然后分别在node1 node2 上也执行下面三个命令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
4.加入node1 node2 到集群
kubeadmin join master:6443 --token xxx --discovery-token-ca-cert-hasg xxx
5.安装网络插件(部署好kubectl 都可以执行):
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yaml
kubectl get nodes #查看节点状态
注:
flannel是coreos开源的针对k8s的网络服务,其目的是解决k8s集群中各主机pod之间的通信问题,借助etcd维护网络ip地址分配,并为每个node节点分配一个不同的ip地址段
在每个节点创建文件/run/flannel/subnet.env写入以下内容,等一会儿即可
FLANNEL_NETWORK=10.244.0.0/16 #flannel 全局网段
FLANNEL_SUBNET=10.244.0.1/24 #本节点子网
FLANNEL_MTU=1450 #容器接口mtu值
FLANNEL_IPMASQ=true #地址映射
以上部署完成。
k8s命令
参考官方文档:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
POD:
资源清单 - 部分
apiVersion: v1 # api文档版本
kind:Pod # 资源对象类型 pod deployment statefulset 一类对象
metadata:#pod相关元数据,描述pod数据
name: nginx-demo #pod名称
labels:# 标签
type: app
version: 1.0.0
namespace: 'default' # 命名空间的配置
spec:#期望pod按照这里面的描述进行创建
terminationGracePeriodSeconds:30 #当pod被删除时,给这个pod宽限多长时间
containers: 对于pod中容器描述
- name: nginx #容器名称
image: nginx:1.7.9 #容器的镜像
imagePullPolicy: IfNotPresent # 镜像拉取策略 Always:每次尝试拉取镜像 Never:只用本地镜像 IfNotPresent:本地有就用,没有就拉取
command: # 指定容器启动命令,因为数组可以指定多个,不指定则使用镜像打包时使用的启动命令
- nginx
- -g
- 'daemon off;' # nginx -g 'daemon off;'
args: #指定容器启动命令参数,数组可以指定多个
workingDir: /usr/share/nginx/html #定义容器启动后的工作目录,进入容器停到的目录
ports: #指定容器需要用的端口列表
- name: http # 端口名称
containerPort: 80 #容器内要暴露什么端口
protocol: TCP # 描述端口基于那种协议
env: # 环境变量
- name: JVM_OPTS
value: '-Xm sdsa'
resources: # 资源配置
requests: 最少需要多少资源
cpu:100m
memory:128m
limits:最多需要多少资源
cpu: 200m
memory:128m
restartPolicy:Onfailure # 重启测率 Always Onfailure Never
lifecycle:# 生命周期配置
postStart:#生命周期启动阶段做的事情
exec:
command:
- sh
- -c
preStop: #生命周期结束前做的事情
exec:
command:
starupProde:#启动探针,启动后执行下列两个探针任务
livebusnessProde:#存活探针,某一条件判定不存活按照一定规则重启
readinessProde:#就绪探针,某一条件判断成功就绪 做一些事情
- kubectl create -f xxx.yaml
- kubectl delete po xxx
- kubectl describe po nginx #查看具体信息
Deployment
适用无状态应用部署
创建:
- kubctl create deploy nginx-deploy --image=nginx:1.7.9 # 命令行创建deploy
- kubctl get deloyments #查看信息
- kubctl get replicaset # pod < rs < deploy
- kubctl get deploy nginx-deploy -o yaml #查看系统自动生成yaml 可以参考其写法
apiVersion: apps/v1 #deployment api 版本
kind:Deployment #资源类型
metadata: #元信息描述
labels: # 标签
app:nginx-deploy #具体的标签key:value
name:nginx-deploy #deploy 名字
namespace:default #所在命名空间
spec:
replicas: 1 # 期望副本数 可以修改此值更新副本
revisionHistoryLimit:10 # 滚动更新后 默认保留的历史版本数
selector:# 选择器 用于找到匹配的RS
matchLabels:#按照标签匹配
app:nginx-deploy # 匹配的标签
strategy:# 更新策略
rollingUpdate:#滚动更新配置
maxSurge: 25% # 进行滚动更新时 更新的个数最多可以超过期望副本数的个数/比例
maxUnavailable: 25% # 进行滚动更新时 更大不可用比例,表示再所有副本数中 最大可以有多少个不更新成功
type:RollingUpdate # 更新类型 采用滚动更新
template:# pod 模板
metadata: # pod 元信息
labels:
app:nginx-deploy
spec: # pod 期望信息
containers:
- image:nginx:1.7.9
imagePullPolicy:IfNotPresent
name:nginx
rstartPolicy:Always
terminationGracePeriodSeconds: 30
滚动更新:
只有修改了deployment配置文件中的template中的属性后,才会触发更新操作
- kubectl edit deploy nginx-deploy # 修改template中的值,保存后describe 查看滚动更新效果
- kubectl set image deployment/nginx-deploy nginx=nginx:1.7.9 #也可更新属性
回滚:
- kubectl rollout history deployment/nginx-deploy # 查看revision的列表
- kubectl rollout history deployment/nginx-deploy --revision=2 #可以查看具体版本信息
- kebectl rollout undo deployment/nginx-deploy --to-revision=2 #回退指定版本
如果spec.revisionHistoryLimit设置为0 则不允许deploy回退了
扩容缩容:
- kubectl edit deploy nginx-deploy #直接编辑:修改replicas:3
- kubectl scale --replicas 3 deploy nginx-deploy #命令行修改
暂停恢复:
由于每次对template信息发生修改后,都会出发更新,实际上只需要执行最后一次修改即可,这种情况可以使用暂停
- kubectl rollout pause deployment nginx-deploy # 暂停滚动更新,直到下次恢复后才会继续滚动更新
- kubectl rollout resume deploy nginx-deploy # 恢复滚动更新
删除:
- kubectl delete deploy nginx-deploy #级联删除,关联pod也一并删除
StatefulSet
适用有状态服务部署
创建:
web.yaml
---
apiVersion: v1
kind: Service
metadata:
name:nginx
labels:
app:nginx
spec:
ports:
- port:80
name: web
clusterIP:None
selector:
app:nginx
---
apiVersion:apps/v1
kind:StatefulSet # 类型
metadata:
name:web # 名字
spec:
serviceName:"nginx" # 使用哪个service 来管理redis
replicas:2
selector:
matchLabels:
app:nginx
template:
metadata:
labels:
app:nginx
spec:
containers:
- name: nginx
image:nginx:1.7.9
ports:# 容器内部要暴露的端口
- containerPort: 80 #具体暴露的端口号
name: web #端口配置的名字
volumeMounts: #加载数据卷
- name: www # 指定加载哪个数据卷
mountPath:/usr/share/nginx/html # 加载到容器种的哪个目录
updateStrategy:
rollingUpdate:
partition:0# 假设有5个pod,那么此时更新只会更新那些索引id >= 3的pod,实现灰度发布 逐步更新
type:RollingUpdate
volumeClaimTemplates: # 数据卷模板
- metadata: # 数据卷描述
name:www # 数据卷名称
annotations: # 数据卷注解
volume.alpha.kubernetes.io/storage-class: anything
spec: # 数据卷的规约
accessModes:["ReadWriteOnce"] # 访问模式
resources:
requests:
storage:1Gi# 需要1个G的存储资源
-kubectl create -f web.yaml
-kubectl get sts(statefulset 缩写)
-kubectl get svc(service 缩写)
-kubectl get pvc # 查询持久卷信息
-kubectl replace sts web -f web.yaml # 替换yaml
-kubectl run -it --image busybox dns-test --restart=Never --rm /bin/sh #运行一个名为dns-test的busybox容器,使用后删除
ping web-0.nginx
扩容缩容:
有序操作,保证顺序扩容缩容
-kubectl scale statefulset web --replicas=5 #扩容缩容
-kubectl patch statefulset web -p '{"spec":{"replicas":3}}' # 缩容
滚动更新:
statefulset 也可以采用滚动更新策略,同时修改pod template属性后触发,但是由于statefulset下的pod是有序的,更新时会按照顺序滚动更新
灰度发布:(金丝雀发布,目标:将项目上线后产生的影响降到最低,只更新一小部分,逐步放开更新全部,利用template中updateStrategy的partition控制)
OnDelete:修改template中updateStrategy的type为OnDelete 即使修改了模板也不会更新了,只有delete pod web-x 删除时才会更新
删除:
- kubectl delete statefulset web #级联删除,关联pod也一并删除
- kubectl delete statefulset web --cascade=false # 非级联删除,删除sts时不会删除pods
DaemonSet
为每一个匹配的node部署一个守护进程(监控,数据清理,日志收集等等服务,只要打了匹配标签的机器,会自动部署上去)匹配方式如下:
nodeSelector:只调度到匹配指定label的node上
fluentd.yaml:
apiVersion:apps/v1
kind:DaemonSet # 创建daemonset资源
metadata:
name:fluentd
spec:
selector:
matchLabels:
app:logging
template:
metadata:
labels:
app:logging
id:fluentd
name:fluentd
spec:
nodeSelector:# 节点选择器
type:microservices
containers:
- name:fluentd-es
image:agilestacks/fluentd-elasticsearch:v1.3.0
env: # 环境变量配置
- name:FLUENTD_ARGS
value: -qq
volumeMounts: # 加载数据卷 避免数据丢失
- name: containers # 数据卷名字
mountPath: /var/lib/docker/containers # 将数据卷挂载到容器内哪个目录
- name: varlog
mountPath:/var/log
volumes:# 定义数据卷类型
- hostPath: # 数据卷类型,主机路径模式,与node共享目录
path:/var/lib/docker/containers # node 中的共享目录
name: containers # 定义的数据卷的名称
- hostPath:
path:/var/log
name: varlog
- kubectl label node k8s-node1 type=microservices # 给node加一个标签
- kubectl create -f fluentd.yaml
- kubectl get daemonset(ds)
nodeAffinity:功能更丰富的node选择器,比如支持集合操作
podAffinity:调度到满足条件的pod所在的node上
HPA:(Horizontal Pod Autoscaler)
Pod 自动扩容,根据cpu使用率或者自定义指标(metrics)自动对pod进行扩容缩容
- 控制器管理每隔30s(可以通过-horizontal-pod-autoscaler-sync-period修改)查询metrics的资源使用情况
- 支持三种metrics类型
预定义metrics (pod cpu利用率方式计算)
自定义,以原始值(raw value)方式计算
自定义object metrics
- 支持两种metrics查询方式:Heapster 和自定义rest api
- 支持多metrics
cpu 内存指标监控:
前提必须配置resources.requests.cpu|memory才可以
新增配置:
resources: # 资源配置
requests: 最少需要多少资源
cpu:100m
memory:128m
limits:最多需要多少资源
cpu: 200m
memory:128m
- kubectl replace -f nginx-deploy.yaml #替换yaml
- kubectl autoscale deploy nginx-deploy --cpu-percent=20 --min=2 --max=5#创建hpa
- kubectl get hpa # 查看信息
服务发现(Service)内部
nginx-svc.yaml
apiVersion:v1
kind: Service # 资源类型为 Service
metadata:
name:nginx-svc
labels:
app:nginx
spec:
selector: # 匹配那些pod会被service代理
app:nginx-deploy # 所有匹配这些标签的pod都可以通过该service进行访问
ports:# 端口映射
- port:80 # service 自己的端口,在使用内网ip访问时使用
targetPort: 80 # 目标pod端口
nodePort: 32000 # 固定绑定所有node的32000端口上
name:web # 端口名称
type:NodePort #随机启动一个端口(30000-32767),映射到ports中的端口,该端口是直接绑定在node上的,且集群中的每一个node都会绑定这个端口;也可以用于将服务暴露给外部访问,但是这种生产环境不推荐,效率较低,四层负载(网络层代理)
# ClusterIP 集群内部访问
# ExternalName 别名映射
# LoadBalancer 绑定第三方负载均衡器上
- kubectl create -f nginx-svc.yaml # 创建service
- kubectl get svc
- kubectl exec -it dns-test --sh curl http://nginx-svc # 随便进行一个容器测试访问service名字为nginx-svc的服务
代理k8s外部服务:
编写service文件时,不指定selector,自己创建endpoint:
nginx-svc-ext.yaml
apiVersion:v1
kind: Service # 资源类型为 Service
metadata:
name:nginx-svc-ext
labels:
app:nginx
spec:
ports:# 端口映射
- port:80 # service 自己的端口,在使用内网ip访问时使用
targetPort: 80 # 目标pod端口
name:web # 端口名称
type:ClusterIP
nginx-ep-ext.yaml
apiVersion:v1
kind: EndPoints # 资源类型为 EndPoints
metadata:
labels:
app:nginx-svc # 与service一致
name: nginx-svc-ext # 与service一致
namespace:default # 与service一致
subsets:
- address:
- ip: <任一网站ip地址>
ports: # 与service一致
- name:web
port: 80
protocol:TCP
- kubectl create -f nginx-svc-ext.yaml # 创建service
- kubectl create -f nginx-ep-ext.yaml # EndPoints
curl http://nginx-svc-ext
流程 k8s内部访问service 然后到endpoint 再到目标网站或者接口
反向代理外部域名服务:
apiVersion:v1
kind:Service
metadata:
labels:
app:xxxx.com-domain
name:xxxx.com-domain
spec:
type:ExternalName
externalName:xxxx.cn
curl http://xxxx.com-domain
服务发现(ingress)外部
用户访问ingress -> service -> pod
安装ingress-nginx
- 安装helm包管理器(具体操作查看官网)
下载解压设置环境变量
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx #添加仓库
- helm pull ingress-nginx #xf解压出来
- 修改values.yaml
仓库国内仓库:registry.cn-hangzhou.aliyuncs.com
image:google_containers/nginx-ingress-controller
webhook镜像 image:google_containers/kube-webhook-certgen
kind:DaemonSet nodeSelector 新增
ingress:"true"
dnsPolicy:ClusterFirstWithHostNet
hostNetWork:"true"
type:ClusterIP
- kubectl create namespace ingress-nginx
- kubectl label node k8s-master ingress=true
- helm install ingress-nginx -n ingress-nginx .
ingress.yaml
apiVersion:networking.k8s.io/v1
kind:Ingress
metadata:
name: ingress-test
annotations:
kubernetes.io/ingress.class:"nginx"
spec:
rules:
- host: xxxxx.com # 域名配置
http:
path:
- pathType:Prefix#按照路径类型进行匹配 ImplementationSpecific:需要指定ingressclass,具体匹配规则以ingressclass中的规则为准;Exact:精确匹配,URL需要与path完全匹配区分大小写;Prefix:以/作为分隔符,进行前缀匹配
backend:
service:
name:nginx-svc # 代理到哪个service
port:
number:80 # service 端口名称
path:/api # 等价于nginx中的location 路径匹配
配置管理
ConfigMap:
kubectl create configmap -h #查看示例
kubectl create cm test-config --from-file=./test/
加密数据配置Secret:加密配置
kubectl create secret test-config --from-file=./test/
SubPath:避免覆盖
配置热更新:edit | replace
kubectl edit cm test-config
kubectl create cm test-config --from-file=./test/ --dry-on -o yaml | kubectl replace -f
不可变的Secret和configmap
增加配置 immutable:true禁止修改
持久化存储
volumes:
- HostPath: 将节点上的摁键或目录挂载到pod上,此时目录变成持久化存储目录,即使pod删除重启,也可以重新加载到目录。该目录下的文件不会丢失
apiVersion: v1
kind:Pod
metadata:
name:test-volume
spec:
containers:
image:nginx
name:nginx-volume
volumeMounts:
mountPath:/test-pd # 挂载到容器的哪个目录
name:/test-volume # 挂载下面定义的数据卷名字
volumes:# 定义数据卷
name:test-volume # 名字
hostPath: # 路径与主机共享,本节点服务器上的路径
path:/data
type:Directory# 空字符串:默认类型,不做任何检查;DirectoryOrCreate:如果给定的path不存在创建一个755的空目录;Directory:这个目录必须存在;FileOrCreate:给定文件不存创建一个655文件;File:文件必须存在;Socket:UNXI套接字,必须存在;CharDevice:字符设备,必须存在;BlockDevice:块设备,必须存在
- EmptyDir:一个pod中不同的container共享数据使用的,因为在pod使用,因此与其他volume区别,当pod被删除,这个emptyDir也会被删除
NFS挂载:nfs能将nfs(网络文件系统)挂载到你的pod中。不想emptydir那样会在删除pod同时删除,nfs内容会在删除pod时保存,卷也只是被卸载,意味着nfs可以预先填充数据,可以在pod之间共享.
apiVersion:v1
kind:Pod
metadata:
name:nfs-test-pd1
spec:
containers:
- image:nginx
name:test-container
volumeMounts:
- mountPath:/user/share/nginx/html
name:test-volume
volumes:
- name: test-volume
nfs:
server:xxx.xxx.xxx.xxx # 网络存储服务地址
path:/home/nfs/rw/www # 网络存储路径
readOnly:false
PV&PVC:
pv:统一存储规范,至于存到什么设备自己设定,pvc:持节卷申领,替pod向pv申领资源。
pv.yaml
apiVersion:v1
kind:PersistentVolume # 描述资源对象为pv类型
metadata:
name:pv0001
spec:
capacity: # 容量
storage:5Gi # pv的容量
volumeMode:Filesystem #存储类型为文件系统
accessModes:# 访问模式 ReadWriteOnce ReadWriteMany ReadOnlyMany ReadOnlyOnce
- ReadWriteOnce # 可被节点单独写
persistentVolumeReclaimpolicy: Retain # 回收策略 Retain(保留) Delete(删除) Recycle(回收)
storageClassName:slow #创建pv的存储类名,需要与pvc相同
mountOptions:
- hard
- nfsvers=4.1
nfs:#连接到nfs
path:/data/nfs/rw/test-pv # 网络存储路径
server:xxx.xxx.xxx.xxx # 网络存储服务地址
pvc.yaml
apiVersion:v1
kind:PersistentVolumeClaim
metadata:
name:nfs-pvc
spec:
accessModes:
- ReadWriteOnce # 权限类型要与pv相同
volumeMode:Filesystem
resources:
requests:
storage:5Gi #资源可以小于等于pv,大于则匹配不到pv
storageClassName:slow # 名字要与对应pv相同
selector: # 也可以通过select选择器匹配
pod.yaml
...
spec:
containers:
...
volumeMounts:
- mountPath:/test-pd
name:test-volume
volumes:
- name:test-volume
PersistentVolumeClaim: # 关联到哪个pvc
claimName:nfs-pvc # 关联到pvc的名字
StorageClass:
每个sc都又一个制备器provisioner,用来决定使用哪个卷插件制备pv,自动创建pv
nfs-storage-class.yaml
apiVersion:storage.k8s.io/v1
kind:StorageClass
metadata:
name:managed-nfs-storage
provisioner:fuseim.pri/ifs #外部制备器提供者,编写为提供者的名称
parameters:
archiveOnDelete:"false" # 是否存档,false 不存档,会删除oldpath下面的数据。true表示存档,会重命名路径
reclaimPolicy: Retain # 回收策略 默认Delete
volumeBindingMode:Immediate # 默认为Immediate,表示创建pvc立即进行绑定
---
kind:Service
嵌套service配置
---
kind:statefulset
...
spec:
template:
...
spec:
containers:
- image: nginx
volumeMounts:
- mountPath:/usr/share/nginx/html
name:nginx-sc-test-pvc
VolumeClaimTemplates:
- metadata:
name:nginx-sc-test-pvc
spec:
storageClassName:managed-nfs-storage
accessNodes:
- ReadWriteMany
rouserces:
requests:
storage: 1Gi
高级调度
CronJob 计划任务:
与linux crontab相同,注意:cronjob执行时间时controller manager的时间
apiVersion:batch/v1
kind:CronJob
metadata:
name:hello
spec:
concurrencyPolicy:Allow # 并发调度策略:Allow 允许并发调度,Forbid 不允许并发执行,Replace 如果之前的任务没执行完,就直接执行新的,放弃上一个任务
failedJobsHistoryLimit:1 # 保留多少个失败的任务
successfulJobsHistoryLimit:3 # 保留多少个成功的任务
suspend: false # 是否挂起任务 true 则该任务不会执行
startingDeadlineSeconds:30 # 间隔多少时间检测失败的任务并重新执行不能小于10
schedule:"* * * * *" # 调度策略
jobTemplate:
spec:
template:
spec:
containers:
- name:hello
image:busybox:1.28
imagePullPolicy:IfNotPresent
command:
- /bin/sh
- -c
- date;echo hello from the k8s clusterIP
restartPolicy:OnFailure
Init Container:
相对于生命周期钩子函数postStart,在真正启动容器前,先启动init c,在初始化容器中完成真实容器初始化操作,完成后启动真实的容器
在pod创建的模板template中配置initContainers参数:
spec:
initContainers:
- image: nginx
imagePullPolicy:IfNotPresent
commond: ["sh", "-c", "echo 'inited' >> /.init"]
name:init-test
污点和容忍:配置污点的node不会生成pod,配置了容忍的pod会部署上去。
NoSchedule:如果不能容忍,那么pod无法调度这个节点上
NoExecute:不能执行,已经执行的会删除
亲和力(Affinity):
依据条件筛选更有条件匹配的pod node 调度。