kubectl expose -应用暴露
在kubernetes中,Pod是应用程序的载体,我们可以通过Pod的IP来访问应用程序,但是Pod的IP地址不是固定的,这就意味着不方便直接采用Pod的IP对服务进行访问。为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个Pod进行聚合,并且提供一个统一的入口地址,通过访问Service的入口地址就能访问到后面的Pod服务。Service 匹配一组 Pod 是使用 标签(Label)和选择器(Selector), 它们是允许对 Kubernetes 中的对象进行逻辑操作的一种分组原语。
基本语法
bash
kubectl expose RESOURCE NAME [--port=port] [--protocol=TCP|UDP|SCTP] [--target-port=number-or-name] [--name=name] [--type=type] [flags]选项
| 选项 | 缩写 | 描述 | 默认值 |
|---|---|---|---|
--port | 无 | Service 公开的端口 | 必填 |
--protocol | 无 | 端口协议(TCP/UDP/SCTP) | TCP |
--target-port | 无 | 后端 Pod 的端口(名称或数字) | 与 --port 相同 |
--name | 无 | Service 名称 | 资源名称 |
--type | 无 | Service 类型(ClusterIP/NodePort/LoadBalancer/ExternalName) | ClusterIP |
--external-ip | 无 | 外部 IP 地址(仅适用于 NodePort 和 LoadBalancer) | 无 |
--overrides | 无 | 覆盖生成的 Service 的 JSON 配置 | 无 |
--selector | -l | 标签选择器(如果资源没有标签) | 从资源继承 |
--session-affinity | 无 | 会话亲和性(ClientIP/None) | None |
--load-balancer-ip | 无 | 负载均衡器 IP(仅适用于 LoadBalancer 类型) | 无 |
经典案例
bash
# 将 Deployment 暴露为 Service
kubectl expose deployment nginx --port=80 --target-port=80 --type=ClusterIP
# 暴露为 NodePort Service
kubectl expose deployment nginx --port=80 --type=NodePort
# 暴露为 LoadBalancer Service
kubectl expose deployment nginx --port=80 --type=LoadBalancer
# 自定义 Service 名称和端口映射
kubectl expose deployment nginx --name=web-service --port=8080 --target-port=80
# 直接暴露 Pod
kubectl expose pod nginx-pod --port=80 --name=nginx-service
# 使用自定义标签选择器
kubectl expose deployment nginx --port=80 --selector=app=nginx
# 查看端口
kubectl get service
# 删除ClusterIPd的暴露
kubectl delete svc my-nginx注意事项
- 资源类型:支持 Deployment、ReplicaSet、ReplicationController 和 Pod
- 端口配置:
--port是 Service 对外暴露的端口--target-port是 Pod 实际监听的端口
- Service 类型选择:
- ClusterIP:仅集群内部访问(默认)
- NodePort:通过节点 IP 和静态端口访问
- LoadBalancer:使用云提供商的负载均衡器
- ExternalName:返回 CNAME 记录
- 标签选择器:如果资源没有标签,必须使用
--selector指定 - YAML 替代方案:复杂配置建议使用 YAML 文件创建 Service
