pod 入门
pod 入门
入门级的放通网络
我们使用 nginx 创建的pod,必须要能本地访问它才行,在不引入复杂的网络环境的前提下,我们可以通过映射端口或者映射本机网络的方式进行访问。
apiVersion: v1
kind: Pod
metadata:
name: web01
labels:
app: nginx
version: "1.24"
namespace: learn
spec:
containers:
- name: ng-host
image: docker.io/library/nginx:1.24
imagePullPolicy: IfNotPresent
restartPolicy: Always
hostNetwork: true # 使用宿主机网络
---
apiVersion: v1
kind: Pod
metadata:
name: web02
labels:
app: nginx
version: "1.24"
namespace: learn
spec:
containers:
- name: ng-port
image: docker.io/library/nginx:1.24
imagePullPolicy: IfNotPresent
ports:
- containerPort: 80
hostPort: 8080 # 映射主机端口
restartPolicy: Always
加载的时候,发现 version 定义浮点数它报错,做成字符串就可以了
- 加载部署,然后查看网络地址,访问测试
web01 这个pod已经直接映射为物理网络的地址,使用 node01 节点的网络;web02 也被分发到了 node01 节点,但是端口映射的是 8080
通过以上,其实已经学会了 pod 的基础使用了,也就是创建配置,拉起服务,测试访问
Labels 标签,k8s 管理的锚
k8s 的 logo 像是一个舵,掌握航行方向,我说 label 是它的锚,是因为绝大多数操作的关联项都是基于 label 进行的。
举个例子:
# 查看标签
kubectl get po -n learn --show-labels
# 根据标签进行删除,同理,能根据标签删除,也就能根据标签升级或其他操作
kubectl delete -l "version=1.24" -n learn
-
标签使用时,只输入键,是模糊操作,有该键的都会被操作到
-
键值对时,精确操作
-
常用的标签键值对
app: role: master、node、replica、salve env: dev、test、qa、prod release: stable、test、mainline tier: fronted、backend、cache partition: areaA、areaB
-
手动创建标签
# 创建节点标签,该标签可用于 nodeSelector 调用 kubectl label nodes node02 os=rocky9 # 创建pod标签 kubectl label pod web03 version=1.24 -n learn
-
删除标签
# 指定键值即可 kubectl label pod web03 version- -n learn
-
与之类似的,打污点,污点针对 node
# 污点标签:污点策略 kubectl taint node node02 node-type=dev:PreferNoSchedule
pod 基础存储
apiVersion: v1
kind: Pod
metadata:
name: web04
labels:
app: nginx
namespace: learn
spec:
volumes:
- name: vol-empty # emptyDir 存储定义
emptyDir:
{}
- name: vol-local # localPath 存储定义
hostPath:
path: /data/vol
containers:
- name: ssd-empty # 创建一个容器,调用 emptyDir
image: nginx:1.24
imagePullPolicy: IfNotPresent
volumeMounts: # 挂载,声明挂载路径和名称
- mountPath: /usr/share/nginx/html
name: vol-empty
- name: ssd-local # 创建调用 hostPath 的容器
image: alpine:3.18
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /usr/share/nginx/html
name: vol-local
command: # 给个命令,hang 住后台,不然启动容器就结束了,run不起来
- ping
- loclhost
restartPolicy: Always
pod 节点选择
节点选择的方式,一种是直接指定分发的节点,一种是根据节点标签进行分发。根据节点标签进行分发,需要节点有各自的标签信息。
-
为 node 创建标签
# 查看节点标签信息 kubectl get nodes --show-labels # 给 node02 打标签 kubectl label nodes node02 os=rocky9 # 删除标签,指定key即可 kubectl label nodes node02 os-
-
加载配置
apiVersion: v1 kind: Pod metadata: name: web05 labels: app: nginx namespace: learn spec: nodeName: node01 # 指定调度到 node01 containers: - name: node-name image: nginx:1.24 imagePullPolicy: IfNotPresent restartPolicy: Always --- apiVersion: v1 kind: Pod metadata: name: web06 labels: app: nginx namespace: learn spec: nodeSelector: # 标签选择,应该会调度到node02 os: rocky9 containers: - name: node-name image: nginx:1.24 imagePullPolicy: IfNotPresent restartPolicy: Always
-
查看结果
kubectl get po -n learn -owide
pod 的污点容忍和亲和性
当前没学各种控制器,pod 随机调度,我们先为 node02 打上污点,创建一个容忍该污点的 pod。pod 优先分发到没有污点的节点,所以,我们需要给做个节点的亲和性,让pod更亲和node02
-
为 node02 创建污点
kubectl taint node node02 env=test:NoSchedule
-
创建并加载配置
apiVersion: v1 kind: Pod metadata: name: web07 labels: app: nginx namespace: learn spec: containers: - name: web-affinity image: nginx:1.24 imagePullPolicy: IfNotPresent # 配置容忍度,节点已创建污点 tolerations: - key: env operator: Exists effect: NoSchedule # 亲和性 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: os operator: In values: - rocky9 restartPolicy: Always
-
查看结果,pod 被调度到node02,符合预期
kubectl get po -n learn -owide
pod 配置详细说明
根据 kubectl explain pod
逐级筛选
# 协议版本
apiVersion: v1
# 资源类型,资源不同,协议可能不同
kind: Pod
# 元数据
metadata:
# pod 名称
name: nginx
# 标签
labels:
app: nginx
# 名称空间
namespace: learn
# 自定义注释
annotations:
- name: "string"
# 容器的详细配置
spec:
# 容器列表
containers:
# 容器名称
- name: nginx
# 镜像路径及名称
image: nginx:1.24
# 镜像拉取策略,IfNotPresent 本地不存在,拉取远程;Never 从不拉取远程;Always 总是拉取远程
imagePullPolicy: IfNotPresent
# 执行命令
command: ["/bin/bash"]
# 命令参数拼接
args: ["-c","while true;do echo hello;sleep 1;done"]
# 指定容器工作目录
workingDir: /usr/share/nginx/html
# 挂载存储,在外层先定义,后面高一层级这个
volumeMounts:
# 容器内挂载的绝对路径
- mountPath: /usr/share/nginx/html
# 上层定义个存储名称
name: vol-name
# 还可以配置环境变量、端口、资源限制等
# 生命周期配置
lifecycle:
# 主容器启动前
postStart:
exec:
command:
- "sh"
- "-c"
- "echo \"postStart at $(date +%F_%T)\" >> /poststart.log "
# 主容器删除前
preStop:
exec:
command:
- "sh"
- "-c"
- "echo \"preStop at $(date +%F_%T)\" >> /preStop.log "
# 存活检查
livenessProbe:
exec:
command:
- cat
- /etc/host
# 启动完成后多少时间进行检查
initialDelaySeconds: 10
# 检查等待超时
timeoutSeconds: 10
# 定期检查
periodSeconds: 5
# 连续成功次数,默认为1,最少1次
successThreshold: 3
# 连续失败次数
failureThreshold: 3
# 宽限期,默认30s
terminationGracePeriodSeconds: 30
# 就绪检查
readinessProbe:
tcpSocket:
port: 80
# 启动检查
startupProbe:
httpGet:
port: 80
# 定义存储
volumes:
# 存储名称,调用时使用这个名称
- name: vol-name
# 调用nfs资源
nfs:
# nfs 共享路径
path: /data/vol
# nfs 服务地址,域名、主机、IP
server: nfs.server.com
- name: vol2
# 定义一个空目录,临时文件,删除pod,数据丢失
emptyDir:
{}
- name: vol3
# 挂载主机本地存储
hostPath:
path: /data/vol
# -----------------------------------------
# 节点调度,nodeName 和 nodeSelector 二选一
# 指定节点的调度,与其他调度方式互斥,优先级更高
#nodeName: node01
# 根据【节点】标签调度
#nodeSelector:
# 节点有对应标签
#cpu: high
# -----------------------------------------
# 容忍度
tolerations:
# 污点 key
- key: node-type
# 操作符 Exists 包含,可忽略值;Equal 键值对相等,要同时配置键值;
operator: Exists
# 调度策略 NoExecute 驱逐,NoSchedule 不调度,存在继续;PreferNoSchedule 减少调度
effect: PreferNoSchedule
# 亲和性
affinity:
# 节点亲和性 nodeAffinity;pod亲和性 podAffinity;反亲和性 podAntiAffinity
nodeAffinity:
# 精确匹配,硬亲和性
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
# 匹配表达式
- matchExpressions:
- key: cpu
# in / notin 键值对存在或不存在;exists / noexists 键存在或不存在;Gt / Lt 大于或小于
operator: In
values:
- high
- low
- key: app
operator: Exists
# 模糊匹配,软亲和性
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: cpu
operator: In
values:
- high
weight: 1
# 容器重启策略 Always 总是重启;OnFailure 非正常退出;Never 不重启
restartPolicy: Always
本文来自博客园,作者:虫祇,转载请注明原文链接:https://www.cnblogs.com/chongxs/p/18103337/pod