资源清单
###### 资源清单文件格式
```yaml
# yaml格式遵循帕斯卡编码(PascalCase)
小驼峰: 大驼峰 #但只适用于系统关键字,用户自定义字段不遵循
# 格式1: 键值对格式
---
kind: Pod
apiVersion: v1
metadata:
name: myweb
spec:
containers:
- name: nginx
image: myos:nginx
status: {}
# 格式2: 数组格式
---
kind: Pod
apiVersion: v1
metadata: { name: myweb }
spec: { containers: [{name: nginx, image: myos:nginx }] }
status: {}
```
#### 一、静态Pod
**静态 Pod(Static Pod)** 是一种由特定节点上的 `kubelet` 直接管理的 Pod,**无需通过 API Server 创建或调度**。它的定义文件直接存储在节点本地,而不是由集群的 apiserver 管理。静态Pod崩溃,kebulet会自动重启
##### 创建静态Pod
```shell
# 将Pod的YAML文件放到kubelet的监控目录下
echo '
---
kind: Pod
apiVersion: v1
metadata: { name: myweb }
spec: { containers: [{ name: nginx, image: myos:nginx }] }
status: {}' > /etc/kubernetes/manifests/myweb.yaml
# 修改静态Pod配置路径
vim +42 /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests/myweb.yaml
# 在master节点上验证
kubectl get pods -o wide
```
##### 删除静态Pod
```shell
# 测试在master删除pods
kubectl delete pods --all
kubectl get pods -o wide #会发现删除失败,pod进入Pending状态后转到Runing
# 正确删除方式,在node计算节点上删除静态Pod文件
rm -rf /etc/kubernetes/manifests/myweb.yaml
```
<img src="image-20250328095803013.png" alt="image-20250328095803013" style="zoom:150%;" />
> ###### 模板与帮助信息
>
> 标准格式:*--dry-run=client -o yaml*
> yaml结构使用"."分割层级结构关系,查询时采用*"资源对象.层级关系"*
>
> ```shell
> # 获取testns资源对象模板
> kubectl create namespace testns --dry-run=client -o yaml
> # 执行explain获取帮助信息
> kubectl explain Pod.metadata.namespace #在最后一行有官方提供的帮助文档
> ```
>
> 官方帮助手册:https://kubernetes.io/docs/concepts/overview
> 提供了中文文档
#### 二、多个容器Pod
##### 创建多容器Pod
```yaml
# 编写yaml
---
kind: Pod
apiVersion: v1
metadata:
name: myweb
spec:
containers:
- name: nginx
image: myos:nginx
- name: php
image: myos:php-fpm
# 创建多容器Pod
kubectl create -f myweb.yaml
# 查看Pod状态
kubectl get pods
```
##### 管理多容器Pod
```shell
# 多容器Pod中查看单个容器日志
kubectl logs myweb -c nginx
kubectl logs myweb -c php
# 多容器Pod中单个容器中执行命令或进入容器中操作
kubectl exec myweb -c nginx -- bash
kubectl exec myweb -c php -- ss -antlp
# 多容器Pod中拷贝命令
kubectl cp myweb:/etc/hosts /root -c nginx
kubectl cp myweb:/etc/php-fpm.conf /root -c php
# 删除多个容器
kubectl delete -f myweb.yaml
```
>
>
>```yaml
>## 合并多资源清单文件
>---
>kind: Namespace
>apiVersion: v1
>metadata:
> name: work
>---
>kind: Pod
>apiVersion: v1
>metadata:
> name: myweb-word
> namespace: work
>spec:
> containers:
> - name: httpd
> image: myos:httpd
>---
>kind: Pod
>apiVersion: v1
>metadata:
> name: myweb-default
> namespace: default
>spec:
> containers:
> - name: httpd
> image: myos:httpd
>
>## 执行方法
>kubectl apply -f app.yaml
>## 将多个资源清单文件放到app目录下,删除
>kubectl delete -f app/
>```
#### 三、自定义任务及嵌入式脚本
```yaml
---
kind: Pod
apiVersion: v1
metadata:
name: myweb
spec:
activeDeadlineSeconds: 60 #容器的最大生命周期
terminationGracePeriodSeconds: 15 #等待容器自行退出的最长时间,默认30s
restartPolicy: OnFailure #定义容器退出后的重启策略
containers:
- name: nginx
image: myos:nginx
command: [sh] #覆盖镜像启动命令,使用sh作为入口
args: #传递给command的参数
- -c
- |
ID=$RANDOM #嵌入式脚本内容
for i in {1..9}
do
echo "webtest"
sleep 5
done
exit $ID%2 #退出返回值,对应重启策略
status: {}
# 以上所有参数可以查询详细信息
kubectl explain Pod.spec
```
案例
```yaml
---
kind: Pod
apiVersion: v1
metadata:
name: myweb
spec:
containers:
- name: nginx
image: myos:nginx
command: [sh]
args:
- -c
- |
while sheep 5;
do
memery=`free -m | awk '/Mem/ {print $3}'`
if [ $memery < 1000 ]; then
echo "INFO: running normally"
else
echo "WARN: high memory usage"
if
done
status: {}
```
#### 四、调度策略
###### 调度逻辑
调度是将Pod分配到合适的计算节点上,对应节点上的kubelet运行被分配的Pod。kube-scheduler是默认调度器也是集群的核心组建。
调度流程:过滤(筛选)——打分(优选)——绑定
筛选:筛选出满足Pod所有资源请求的节点,包括计算资源、内存、网络、端口号等,如果没有满足Pod需求将会一致停留在Pending状态,直到调度器找到合适的节点运行Pod
优选:调度器为每一个调度节点打分,其中得分最高的节点会被选出来运行Pod,如果可选节点不止一个,调度器会随机选取一个。
绑定:当确定Pod运行的节点后,调度器会将调度决定通知给kube-apiserver
###### 定向调度
声明Pod运行的节点主机名,如果指定节点因资源不足等无法运行,Pod不会迁移其他节点,会一直等待下去
```yaml
# 名称定向调度
---
kind: Pod
apiVersion: v1
metadata:
name: myweb
labels:
app: apache
spec:
nodeName: node-0001
containers:
- name: nginx
image: myos:nginx
status: {}
# 标签定向调度
---
kind: Pod
apiVersion: v1
metadata:
name: myweb
labels:
app: apache
run: httpd-2.4
spec:
nodeSelector:
kubernetes.io/hostname: node-0001
containers:
- name: nginx
image: myos:nginx
status: {}
```
###### 标签管理
```yaml
# 设置标签
kubectl label pods myweb app=nginx
# 删除标签
kubectl label pods myweb app-
# 查看标签
kubectl get pods myweb --show-labels
## 可以给节点、Pod、namespace上标签
```
> 因为nodeSelector是逻辑与,所以分配多个标签时,不会把每一个标签看成一个对象然后在众多对象中随机,而是会把所有标签看作一个对象然后在众多可用目标中寻找符合所有标签的目标。
>
> 如果想要实现在给定范围内的主机群中随机创建,可用方法就是给定范围内主机群中所有目标主机创建同一个标签,且与其他主机群不同的标签
>
> 服务分区:根据上面这条方法可以实现服务分区,譬如新服务器性能强劲则打上A标签,所有核心业务通过A标签找到新服务器运行;旧服务器则打上B标签,所有次级业务通过B标签寻找旧服务器运行;而老式服务器则打上C标签,所有测试活动通过C标签找到老式服务器用于测试功能

1010

被折叠的 条评论
为什么被折叠?



