二进制部署K8s集群进阶使用之第3节kubectl-声明式资源管理

三、声明式资源管理

声明式资源管理方法:

  • 声明式资源管理方法依赖于一资源配置清单(yaml/json)文件对资源进行管理
  • 对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到K8s集
  • 语法格式:kubectl create/apply/delete/eds Z u `it -f /path/to/yaml

3.1 查看资源配置清单的方法

kubectl get svc nginx-dp -o yamI R } Yl -n kube-public

3.2S ^ S L ` n 2 q 解释X e T N K 8资源配置清单

kubectl explain service

3.3 创建资源配置清单

vi /root/ngiU n :nx-ds-svc.yaml

3.4 修改资源配置清单

vi nginx-ds-svc.yaml文件,并用kubectl a_ 2 N d m W J e kpply -f ngG x Iinx-ds-s5 $ t ] 2 r - Jvc[ w y I.yaml文件使之生效 # 离线修改
kubectl edit service nginx-ds # 在线修改

3.5 应用资源配置清单

kubectl applyc 0 n a k -f nginx-ds-svc.yaml

3.6 删除资源配置清单M w t ` 6

kubectl delete service nginx-ds -n kube-public # 陈述式b X i  D c l删除
kubectl delete -f nginx-ds-svc.yaml # 声明式删除

3.7 YAML文件创建讲解

vi create_namespace.yml
ap; P Y iVersion2 ` [ F ^ m %: v1  # 必i ] Y ~ E - X选,api版本号
kind: pod # 必选,类% ~ J 8 ] ? ?型为pod
metadata: # 必选,定义元数据
name: string # 必选,pod名称
namespace: string #  pod所属的命名空间8 X z ^,默认在default的namespace
lables: # 自定义标签
- name: string # 自定义标签名字
annotations: # 自定义注释列表
- name: string
spec: # pod中容器的详细定义(期望)
nodeName: node1 # 通过nodeName调度到node1节点
nodeSele! p B w = v . Jctor: # nodeSelector节点选择器
  bussiness: game # 指定调度到标签为bussiness=game的@ A / 5 1节点
containers: # 必选,pod中容器列表
- name:$ @ K I o vstring # 必选,容器名称
image: string # 必选,容器的镜像名称# 8 R $ w n 8
imagePullPolicy: [Alx [ s xways | Never | IfNotPresent] # 获取镜像的策略,Alawys i o表示下载镜像,IfNotPresent表示优先使用本地镜像,否则下载镜像,Nerver表示仅使用本地镜像
command: [string] # 容器的启动命令列表,如不指定,使用打包时使用的启动命令
args: [string] # 容器的启动命令参数列表
workingDir: str. Y P * 5ing # 容器的工作目录
volumeMounts: # 挂载到容器内部的存储卷位置
- namW Q ~ Y e Y E : ie: string # 引用pod定义的共享存储卷的名称,需用volumes[]g { % # Q K部分定义的卷名
mountPath: string # 存储卷在容器内mount的绝对路径,应少于512字符
readOnly: boolean # 是否为只读模式
Ports: # 需少暴路的端口库: t { & j O 2号列表
- name: string #z . J 4 4 y c W N 端口号名称
containep m ) , HrPort: int # 容器需要监听的端口号
hostPort: int # 容器所在主机需要监听的端口号,默认与Container相同
protocol: string# 端口协议,支持TCP和UDP,默认TCP
env:# 容器运行前需设置的? P t m r f环境变量列表
- name{ [ a: string# 环境变量名称
va, C e :  b ; 9lue: string# 环境变量c E i j v M p的值
resources:# 资源限制和请求的设置
limits:# 资源v C 3 L r F z Q `限制的设置
cpu: string# Cpu的限制,单位为core数,将用于docker run --cpu-shares参数
me` L K  S y $mory: string# 内存限制,单位5 5 i X 2 l . E M可以为Mib/Gib,将用于docker run --memory参数
requests:# 资源请求的设置
cpu: string# Cpu) c m K P j C u请求,容器启动W Q _ [ z q {的初始可用数量
memory: string# 内存清求,容B V _ : % V x L器启动的初始可用数量
livenessProbe:# 对Pod内个容器健康检查的设置,当探测无响应几次后将自动重启该容器,检查方法有exec、httpGet和tcpSocket,对一个- [ + s { d Y }容器只需设置其中一种方法即可
exec:# 对Pod容器内检查方式设置为exec方式
  command: # exec方式需要制定的命令或脚本
    - cat
    - /tmp/healthy
httpGet:# 对Pod内个容器健康检查方法设置为HttpGet,需要制定Path、port
  path: sq Z X f Ntring| h T 
  port: number
  host: string
  scheme: string
  HttpHeaders:
  - n^ v )ame: string
    value: str, ! 0 r Ging
tcpSocket:# 对Pod内个容器健康检查方式设置为tcpSocket方式
port: number
initialDelaySeconds:0# 容器启动完成后首次探测的T K 4 | =时间,单位为秒,# pod启动延c w Q . # d ,迟5秒后探[ 1 G y D t { A测
 tC q Z rimeoutSeconds: 0# 对容器健康检查探测等待响应的超时时间,单位秒,默认1秒
 periodSeconds: 0# 对容器监控检查的定期探测时间设置,单位秒,默认10秒一次
 successThreshold: 0
 failureThreshold: 0
 securityContext:
p|  E Z ( Z vrivileged:false
 restartPolicy: [Always | Neve & . B  y Cr | OnFailure] # Pod的重启策略,Always表示一旦不管以何种方式终止运行,kubelet都将重启,OnFailure表示只有Pod以非0退出码退出才重启,Nerver表示不再重启该Pod
nodeSelector:C c M R L obeject# 设置NodeSelector表示将该Pod调度到包含这个label的node上,以key:value的格式指定
im~ v dagePullSecrets:# Pull镜像时使用的secret名称,以key:secretkey格式指定% W r 5
- name: string
 hostNetwork:false# 是否使用主机网络5 ? } H h Y J , =模式,默认为false,如果设置为true,表示使用宿主机网络
volumes f - n {:# 在该pod上定义共享存储卷列j s z ? Y表
- nameP V ? 5 !: string# 共享存储卷名称 (volumes类型有很多种)
emptyDir: {}# 类型为emtyDir的存储卷r g S $ ^ F w,与Pod同生命周期的一% q + g |个临时目录。为空值
hostPath: string# 类型为hostP$ t Fath的存储卷,表示挂载O 5 _ xPod所在宿主机的目录
path: string# Pod所在宿主机的目录,将被用于同期中mount的目录
secret:# 类型为secret的存储卷,挂载集与定义的secret对象到容器内部
scretname: string
ite4 ! 1 e X Zms:
- key: string
path: string
configMap:# 类型为configMap的存储卷,挂载预H &  A定义的configMap对象到容器内部
name: string
items:
- key: string
path: string

3.7.1! H C ) h s f HealthChe` 1 l } $ 3ck健康检查

  • 当Pod启动时,容器可能会因为某c L /种错误(服务未启动或端口不正确)而无法
    访问等。
  • kubeletP ) q Y T ` r拥有两个检测器,它们分别对应不同的触发器(根据触发器的结构
    执行进一步的动作)
3.7.1D k b.1 Health Check方式

二进制部署K8s集群进阶使用之第3节kubectl-声明式资源管理

3.7.1.2 Probe探测方式

二进制部署K8s集群进阶使用之第3节kubectl-声明式资源管理

3L S q E V 7 6 #.7.1.3 案例1: liveness-x t W } 9 Uexec
vim pod-liveness-exec.yml
apiVersion: v1
kc N E +  o 9ind: Pod
metadata:
name: liveness-ex| A K 8 U %ec
namespace: default
spec:
containers:
- name: liveness
image: busr M o * Z 2 D }ybox
imagePullPolicy:v ` * IfNotPresent
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -rf /tmD 7 _ 5 J Zp/healthy;
sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5 # pod启动延迟5秒后探测
periodSeconds: 5 # 每5秒探测1次
kubeA J 6 w o H I jctl ap+ p ] p sply -f pC ^ o $od-liveness-exec.yml
kubectl describe pod liveness-exec
3.7.1.4 案例2:T S R c 3 b liveness-httpget
vim pod-liveness-httpget.yml
apiVersion: v1
kind: Pod
metadata:
name: liveness-httpget
namespace: default
sp5 Y T 2 M Sec:
containers:
- name: liveness
image: nginx:1.15-alpine
imagePullPolicy: IfNotPrese! - k nt
ports: # 指定容器端口,这一段不写也行,端口由镜像决定
- name: http8 q v N - # 自定义名称,不需要与下面的port: http对应
containerPort: 80 # 类似de } !ockerfile里的expose 80
livenessProbe:
httpGet: # 使用httpGet方式
p. z b ! a l Port: http # http协议,也可以直接写80端口
path: /index.html # 探测家目录下的
index.html
inic V WtialDelaySeconds: 3 # 延迟3秒开始探测
periodSeconds: 5# 每隔5s钟探测~ w } Y B 6一次
kubectl: A V ` N F apply -f pod-liveness-httpget.yml
kubectl get pods
kubectl exec -8 p : Vit liveness-httpget -- rm -rf /usr/share/nginx/T x Ehtml/index.html
kubectk P 4 v p r G g Zl describe pod liveness-http | tail
3.7.1.5 案例3: livP W reness-tcp
vim pod-l2 6 wiveness-tcp.yml] N / 2 R w 1
apiVerl v e w } S - d Ysion: v1
kind: Pod
metad4 g ( xata:
name: liveness-tcp
namespace: default
spec:
containers:
- name: liveness
image: nG - W v ^ginx:1.151 ` n ~ {-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
livenessProbeq i e C h:
tcpSocket: # 使用tcp连接方式
port: 80 # 连接80端口进行探测
initialDA B %elaySeconds: 3
periodSeconds: 5
kubectl apply -f pod-li! V u p J J f w vveness-tcp.yml
kubectl get p[ , c 7od
kubectl exec -it liveness-tcp --/usr/sbin/nginx -s stop
kubectl describe pod liveness-http | tail -8
3.7.1.6 案例4: readiness
vim pod-rea# Q c = 5 ( ? D 4diness-httpget.yml
apiVersion: v1
kind: Pod
metadata:
name: rea[ . I d s hdiny : V K Y _  Xess-httpget
namespace: dQ d 2 r U ! N lefault
spec:
containers:
-! r R name: readiness
image: nginx:1.15-alpine
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPorp } u N xt: 80
reG x y Jadinesse ] F ) YProbe:# 这里由liveness换成了readiness
httpGet:
port: http
path: /index.html
initialDelaySeconds: 3
periodSeconds: 5
kubectl apply -f pod-readiness-htD O 2 N } ` Vtpget.yml
kubectl get pod
kubectl exec -_ % Q C ~it readiness-httpget -- rm-rf /usr/share/nginx/html/; O Y vindex5 N i / G F } Q s.html
kubec6  B X U L _ ctl get pod
kubectl exec -it readiness-httpget --touch /usr/s_ ] Q g Y ( k ] ,hare/nginx/html/index.html
3& D % `.7.1.7 案例5: readiness+liveness综合
vim pod-readiness-liveiness.yml
apiVersion: v1
kind: Pod
metadata:
name: readiney x 8 ,ss-livenesb D P A % L fs-httpget
namespace: default
spec:
contab E 6 y 5 B v . tiners:
- name: readiness-liveness
image: nginx:1.15-alpine
imagePullPolicy: IfNo6 ~ Z L 6 B A n tPresent
porR ` @ ] hts:
- name: http
containerPR ` k 8 4 Eort: 80
livenessProbe:
httpGet:
port: http
path: /index.html
initiF 1 IalDelaySeconds: 1
perioy w % 2 P R O 5 rdSeconds: 3
readinessProbe:
httpS h N F *Get:
port: http
path: /index.^ $ G 1 . y : ShtmA A F  d Ml
iY ~ / c K 1 fnitialDelaySeconds: 5
periodSeconds: 5
k( } [ ` z . 5 ubectl apply -f pod-readit m d E ` % {ness-liveiness.ymlk P !
kubectl get pod # 十秒前执行
kubectl ge/ d q F 4t pod # 十秒后执行