[kubernetes] kubectl proxy 让外部网络访问K8S service的ClusterIP

本文介绍如何使用 kubectl proxy 命令配置 Kubernetes API Server 的本地代理,包括监听端口、允许远程访问及认证过程。通过示例演示如何解决未认证提示,并成功访问 API 路径。

使用kubectl proxy命令就可以使API server监听在本地的8001端口上:

$ kubectl proxy --port=8009
Starting to serve on 127.0.0.1:8009

如果想通过其它主机访问就需要指定监听的地址:

$ kubectl proxy --address=0.0.0.0  --port=8009
Starting to serve on [::]:8009

此时通过curl访问会出现未认证的提示:

$ curl -X GET -L http://k8s-master:8009/
<h3>Unauthorized</h3>

设置API server接收所有主机的请求:

$ kubectl proxy --address='0.0.0.0'  --accept-hosts='^*$' --port=8009
Starting to serve on [::]:8009

访问正常:

$ curl -X GET -L http://k8s-master:8009/
{
  "paths": [
    "/api",
    "/api/v1",
    ...
  ]
}
访问正常:

 

curl http://[k8s-master]:8009/api/v1/namespaces/[namespace-name]/services/[service-name]/proxy

### 三级标题:Kubernetes ClusterIP 配置与使用指南 ClusterIPKubernetesService 的默认类型,用于为一组 Pod 提供稳定的内部 IP 地址,使得集群内部可以方便地访问该服务。ClusterIP 仅在集群内部可见,适用于微服务架构中的内部通信场景。 #### ClusterIP 的基本概念 ClusterIP 是由 Kubernetes 自动分配的虚拟 IP 地址,绑定到特定的 Service 上,该 IP 地址在整个集群生命周期内保持不变。即使底层 Pod 被销毁或重新调度,Service 仍可通过 ClusterIP 提供稳定的访问入口。每个 ClusterIP 服务都会在 kube-proxy 中配置相应的 iptables 或 IPVS 规则,将流量转发到后端的 Pod。 #### ClusterIP 的配置方式 创建 ClusterIP 类型的 Service 时,只需在 YAML 文件中将 `type` 字段设置为 `ClusterIP`(也可以省略,因为这是默认值)。例如,定义一个名为 `my-service` 的 Service: ```yaml apiVersion: v1 kind: Service metadata: name: my-service spec: selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376 type: ClusterIP ``` 该配置将为匹配标签 `app: MyApp` 的 Pod 提供一个 ClusterIP 地址,并将流量转发到这些 Pod 的 9376 端口。 #### ClusterIP 的使用场景 ClusterIP 适用于集群内部服务之间的通信,例如后端服务调用数据库或缓存服务。由于 ClusterIP 无法从集群外部访问,因此适合用于构建安全的内部网络环境。例如,在部署 Java 应用时,可以通过 ClusterIP应用访问数据库服务,而无需暴露数据库到外部网络。 #### ClusterIP 的自定义配置 在某些场景下,可能需要为 Service 分配特定的 ClusterIP,而不是由 Kubernetes 自动分配。可以通过在 Service 定义中指定 `clusterIP` 字段实现: ```yaml spec: clusterIP: 10.0.0.100 ``` 需要注意的是,该 IP 必须位于 `service-cluster-ip-range` 指定的 CIDR 范围内,否则 Service 将无法创建。 #### ClusterIP 与 Headless Service 的区别 与 ClusterIP 不同,Headless Service 不分配虚拟 IP,而是直接返回后端 Pod 的 IP 地址。这在需要直接访问 Pod 的场景下非常有用,例如有状态应用的部署。Headless Service 的定义方式如下: ```yaml spec: clusterIP: None ``` 此时,DNS 查询将返回所有匹配 Pod 的 IP 地址列表,而不是 ServiceClusterIP。 #### ClusterIP 的健康检查机制 Kubernetes 通过 kube-proxy 组件维护 ClusterIP 的转发规则,并结合 Pod 的 readinessProbe 检查来确保流量只被转发到健康的 Pod。如果某个 Pod 的健康检查失败,kube-proxy 会自动将其从转发列表中移除,直到其恢复健康。 #### ClusterIP 的性能优化 为了提升 ClusterIP 的转发性能,可以启用 IPVS 模式替代默认的 iptables 模式。IPVS 在大规模服务场景下具有更好的性能表现。启用方式如下: ```bash kubectl edit configmap -n kube-system kube-proxy ``` 将 `mode` 字段设置为 `ipvs`: ```yaml mode: ipvs ``` 保存后,重启 kube-proxy 组件以应用更改。 #### ClusterIP 的故障排查 当 ClusterIP 无法正常工作时,可以使用以下命令进行排查: - 查看 ServiceClusterIP 和端口信息: ```bash kubectl get svc ``` - 查看 Endpoints 对象,确认后端 Pod 的 IP 和端口是否正确: ```bash kubectl get endpoints <service-name> ``` - 检查 Pod 的状态和标签是否匹配 Service 的 selector: ```bash kubectl get pods --show-labels ``` - 查看 kube-proxy 的日志,确认是否有转发规则配置错误: ```bash kubectl logs -n kube-system <kube-proxy-pod-name> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值