Pod YAML 文件核心字段详细介绍
使用 kubectl explain pods.metadata 可以获取详细的编写说明.
nodeName:pod调度到指定的node节点
创建资源清单文件如下:
mkdir node
cd node/
# 添加资源文件
cat > pod-node.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: demo-pod
namespace: default
labels:
app: myapp
env: dev
spec:
nodeName: b-yabin-node
containers:
- name: tomcat-pod-java
ports:
- containerPort: 8080
image: tomcat
imagePullPolicy: IfNotPresent
- name: busybox
image: busybox:latest
command:
- "/bin/sh"
- "-c"
- "sleep 3600"
EOF
其中的 nodeName 根据自己想让其运行的工作节点名称进行修改. 查看所有可用的节点名称可以使用 kubectl get nodes. 然后执行以下命令创建 pod:
kubectl apply -f pod-node.yaml
如果需要删除 pod 可以使用 kubectl delete pods demo-pod.
k8s 核心资源 Pod-nodeName
kubectl get pods -n kube-system查看系统 pod 是否都正常工作.kubectl run busybox --image busybox:1.28 --restart=Never --rm -it busybox -- sh启动一个 busybox pod, 在其中执行nslookup kubernetes查看 dns 域名解析是否正确, 执行ping 8.8.8.8查看网络是否正确.openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text | grep Not命令查看 k8s 证书有效期, 默认为一年. 官方文档 中有关于更新有效期的介绍, 注意更新证书时会重启集群, 在生产环境中慎重操作.kubectl explain service查看服务编写帮助信息.kubectl get pods -l env=dev -o wide查看特定标签的 pod 的详细信息.
k8s 核心资源Pod-node Selector
资源清单文件示例:
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector
disk: ssd
region: us-west
kubectl get nodes --show-labels: 查看所有 node 节点的标签.kubectl describe pods my-pod: 查看 pod 的详细信息.kubectl label nodes b-yabin-node disk=ssd: 给指定的工作节点加上特定的标签.kubectl label nodes b-yabin-node disk-: 删除 disk 标签.
k8s 核心资源 Pod-污点和容忍度
在 k8s 中亲和性有两种: 节点亲和性(node affinity) 和 Pod 亲和性(pod affinity). 亲和性是希望两个 pod 想放在一起, 反亲和性则是不希望在一起.
node 节点亲和性
kubectl explain pods.spec.affinity: 查看亲和性相关字段说明.requiredDuringSchedulingIgnoredDuringExecution: 是硬亲和性表示必须满足的条件.preferedDuringSchedulingIgnoredDuringExecution: 是软亲和性表示非必须满足的条件.kubectl get pods -o wide: 获取所有默认命名空间中的 pod.kubectl delete -f pod-node.yaml --force --grace-period=0: 立即强制删除 pod, 一般不建议使用, 能优雅的删除还是优先优雅的删除.
资源清单文件示例:
apiVersion: v1
kind: Pod
metadata:
name: nodeaffinity-1
namespace: default
labels:
app: myapp
item: pro
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: a
operator: In
values:
- b
pod 节点亲和性
首先创建第一个 pod, 资源清单如下:
apiVersion: v1
kind: Pod
metadata:
name: first
namespace: default
labels:
app: first
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
然后创建第二个 pod, 设置和第一节点的亲和性, 资源清单如下:
apiVersion: v1
kind: Pod
metadata:
name: second
labels:
app: second
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecutiong:
- labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["first"]}
topologyKey: kubernetes.io/hostname # 这个是 node 的标签, 用来判断两个 pod 是否在同一个位置.
创建第三个 pod, 设置和第一个节点的反亲和性, 资源清单如下:
apiVersion: v1
kind: Pod
metadata:
name: second-1
labels:
app: second-1
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
imagePullPolicy: IfNotPresent
tolerations:
- key: node-role.kubernetes.io/master
operator: Exists
effect: NoSchedule
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecutiong:
- labelSelector:
matchExpressions:
- {key: app, operator: In, values: ["first"]}
topologyKey: kubernetes.io/hostname
kubectl describe nodes b-yabin-master: 查看 node 详细信息. 对于 master 节点其中有污点(taints), 不允许 pod 调度. 上面资源清单中的tolerations用来设置该 pod 容忍在有该污点的 node 进行调度.- 上面的
topologyKey也可以设置为自定义标签用来判断是否在同一个 node.
污点和容忍度
污点是给 node 打的标签, 容忍度是 pod 的标签.
kubectl explain node.spec.taints: 查看污点帮助文档.kubectl taint nodes b-yabin-node a=b:NoExecute: 给节点打一个污点.kubectl get daemonset kube-proxy -o yaml -n kube-system > 1.yaml: 导出 kube-proxy daemonset 的配置. 在配置文件中可以发现其配置可以容忍任何污点.kubectl taint nodes b-yabin-node a-: 删除节点的污点.kubectl explain pods.spec.tolerations: 查看 pod 容忍帮助文档.