kube-ipam配置和使用说明

news/2024/11/8 20:51:11/

Kube-ipam基于etcd分布式存储实现kubernetes动态IP网络分配管理,确保集群中IP地址的唯一性。Kube-ipam支持给kubernetes集群中的Pod固定IP地址,同时支持resolv.conf的DNS配置。

1. 概述

一些场景往往对IP地址有依赖,需要使用固定IP地址的Pod,可以使用kube-ipam轻松解决这类问题。例如,mysql主从架构的时候,主database与从database之间的同步;例如keepalived做集群HA的时候,两个节点之间检测通信等;例如某些安全防护设备,需要基于IP地址进行网络安全访问策略限制的场景等

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D4KYwfNO-1678290820655)(assets/image-20230308164206-l0orml8.png)]

Kube-ipam 基于etcd分布式存储实现kubernetes动态IP网络分配管理,确保kubernetes集群中的Pod拥有固定的IP地址。在使用kube-ipam配置之后,上图中的fixed-ip Pod在销毁重建之后仍然可以保持原有IP地址的固定不变。
在这里插入图片描述

2. 安装kube-ipam

  • 启用与配置CNI路径

请确保你的kubelet正确的配置了network-plugincni-conf-dircni-bin-dir参数。下面给出一个kubelet的配置示例供你参考:

# cat /etc/systemd/system/kubelet.service 
...
ExecStart=/usr/local/bin/kubelet \
...--network-plugin=cni \--cni-conf-dir=/etc/cni/net.d \--cni-bin-dir=/opt/cni/bin/ \
  • 获取和安装kube-ipam

可以通过下载或编译获得kube-ipam的二进制文件,然后将kube-ipam的二进制文件拷贝到kubernetes node主机的/opt/cni/bin/ 目录中

# wget https://github.com/cloudnativer/kube-ipam/releases/download/v0.2.0/kube-ipam-v0.2.0-x86.tgz
# tar -zxvf kube-ipam-v0.2.0-x86.tgz
# mv kube-ipam-v0.2.0-x86/kube-ipam /opt/cni/bin/kube-ipam

3. /etc/cni/net.d配置

3.1 子网和etcd配置

通过 subnet 参数设置IP子网信息,通过 gateway 设置网关信息。你可以通过 etcdConfig 配置etcd的证书和endpoint地址

编辑所有kubernetes node主机的 /etc/cni/net.d/1-kube-ipam.conf 文件。

# cat /etc/cni/net.d/1-kube-ipam.conf
{"cniVersion":"0.3.1","name": "k8snetwork","type": "macvlan","master": "eth0","ipam": {"name": "kube-subnet","type": "kube-ipam","kubeConfig": "/etc/kubernetes/pki/kubectl.kubeconfig""etcdConfig": {"etcdURL": "https://192.168.1.50:2379,https://192.168.1.58:2379,https://192.168.1.63:2379","etcdCertFile": "/etc/kubernetes/pki/etcd.pem","etcdKeyFile": "/etc/kubernetes/pki/etcd-key.pem","etcdTrustedCAFileFile": "/etc/kubernetes/pki/ca.pem"},"subnet": "10.188.0.0/16","fixedStart": "10.188.0.10","fixedEnd": "10.188.0.255","rangeStart": "10.188.1.0","rangeEnd": "10.188.255.254","gateway": "10.188.0.1","routes": [{"dst": "0.0.0.0/0"}],"resolvConf": "/etc/resolv.conf"}
}

3.2 参数说明

  • type (string, required): 填写CNI插件的类型, 例如 macvlan、ipvlan、kube-router、bridge、calico等(还可以与Multus结合支持更多CNI插件)。
  • routes (string, optional): 要添加到容器命名空间的路由列表。 每个路由都是一个带有“dst”和可选“gw”字段。 如果省略“gw”,将使用“网关”的值。
  • resolvConf (string, optional): 主机上要解析并作为 DNS 配置返回的 resolv.conf 文件路径。
  • etcdConfig:etcd 地址信息的对象
    • etcdURL (string, required): etcd的endpoint URL地址。
    • etcdCertFile (string, required): etcd的cert文件。
    • etcdKeyFile (string, required): etcd的key文件。
    • etcdTrustedCAFileFile (string, required): etcd的ca文件。
    • kubeConfig (string, required): kubernetes集群的kubeconfig文件。
  • ranges, (array, required, nonempty) an array of arrays of range objects:
    • subnet (string, required): 要分配出去的 CIDR 块。
    • rangeStart (string, optional): 从subnet子网内开始分配的IP地址,默认为subnet子网段内的“.2”这个IP地址。
    • rangeEnd (string, optional): 从subnet子网内结束分配的IP地址,默认为subnet子网段内的“.254”这个IP地址。
    • gateway (string, optional): 从subnet子网内分配的网关IP地址,默认为subnet子网段内的“.1”这个IP地址。

提示:ranges可以支持多个子网的配置格式,详见multiple-subnets文档。

4. Kubernetes固定IP容器方法

4.1 固定IP地址配置

pod IP地址的固定分配可以通过在pod的annotations中配置kube-ipam.ipkube-ipam.netmaskkube-ipam.gateway参数来实现。
/etc/cni/net.d/1-kube-ipam.conf中,随机IP地址的范围在rangestartrangeend中设置。没有设置在rangestartrangeend中IP地址段,可以手工分配给固定IP的容器。

如果你需要保持pod的IP地址固定不变, 请不要将 kube-ipam.ip 的值设置在此rangestartrangeend范围内。

新建一个fixed-ip-test-Deployment.yaml ,用来创建一个固定IP的Pod:

# cat fixed-ip-test-Deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:name: fixed-ip-testnamespace: defaultlabels:k8s-app: cloudnativer-test
spec:replicas: 1strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1selector:matchLabels:k8s-app: cloudnativer-testtemplate:metadata:labels:k8s-app: cloudnativer-testannotations:kube-ipam.ip: "10.188.0.216"kube-ipam.netmask: "255.255.0.0"kube-ipam.gateway: "10.188.0.1"spec:containers:- name: fixed-ip-testimage: nginx:1.7.9imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80  
---

说明:

  • 我们可以使用10.188.0.0/16网段中,除了10.188.0.10~10.188.0.200之外的IP地址来分配给Pod。
  • 如果想要创建随机IP的Pod,只需要去掉annotations的kube-ipam.ipkube-ipam.netmaskkube-ipam.gateway配置即可

4.2 创建一个固定IP的Pod

使用 kubectl apply -f 命令来创建固定IP的Pod:

# kubectl apply -f fixed-ip-test-Deployment.yaml
#
# kubectl get pod -o wideNAME                             READY   STATUS    RESTARTS   AGE     IP             NODE   fixed-ip-test-6d9b74fd4d-dbbsd   1/1     Running   0          2d23h   10.188.0.216   192.168.20.21

这个fixed-ip-test-6d9b74fd4d-dbbsd这个Pod就被分配了一个固定不变的IP地址(10.188.0.216)

4.3 销毁重建Pod,IP保持固定不变

使用kubectl delete命令来删除上面这个Pod,kubernetes会自动重建一个新的Pod:

# kubectl delete pod fixed-ip-test-6d9b74fd4d-dbbsd
#
# kubectl get pod -o wideNAME                             READY   STATUS    RESTARTS   AGE   IP             NODE   fixed-ip-test-6d9b74fd4d-xjhek   1/1     Running   0          1h    10.188.0.216   192.168.30.35

新启动的fixed-ip-test-6d9b74fd4d-xjhek这个Pod的IP地址依然是10.188.0.216。

calicoCNI环境使用kube-ipam来固定容器IP的例子,请点击这里查看!

5. 查看日志信息

查看kubernetes node主机上的/var/log/kube-ipam.log文件,可以获取kube-ipam的系统日志信息。

6. 分层网络安全架构

kube-ipam可以与Multus结合来进行组网,这样可以支持更多的CNI插件场景下的容器IP地址固定。例如,我们可以基于kube-ipamMultus实现Web和数据库分层网络安全访问架构,让一个Pod同时支持随机IP和固定IP等多个网络接口。这样的部署方式有利于安全人员把应用网络和数据库等多个网络区域进行相互隔离,有效控制容器集群网络架构。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwHDwKIp-1678290820656)(assets/image-20230308165621-10f1je3.png)]

上图中显示了每个Pod具有2个接口:eth0、net1。eth0作为外界用户访问web pod的网络接口;而net1是附加的容器网卡,作为web Pod到database Pod的内部网络通信。

用户可以通过ingress或service来访问到web服务。web pod可以通过database区域网络,访问固定IP地址的database服务。Database区域网络的database Pod可以互相通过固定IP地址进行集群的通信操作。分层网络安全访问架构的安装与部署过程请点击这里查看。
在这里插入图片描述


http://www.ppmy.cn/news/31148.html

相关文章

JVM调优面试题——垃圾回收专题

文章目录1、如何确定一个对象是垃圾?1.1、引用计数法1.2、可达性分析2、对象被判定为不可达对象之后就“死”了吗?3、都有哪些垃圾收集算法?3.1、 标记-清除(Mark-Sweep)3.2、标记-复制(Mark-Copying)3.3、标记-整理(Mark-Compact)3.4、分代收…

Tomcat源码分析-Session源码解析

Session清理 Background 线程 前面我们分析了 Session 的创建过程,而 Session 会话是有时效性的,下面我们来看下 tomcat 是如何进行失效检查的。在分析之前,我们先回顾下 Container 容器的 Background 线程。 tomcat 所有容器组件&#xf…

一句话设计模式6:享元模式

享元模式:局部单例模式。 文章目录 享元模式:局部单例模式。前言一、享元模式的作用二、如何实现享元模式总结前言 享元模式其实很简单,但是如果用好,确实可以达到减少内存,事半功倍的效果;适合 系统要创建大量相似对象,相同对象等; 一、享元模式的作用 1 享元模式可以解决对象…

【Linux】进程状态(阻塞、挂起、僵尸进程)

文章目录1 阻塞与挂起1.1 阻塞1.2 挂起2 进程状态前言: 当我们在Windows下双击运行一个程序,或是在Linux下通过 ./ 加载运行一个程序,是否就代表对应的进程就一直处在运行状态呢?其实不然,一个进程有许多不同的状态。当…

JDK8新特性宝典

JDK8新特性 ​ Java 是第一大编程语言和开发平台。它有助于企业降低成本、缩短开发周期、推动创新以及改善应用服务。如今全球有数百万开发人员运行着超过 51 亿个 Java 虚拟机,Java 仍是企业和开发人员的首选开发平台 课程内容的介绍 了解Java发展史Lambda表达式…

[Tomcat]解决IDEA中的Tomcat中文乱码问题

目录 1、IDEA 2、VM options 3、IDEA启动程序的存放目录 4、Tomcat 写在前面:此方法亲测有效!!! 1、IDEA 2、VM options 加上这两行: -Dfile.encodingUTF-8 -Dconsole.encodingUTF-8 3、IDEA启动程序的存放目录…

Kubernetes ConfigMap简介

ConfigMap Service是Kubernetes系统中非常重要的一个核心概念,今天来学习另外一个非常重要的资源对象:ConfigMap,我们知道许多应用经常会有从配置文件、命令行参数或者环境变量中读取一些配置信息,这些配置信息我们肯定不会直接写…

华为OD机试 - 端口合并(C 语言解题)【独家】

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧文章目录 使用说明本期题目:端口合并…