k8s相关问题及解决方法

1. 如何修改k8s默认nodePort端口范围

说明: 默认情况下k8s的nodePort端口范围是30000-32767,当我们svc使用nodePort或者使用istio的网关时, 比如我们想使用80:80这时我们就应该更改k8s默认映射的端口了, 具体步骤如下:
编辑 kube-apiserver.yaml文件

// 打开kube-apiserver.yaml文件
vim /etc/kubernetes/manifests/kube-apiserver.yaml;

添加一行 - --service-node-port-range=1-65535

修改后文件如下所示:

- --service-account-issuer=https://kubernetes.default.svc.cluster.local
- --service-account-key-file=/etc/kubernetes/pki/sa.pub
- --service-account-signing-key-file=/etc/kubernetes/pki/sa.key
- --service-cluster-ip-range=10.96.0.0/12
- --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
- --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
- --service-node-port-range=1-65535

注意:我这里使用的k8s版本是1.22.12-00,编辑上面kube-apiserver.yaml文件保存退出之后,kube-apiserver的pod将自动更新,更新期间kube-apiserver将 不可用,在生产环境谨慎更改

2. 内存溢出导致pod容器退出重启(OOM)

说明: 有时我们k8s集群中的pod会反复重启, 这时我们就要注意是不是pod容器的内存溢出了
官方资料地址:https://v1-20.docs.kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/

出现pod容器OOM的原因

部署文件中 pod中容器配置内存限制如下:

Spec:
Containers:
  Resources:
    Limit:
     Memory:200Mi
    requests:
     Memory:100Mi

Limit.Memory: 指的是pod容器最大限制使用内存是200M
requests.Memory: 指的是pod容器请求使用内存是100M
如果容器在运行过程中(比如容器中java使用参数请求内存为500Mi)实际使用内存比limit限制的200Mi还大, 则容器会被退出, 根据策略也可能重启

查看pod容器退出原因是否是OOM

(1)可以使用命令查看kubectl get pod aaa -o yaml -n test, 其结果中出现如下图:

在这里插入图片描述

上面图中reason:OOMKilled 可以看出pod容器确实是由于内存溢出导致退出的

(2)另一种方式查看容器由于oom退出的

kubectl describe pod memory-demo-2 --namespace=mem-example

在这里插入图片描述

3. k8s安装后所有node节点状态都是notReady

这是由于没有安装网络插件造成的

4. 执行主节点添加命令报错

报错如下:
error execution phase preflight: couldn’t validate the identity of the API Server: Get “https://192.168.10.239:6443/api/v1/namespaces/kube-public/configmaps/cluster-info?timeout=10s”: x509: certificate has expired or is not yet valid: current time 2022-03-08T06:13:03-08:00 is before 2022-03-19T03:59:32Z
原因:这是主节点和node节点服务器时间不一致导致的
解决: 安装ntpdate和ntp即可

5. coreDNS报错

报错信息如下:
“[FATAL] plugin/loop: Loop (127.0.0.1:57190 -> :53) detected for zone “.”,”

原因: 这时由于本地dns地址配置的127.0.1.1 导致的(linux是在/etc/resolv.conf文件中)
解决办法: 将dns地址地址更改为其他就可以了

6. 使用ipvs模式

修改kube-proxy的默认配置:
kubectl edit configmap kube-proxy -n kube-system
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: “”
strictARP: false
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
metricsBindAddress: “127.0.0.1:10249”
mode: “ipvs”
删除原先的kube-proxy的pod,会重新生成新的pod
最后使用ipvsadm -Ln 命令查看就能看到k8s设置的规则

7. calico更改为bgp模式

calico默认使用的是ipip模式 现在我们更改为bgp模式

(1)如果未安装calico更改为bgp模式:
打开官方提供的calico.yaml模板里
默认如下:

  • name:CALICO_IPV4POOL_IPIP
    value:“Always”
    更改后如下:
  • name:CALICO_IPV4POOL_IPIP
    value:“Never”

(2)如过已经安装完caclio开启bgp模式:
kubectl edit ippools.crd.projectcalico.org 然后更改“ipipMode: Always” 为“ipipMode: Never”
Always 表示使用的时ipip模式
Never 表示使用的时BGP模式

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐