18 章学习笔记

89 阅读1分钟

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 容忍帮助文档.