k8s Pod服务通过IP对外访问

前言

k8s v1.14.2版本提供了5种访问Pod的方式(hostNetwork,hostPort,NodePort,LoadBalancer和Ingress),但都不符合通过PodIp直接访问容器的需求,这边的需求是直接访问Pod的Ip,并指定Ip创建Pod

外部访问逻辑

指定k8s生成PodIp范围关闭calico默认隧道模式(IPIP),添加路由器路由(PodIP范围内的ip跳转到k8s-master节点),允许k8s-master节点转发并添加iptables转发规则,指定Ip创建Pod(可选,看需求)

操作

以下步骤需要重新搭建

1、修改calico配置文件

修改calico.yaml文件配置

vim calico.yaml

把默认IPIP禁用掉,这一步是因为我们访问是通过传统的BGP模式,而calico默认设置为IPIP模式,这一步是为了统一路由协议,能够正确的转发数据包。修改完成后,k8s会在k8s集群内自动添加内部BGP路由。

# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
  value: "Off"

同时修改value生成范围(与–pod-network-cidr参数一致,这里的192.168.128.0/17范围为192.168.128.0到192.168.255.255)确保k8s的节点不在这个IP范围内,不然会导致很多不可预知的问题。比如coredns启动失败或calico-kube-controllers启动失败,报错(Get https://10.96.0.1:443/api/v1/services?resourceVersion=0: dial tcp 10.96.0.1:443: getsockopt: no route to host.)等问题

- name: CALICO_IPV4POOL_CIDR
  value: "192.168.128.0/17"
2、k8s初始化

kubeadm init时指定 –pod-network-cidr 参数(与calico.yaml中的 CALICO_IPV4POOL_CIDR 保持一致),

我这里执行的命令为

kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=192.168.128.0/17 --apiserver-advertise-address=192.168.1.22 --image-repository registry.aliyuncs.com/google_containers
3、在k8s-master节点打开转发功能和添加路由

打开转发功能

echo 1 > /proc/sys/net/ipv4/ip_forward

配置转发规则(接收192.168.3.0/24段的包,并进行转发)

iptables -I FORWARD -s 192.168.3.0/24 -j ACCEPT
4、在路由器上添加路由

在路由器上添加pod-network-cidr范围内的包下一跳指向k8s-master节点IP

5、指定PodIP创建Pod(可以不指定,k8s会自动分配并添加内部路由,由于特殊需求,我这里是指定的)

样例:指定创建ip为192.168.217.217

vim busybox.yaml
apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
  annotations:
    cni.projectcalico.org/ipAddrs: "[\"192.168.217.217\"]"
spec:
  containers:
  - name: myapp-container
    image: busybox
    command: ['sh', '-c', 'echo Hello Kubernetes! && sleep 3600']

然后看一下

kubectl get pods

创建成功

myapp-pod                                   1/1     Running   0          16s   192.168.217.217   node1   <none>           <none>
6、测试

最后ping一下

[C:\~]$ ping 192.168.217.217

正在 Ping 192.168.217.217 具有 32 字节的数据:
来自 192.168.217.217 的回复: 字节=32 时间=1ms TTL=61
来自 192.168.217.217 的回复: 字节=32 时间=1ms TTL=61
来自 192.168.217.217 的回复: 字节=32 时间=1ms TTL=61
来自 192.168.217.217 的回复: 字节=32 时间=1ms TTL=61

测试成功

Logo

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

更多推荐