[固定容器IP地址]轻量级kube-ipam帮你实现K8S容器IP地址固定不变

不知道你有没有遇到过这样的情况,某些场景必须得把容器的IP地址固定下来才行,例如某些数据库集群内部通信、某些HA主备切换场景、企业的历史包袱迁移问题、使用容器模拟虚拟机效果、某些安全防护设备需要基于IP地址进行网络安全访问策略限制的场景等。那么云君今天就来介绍两种帮你固定容器IP地址的方法。

[1] 固定Docker容器IP地址

首先来说说Docker容器如何固定IP地址。其实Docker自带的network功能就可以很轻松的实现容器的IP地址固定,而且重启之后IP地址也不会改变。

图片

给docker0网桥(你也可以通过docker network命令自己增删修改网桥)配置一个自定义的网桥IP地址,假设这里设置的网段为10.123.20.0/24,网桥的IP地址为10.123.20.1。

# vi /etc/docker/daemon.json   {"bip": "10.123.20.1/24"}

然后在运行容器的时候带上“--ip”参数,在参数后面指定一个10.123.20.0/24网段的IP地址即可:

# docker run -id --ip 10.123.20.38 --name web nginx  /bin/bash

你通过“docker exec -it web ifconfig”命令或登录到容器中就可以查看到容器的IP地址为“10.123.20.38”了。此时,即便是容器挂掉了重新启动也是固定不变的这个IP地址。

固定Docker容器的IP地址比较简单方便,但是要固定K8S的容器IP地址就比较麻烦了。K8S的诞生就是为了云原生,把容器的IP地址固定下来似乎有点背道而驰的感觉。梦想是如此的美妙,而在企业中(尤其是传统型企业),存在着许多技术与非技术历史包袱、办公室政治、某些技术难题场景,在团队HC资源与成本ROI的不断助攻之下,有时候不得不向现实低头。

下面介绍一种基于轻量级的kube-ipam,帮你轻松实现K8S容器的IP地址永久固定不变的方法,或许对你的工作有帮助。

[2] 固定Kubernetes容器IP地址

Kube-ipam 基于etcd分布式存储实现kubernetes动态IP网络分配管理,确保kubernetes集群中的Pod拥有固定的IP地址。

图片

你可以在https://github.com/cloudnativer/kube-ipam/releases下载获得kube-ipam的二进制文件。只需要将kube-ipam的二进制文件拷贝到kubernetes node主机的/opt/cni/bin/ 目录中即完成kube-ipam的安装。

# 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

假如你的K8S容器网段为10.188.0.0/16,k8s-node上同时存在固定IP的Pod和随机IP的Pod。其中,固定IP的Pod(例如下图中的fixed-ip Pod)应该在销毁重建之后依然可以保持原有IP地址的固定不变。

图片

2.1 配置CNI Config文件

编辑或新建kubernetes node主机的/etc/cni/net.d/1-kube-ipam.conf 文件,给你的CNI插件植入kube-ipam定海神针吧:

# vi /etc/cni/net.d/1-kube-ipam.conf{       "cniVersion": "0.3.1",        "name": "k8snetwork",        "type": "macvlan",        "master": "eth1",        "ipam": {                "name": "kube-subnet",                "type": "kube-ipam",                "kubeConfig": "/etc/kubernetes/pki/kubectl.kubeconfig"                "etcdConfig": {                       "etcdURL":"https://192.168.1.50: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",                "rangeStart":"10.188.0.10",                "rangeEnd":"10.188.0.200",                "gateway":"10.188.0.1",                "routes": [{                        "dst":"0.0.0.0/0"                }],                "resolvConf":"/etc/resolv.conf"        }}

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

  • type (string, required): 填写CNI插件的类型, 例如 macvlan、ipvlan、kube-router、bridge等,可结合multus支持更多CNI插件。

  • routes (string, optional): 要添加到容器命名空间的路由列表。每个路由都是一个带有“dst”和可选“gw”字段。如果省略“gw”,将使用“网关”的值。

  • resolvConf (string, optional): 主机上要解析并作为 DNS 配置返回的 resolv.conf 文件路径。

  • 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地址。

  • etcdConfig:etcd 地址信息的对象

    • etcdURL (string,      required): etcd的endpoint URL地址。

    • etcdCertFile (string,      required): etcd的cert文件。

    • etcdKeyFile (string,      required): etcd的key文件。

    • etcdTrustedCAFileFile (string,      required): etcd的ca文件。

2.2 编辑创建Pod的YAML

pod IP地址的固定分配可以通过在pod模板的annotations中配置kube-ipam.ip、kube-ipam.netmask和kube-ipam.gateway参数来实现。在/etc/cni/net.d/1-kube-ipam.conf中,随机IP地址的范围在rangestart和rangeend中设置。没有设置在rangestart和rangeend中IP地址段,可以手工分配给固定IP的容器。换句话说,如果你需要保持pod的IP地址固定不变,请不要将 kube-ipam.ip 的值设置在此rangestart和rangeend范围内。

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

# vi fixed-ip-test-Deployment.yaml---apiVersion:apps/v1kind:Deploymentmetadata:  name: fixed-ip-test  namespace: default  labels:    k8s-app: cloudnativer-testspec:  replicas: 1  strategy:    type: RollingUpdate    rollingUpdate:      maxUnavailable: 1  selector:    matchLabels:      k8s-app: cloudnativer-test  template:    metadata:      labels:        k8s-app: cloudnativer-test      annotations:        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-test        image: nginx:1.7.9        imagePullPolicy: IfNotPresent        ports:        - name: http          containerPort: 80 ---

在本例中,我们可以使用10.188.0.0/16网段中(除了10.188.0.10~10.188.0.200之外)的IP地址来分配给Pod。

提示:如果想要创建随机IP的Pod,只需要去掉Pod模块annotations中的kube-ipam.ip、kube-ipam.netmask和kube-ipam.gateway配置即可。

2.3 创建固定IP地址的Pod

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

# kubectl apply -f fixed-ip-test-Deployment.yaml## kubectl get pod -o wide  NAME                             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被调度到192.168.20.21这台k8s-node主机上,并被分配了一个固定不变的IP地址(10.188.0.216)。

2.4 销毁重建Pod地址固定不变

现在你可以任意的重启、销毁重建、漂移这个Pod,它的IP都会固定不变了。在本例中,我们使用kubectl delete命令来删除上面这个Pod,kubernetes会自动重建一个新的Pod。​​​​​​​

# kubectl delete pod fixed-ip-test-6d9b74fd4d-dbbsd## kubectl get pod -o wide  NAME                             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已经漂移到了192.168.30.35这台k8s-node主机上,但是它的IP地址依然是10.188.0.216。

是不是感觉基于kube-ipam固定K8S容器的IP地址非常简单上手!

今天云君分别演示了Docker和K8S中如何固定容器IP地址的方法,希望对你的工作和研究有帮助。

我们下期再见!
 

参考文档:

  • https://github.com/cloudnativer/kube-ipam

  • https://cloudnativer.github.io/kube-ipam.html

  • https://github.com/cloudnativer/kube-ipam/releases

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值