【Kubernetes】Service 类型:NodePort、ClusterlP、LoadBalancer、ExternalName

Service 服务》系列,共包含以下文章:

😊 如果您觉得这篇文章有用 ✔️ 的话,请给博主一个一键三连 🚀🚀🚀 吧 (点赞 🧡、关注 💛、收藏 💚)!!!您的支持 💖💖💖 将激励 🔥 博主输出更多优质内容!!!

在《Service 概念与实战》一文中,Service 的发布使用的是 NodePort 类型。除此之外,Service 的发布还支持 ClusterlPLoadBalancerExternalName 这 3 种类型。

在这里插入图片描述

1.NodePort

在把 Service 的 type 字段设置为 NodePort 时,Kubernetes 将在每个节点上随机分配一个端口作为外部用户访问的入口(该端口号的默认范围是 30000 - 32767)。该端口允许外部用户访问集群内部的 Pod 应用。如果用户想指定 30000 - 32767 内某个具体的端口,则需要增加一个 nodePort 字段。

在这里插入图片描述

在以下 YAML 文件中,使用 nodePort 字段指定了一个自定义的端口号 31234

apiVersion: v1
kind: Service
metadata:
  name: service-demo2
  namespace: default
spec:
  # 这里使用 NodePort 类型的 Service 将应用程序暴露给外部
  type: NodePort 
  ports:
  - name: http
  	# 为方便起见,一般将 targetport 字段的值设置为与 port 字段相同的值
    port: 80
    targetPort: 80
    # 可选字段,自定义端口号
	nodePort: 31234
    protocol: TCP
  # 定义标签选择器,将服务 Service 与匹配便签的一组 Pod 关联起来
  selector:     
    app: nginx
端口类型
说明
nodePort外部机器可访问的端口,一般为 node 机器上开放的端口。nodePort 是 kubernetes 提供给集群外部客户访问 Service 入口的一种方式。
portKubernetes 中的服务之间访问的端口,是提供给集群内部客户访问 Service 的入口。例如,尽管 MySQL 容器暴露了 3306 端口,但是集群内其他容器需要通过 3306 端口访问该服务,外部机器不能访问 MySQL 服务,因为没有配置 nodePort 类型。
targetPorttargetPort 是 Pod 上的端口,容器的端口(最根本的端口入口),与制作容器时暴露的端口一致(DockerFile 中 EXPOSE),例如 docker.io 官方的 nginx 暴露的是 80 端口。从 portnodePort 上到来的数据最终经过 kube-proxy 流入到后端 Pod 的 targetPort 上进入容器。
containerPortcontainerPort 是在 Pod 控制器中定义的、Pod 中的容器需要暴露的端口。targetPortcontainerPort 必须一致。

在这里插入图片描述

2.ClusterlP

这是 Service 默认的发布类型。它将在集群内部分配一个可以访问的虚拟 IP 地址,通过该地址暴露服务。因此,这种类型的 Service 只能够实现 同一个集群内部应用之间的相互访问

在这里插入图片描述

下面来演示 ClusterIP 的使用。

通过 Deployment 创建应用的部署描述文件 service-clusterip1.yaml,并在其中输入以下内容。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name:  service-clusterip
spec:
  replicas: 3 
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx

使用 kubectl apply 命令创建 Deployment。

kubectl apply -f service-clusterip1.yaml

创建 Service 的描述文件 service-clusterip2.yaml,并在其中输入以下内容。

apiVersion: v1
kind: Service
metadata:
  name: service-clusterip
  namespace: default
spec:
  ports:
  - name: http
    port: 1234
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx

这里没有指定 Service 的发布类型,默认就是 ClusterIP。同时这里将容器中的 80 端口暴露成了 1234 端口。

🚀 也可以使用 kubectl expose deployment my-deployment --port=1234 --target-port=80 --name=my-service 命令暴露应用。在这个例子中,my-deployment 是 Deployment 的名称,my-service 是 Service 的名称,--port=1234 是 Service 的端口,--target-port=80 是 Deployment 内部容器的端口。

使用 kubectl apply 命令创建 Service。

kubectl apply -f service-clusterip2.yaml

查看 Pod、Service 和 Endpoint 的详细信息。

kubectl get pod,svc,ep -o wide

输出的信息如下:

在这里插入图片描述

通过 Cluster IP 地址访问应用,将返回 Nginx 的首页。

curl 10.96.206.202:1234

在这里插入图片描述

3.LoadBalance

如果要使用外部的负载均衡器来访问应用(如 Google Cloud、AWS 和 OpenStack 等),则可以通过使用 LoadBalancer 类型的 Service 将 Kubernetes 集群中的 IP 地址和端口号自动加入公有云的 LoadBalancer 中,从而异步地实现负载均衡。

在这里插入图片描述
在以下 YAML 示例文件中,使用阿里云作为 Kubernetes 集群的外部负载均衡器。

apiVersion: v1
kind: Service
metadata:
  name: service-loadbalancer
  labels:
    app: service-loadbalancer
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
    name: main-port
  selector:
    app: service-loadbalancer
  type: LoadBalancer
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: alicloud-controller-manager
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: alicloud-controller-manager
    spec:
      containers:
      - image: collenzhao/alicloud-controller-manager
        name: alicloud-controller-manager
        env:
          - name: ACCESS_KEY_ID
            value: 你的阿里云 ACCESS_KEY_ID
          - name: ACCESS_KEY_SECRET
            value: 你的阿里云ACCESS_KEY_SECRET

在这里插入图片描述

4.ExternalName

ExternalName 类型的 Service 可以将一个已经存在的 Service 映射到外部的 DNS 服务,而达到通过使用外部 DNS 服务解析服务应用的目的。
在这里插入图片描述
下面是 Kubernetes 官方提供的一个示例。

apiVersion: v1
kind: Service
metadata:
  name: my-service
  namespace: prod
spec:
  type: ExternalName
  externalName: my.database.example.com

🚀 在查找主机 my-service.prod.svc.cluster.local 时,Kubernetes 集群的 DNS 服务将返回 my.database.example.com

<think>嗯,用户想了解如何使用Deployment和ServiceNodePort/LoadBalancer)部署Ingress控制器。这个问题需要分步骤解释,因为Ingress本身不是服务类型,而是通过Ingress控制器实现的。 用户提供的引用材料很有帮助:引用[1]详细说明了Deployment的功能,包括管理Pod副本和滚动更新;引用[2][3]解释了NodePort类型Service的工作原理;引用[4]提到了一些K8s基础组件。这些正好是部署Ingress控制器所需的核心知识。 需要重点说明的是:Ingress控制器本质上就是个特殊Pod,所以可以用Deployment部署。而为了让外部访问,需要给它创建Service,这里NodePortLoadBalancer都是可选方案。NodePort适合测试环境,LoadBalancer更适合生产环境。 准备分四部分回答:先解释Ingress控制器的部署逻辑,然后分别说明Deployment配置、Service配置,最后补充实际使用步骤。每个配置部分都会给出yaml示例,特别要标注出NodePortLoadBalancer的关键区别。 用户可能是K8s中级学习者,ta能准确说出"NodePort/LoadBalancer"这些术语,说明对Service类型有基础认知。但可能混淆了Ingress和Ingress控制器的概念,这点需要在回答开头就澄清。 最后考虑生成三个延伸问题:第一个关于Ingress控制器的高可用部署,这是生产环境常见需求;第二个关于HTTPS配置,涉及实际应用安全;第三个比较不同Ingress方案,帮助用户拓宽视野。这些问题都围绕用户当前知识深度合理延伸。</think>以下是使用 Deployment 和 Service (NodePort/LoadBalancer) 部署 Ingress 控制器的详细步骤: ### 核心概念 1. **Ingress 控制器**:是一个特殊的 Pod(如 Nginx Ingress Controller、Traefik),负责解析 Ingress 规则并配置负载均衡器。 2. **Deployment**:用于部署和管理 Ingress 控制器的 Pod 副本[^1]。 3. **Service**:暴露 Ingress 控制器供外部访问。通常使用: * `NodePort`:通过集群节点的 IP 和端口访问(适合测试/简单环境)[^2][^3]。 * `LoadBalancer`:由云平台自动创建外部负载均衡器(推荐生产环境)[^3]。 ### 部署步骤 #### 1. 部署 Ingress 控制器 (Deployment) 创建 YAML 文件(如 `ingress-controller-deployment.yaml`): ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: nginx-ingress-controller namespace: ingress-nginx # 建议使用独立命名空间 spec: replicas: 2 # 副本数 selector: matchLabels: app: nginx-ingress template: metadata: labels: app: nginx-ingress spec: containers: - name: nginx-ingress-controller image: registry.k8s.io/ingress-nginx/controller:v1.10.0 # 使用官方镜像 args: - /nginx-ingress-controller - --publish-service=$(POD_NAMESPACE)/nginx-ingress-service # 关联Service - --election-id=ingress-controller-leader - --ingress-class=nginx - --configmap=$(POD_NAMESPACE)/nginx-configuration env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace ports: - name: http containerPort: 80 - name: https containerPort: 443 livenessProbe: httpGet: path: /healthz port: 10254 scheme: HTTP readinessProbe: httpGet: path: /healthz port: 10254 scheme: HTTP ``` 应用配置: ```bash kubectl apply -f ingress-controller-deployment.yaml ``` #### 2. 暴露 Ingress 控制器 (Service) * **方式一:NodePort Service** (适合测试/无云平台环境) ```yaml apiVersion: v1 kind: Service metadata: name: nginx-ingress-service namespace: ingress-nginx spec: type: NodePort selector: app: nginx-ingress # 匹配Deployment的Pod标签 ports: - name: http port: 80 # Service端口(集群内访问) targetPort: 80 # Pod端口 nodePort: 30080 # 集群节点端口(外部访问端口,范围30000-32767)[^2][^3] - name: https port: 443 targetPort: 443 nodePort: 30443 ``` **访问方式**:`http://<任意NodeIP>:30080` * **方式二:LoadBalancer Service** (推荐生产环境/云平台) ```yaml apiVersion: v1 kind: Service metadata: name: nginx-ingress-service namespace: ingress-nginx spec: type: LoadBalancer selector: app: nginx-ingress ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 # 云平台特定注解(示例) # annotations: # service.beta.kubernetes.io/aws-load-balancer-type: nlb # cloud.google.com/load-balancer-type: "Internal" # GCP内网LB ``` **访问方式**:云平台分配的负载均衡器外部 IP(如 `http://<LB-IP>`) 应用 Service 配置: ```bash kubectl apply -f ingress-controller-service.yaml ``` #### 3. 部署应用并创建 Ingress 规则 * **部署示例应用 (Deployment & Service)**: ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: my-app spec: replicas: 3 selector: matchLabels: app: my-app template: metadata: labels: app: my-app spec: containers: - name: my-app image: my-app-image:latest ports: - containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: my-app-service spec: selector: app: my-app ports: - protocol: TCP port: 80 # Service端口 targetPort: 8080 # Pod端口 ``` * **创建 Ingress 规则**: ```yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: my-app-ingress spec: ingressClassName: nginx # 指定使用的Ingress控制器类 rules: - host: myapp.example.com # 域名 http: paths: - path: / pathType: Prefix backend: service: name: my-app-service # 指向后端Service port: number: 80 # Service端口 ``` #### 4. 验证 1. 检查 Ingress 控制器 Pod 状态:`kubectl get pods -n ingress-nginx` 2. 检查 Service 外部 IP/NodePort:`kubectl get svc -n ingress-nginx` 3. 检查 Ingress 规则:`kubectl get ingress` 4. 使用 `curl` 或浏览器访问配置的域名或 Service 的外部端点。 ### 关键点总结 1. **Deployment 管理控制器 Pod**:确保 Ingress 控制器高可用[^1]。 2. **Service 暴露控制器**: * `NodePort`:通过节点 IP+端口访问,需手动管理流量/防火墙[^2][^3]。 * `LoadBalancer`:由云平台提供外部 IP 和负载均衡,是生产环境首选[^3]。 3. **Ingress 定义路由规则**:将外部 HTTP(S) 流量路由到集群内部 Service。 4. **控制器处理规则**:Ingress 控制器 Pod 持续监控 Ingress 资源变化并实时更新代理配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据与AI实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值