Service发现1

26 篇文章 0 订阅

主要内容

  1. Service
  2. Ingress

预备知识
Service是Kubernetes中的一种抽象,用于定义一组Pod的访问方式和网络策略。Service提供了一个稳定的虚拟IP地址和一个DNS名称,用于将流量路由到后端Pod。

Service的主要作用包括:

  1. 服务发现:通过Service的虚拟IP地址和DNS名称,其他应用或服务可以方便地发现和访问后端Pod。

  2. 负载均衡:Service可以将流量均匀地分发到后端Pod,实现负载均衡,提高应用的可用性和性能。

  3. 会话保持:Service可以通过设置Session Affinity,将同一会话的请求路由到同一个后端Pod,确保会话的连续性。

  4. 网络策略:通过Service可以定义访问控制策略,限制流量只能从特定的IP范围或特定的命名空间访问。

Service的用法如下:

  1. 创建Service:可以通过YAML文件或命令行创建Service。YAML文件中需要指定Service的名称、标签选择器用于选择后端Pod、服务端口和协议等信息。

  2. 访问Service:通过Service的虚拟IP地址或DNS名称,可以从集群内部或外部访问Service。可以使用kubectl get services命令查看Service的详细信息,包括虚拟IP地址和端口。

  3. 负载均衡:Service可以将流量均匀地分发到后端Pod。可以通过设置Service的类型为LoadBalancerNodePort来实现负载均衡。

  4. 会话保持:可以通过设置Service的Session Affinity为ClientIP,将同一会话的请求路由到同一个后端Pod,确保会话的连续性。

  5. 网络策略:可以通过设置Service的访问控制策略,限制流量只能从特定的IP范围或特定的命名空间访问。

  6. 更新和删除Service:可以通过修改或删除Service的YAML文件,或使用kubectl editkubectl delete命令来更新和删除Service。

总结来说,Service是Kubernetes中用于定义一组Pod的访问方式和网络策略的抽象。通过Service,可以实现服务发现、负载均衡、会话保持和网络策略等功能,提高应用的可用性和性能。


一.Service

Pod 是非永久性资源,每个 Pod 都有自己的 IP 地址,这导致了一个问题: 如果一组 Pod(称为“后
端”)为集群内的其他 Pod(称为“前端”)提供功能, 那么前端如何找出并跟踪要连接的 IP 地址,
以便前端可以使用提供工作负载的后端部分?Kubernetes 通过 service 实现这一功能。

在这里插入图片描述

iptables 代理模式的 Service:

kube-proxy 会监视 Kubernetes 控制节点对 Service 对象和 Endpoints 对象的添加和移除。对每个 Service,它会配置 iptables 规则,从而捕获到达该 Service 的clusterIP 和端口的请求,进而将请求重定向到 Service 的一组后端中的某个 Pod 上面。对于每个 Endpoints 对象,它也会配置 iptables 规则,这个规则会选择一个后端组合。默认的策略是,kube-proxy 在iptables 模式下随机选择一个后端。
使用 iptables 处理流量具有较低的系统开销,因为流量由 Linux netfilter 处理,而无需在用户空间和内核空间之间切换。

IPVS 代理模式的 Service:

在 IPVS (IP Virtual Server)模式下,kube-proxy 监视 Kubernetes 服务和端点,调用netlink 接口相应地创建 IPVS 规则,并定期将 IPVS 规则与 Kubernetes 服务和端点同步。该控制循环可确保 IPVS 状态与所需状态匹配。访问服务时,IPVS 将流量定向到后端 Pod 之一。
IPVS 代理模式基于类似于 iptables 模式的 netfilter 挂钩函数,但是使用哈希表作为基础数据结构,并且在内核空间中工作, 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。与其他代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。

1.service,用NGINX镜像准备一个3副本的deployment作为后端,并开放80端口。

代码如下(示例):
cat > deployment-service.yml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-servicetest
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
EOF

2.然后用kubectl expose 的命令创建一个针对deployment的服务,并查询endpoint是否准备就绪。

代码如下(示例):
kubectl create -f deployment-service.yml
kubectl expose deployment nginx-deployment-servicetest --port=9000 --name=myservice --target-port=80 --type=NodePort
kubectl get service,endpoints
curl http://192.168.30.130:31537

在这里插入图片描述

kubectl delete service myservice

在这里插入图片描述

3.解释

让我来解释每一句命令的含义:

  1. cat > deployment-service.yml <<EOF:这是一个shell命令,用于创建一个名为deployment-service.yml的文件,并将后续输入的内容写入该文件。

  2. apiVersion: apps/v1:指定使用的Kubernetes API版本。

  3. kind: Deployment:定义创建的资源类型为Deployment。

  4. metadata:定义Deployment的元数据,包括名称和标签。

  5. replicas: 3:指定Deployment副本数为3,即创建3个Pod副本。

  6. selector:定义用于选择Pod的标签选择器。

  7. template:定义用于创建Pod的模板。

  8. containers:定义Pod中的容器配置。

  9. image: nginx:指定容器使用的镜像为nginx。

  10. imagePullPolicy: IfNotPresent:指定镜像拉取策略为如果本地不存在则拉取。

  11. ports:定义容器监听的端口。

  12. kubectl create -f deployment-service.yml:使用kubectl命令创建Deployment,根据提供的YAML文件进行配置。

  13. kubectl expose deployment nginx-deployment-servicetest --port=9000 --name=myservice --target-port=80 --type=NodePort:使用kubectl命令创建一个Service,将Deployment暴露在集群外部。--port指定Service监听的端口,--name指定Service的名称,--target-port指定将流量转发到Deployment的哪个端口,--type=NodePort指定Service的类型为NodePort,即通过节点的IP和随机端口访问Service。

  14. kubectl get service,endpoints:使用kubectl命令查看Service和Endpoints的信息。Service用于暴露Deployment,Endpoints用于显示与Service关联的Pod的IP地址和端口。

  15. curl http://192.168.30.130:31537:使用curl命令发送HTTP请求,访问Service的IP和端口,以测试是否能够成功访问到Deployment。

  16. kubectl delete service myservice:使用kubectl命令删除名为myservice的Service,从集群中移除对Deployment的暴露。

这些命令的组合操作的目的是创建一个名为nginx-deployment-servicetest的Deployment,将其暴露为名为myservice的Service,并通过curl命令测试访问该Service。最后,通过删除Service将其从集群中移除。


二.Ingress

Ingress是Kubernetes中的一种资源对象,用于管理集群中的入口流量。它充当了一个入口点,将外部流量路由到集群内部的Service或Pod。Ingress通过定义规则和配置来实现流量的路由和负载均衡。

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管。
Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由,流量路由由 Ingress 资源上定义的规则控制。为了让 Ingress 资源工作,集群必须有一个正在运行的 Ingress 控制器。
下图是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
在这里插入图片描述

Ingress的主要特点和用法如下:

  1. 流量路由:Ingress通过定义规则来路由流量。可以根据域名、路径、HTTP方法等条件将流量转发到不同的Service或Pod。通过Ingress规则,可以实现多个域名和路径的流量路由。

  2. 负载均衡:Ingress可以实现基于负载均衡的流量分发。可以将流量均匀地分发到后端的多个Service或Pod上,以实现高可用和性能优化。

  3. SSL/TLS支持:Ingress可以配置SSL/TLS证书,以实现加密的流量传输。可以为每个域名配置不同的证书,保护传输过程中的数据安全。

  4. URL重写和重定向:Ingress可以通过配置URL重写和重定向来实现对流量的处理。可以将请求的URL重写为不同的路径,或者将请求重定向到其他URL。

  5. 基于名称的虚拟主机:Ingress支持基于名称的虚拟主机,可以为不同的域名配置不同的规则和后端服务。这使得在同一个集群中托管多个应用程序或网站变得更加方便。

  6. 创建和使用:可以通过YAML文件或命令行创建Ingress。在YAML文件中,需要指定Ingress的名称、规则、后端服务等信息。可以使用kubectl get ingress命令查看Ingress的详细信息。

下面是一个示例的Ingress配置文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-ingress
spec:
  rules:
    - host: example.com
      http:
        paths:
          - path: /app1
            pathType: Prefix
            backend:
              service:
                name: service1
                port:
                  number: 80
          - path: /app2
            pathType: Prefix
            backend:
              service:
                name: service2
                port:
                  number: 80

在这个示例中,Ingress将example.com/app1的请求转发到名为service1的Service,将example.com/app2的请求转发到名为service2的Service。

总结来说,Ingress是Kubernetes中用于管理入口流量的一种资源对象。通过定义规则和配置,可以实现流量的路由、负载均衡、SSL/TLS支持、URL重写和重定向等功能。通过Ingress,可以更方便地管理集群中的入口流量,并实现灵活的流量控制和管理。

1.Ingress 需要 Ingress 控制器支持,先部署控制器

代码如下(示例):
kubectl apply -f https://gitee.com/cnlxh/Kubernetes/raw/master/cka-yaml/ingressdeploy.yaml

kubectl get pod -n ingress-nginx

在这里插入图片描述

2.用 nginx 镜像生成一个具有 3 副本的 Pod,并通过 Service 提供服务,然后再用 ingress 以特定域名的方式对外暴露

代码如下(示例):
cat > ingress.yml <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-ingress
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: ingressservice
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: testingress
spec:
  ingressClassName: nginx
  rules:
    - host: www.testingress.com
      http:
        paths:
          - pathType: Prefix
            path: "/"
            backend:
              service:
                name: ingressservice
                port:
                  number: 80
EOF

kubectl create -f ingress.yml 
kubectl get deployments,service,ingress 

在这里插入图片描述

echo 192.168.30.131 www.testingress.com >> /etc/hosts 
curl http://www.testingress.com 

在这里插入图片描述

kubectl delete -f ingress.yml 

在这里插入图片描述

3.解释

让我来解释每一句命令的含义:

1.

  1. cat > ingress.yml <<EOF:这是一个shell命令,用于创建一个名为ingress.yml的文件,并将后续输入的内容写入该文件。

  2. apiVersion: apps/v1:指定使用的Kubernetes API版本。

  3. kind: Deployment:定义创建的资源类型为Deployment。

  4. metadata:定义Deployment的元数据,包括名称和标签。

  5. name: nginx-deployment-ingress:指定Deployment的名称为nginx-deployment-ingress

  6. labels:为Deployment添加标签。

  7. app: nginx:为Deployment添加一个名为app,值为nginx的标签。

  8. spec:定义Deployment的规格。

  9. replicas: 3:指定Deployment的副本数量为3,即创建3个Pod。

  10. selector:定义用于选择Pod的标签选择器。

  11. matchLabels:指定选择具有哪些标签的Pod。

  12. app: nginx:指定选择具有名为app,值为nginx的标签的Pod。

  13. template:定义创建Pod的模板。

  14. metadata:定义Pod的元数据,包括标签。

  15. labels:为Pod添加标签。

  16. app: nginx:为Pod添加一个名为app,值为nginx的标签。

  17. spec:定义Pod的规格。

  18. containers:定义Pod中的容器。

  19. name: nginx:指定容器的名称为nginx

  20. image: nginx:指定容器使用的镜像为nginx

  21. imagePullPolicy: IfNotPresent:指定容器的镜像拉取策略为如果本地不存在该镜像,则拉取。

  22. ports:定义容器监听的端口。

  23. containerPort: 80:指定容器监听的端口号为80。

这些命令的组合操作的目的是创建一个名为nginx-deployment-ingress的Deployment,其中包含3个副本的Pod,每个Pod中运行一个名为nginx的容器,该容器使用nginx镜像,并监听80端口。
在这里插入图片描述

2.

  1. apiVersion: v1:指定使用的Kubernetes API版本。

  2. kind: Service:定义创建的资源类型为Service。

  3. metadata:定义Service的元数据,包括名称。

  4. name: ingressservice:指定Service的名称为ingressservice

  5. spec:定义Service的规格。

  6. selector:定义用于选择Pod的标签选择器。

  7. app: nginx:指定选择具有名为app,值为nginx的标签的Pod。

  8. ports:定义Service监听的端口。

  9. protocol: TCP:指定Service监听的协议为TCP。

  10. port: 80:指定Service监听的端口号为80。

  11. targetPort: 80:指定将流量转发到Pod的端口号为80。

这些命令的组合操作的目的是创建一个名为ingressservice的Service,该Service使用标签选择器选择具有app: nginx标签的Pod,并将流量转发到这些Pod的80端口。
在这里插入图片描述

3.

  1. apiVersion: networking.k8s.io/v1:指定使用的Kubernetes API版本为Networking API的v1版本。

  2. kind: Ingress:定义创建的资源类型为Ingress。

  3. metadata:定义Ingress的元数据,包括名称。

  4. name: testingress:指定Ingress的名称为testingress

  5. spec:定义Ingress的规格。

  6. ingressClassName: nginx:指定使用名为nginx的Ingress Controller来处理该Ingress。

  7. rules:定义Ingress的规则。

  8. - host: www.testingress.com:指定Ingress的主机为www.testingress.com

  9. http:定义Ingress的HTTP配置。

  10. paths:定义Ingress的路径配置。

  11. - pathType: Prefix:指定路径匹配类型为前缀匹配。

  12. path: "/":指定匹配的路径为根路径。

  13. backend:定义后端服务配置。

  14. service:指定后端服务为一个Service。

  15. name: ingressservice:指定Service的名称为ingressservice

  16. port:指定Service监听的端口。

  17. number: 80:指定Service监听的端口号为80。

这些命令的组合操作的目的是创建一个名为testingress的Ingress,该Ingress使用nginx Ingress Controller处理请求,并将www.testingress.com的流量转发到名为ingressservice的Service的80端口。
在这里插入图片描述

4.

接下来的命令:

  1. kubectl create -f ingress.yml:使用kubectl命令创建Ingress资源,从ingress.yml文件中读取配置。

  2. kubectl get deployments,service,ingress:使用kubectl命令获取部署、服务和Ingress的信息。

  3. echo 192.168.30.131 www.testingress.com >> /etc/hosts:将www.testingress.com映射到IP地址192.168.30.131,以便在本地主机上访问该域名。

  4. curl http://www.testingress.com:使用curl命令发送HTTP请求到www.testingress.com,以测试Ingress是否正常工作。

  5. kubectl delete -f ingress.yml:使用kubectl命令删除之前创建的Ingress资源,从ingress.yml文件中读取配置。

这些命令的组合操作的目的是创建、测试和删除Ingress资源,并验证Ingress的功能是否正常。
在这里插入图片描述


总结

以上是今天要讲的内容,学到了Service,Ingress。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Microsoft Visual Studio 2010 Service Pack 1是一个给Visual Studio 2010用户带来一些修复和增强功能的升级。它解决了在Visual Studio 2010中发现的一些问题,并引入了一些新的功能。 要下载Microsoft Visual Studio 2010 Service Pack 1,可以按照以下步骤进行: 1. 打开您的Web浏览器,然后导航到Microsoft的官方网站(https://www.microsoft.com)。 2. 在页面的右上角,您可以看到一个搜索框。在搜索框内键入“Visual Studio 2010 Service Pack 1”。 3. 点击“搜索”按钮或按下Enter键,将会显示与您的搜索相关的结果。 4. 在搜索结果页面上,可能会有多个与Visual Studio 2010 Service Pack 1相关的选项。选择您认为最合适的链接,以了解更多详情。 5. 在所选链接的页面上,您将找到有关该Service Pack以及如何下载和安装的信息。请阅读这些详细说明。 6. 按照所提供的链接或指令,单击下载Microsoft Visual Studio 2010 Service Pack 1的安装程序。 7. 选择您要保存安装程序的位置,并单击“保存”按钮。 8. 下载过程可能需要一些时间,具体取决于您的互联网连接速度。 9. 当下载完成后,双击安装程序文件以开始安装过程。按照显示的指示进行操作。 10. 完成安装后,您的Visual Studio 2010将是最新的Service Pack 1版本。 以上就是下载Microsoft Visual Studio 2010 Service Pack 1的步骤。确保您下载和安装适用于您的操作系统和Visual Studio 2010版本的Service Pack。记得在下载和安装之前备份您的项目和设置,以防万一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

K要努力

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

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

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

打赏作者

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

抵扣说明:

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

余额充值