宝剑锋从磨砺出,梅花香自苦寒来。这篇文章主要讲述Kubernetes——配置资源管理(secret)相关的知识,希望能为你提供帮助。
配置资源管理
secret
- secret是用来保存密码、token、密钥等敏感数据的 k8s资源,这类数据虽然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。
- Service Account : 由 Kubernetes 自动创建,用来访问APIServer 的 Secret,所有 Pod 会默认使用这个Secret 与 APTserver通信,并且会自动挂载到Pod 的/run/secrets / kubernetes.io/serviceaccount目录中;
- Opaque : base64编码格式的 secret,用来存储用户自定义的密码、密钥等,默认的 Secret类型;
- kubernetes.io/dockerconfigjson : 用来存储私有docker registry 的认证信息。
- 作为挂教到一个或多个容器上的卷中的文件。
- 作为容器的环境变量。
- 由kubelet在为Pod拉取镜像时使用。
创建secret创建secret资源
kubectl create secret generic/tls/docker registry --from-file=....陈述式管理操作
--from-file=目录会引用目录中所有的文件
--from-file=文件指定特地的文件
--from-file= 可以多次使用声明式管理操作 YAML可以通过模板获取yaml文件, --dry-run=client -oyaml
data:
key: value(需base64编码加密后的格式)
使用
volumes 定义类型为 secret
volumeMount挂载到容器的目录, key将以文件名的形式显示,值为文件内容容器变量
env 定义容器的环境变量名
然后使用valueFrom.secretKeyRef.name 指定secret资源的名称;valueFrom.secretKeyRef.key指定引用哪个secret资源key的值拉取镜像时使用
imagePullSecrets指定secret来作为连接私有仓库时的认证信息
kubeadm -->
harbor 证书认证 httpsconfigmap
kubectl create cm 名称 --from-file=目录/文件 ...
kubectl create cm 名称 --from-literal=key=value ...
describe , get -o yaml 查看 都是以明文的格式去显示key的值env : 需要另外定义环境变量名,通过指定资源名称和key来给这个变量赋值
envFrom : 不需要另外定义环境变量,直接拿configmap资源的key作为变量名,value作为变量值ui.properties-"color.good-purple
color.bad=yellow
allow.textmode=true
how.nice.to.look-fairlyNice"更新configmap资源的数据可以同步更新,通过volume挂载使用configmap的pod资源,大概10秒左右可以完成同步更新
如果是使用env或envFrom方式引用configmap,则不会同步更新pod资源secret 保存 密码,密钥,token之类的敏感数据,保存完之后get -oyaml或者describe查看是看不到实际内容的,base64格式configMap 保存 配置文件,环境变量,命令行参数之类的不需要加密的信息,查看时是以明文显示内容陈述式命令
kubectl create secret generic 名称 --from-file=目录/文件 ...
kubectl create configmap 名称 --from-file=目录/文件 ... --from-literal=key-value声明式命令
kubectl create --dry-run=client -o yaml >
xxx.yaml
kubectl get-o yaml >
xx.yaml使用
env envFrom
volume 挂载
K8S的总结K8S 组件 工作流程flannel 工作流程udpvxlanhost-gw
陈述式管理操作
kubectl run/create/delete/get/expose/scale/set/rollout ... 增删查
kubectl run/create/delete/get/expose/scale/set/rollout --help/- h
声明式管理操作
yaml/json kubectl create/apply/delete -f XX.yaml/json 增 删 改kubectl edit 在线修改
yaml配置文件 资源配置管理清单
kubectl explain 资源类型.第一层字段.第二层字段. ……
kubectl run/create 资源类型 [选项] --dry-run=client -o yaml >
XX.yaml
kubectl get 资源类型 名称 -o yaml >
XX.yaml
kubectl edit 资源类型 名称手工复制粘贴
Pod的两种类型
自主式Pod
被控制器管理的Pod(deployment,statefulset,daemonset,job,cronjob)
Pod中的三种容器基础容器(pasue容器): 给Pod中的所有容器提供网络和存储资源的共享;作为PID=1的进程,管理整个Pod里容器组的生命周期
初始化容器(init容器):多个init容器时是串行启动的,每个init容器都必须在下一个init容器启动前成功完成启动和退出
应用容器(main容器):在所有init容器成功启动和退出后应用容器才会启动。并行启动,提供应用程序业务
Pod容器镜像拉取的三种策略
- Always无标签或latest标签的默认
- Never
- IfNotPresent有指定标签的默认
- Always默认
- Never
- OnFailure
requests.cpu/memory创建pod容器时需要预留的资源量
limits.cpu/memorypod容器能够使用的资源量上限
Pod容器的三种探针livenessProbe(存活探针):
判断容器中的程序是否在正常运行,如果探测失败,kubelet就会杀掉容器(POD),容器(POD)再根据重启策略是否重启
readinessProbe(就绪探针):
1.判断这个pod是否能够进入ready状态并提供接收服务的请求
2.探测失败的话,就会进入no ready(0/1)状态,并从service的endpoints中剔除这个pod,service将不会再把请求发给这个pod
startupProbe(启动探针):
判断容器内的应用是否启动用的,在状态为success前,其他探针都会处于无效状态(不会启动)
探测的三种方式
exec:配合command或args字段在容器中执行Linux命令探测,如果命令的返回码为0,则认为探测成功
httpget:通过对指定的端口使用url路径发起一次httpget请求,如果返回的合同谈判状态码为2XX或3XX则认为探测成功
tcpsocket:通过使用对pod IP和指定的端口进行TCP连接(三次握手),如果对端口TCP连接成功,则认为探测成功
Pod容器的启动动作和退出动作
lifecycle.postStart当应用容器启动时,会执行的额外操作
lifecycle.preStop当应用容器退出时,会执行的操作
List-Watch机制controller manager,scheduler,kubelet 监听 apiserver 发出的事件,apiserver 会监听 etcd 发出的事件
Scheduler的预选策略和优选策略预选策略:过过滤掉不满足条件的节点
优选策略:对满足条件的节点进行打分,通过算法对所有的优先级项目和权重进行计算,权重越高优先级越高
Pod调度到指定节点的方法nodeName
nodeSelector
node节点亲和性硬策略 软策略
Pod亲和性硬策略 软策略 和指定pod在同一个拓扑域
Pod反亲和性 和指定pod不在同一个拓扑域
pod 标签 app=myapp01运行在 node01拓扑域的key是hostname, hostname=node01 , 指定pod的拓扑域节点标签就是hostname=node01
反亲和 就要求创建的Pod不能在有hostname=node01这个拓扑域的节点上运行
kubectl label 资源类型 资源名称key=value
污点 和 容忍node上设置 污点:拜金(无钱的免谈)node 没有 污点
pod 上设置 容忍:拜金
effect:NoSchedulePreferNoScheduleNoExecute
【Kubernetes——配置资源管理(secret)】kubectl taint node 节点名称 key=value:effect
如果你想把某个node节点设置成不可调度,并驱逐节点上运行的Pod
使用 kubectl taint ,在节点上设置污点key=value:NoExecute ,可以把不能容忍这个污点的pod驱逐出去
使用 kubectl cordon / drain 设置
Pod 启动阶段 5个状态pending
running
succeeded
failed
unknown
排障kubectl describe
kubectl logs
kubectl exec -it
kubectl get nodes
journalctl -xefu 服务进程名
kubectl cluster-info
nfs 其实并不是存储设备, 它只是一个远程共享存储服务
文件服务器的文件系统(LVM,raid)给共享出去
NAS 企业级专业存储设备+ nfs 给共享出去
k8s 存储卷volumeemptyDir可以实现 pod 中的容器之间共享数据,但是存储卷会随着 pod 生命周期结束而一起删除
hostPath可以持久存储,是使用Node节点的目录或文件挂载的,但是存储空间会受到单机限制,node节点故障数据会丢失,pod跨node不能共享数据
nfs可以持久存储,pod跨node可以共享数据
PVPVC先在存储 创建 pv(静态pv) ,然后在 pod 配置中定义 pvc 。在创建 pod 时就会根据pvc配置请求相对应的pv资源并挂载使用
StorageClass动态创建 pv的机制。 是用户动态创建pv供pod使用,相匹配pvc申请的资源。
SC存储类
静态绑定 pv配置 nfs 共享目录
创建 pv 资源 设置 存储大小 访问模式 存储卷类型(nfs)
创建 pvc 资源配置请求pv资源的大小和访问模式
创建 pod 资源存储卷类型设置成 persistentVolumeClaim , 在容器内挂载 存储卷
PVC 在绑定 PV 时访问模式必须支持匹配,否则会处于 pending 状态
请求的存储空间 会优先选择相等的 PV 资源。如果没有 会选择大于请求的存储空间 的PV 资源
回收策略为 Retain 时 ,删除绑定的 PVC 后,PV 会处于 Released 状态, 后续等待管理员手动处理存储的数据和删除PV资源
StorageClass动态创建 pv 的机制StorageClass + nfs
配置 nfs 共享目录
创建 sa 用户,进行 rbac 认证绑定配置
创建 nfs-client provisioner 存储卷插件(以 pod 形式运行的),并关联 sa 用户获取相关操作权限
创建 sc 资源关联 nfs 存储卷插件
创建 pvc 资源关联 sc 资源,此时会在 nfs 服务器上生成相关目录,目录名以 namespace-pvc名称-pv名称 格式命名
创建 pod 资源存储卷类型设置成 pvc 类型 , 在容器内挂载 存储卷
有状态应用与无状态应用httpd nginx 无状态应用
mysqles有状态应用
Deployment部署无状态应用ReplicaSet维护pod副本期望数量创建和删除时是并行创建,升级时是先创建一部分再删除一部分
StatefulSet部署有状态应用创建和删除时是有顺序的(串行的),
升级时是串行执行的,会先删除旧Pod再创建新Pod
,先从最大到最小序号开始更新,在下一批Pod更新前需等待上一批pod更新完毕(进入running和ready状态)才会更新
5 个副本 创建时 nginx-0nginx-1...nginx-4删除时 nginx-4nginx-3 ...nginx-0
DaemonSet在所有 node 节点上部署同一种类型pod
Job部署一次性任务的Pod.完成就立即退出不会重启重建
Cronjob周期性部署任务的Pod.完成就立即退出不会重启重建
strategy:
rollingUpdate:
maxSurge: 25%升级时会先启动的新pod数量不会超过控制器期望Pod数量的25%,也可以设置成一个绝对值
maxUnavailable: 25%升级时在新pod创建启动好后要销毁的旧pod数量不会超过控制器期望Pod数量的25%,也可以设置成一个绝对值
Service 类型clusterIP
NodePort
LoadBalancer
ExternalName:将 service 名称映射到 DNS 域名上,相当于 DNS 服务的 CNAME 记录
Headless Service解析 PodName 成 podIP 直达 pod 的效果, 也就是客户端可以通过 PodName 访问 pod
coreDNS在k8s集群中自动关联 service资源的名称 和 service clusterIP ,从而达到服务被集群自动发现的目的
要创建一个 StatefulSet 资源前提条件要有
Headless Service
静态PVStorageClass动态创建的PV
Headless Service使用 podname 解析 podip
解析的域名格式是 pod_name.service_name[.namespece_name.svc.cluster.local]
K8S的端口port
nodeport
targetport
containerport
K8S网络节点网络
Pod网络
service网络
secret 三种类型Opaque通用类型。默认的
kubernetes.io/service-account-token给serviceaccount资源用的
kubernetes.io/dockerconfigjson给登录harbor私有仓库用的
serviceaccount sa
是一种secret资源,通常会把sa理解成pod的一种具体某些权限的专属服务用户,用来与apiserver通信的
推荐阅读
- 并发编程框架Disruptor之高性能设计
- docker 安装cloudreve +离线下载
- 不会sql也能玩转的sql数据分析-上篇
- nginx服务器搭建
- CoProcessFunction实战三部曲之一(基本功能)
- Linux SRE 课程第一周作业
- [OpenCV实战]10 使用Hu矩进行形状匹配
- 日志中台不重不丢实现浅谈
- 漏洞发现(代码分析引擎 CodeQL)