k8s之服务发现

在 Kubernetes 中,服务发布是指将应用程序或微服务暴露给集群内部或外部用户访问的过程。Kubernetes 提供多种方式来实现服务发布,包括以下几种常见的方法:

  1. ClusterIP Service:ClusterIP 是默认的 Kubernetes 服务类型,它为在集群内部访问的服务提供了一个虚拟的 IP 地址。使用 ClusterIP Service 可以通过该虚拟 IP 地址进行服务发现和网络通信,但只能在集群内部访问。
  2. NodePort Service:NodePort 服务类型会在每个节点上绑定一个静态端口,并通过该端口来公开服务。这样,您可以通过任何节点的 IP 地址和指定的端口号来访问服务。NodePort 服务适用于需要从集群外部访问服务的场景,但不适合生产环境中大规模的应用程序。
  3. LoadBalancer Service:LoadBalancer 服务类型可以通过云服务提供商的负载均衡器来自动创建公共 IP 地址,并将流量引导到后端 Pod 上。这种方式适用于需要高可用性和负载均衡的生产环境。
  4. Ingress Controller:Ingress 是一种 Kubernetes 的资源对象,用于配置 HTTP 和 HTTPS 流量的入口规则。通过 Ingress Controller,您可以将流量转发到相应的服务和路由上,并且可以配置各种高级功能,如路径匹配、域名重写等。

除了上述方法外,还可以使用其他的服务暴露方式,如外部 DNS 记录、API 网关等。选择适当的服务发布方式取决于您的应用程序需求和环境配置。

在实际使用中,您可以通过定义 Service 资源来指定服务发布的方式,并通过 Service 的选择器与后端 Pod 建立关联。这样,Kubernetes 将自动管理服务的负载和扩展,使得您的应用程序能够方便地被其他组件或用户访问到。

service

Service的定义

命令操作
# 创建 service
kubectl create -f nginx-svc.yaml

# 查看 service 信息,通过 service 的 cluster ip 进行访问
kubectl get svc 

# 查看 pod 信息,通过 pod 的 ip 进行访问
kubectl get po -owide

# 创建其他 pod 通过 service name 进行访问(推荐)
kubectl exec -it busybox -- sh
curl http://nginx-svc

# 默认在当前 namespace 中访问,如果需要跨 namespace 访问 pod,则在 service name 后面加上 .<namespace> 即可
curl http://nginx-svc.default
Endpoint
在 Kubernetes 中,Endpoint 是一种资源对象,用于存储和管理 Service 的后端 Pod 地址信息。当您创建 Service 资源时,Kubernetes 会自动创建对应的 Endpoint 资源,并将 Service 与 Endpoint 建立关联。这样,Kubernetes 就可以根据 Endpoint 中的地址信息来将流量路由到相应的 Pod 上。

具体来说,Endpoint 包含以下信息:

IP 地址:Pod 的 IP 地址。
端口号:Pod 中容器运行的端口号。
Endpoint 维护了一个与 Service 相关联的 Pod 列表,并将它们的 IP 地址和端口号映射到该 Service 的 ClusterIP 上。每当 Pod 发生变化或删除时,Endpoint 也会相应地进行更新,以确保 Service 始终能够找到正确的后端 Pod。

Endpoint 可以通过 kubectl get endpoints 命令来查看和管理。另外,您还可以使用 Kubernetes API 来访问 Endpoint,例如通过 HTTP 或 gRPC 协议访问 API Server,或者使用 Kubernetes 客户端库编写代码进行访问。

总之,Endpoint 是 Kubernetes 中存储和管理 Service 后端 Pod 的地址信息的资源对象。通过 Endpoint,Kubernetes 可以根据 Pod 的 IP 地址和端口号将流量路由到相应的 Service 上,从而实现服务发现和负载均衡的功能。

代理K8s外部服务

  • 各环境访问名称统一

  • 访问k8s集群外的其他服务

  • 项目迁移

    实现方式:
    编写 service 配置文件时,不指定 selector 属性
    自己创建 endpoint
    endpoint 配置:
    apiVersion: v1
    kind: Endpoints
    metadata:
    labels:
    app: wolfcode-svc-external # 与 service 一致
    name: wolfcode-svc-external # 与 service 一致
    namespace: default # 与 service 一致
    subsets:

    • addresses:
      • ip: <target ip> # 目标 ip 地址
        ports: # 与 service 一致
      • name: http
        port: 80
        protocol: TCP

反向代理外部域名

apiVersion: v1
kind: Service
metadata:
  labels:
    app: wolfcode-external-domain
  name: wolfcode-external-domain
spec:
  type: ExternalName
  externalName: www.wolfcode.cn

常用类型

  • ClusterIP

    只能在集群内部使用,不配置类型的话默认就是 ClusterIP

  • ExternalName

    返回定义的 CNAME 别名,可以配置为域名

  • NodePort

    会在所有安装了 kube-proxy 的节点都绑定一个端口,此端口可以代理至对应的 Pod,集群外部可以使用任意节点 ip + NodePort 的端口号访问到集群中对应 Pod 中的服务。

    当类型设置为 NodePort 后,可以在 ports 配置中增加 nodePort 配置指定端口,需要在下方的端口范围内,如果不指定会随机指定端口

    端口范围:30000~32767

    端口范围配置在 /usr/lib/systemd/system/kube-apiserver.service 文件中

  • LoadBalancer

    使用云服务商(阿里云、腾讯云等)提供的负载均衡器服务

Ingress

安装ingress-nginx

安装helm
wget https://get.helm.sh/helm-v3.2.3-linux-amd64.tar.gz
tar -xzvf helm-v3.2.3-linux-amd64.tar.gz 
cd linux-amd64/
cp helm  /usr/local/bin/
helm version
添加helm仓库
# 添加仓库
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx

# 查看仓库列表
helm repo list

# 搜索 ingress-nginx
helm search repo ingress-nginx
下载包
# 下载安装包
helm pull ingress-nginx/ingress-nginx
配置参数
# 将下载好的安装包解压
tar xf ingress-nginx-xxx.tgz

# 解压后,进入解压完成的目录
cd ingress-nginx

# 修改 values.yaml
镜像地址:修改为国内镜像
registry: registry.cn-hangzhou.aliyuncs.com
image: google_containers/nginx-ingress-controller
image: google_containers/kube-webhook-certgen
tag: v1.3.0

hostNetwork: true
dnsPolicy: ClusterFirstWithHostNet

修改部署配置的 kind: DaemonSet
nodeSelector:
  ingress: "true" # 增加选择器,如果 node 上有 ingress=true 就部署
将 admissionWebhooks.enabled 修改为 false
将 service 中的 type 由 LoadBalancer 修改为 ClusterIP,如果服务器是云平台才用 LoadBalancer
创建namespace
# 为 ingress 专门创建一个 namespace
kubectl create ns ingress-nginx
安装ingress
# 为需要部署 ingress 的节点上加标签
kubectl label node k8s-node1 ingress=true

# 安装 ingress-nginx
helm install ingress-nginx ./ingress-nginx -n ingress-nginx  .

基本使用

创建一个ingress
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
  name: wolfcode-nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: # ingress 规则配置,可以配置多个
  - host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service: 
            name: nginx-svc # 代理到哪个 service
            port: 
              number: 80 # service 的端口
        path: /api # 等价于 nginx 中的 location 的路径前缀匹配
多域名配置
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:
  name: wolfcode-nginx-ingress
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules: # ingress 规则配置,可以配置多个
  - host: k8s.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service: 
            name: nginx-svc # 代理到哪个 service
            port: 
              number: 80 # service 的端口
        path: /api # 等价于 nginx 中的 location 的路径前缀匹配
      - pathType: Exec # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service:
            name: nginx-svc # 代理到哪个 service
            port:
              number: 80 # service 的端口
        path: /
  - host: api.wolfcode.cn # 域名配置,可以使用通配符 *
    http:
      paths: # 相当于 nginx 的 location 配置,可以配置多个
      - pathType: Prefix # 路径类型,按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass,具体匹配规则以 IngressClass 中的规则为准。Exact:精确匹配>,URL需要与path完全匹配上,且区分大小写的。Prefix:以 / 作为分隔符来进行前缀匹配
        backend:
          service:
            name: nginx-svc # 代理到哪个 service
            port:
              number: 80 # service 的端口
        path: /
相关推荐
小钟不想敲代码21 分钟前
Docker部署Sentinel
docker·容器·sentinel
上海运维Q先生24 分钟前
面试题整理17----K8s中request和limit资源限制是如何实现的
服务器·云原生·kubernetes
胖毁青春,瘦解百病2 小时前
Docker镜像源设置不生效问题排查
docker·容器
CloudPilotAI2 小时前
15条 Karpenter 最佳实践,轻松掌握弹性伸缩
kubernetes·弹性伸缩·karpenter
会飞的土拨鼠呀2 小时前
Flannel是什么,如何安装Flannel
运维·云原生·kubernetes
ether-lin3 小时前
DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)
ci/cd·kubernetes·devops
Carry_NJ4 小时前
docker-compose样例
运维·docker·容器
勇-子4 小时前
K8s 常用资源介绍
云原生·容器·kubernetes
大G哥4 小时前
k8s创建单例redis设置密码
数据库·redis·云原生·容器·kubernetes
勇-子7 小时前
K8s DaemonSet的介绍
云原生·容器·kubernetes