Shell 自动补全
● Bash: kubectl completion bash > ~/.bashrc
● Zsh: kubectl completion zsh > ~/.zshrc
Bonus tip: 对 kubectl 的 alias 也启用 Auto Complete,假设你设置了 alias k=kubectl,那么在 ~/.zshrc 或者 ~/.bashrc 中可以加上complete -F __start_kubectl k来让 k也获得自动补全能力
同时 tail 多个 Pod 的日志
指定选择器:kubectl logs -f --selector
资源短名称
● 常用:po->pods, no->nodes, svc -> services, deploy -> deployments, ds->daemonsets, sts->statefulsets, ing->ingresses, cm->configmaps
持续监视 Pod 更新
● kubectl get po -w:pod 更新/创建/删除时会更新输出
● watch -n 1 kubectl get po:直接使用 watch 命令,每秒运行一次 kubectl get po
设置默认 Namespace
kubectl config set-context $(kubectl config current-context) --namespace=<your_namespace>
比如:
kubectl config set-context $(kubectl config current-context) --namespace=sfm
编辑 K8s 资源对象
kubectl edit <rsc_kind> <rsc_name>
比如:kubectl edit deploy ai-hub
Bonus tip: 指定编辑器,获得更好的编辑体验 EDITOR=vim kubectl edit deploy ai-hub(可以直接在 ~/.bashrc 或者 ~/.zshrc 中 export EDITOR=vim)
获取 Raw 形式的数据
kubectl get --raw=/apis/apps/v1/deployments
Bonus tip: 使用 jq命令对输出的原始 JSON 数据做进一步处理,如:
kubectl get --raw=/apis/apps/v1/deployments | jq ‘.items[] | {name: .metadata.name,uid:.metadata.annotations }’
Bonus tip 2: --raw 参数值的拼接形式 为 /apis//,其中 APIVERSION 和 NAME 可以通过 kubectl api-resources查看
同时删除不同种类的资源
kubectl delete pod/my-pod-1 svc/my-service-1
向 Pod 中复制文件
kubectl cp pod:
比如: kubectl cp ./lic.json sfm-apes-daemon-0:/app/
反之也可以从 Pod 里往外复制文件
kubectl cp sfm-apes-daemon-0:/app/lic.json .
在本地暴露 Service/Pod/Deploy 的端口
kubectl port-forward svc/<service_name> <local_port>:<svc_port>
kubectl port-forward pod/<pod_name> <local_port>:<pod_port>
比如:kubectl port-forward svc/ai-hub-svc 3355:80,即为将 ai-hub-svc的 80 端口转发到本地的 3355 端口
污点(Taints)
污点是节点上的一种属性,它会阻止未经授权的 Pod 调度到该节点上。当你在节点上设置了一个污点时,只有那些具有匹配容忍度的 Pod 才能够在该节点上被调度。
增加污点:kubectl taint nodes node01 key1=value1:NoSchedule
删除污点:kubectl taint nodes node01 key1=value1:NoSchedule-
容忍度(Tolerations):
Tolerations(容忍) 一般和Taints 一起搭配使用,toleration 是 pod 的属性,让pod 可以部署在标注了 Taint的 Node上。
容忍度是 Pod 的一个属性,它允许 Pod 被调度到带有指定污点的节点上。如果 Pod 具有与节点上设置的污点匹配的容忍度,则它可以被调度到该节点上。
作用方式:通过在 Pod 的 YAML 配置中添加 tolerations 来指定。
语法:容忍度由 key、operator、value、effect 四个部分组成。
key:与节点上设置的污点的 key 匹配。
operator:用于指定匹配规则,常见的有 “Equal”、“Exists”、“Exists”。
value:与节点上设置的污点的 value 匹配。
effect:与节点上设置的污点的 effect 匹配。
tolerations:
- key: "key1"
operator: "Equal"
value: "value1"
effect: "NoSchedule"
以上部署这个Pod以后将会调度到node01上面。
节点亲和性
```bash
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: aliyun.accelerator/nvidia_name
operator: In
values:
- NVIDIA-A10
containers:
==================反亲和性,所有标记有app=nacos的Pod不会被调度到相同的物理服务器或虚拟机上==========
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nacos
topologyKey: kubernetes.io/hostname
节点基于Label选择
imagePullSecrets:
- name: common-faas
nodeSelector:
opentrek-enable: "true"
k8s之volumes和volumeMounts
apiVersion: apps/v1
kind: Deployment
metadata:
name: python-deployment
spec:
replicas: 1
selector:
matchLabels:
app: python-app
template:
metadata:
labels:
app: python-app
spec:
containers:
- name: python-container
image: python:3.9
command: ["python", "-m", "http.server", "8000"]
ports:
- containerPort: 8000
volumeMounts:
- name: data-volume
mountPath: /app/data
subPath: data1
volumes:
- name: data-volume
hostPath:
path: /root/data
---
apiVersion: v1
kind: Service
metadata:
name: python-service
spec:
selector:
app: python-app
ports:
- protocol: TCP
port: 80
targetPort: 8000
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: python-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: domain.com
http:
paths:
- path: /app1
pathType: Prefix
backend:
service:
name: python-service
port:
number: 80
k8s之hostAliases
通过图片内容可以看出,在 k8s 中,容器内部的 hosts 解析是不会继承宿主机的 host 解析的(与宿主机不相干),常规情况我们在这个应用体系内都有公共的 DNS 服务,DNS 服务是跨主机和容器共享的。
只是有时候在没有公共DNS解析服务的情况下,而容器中的程序又需要通过本地域名的方式去请求接口。这就需要我们手工配置 hosts 映射,这个配置如图来看在宿主机上配置是不可行的,那么在 k8s 的应用场景中,它为我们提供了可以为 pod 配置 hosts 解析的方式,如题所述就是使用 HostAliases。
代码
apiVersion: v1
kind: Deployment
metadata:
name: hostaliases-dp
namespace: default
spec:
replicas: 1
selector:
name: hostaliases-pod
template:
metadata:
labels:
name: hostaliases-pod
spec:
hostAliases:
- ip: "127.0.0.1"
hostnames:
- "foo.local"
- "bar.local"
- ip: "10.1.2.3"
hostnames:
- "foo.remote"
- "bar.remote"
containers:
- name: cat-hosts
image: busybox
imagePullPolicy: Always
command:
- cat
args:
- "/etc/hosts"