kubernets(k8s)修改pod默认10.244.0.0段的踩坑经历

问题描述:

测试环境安装默认的10.244段无问题,可直接用, 生产环境安装时,也套用了默认的安装模板,造成flannel等组件IP都是10.244段,要改掉,IP规划为pod全用10.80.0.0/16段, service的IP段为10.90.0.0/16段, 这样各环境IP段就不会冲突了,方便后续做路由指向和网络隔离等安全策略,全套标准步骤如下:

1. 注意查看api-server的证书生成时的IP段,如果里面没有包括 10.80和10.90段,api-server的证书就需要重新生成替换,否则后面所有节点连api-server时都会被拒绝.

2. 先删除flannel, 此时flannel还是10.244段,先对此组件下线

kubectl delete -f kube-flannel.yml

3. 删除node

kubectl delete node 节点名

4. 更新配置

有如下配置项要做更改:

kubelet-config.yml clusterDNS 改为 10.90.0.2 (此IP为coreDNS的地址)

kube-proxy-config.yml 改为 clusterCIDR: 10.80.0.0/16

kube-controller-manager.conf 配置项修改 --cluster-cidr=10.80.0.0/16 --service-cluster-ip-range=10.90.0.0/16 # 注意如果这里不匹配的话,就会对node失去控制

coredns和flannel都是用的yml文件安装成了pod, 因此这两个组件要提前改好IP段

coredns.yaml 里设置Service相关配置 clusterIP: 10.90.0.2

kube-flannel.yml 里设置 net-conf.json

net-conf.json: |

{

"Network": "10.80.0.0/16",

"Backend": {

"Type": "vxlan"

}

}

 

5. 重启master相关应用

systemctl restart kube-controller-manager

 

6. 重启node相关应用

rm -f /opt/kubernetes/cfg/kubelet.kubeconfig

rm -f /opt/kubernetes/ssl/kubelet*

#上面这两步千万不要漏掉,否则会无法颁发证书

systemctl restart kubelet

systemctl restart kube-proxy

 

7. master上给node节点颂发证书,注意颂发后的证书状态要为

kubectl get csr

NAME AGE SIGNERNAME REQUESTOR CONDITION

node-csr-JYNknakEa_YpHz797oKaN-ZTk43nD51Zc9CJkBLcASU 85m kubernetes.io/kube-apiserver-client-kubelet kubelet-bootstrap Pending

kubectl certificate approve node-csr-JYNknakEa_YpHz797oKaN-ZTk43nD51Zc9CJkBLcASU

再次查看证书 kubectl get csr

 

kubectl get node

NAME STATUS ROLES AGE VERSION

k8s-master Ready <none> 34h v1.18.3

k8s-master2 Ready <none> 83m v1.18.3

k8s-node1 Ready <none> 33h v1.18.3

k8s-node2 Ready <none> 33h v1.18.3

此时节点已管理上,再次重新安装coredns和flannel, 如果其他pod 的IP没有变过来,也一并重新安装,

装好后IP如下图

 

 

装好后节点上IP和pod的IP都已正常

 

注意: 此方法只是在初始安装或者安装错了后修改的标准做法, 不适用于现有的k8s上已经安装有大量的pod资源的情况, 因为涉及到删除node节点,所以所有的pod都会随之删除, 操作前请评估好风险, 如果k8s已经上线运行了一段时间,存在大量资源的话,不建议再修改IP段, 风险太大.

 

整个操作过程中可能碰到的问题报错总结:

1. kube-controller-manager 报错 F1019 13:39:09.784464 6321 controllermanager.go:235] error starting controllers: failed to mark cidr[10.244.3.0/24] at idx [0] as occupied for node: gql-prod-k8s-node1-ip44: cidr 10.244.3.0/24 is out the range of cluster cidr 10.80.0.0/16

 

原因: 因为kube-controller-manager 提前修改成了 10.80段,而没有提前删除node节点,node节点信息还残留在etcd里

解决办法: 进etcd里清除node节点相关信息(注意先备份),或者将kube-controller-manager的IP再改回10.244重启后再删除node

etcd里残留的节点信息如下图

 

etcd查找节点信息key的方法

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="三个etcd地址" get / --prefix --keys-only |grep node

 

查看具体节点信息残留的方法, 尽量不要执行删除操作,一定要做好备份

ETCDCTL_API=3 /opt/etcd/bin/etcdctl --cacert=/opt/etcd/ssl/ca.pem --cert=/opt/etcd/ssl/server.pem --key=/opt/etcd/ssl/server-key.pem --endpoints="三个etcd地址" get /registry/minions/k8s-node1

 

2. 证书颂发后,状态只显示Approved,而没有Issued, node节点里只收到 kubelet-client-key.tmp, 没有生成kubelet.kubeconfig和其他自动生成的kubelet-client证书

 

原因: 部分node节点失控, 占用了 kube-controller-manager处理线程,此时kube-controller-manager里会一直报节点的错误,详情请看上面的第一条故障

解决办法: 提前删除所有node节点,重新按标准流程添加node节点

3. kube-controller-manager和kube-scheduler日志不断报错如下:

No authentication-kubeconfig provided in order to lookup client-ca-file in configmap/extension-apiserver-authentication in kube-system, so client certificate authentication won't work.
No authentication-kubeconfig provided in order to lookup requestheader-client-ca-file in configmap/extension-apiserver-authentication in kube-system, so request-header client certificate authentication won't work.
No authorization-kubeconfig provided, so SubjectAccessReview of authorization tokens won't work.

原因: kubelet证书颂发流程未走完,没有显示Issue状态,因此这两个master组件里会一直报错

解决办法: 彻底删除所有节点, 再kubectl delete csr 证书名  清理所有状态不正常的证书, 重新按标准流程添加节点,重新发证书.

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于在 Ubuntu 18.04.1 上安装 Kubernetes 1.26.3 的教程,可以按照以下步骤进行操作: 1. 更新系统软件包: ``` sudo apt update sudo apt upgrade -y ``` 2. 安装 Docker: ``` sudo apt install docker.io -y sudo systemctl start docker sudo systemctl enable docker ``` 3. 配置 Kubernetes APT 存储库: ``` sudo apt update && sudo apt install -y apt-transport-https curl curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list sudo apt update ``` 4. 安装 Kubernetes 组件: ``` sudo apt install -y kubelet kubeadm kubectl sudo apt-mark hold kubelet kubeadm kubectl ``` 5. 初始化 Kubernetes Master 节点: ``` sudo kubeadm init --pod-network-cidr=10.244.0.0/16 ``` 初始化完成后,将会显示一些指令,类似下面的内容: ``` kubeadm join <master-ip>:<master-port> --token <token> --discovery-token-ca-cert-hash <hash> ``` 6. 设置当前用户的 Kubernetes 配置: ``` mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config ``` 7. 安装网络插件(这里以 Calico 为例): ``` kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml ``` 8. 加入其他节点(如果有的话): 在其他节点上执行第 5 步中的指令,将其加入 Kubernetes 集群。 完成上述步骤后,您应该已经成功安装了 Kubernetes 1.26.3 版本。您可以通过运行 `kubectl get nodes` 命令来验证节点的状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值