K8S学习笔记

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 调度。
posted @   李皇皓  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
点击右上角即可分享
微信分享提示