Kubernetes——配置资源管理(secret)

Posted 封玖FJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernetes——配置资源管理(secret)相关的知识,希望对你有一定的参考价值。

配置资源管理

secret

  • secret是用来保存密码、token、密钥等敏感数据的 k8s资源,这类数据虽然也可以存放在Pod或者镜像中,但是放在Secret中是为了更方便的控制如何使用数据,并减少暴露的风险。

secret三种类型

  1. Service Account : 由 Kubernetes 自动创建,用来访问APIServer 的 Secret,所有 Pod 会默认使用这个Secret 与 APTserver通信,并且会自动挂载到Pod 的/run/secrets / kubernetes.io/serviceaccount目录中;
  2. Opaque : base64编码格式的 secret,用来存储用户自定义的密码、密钥等,默认的 Secret类型;
  3. kubernetes.io/dockerconfigjson : 用来存储私有docker registry 的认证信息。

pod需要引用才能用某个secret,pod有三种方式来用secret:

  • 作为挂教到一个或多个容器上的卷中的文件。
  • 作为容器的环境变量。
  • 由kubelet在为Pod拉取镜像时使用。

应用场景:凭据

https:// kubernetes.io/docs/concepts/configuration/secret/

创建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 证书认证 https

configmap
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 工作流程 udp vxlan host-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 有指定标签的默认

Pod容器三种重启策略

  • Always 默认
  • Never
  • OnFailure
Pod容器的资源限制
requests.cpu/memory     创建pod容器时需要预留的资源量
limits.cpu/memory       pod容器能够使用的资源量上限
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: NoSchedule PreferNoSchedule NoExecute

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 存储卷 volume

emptyDir 可以实现 pod 中的容器之间共享数据,但是存储卷会随着 pod 生命周期结束而一起删除

hostPath 可以持久存储,是使用Node节点的目录或文件挂载的,但是存储空间会受到单机限制,node节点故障数据会丢失,pod跨node不能共享数据

nfs 可以持久存储,pod跨node可以共享数据

PV PVC

先在存储 创建 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 无状态应用
mysql es 有状态应用

Deployment 部署无状态应用 ReplicaSet 维护pod副本期望数量 创建和删除时是并行创建,升级时是先创建一部分再删除一部分
StatefulSet 部署有状态应用 创建和删除时是有顺序的(串行的),
升级时是串行执行的,会先删除旧Pod再创建新Pod
,先从最大到最小序号开始更新,在下一批Pod更新前需等待上一批pod更新完毕(进入running和ready状态)才会更新
5 个副本 创建时 nginx-0 nginx-1 ... nginx-4 删除时 nginx-4 nginx-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
静态PV StorageClass动态创建的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通信的

以上是关于Kubernetes——配置资源管理(secret)的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes进阶之secret及configmap配置管理

Kubernetes(k8s)配置管理ConfigMap&Secret

一文带你弄懂Kubernetes应用配置管理

Kubernetes笔记

kubernetes管理机密信息

12.Kubernetes配置管理