k8s之PodIP、ClusterIP和ExternalIP

k8s之PodIP、ClusterIP和ExternalIP

k8s之PodIP、ClusterIP和ExternalIP - yuxi_o - 博客园icon-default.png?t=M0H8https://www.cnblogs.com/embedded-linux/p/12657128.html

关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿!

 

Pod IP

Kubernetes的最小部署单元是Pod。利用Flannel作为不同HOST之间容器互通技术时,由Flannel和etcd维护了一张节点间的路由表。Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且”不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

每个Pod启动时,会自动创建一个镜像为gcr.io/google_containers/pause:0.8.0的容器,容器内部与外部的通信经由此容器代理,该容器的IP也可以称为Pod IP。

Service ClusterIP

Service是Kubernetes最核心的概念,通过创建Service,可以为一组具有相同功能的容器用用提供一个统一的入口地址,并且将请求进行负载分发到后端的各个容器应用上。

Pod IP 地址是实际存在于某个网卡(可以是虚拟设备)上的,但没有网络设备为Service Cluster IP负责。

它是由kube-proxy使用Iptables规则重新定向到其本地端口,再均衡到后端Pod的。这个地址从我们启动API的service-cluster-ip-range参数(旧版本为portal_net参数)指定的地址池中分配,比如–service-cluster-ip-range=10.0.0.0/16。假设这个Service的端口是1234。集群内的所有kube-proxy都会注意到这个Service。当proxy发现一个新的service后,它会在本地节点打开一个任意端口,建相应的iptables规则,重定向服务的IP和port到这个新建的端口,开始接受到达这个服务的连接。

当一个客户端访问这个service时,这些iptable规则就开始起作用,客户端的流量被重定向到kube-proxy为这个service打开的端口上,kube-proxy随机选择一个后端pod来服务客户。这个流程如下图所示:

根据Kubernetes的网络模型,使用Service Cluster IP和Port访问Service的客户端可以坐落在任意代理节点上,只能Cluster内部访问。外部要访问Service,我们就需要给Service外部访问IP。

External IP

外部访问Service的方式有两种:

1)通过设置nodePort映射到物理机,同时设置Service的类型为NodePort。

2)通过设置LoadBalancer映射到云服务上提供的LoadBalancer地址。这种用法仅用于公有云服务提供商的云平台设置Service的场景。对该Service的请求将会通过LoadBalancer转发到后端Pod上,负载分发的实现方式则依赖于云服务商提供的LoadBalancer的实现机制。

示例:

创建一个基于nginx的deployment

kubectl run nginx --image=nginx:maxline

ExternalIP方式提供外部Service服务(包含Cluster IP和External IP)

kubectl expose deployment nginx --type=LoadBalancer --port=80 --target-port=80

type的类型选择为LoadBalancer, --port指定的是80端口,意思是这个service对外界暴露出来的服务端口是80,--target-port=80,这个端口是pod内部的nginx docker容器提供服务的工作端口,默认为80。

kubectl get svc获取External IP和端口,通过External:port外部访问Service。

NodePort方式提供外部Service服务

kubectl expose deployment nginx --type=NodePort --port=80 --target-port=80

kubectl get svc获取nodePort端口, 随便使用任意一个node的external IP地址+nodePort端口外部访问Service。

附:Pod的端口转发功能

有时我们出于测试的目的,需要一种简单的办法查看一个pod是否能正常提供服务。如果每次通过kubectl的方式创建service就太麻烦了。

这里介绍一种简单的办法:pod的端口转发功能(port forward)。

比如我们想测试下图get pods返回的第一个pod的功能,名称为nginx-6f754dd4b9-74jdn:

 执行命令行 kubectl port-forward pod/nginx-6f754dd4b9-74jdn 8080:80

看到提示信息Forwarding from 127.0.0.1:8080 -> 80, 意思是把当前主机的8080端口映射到nginx pod的80工作端口: 

最后,就能够通过localhost:8080直接访问nginx pod提供的服务了。

 关注公众号 风色年代(itfantasycc) 300G微服务资料等你拿!

参考:

1. Kubernetes中的PodIP、ClusterIP和外部IPicon-default.png?t=M0H8https://www.2cto.com/net/201702/595150.html

2. 一个简单的例子理解Kubernetes的三种IP地址类型icon-default.png?t=M0H8https://www.jianshu.com/p/a45dca185afb

### 微信公众号IP白名单配置 对于微信公众号而言,设置IP白名单是为了确保只有指定的服务器可以合法地调用微信接口。这通常涉及到开发者中心的安全设置页面,在那里可以选择添加信任的服务器IP地址。 当涉及Kubernetes环境时,考虑到理想情况下不应开放Kubernetes Master节点公网访问,并且应限制能访问集群Master节点的IP地址[^1],因此建议采取如下措施来管理配置用于微信服务的Pod或应用: - **内部通信优化**:尽可能减少对外部网络依赖,利用Service资源对象实现微服务间高效稳定的内网互通。 - **入口控制器(Ingress Controller)部署**:如果需要提供外网接入能力,则可以通过安装Nginx或其他类型的入口控制器来统一管理进出流量。此时可以根据实际需求设定相应的转发策略安全规则。 - **云服务商特性运用**:假如是在公有云上构建Kubernetes集群,那么还可以借助于各平台特有的网络安全功能,比如阿里云的安全组、腾讯云VPC防火墙等手段进一步增强防护力度。例如,可通过调整安全组规则仅允许特定源地址范围内的请求到达承载着微信业务逻辑的应用实例所在主机。 关于具体操作步骤方面,假设已经拥有了一个正在运行中的Kubernetes集群,并打算在此基础上为微信公众号关联的服务程序实施上述提到的一些做法: #### 使用命令行工具`kubectl` 为了简化说明过程,这里给出一段Python脚本作为例子展示怎样动态获取当前集群中某类工作负载所占用的真实物理机位置信息并据此更新至微信公众平台上相应字段里去。 ```python import subprocess def get_node_ips(): result = subprocess.run(['kubectl', 'get', 'nodes', '-o=jsonpath={.items[*].status.addresses[?(@.type=="ExternalIP")].address}'], capture_output=True, text=True) return result.stdout.split() if __name__ == '__main__': node_ips = get_node_ips() print(f"Current cluster nodes' external IPs are {node_ips}. Please add these to WeChat Official Account's whitelist.") ``` 此段代码会查询所有节点的状态详情并将其中属于外部可达性的那一项提取出来形成列表形式返回给调用者;之后便可以在控制台输出提示语句指导管理员完成后续动作。 另外需要注意的是,由于Kubernetes本身并不直接参与决定Pod层面具体的IP数值——这项任务是由像Calico这样的第三方插件协同kubelet共同完成的[^2]——所以在大多数场景下没有必要也无法针对单个容器单独申请固定不变的互联网协议版本四号标识符供外界识别使用。相反,应该更多关注如何合理规划整个架构体系下的路由路径设计从而间接达成目的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值