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: # 目标 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: /
相关推荐
皮皮蟹虾饺1 小时前
DNS协议指南:从报文格式到安全加密与 K8s 实战
安全·容器·kubernetes
千寻girling2 小时前
记录第一次学习 Docker
学习·docker·容器
迷糊小面包4 小时前
Docker Hadopp集群版部署搭建及常规问题解疑
运维·docker·容器
烁3475 小时前
Docker
运维·docker·容器
网络中的夜鹰6 小时前
轩辕镜像一键安装Docker和Docker Compose脚本
运维·docker·容器
lihongbao806 小时前
kuboard v3创建用户分配命名空间
kubernetes·kuboard
江湖有缘9 小时前
Docker部署HamsterBase Tasks任务管理工具
运维·docker·容器
很楠爱上9 小时前
Docker 从入门到实战:核心概念、微服务编排与环境移植完全指南
docker·微服务·容器
Qres8219 小时前
docker & WSL & Ubuntu安装记录
ubuntu·docker·容器·wsl
java_cj10 小时前
从kubectl源码学pprof:生产环境性能分析的实战指南
运维·云原生·容器·kubernetes