前言
本文记录了Kubernetes的资源对象文件的学习过程
为了方便写yaml文件,一般会设置vim风格:
set ai 设置自动缩进
set ts=2 设置tab缩进两个空格
set et 将tab缩进的空格转换为对应个数的空格
一、资源对象文件
1、模板与帮助信息
资源对象文件的优势:
命令无法实现的高级复杂功能资源对象文件可以
某些资源对象无法使用命令创建
资源对象文件不像命令,即方便管理,保存,也可以追溯历史记录
资源对象模板的生成
资源对象Pod模板使用run生成, 其他使用create生成,–dry-run=client -o yaml 是生成模板命令。
kubectl run --image=myos:nginx --dry-run=client -o yaml
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: myweb
name: myweb
spec:
containers:
- image: myos:nginx
name: myweb
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
获取资源对象模板
kubectl create namespace work --dry-run=client -o yaml
apiVersion: v1
kind: Namespace
metadata:
creationTimestamp: null
name: work
spec: {}
status: {}
查看帮助文档
kubectl explain Pod.spec.restartPolicy
KIND: Pod
VERSION: v1
FIELD: restartPolicy <string>
DESCRIPTION:
Restart policy for all containers within the pod. One of Always, OnFailure,
Never. Default to Always. More info:
https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#restart-policy
Possible enum values:
- `"Always"`
- `"Never"`
- `"OnFailure"`
资源对象文件
mkdir app
cd app
# vim nginx.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: nginx
spec:
containers:
- name: nginx
image: myos:nginx
###
# vim phpfpm.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: php
spec:
containers:
- name: php
image: myos:php-fpm
###
管理资源对象文件
# 使用镜像资源文件创建应用
kubectl apply -f nginx.yml -f phpfpm.yml
# 删除应用(使用目录删除,相当与读取资源文件删除Pod)
kubectl delete -f /root/app
# 合并资源对象文件
cat nginx.yml >> app.yml
cat phpfpm.yml >> app.yml
# 创建资源文件对象
kubectl apply -f app.yml
# 删除资源对象文件(直接使用yml文件删除)
kubectl delete -f app.yml
自定义命令
自定义命令设置在command字段下,参数写在args字段下
# vim mycmd.yml
---
kind : Pod
apiVersion : v1
metadata :
name : mycmd
spec :
containers :
- name : linux
image : myos:8.5
command : ["sleep"] # 自定义命令
args : ["30"] # 自定义命令参数
###
kubectl apply -f mycmd.yml
kubectl get pods -w
容器保护策略
Pod会根据策略决定容器结束后是否重启,Always重启,Never不重启,OnFailure失败就重启
# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
restartPolicy: Never # 配置保护策略
containers:
- name: linux
image: myos:8.5
command: ["sleep"]
args: ["30"]
宽限期策略
宽限期避免服务突然中断,造成的事物不一致(默认30s不等待设置为0)
# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0 # 设置宽限期
restartPolicy: Never
containers:
- name: linux
image: myos:8.5
command: ["sleep"]
args: ["30"]
最大生命周期
允许Pod运行最大时常,时间到期后会向Pod发送signal,如果Pod无法结束就会强制关闭,并设置为Error
# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0
activeDeadlineSeconds: 60 # 可以执行的最大时长
restartPolicy: Never
containers:
- name: linux
image: myos:8.5
command: ["sleep"]
args: ["300"]
Pod嵌入脚本
- -c从字符串中读取数据
- | 保持字符串原有数据 > 将不同行数据以空格连接在同一行
# vim mycmd.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mycmd
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
containers:
- name: linux
image: myos:8.5
command: ["/bin/bash"]
args:
- -c
- |
while sleep 5;do
echo "hello world."
done
多容器 Pod
同一个Pod共享网络和IP及权限
同一个Pod共享主机名
同一个Pod共享存储设备
同一个Pod内容器不能使用同个端口,不能挂载同一个路径,不能使用相同环境变量
# vim mynginx.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mynginx
spec:
terminationGracePeriodSeconds: 0
restartPolicy: Always
containers:
- name: nginx
image: myos:nginx
- name: php
image: myos:php-fpm
管理多容器 Pod
受到多容器影响的命令: [“cp”, “logs”, “exec”]
echo "hello world" >hello.html
kubectl cp hello.html mynginx:/usr/local/nginx/html/ -c nginx
kubectl exec mynginx -c php -- ps
kubectl logs mynginx -c nginx
二、资源监控组件
安装部署程序后,必须要了解应用程序在部署后的性能和资源使用情况,可以通过检测Pod容器或节点来了解整个集群的情况
kubernetes的Metrics-server组件提供有关节点和Pod的资源使用情况的信息,包括CPU和内存的指标,将Metrics-server部署到集群中,就可以查询并使用这些信息管理应用及服务
Metrics-server为调度器,弹性控制器以及Dashboard等ui组件提供数据来源
安装条件:
kube-apiserver必须启用聚合服务,或使用kube-proxy代理转发
节点必须启用身份验证和授权,kubelet证书需要由集群证书颁发机构签名
Metrics Server使用443、4443端口,所有节点上Kubelet必须能够访问该端口
配置授权令牌
启用引导令牌,并签发
echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
systemctl restart kubelet
kubectl get certificatesigningrequests
kubectl certificate approve csr-2hg42
kubectl get certificatesigningrequests
安装插件 metrics
docker load -i metrics-server.tar.xz
docker images|while read i t _;do
[[ "${t}" == "TAG" ]] && continue
[[ "${i}" =~ ^"harbor:443/".+ ]] && continue
docker tag ${i}:${t} harbor:443/plugins/${i##*/}:${t}
docker push harbor:443/plugins/${i##*/}:${t}
docker rmi ${i}:${t} harbor:443/plugins/${i##*/}:${t}
done
sed -ri 's,^(\s*image: )(.*/)?(.+),\1harbor:443/plugins/\3,' components.yaml
140: image: harbor:443/plugins/metrics-server:v0.6.2
kubectl apply -f components.yaml
kubectl -n kube-system get pods -l k8s-app=metrics-server
计算节点签发证书
# 查看节点资源指标
kubectl top nodes
#--------------- 在所有计算节点配置证书 -----------------
echo 'serverTLSBootstrap: true' >>/var/lib/kubelet/config.yaml
systemctl restart kubelet
#--------------- 在 master 签发证书 -------------------
kubectl certificate approve $(kubectl get csr -o name)
kubectl get certificatesigningrequests
查看节点资源指标
#获取资源指标有延时,等待 15s 即可查看
kubectl top nodes
监控资源指标
CPU资源单位:
CPU资源约束和请求以毫核(m)为单位,1m是最小调度单位,CPU一个核心约为1000m
memory资源类型:
以字节为单位,可以使用E,P,T,G,M,k
也可以使用对应的2的幂数Ei,Pi,Ti,Gi,Mi,Ki
eg:1k=1000
1ki=1024
# vim mylinux.yaml
---
kind: Pod
apiVersion: v1
metadata:
name: mylinux
spec:
containers:
- name: linux
image: myos:8.5
command: ["awk", "BEGIN{while(1){}}"]
kubectl apply -f mylinux.yaml
查看 Pod 资源指标
# 查看 CPU 资源消耗
kubectl top pods
# 测试消耗内存资源
kubectl cp memtest.py mylinux:/usr/bin/
kubectl exec -it mylinux -- memtest.py 2500
#--------------- 在另一个终端查看------------------------
kubectl top pods
# 实验完成以后清空所有容器
kubectl delete pods --all