Skip to content

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]

选项

选项缩写描述默认值
--portService 公开的端口必填
--protocol端口协议(TCP/UDP/SCTP)TCP
--target-port后端 Pod 的端口(名称或数字)--port 相同
--nameService 名称资源名称
--typeService 类型(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

注意事项

  1. 资源类型:支持 Deployment、ReplicaSet、ReplicationController 和 Pod
  2. 端口配置
    • --port 是 Service 对外暴露的端口
    • --target-port 是 Pod 实际监听的端口
  3. Service 类型选择
    • ClusterIP:仅集群内部访问(默认)
    • NodePort:通过节点 IP 和静态端口访问
    • LoadBalancer:使用云提供商的负载均衡器
    • ExternalName:返回 CNAME 记录
  4. 标签选择器:如果资源没有标签,必须使用 --selector 指定
  5. YAML 替代方案:复杂配置建议使用 YAML 文件创建 Service