k8s骚操作 Pod服务通过IP对外访问&k8s指定IP创建Pod
k8s Pod服务通过IP对外访问前言k8s v1.14.2版本提供了5种访问Pod的方式(hostNetwork,hostPort,NodePort,LoadBalancer和Ingress),但都不符合通过PodIp直接访问容器的需求,这边的需求是直接访问Pod的Ip,并指定Ip创建Pod外部访问逻辑指定k8s生成PodIp范围关闭calico默认隧道模式(IPIP),添加路由器路由(...
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
测试成功
更多推荐
所有评论(0)