做动漫网站的心得体会,网站建设产品分类,企业网站的建设费用,h5手机网站建设文章目录 Service 和 IngressServiceEndpointservice 的定义代理集群外部服务反向代理外部域名Service 常用类型 IngressIngress-nginx安装使用 Service 和 Ingress
service 和 ingress 是kubernetes 中用来转发网络请求的两个服务#xff0c;两个服务用处不同#xff0c;se… 文章目录 Service 和 IngressServiceEndpointservice 的定义代理集群外部服务反向代理外部域名Service 常用类型 IngressIngress-nginx安装使用 Service 和 Ingress
service 和 ingress 是kubernetes 中用来转发网络请求的两个服务两个服务用处不同service 主要提供集群内部网络调用、负载均衡(四层负载)ingress 提供外部访问反向代理负载均衡(七层负载) Service
在kubernetes中pod是应用程序的载体我们可以通过pod的ip来访问应用程序但是pod的ip地址不是固定的这也就意味着不方便直接采用pod的ip对服务进行访问。
为了解决这个问题kubernetes提供了Service资源Service会对提供同一个服务的多个pod进行聚合并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务
可以说 Service 是一个应用服务的抽象定义了 Pod 逻辑集合和访问这个 Pod 集合的策略。Service 代理 Pod 集合对外表现为一个访问入口访问该入口的请求将经过负载均衡转发到后端 Pod 中的容器。
Endpoint
每一个service 都会有一个 Endpoint controller 在endponit 里面会维护 addresstargetPort 和 容器之间的关系。整个访问链是 通过 service - endpoint -iptables-kube-proxy - 容器 service 的定义
Yaml 文件案例
apiVersion: v1
kind: Service
metadata:name: nginx-svc # service namelabels:app: nginx-svc # service 自己的标签
spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议支持 TCP、UDP、SCTP默认为 TCPport: 1080 # service 自己的端口targetPort: 80 # 目标 pod 的端口type: NodePort # 默认是ClusterIP 类型只能在集群内部使用 # NodePort 用于将服务暴露给外部访问selector: # 选中当前 service 匹配哪些 pod对哪些 pod 的东西流量进行代理app: nginx使用命令
# 创建 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代理集群外部服务
用于解决外部服务迁移到k8s 集群各个环境访问名称统一容器内部访问外部服务等需求
实现方式 编写 service 配置文件时不指定 selector 属性 apiVersion: v1
kind: Service
metadata:name: nginx-svc # service namelabels:app: nginx-svc # service 自己的标签
spec:ports:- name: http # service 端口配置的名称protocol: TCP # 端口绑定的协议支持 TCP、UDP、SCTP默认为 TCPport: 1080 # service 自己的端口targetPort: 80 # 目标 pod 的端口type: ClusterIP # 默认是ClusterIP 类型只能在集群内部使用 # NodePort 用于将服务暴露给外部访问自己创建 endpoint
apiVersion: v1
kind: Endpoints
metadata:labels:app: nginx-svc-external # 与 service 一致name: nginx-svc-external # 与 service 一致namespace: default # 与 service 一致
subsets: # 子网设置
- addresses:- ip: target ip # 目标 ip 地址ports: # 与 service 一致- name: http # service 中ports.name 属性保持一致port: 80protocol: TCP反向代理外部域名
直接通过在容器内部直接通过外部域名去访问
apiVersion: v1
kind: Service
metadata:labels:app: baidu-external-domainname: baidu-external-domain
spec:type: ExternalNameexternalName: www.baidu.comService 常用类型
Type用途补充ClusterIP只能在集群内部使用不配置类型的话默认就是 ClusterIPExternalName返回定义的 CNAME 别名可以配置为域名LoadBalancer使用云服务商阿里云、腾讯云等提供的负载均衡器服务NodePort在所有安装了 kube-proxy 的节点都绑定一个端口此端口可以代理至对应的 Pod集群外部可以使用任意节点 ip NodePort 的端口号访问到集群中对应 Pod 中的服务。一般用于测试环境生产环境使用ingress
补充 NodePort 映射是一个O(N) 的时间复杂度当节点数越多的时候效率越低内部代码是通过轮询来处理的 当类型设置为 NodePort 后可以在 ports 配置中增加 nodePort 配置指定端口需要在下方的端口范围内如果不指定会随机指定端口 端口范围30000~32767 端口范围配置在 /usr/lib/systemd/system/kube-apiserver.service 文件中 Ingress
Ingress 可以提供外网访问 Service 的能力。可以把某个请求地址映射、路由到特定的 service。
ingress 需要配合 ingress controller 一起使用才能发挥作用ingress 只是相当于路由规则的集合而已真正实现路由功能的是 Ingress Controlleringress controller 和其它 k8s 组件一样也是在 Pod 中运行。 Ingress-nginx
Ingress 是一个更高层的抽象具体实现还需要借助于Ingress controller 列如 Ingress-nginx 其他控制器参考 官网文档 https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress-controllers
安装
参考官网地址https://kubernetes.github.io/ingress-nginx/deploy/#using-helm
官网默认采用helm因此需要先安装helm 下载安装包 wget https://get.helm.sh/helm-v3.14.2-linux-amd64.tar.gztar -zxvf helm-v3.2.3-linux-amd64.tar.gzcp helm /usr/local/bin/ # 添加ingree 仓库
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 --version 4.4.2# 解压安装包
tar -zxvf ingress-nginx-4.4.2.tgz# 解压后进入解压完成的目录
cd ingress-nginx# 修改 values.yaml镜像地址修改为国内镜像registry: registry.cn-hangzhou.aliyuncs.comimage: google_containers/nginx-ingress-controllerimage: google_containers/kube-webhook-certgentag: 两个image 版本保持一致 或者 不动也行hostNetwork: truednsPolicy: ClusterFirstWithHostNet修改部署配置的 kind: /DaemonSet # Deployment 改成 DaemonSetnodeSelector:ingress: true # 增加选择器如果 node 上有 ingresstrue 就部署将 admissionWebhooks.enabled 修改为 false将 service 中的 type 由 LoadBalancer 修改为 ClusterIP如果服务器是云平台才用 LoadBalancer# 为 ingress 专门创建一个 namespace
kubectl create ns ingress-nginx# 为需要部署 ingress 的节点上加标签
kubectl label node k8s-master ingresstrue# 安装 ingress-nginx
helm install ingress-nginx -n ingress-nginx .使用
apiVersion: networking.k8s.io/v1
kind: Ingress # 资源类型为 Ingress
metadata:name: demo-nginx-ingressannotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/rewrite-target: / # 重写路径
spec:rules: # ingress 规则配置可以配置多个- host: k8s.demo.cn #域名配置可以使用通配符 * 可以配置多个host 也可以不配置host 直接通过ip:port 方式访问 配置了host 就只能通过host 不能选择ip:port 的形式http:paths: # 相当于 nginx 的 location 配置可以配置多个 paths- path: /api # 等价于 nginx 中的 location 的路径前缀匹配pathType: Prefix # 路径类型按照路径类型进行匹配 ImplementationSpecific 需要指定 IngressClass具体匹配规则以 IngressClass 中的规则为准。Exact精确匹配URL需要与path完全匹配上且区分大小写的。Prefix以 / 作为分隔符来进行前缀匹配backend:service: name: nginx-svc # 代理到哪个 serviceport: # 可以直接写 80 也可以如下写法number: 80 # service 的端口