Kubernetes创建一个Pod的主要流程
1.客户端提交Pod的配置信息(可以是yaml文件定义的信息)到kube-apiserver。
2.Apiserver收到指令后,通知给controller-manager创建一个资源对象。
3.Controller-manager通过api-server将pod的配置信息存储到ETCD数据中心中。
4.Kube-scheduler检测到pod信息会开始调度预选,会先过滤掉不符合Pod资源配置要求的节点,然后开始调度调优,主要是挑选出更适合运行pod的节点,然后将pod的资源配置单发送到node节点上的kubelet组件上。
5.Kubelet根据scheduler发来的资源配置单运行pod,运行成功后,将pod的运行信息返回给scheduler,scheduler将返回的pod运行状况的信息存储到etcd数据中心。
Kubernetes Pod的常见调度方式
1.Deployment或RC:该调度策略主要功能就是自动部署一个容器应用的多份副本,以及持续监控副本的数量,在集群内始终维持用户指定的副本数量。
2.NodeSelector:定向调度,当需要手动指定将Pod调度到特定Node上,可以通过Node的标签(Label)和Pod的nodeSelector属性相匹配。
3.NodeAffinity亲和性调度:亲和性调度机制极大的扩展了Pod的调度能力,目前有两种节点亲和力表达:
4.requiredDuringSchedulingIgnoredDuringExecution:硬规则,必须满足指定的规则,调度器才可以调度Pod至Node上(类似nodeSelector,语法不同)。
5.preferredDuringSchedulingIgnoredDuringExecution:软规则,优先调度至满足的Node的节点,但不强求,多个优先级规则还可以设置权重值。
6.Taints和Tolerations(污点和容忍):
7.Taint:使Node拒绝特定Pod运行;
8.Toleration:为Pod的属性,表示Pod能容忍(运行)标注了Taint的Node。
Kubernetes 静态Pod
1.由kubelet创建并总是在kubelet所在的node上运行
kubeadm安装的k8s集群配置文件路径:/var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests
2.二进制安装的k8s集群配置文件路径:/usr/lib/systemd/system/kubelet.service 在文件内新增一行:–pod-manifest-path=
Kubernetes 数据持久化方式
1、emptydir 空目录,临时存储
2、hostpath 挂载宿主机目录
3、pv nfs ceph等
Kubernetes 默认端口范围修改
k8s默认的端口范围是30000-32767,如果讲svc配置的端口超过这个范围就需要修改kube-apiserver的配置
vim /etc/kubernetes/manifests/kube-apiserver.yaml
command段新增如下一行内容
- --service-node-port-range=30000-40000
# 配置好后重启apiserver服务
kubectl delete pod kube-apiserver-k8s-master01 -n kube-system
修改kubernetes代理模式从iptables修改为ipvs
#查看当前集群的代理模式命令
kubectl logs -n kube-system kube-proxy-7pk8n | grep -i "Using"
# 修改kube-proxy的configmap资源对象
kubectl edit cm kube-proxy -n kube-system
# 找到如下面的内容,将mode: ""修改为mode: "ipvs"
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
# 如果使用OpenELB的EIP,这里改成true
strictARP: true
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
logging:
flushFrequency: 0
options:
json:
infoBufferSize: "0"
verbosity: 0
metricsBindAddress: ""
#这里改掉
mode: "ipvs"
# 修改好后,重启kube-proxy
kubectl rollout restart daemonset kube-proxy -n kube-system
配置Pod自动伸缩功能,此时会出现自定义副本数量失败情况
#配置自动伸缩并设置CPU、内存限制等
kubectl autoscale deploy nginx --min=4 --max=10 --cpu-percent=80
kubectl set resources deploy/nginx --limits=cpu200m,memory=512Mi
# 设置了上面的参数后,将无法手动讲pod副本数改到小于4或者大于10个
# 移除自动伸缩配置
kubectl delete hpa nginx
#此时可以成功手动指定pod副本数量
kubectl scale deploy nginx --replicas=2
修改k8s节点故障Pod迁移时间
默认k8s节点故障后,对应节点上的pod不会马上进行迁移,k8s默认设置了5分钟的等待时间,超过5分钟后节点上的Pod才会主动进行迁移,可以通过如下配置修改默认迁移时间
# 修改pod容忍时间从300s改为100s
# 创建个测试Pod
kubectl create deploy nginx --image=nginx:1.27.5
# 1、编写yml文件
vim change_seconds.yml
spec:
template:
spec:
tolerations:
- key: "node.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
# 调整 Pod 对污点 Unreachable:NoExecute 的容忍时长为 100s
tolerationSeconds: 100
- key: "node.kubernetes.io/not-ready"
operator: "Exists"
effect: "NoExecute"
# 调整 Pod 对污点 NotReady:NoExecute 的容忍时长为 100s
tolerationSeconds: 100
# 2、对已存在的deploy控制器打补丁
kubectl patch deploy nginx --patch "$(cat change_seconds.yml)"
kubectl命令自动补全问题
apt install bash-completion
source /usr/share/bash-completion/bash_completion
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
防止apt更新k8s组件及内核版本
# 1、查看要阻止更新的软件包
dpkg --get-selections|grep -E 'kubectl|kubeadm|kubelet|docker-ce|docker-ce-cli|docker-ce-rootless-extras|linux-headers-5.15.0-140-generic|linux-image-5.15.0-140-generic'
# 2、锁定不想升级的包
apt-mark hold kubectl kubeadm kubelet docker-ce docker-ce-cli docker-ce-rootless-extras linux-headers-5.15.0-140-generic linux-image-5.15.0-140-generic
# 3、取消锁定
apt-mark unhold kubectl kubeadm kubelet docker-ce docker-ce-cli docker-ce-rootless-extras linux-headers-5.15.0-140-generic linux-image-5.15.0-140-generic
最后编辑:于浩 更新时间:2025-06-10 18:08