Kubernetes:Service

news2024/11/16 23:31:42

文章目录

    • 1、Service 定义
      • 1.1、无选择符的服务
      • 1.2、Endpoints
    • 2、服务发布类型
      • 2.1、ClusterIP
      • 2.2、NodePort
      • 2.3、ExternalName
      • 2.4、loadbalancer
    • 3、无头服务
      • 3.1、有选择符的服务
      • 3.2、无选择符的服务
    • 4、服务发现
      • 4.1、环境变量
      • 4.2、DNS
    • 5、Service TLS

Service:将运行在一组 Pods 上的应用程序公开为网络服务(微服务)的抽象方法。

k8s 以 Pod 应用部署的最小单位。k8s 根据调度算法为 Pod 分配运行节点,并随机分配 ip 地址。因此 Pod 的 IP 地址不固定,不方便通过 Pod 的 IP 地址访问服务。因此,k8s 提供了 Service,对后端提供相同服务的一组 Pod 的聚合。

一个 Service 提供一个虚拟的 Cluster IP,后端对应一个或者多个提供服务的 Pod。在集群中访问该 Service 时,采用 Cluster IP 即可,Kube-proxy 负责将发送到 Cluster IP 的请求转发到后端的Pod上。

在这里插入图片描述

1、Service 定义

来看一个微服务的定义

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  # service 发布类型
  type: ClusterIP
  # 标签选择器:选择 pod
  selector:
    app: myapp
  # 指定端口数组
  ports:
    # service 端口
  - port: 443
    # 协议
    protocol: TCP
    # 容器端口
    targetPort: 443
    # 端口名称 
    name: https
  - port: 80
    protocol: TCP
    targetPort: 80
    name: http
  - port: 6379
    protocol: TCP
    targetPort: 6379
    name: redis-tcp

微服务暴露端口:443, 80, 6379,k8s 为其分配一个集群 ip: ClusterIP。通过标签选择器选择与其匹配的 Pod,然后将所有更新发布到也称为 myapp-svc 的 Endpoint 对象。

1.1、无选择符的服务

没有选择符的 service 需要手动配置 EndpointSlice(旧版 Endpoints),将服务映射到集群外部的服务或者是集群内其他命名空间下的服务。

例:定义没有选择符的 Service

apiVersion: v1
kind: Service
metadata:
  name: notselector-svc
spec:
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80

服务没有选择算符,因此不会自动创建相应的 Endpoint 对象。 需要手动添加 Endpoint 对象,将服务手动映射到运行该服务的网络地址和端口:

apiVersion: v1
kind: Endpoints
metadata:
  name: notselector-svc
subsets:
- addresses:
  - ip: 10.244.1.60
  ports:
  - port: 80
- addresses:
  # 非集群节点的机器:集群外部服务
  - ip: 192.168.88.131
  ports:
  - port: 80

应用资源

kubectl apply -f notselector-svc.yaml
kubectl describe -f notselector-svc.yaml

kubectl apply -f notselector-points.yaml
kubectl describe -f notselector-points.yaml

在集群节点访问外部服务

curl http://192.168.88.131:80/ping

1.2、Endpoints

Endpoints 定义了网络端点的列表,通常由 Service 引用,定义可以将流量发送到哪些 Pod。推荐用 EndpointSlice API 替换 Endpoints。

2、服务发布类型

type的四种类型

  • ClusterIP:默认值,通过集群内部 ip 暴露服务。该服务只能在集群内部访问。
  • NodePort:通过每个节点上的 IP 和静态端口(NodePort)暴露服务。除了集群内部访问,集群外部可以通过 IP:NodePort访问该服务。
  • ExternalName:将服务映射到 DNS 名称,把集群外部的服务引入到集群内部来使用
  • LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。 将来自外部负载均衡器的流量路由到后端的 pod 上,不再需要内部的负载均衡。

2.1、ClusterIP

定义 clusterIP 类型的服务

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  type: ClusterIP
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
    name: https
  - port: 80
    protocol: TCP
    targetPort: 80
    name: http
  - port: 6379
    protocol: TCP
    targetPort: 6379
    name: redis-tcp

应用 | 查看服务

kubectl apply -f myapp-svc.yaml
kubectl get -f myapp-svc.yaml 
kubectl describe -f myapp-svc.yaml
kubectl get endpoints

集群 ip 范围在 master 节点初始化配置文件 init.default.yaml 中

networking:
  # 域名
  dnsDomain: cluster.local
  # 服务 ip
  serviceSubnet: 10.96.0.0/12
  # pod ip
  podSubnet: 10.244.0.0/16

测试服务

集群内部创建 pod

# 创建一个 redis pod
kubectl run redis --image=redis
# 创建一个带有 curl 工具的 pod
kubectl run curl --image=radial/busyboxplus:curl -it

测试:集群内部访问服务。

# 访问 curl 容器
kubectl exec -it curl -- sh
# 访问集群 service ip
curl http://10.109.36.83:80/ping
# 访问集群服务域名
# 域名形式:服务名.命名空间.服务.dns域名(cluster.local)
curl http://myapp-svc.default.svc.cluster.local:80/ping

# 访问 redis 容器
kubectl exec -it redis -- bash
# 通过集群IP访问
redis-cli -h <clusterIP> -p 6379
# 通过域名访问
redis-cli -h myapp-svc.default.svc.cluster.local -p 6379

2.2、NodePort

定义 service

apiVersion: v1
kind: Service
metadata:
  name: myapp-svc
spec:
  type: NodePort
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
    name: https
    nodePort: 30001
  - port: 80
    protocol: TCP
    targetPort: 80
    name: http
  - port: 6379
    protocol: TCP
    targetPort: 6379
    name: redis-tcp
    nodePort: 30002
  selector:
    app: myapp

查看 | 应用服务

kubectl delete svc myapp-svc
kubectl apply -f myapp-svc.yaml

kubectl get -f myapp-svc.yaml 
kubectl describe -f myapp-svc.yaml
# 显示 svcPort: nodePort。不指定 nodePort,则随机生成
# 443:30001/TCP, 80:32326/TCP, 6379:30002/TCP

测试服务

  • 通过 serviceIP:port可以集群节点,集群内部容器内访问服务。
  • 通过 DNS 域名,可以在集群内部容器访问服务。
  • 通过 nodeIP:nodePort可以在集群节点、集群内部容器、集群外部访问服务。
# serviceIP:port
curl http://<clusterIP>:80/ping
curl http://<podIP>:32326/ping

# nodeIP:nodePort
curl http://<nodeIP>:32326ping

# DNS 域名
curl http://myapp-svc.default.svc.cluster.local:80/ping

2.3、ExternalName

将服务映射到 DNS 名称,相当于将集群内的服务域名映射到外部域名。使用 CNAME 重定向,无法实现端口映射。

定义服务

apiVersion: v1
kind: Service
metadata:
  name: externalname-svc
spec:
  type: ExternalName
  externalName: 

应用服务

kubectl apply -f externalname-svc.yaml
kubectl get svc
# 显示:CLUSTER-IP 和 PORT(S) 均为 <none>

测试服务

# 进入集群 curl pod
kubectl exec -it curl -- sh
ping externalname-svc.default.svc.cluster.local
ping www.baidu.com

2.4、loadbalancer

在使用支持外部负载均衡器的云提供商的服务时,云提供商的服务会自动的为 type 值为 LoadBalancer 的 service 创建负载均衡。负载均衡是异步创建的,关于被提供的负载均衡器的信息将会通过 service 的 status.loadBalancer 字段发布出去。

使用云厂商提供的外部负载均衡器,来自外部负载均衡器的流量将直接重定向到后端 Pod 上。不再需要内部负载均衡。

apiVersion: v1
kind: Service
metadata:
  name: my-loadbalancer-svc
spec:
  selector:
    app: myapp
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
  clusterIP: 10.0.171.239
  type: LoadBalancer
status:
  loadBalancer:
    ingress:
    - ip: 192.0.2.127

3、无头服务

对于无状态的应用,客户端并不在意其连接的是哪一个 Pod,采用 Service 是没有问题的。但是对于有状态的应用,有时需要客户端根据某种算法选择对应的某一个后端 Pod 提供服务,或是需要连接所有的后端 Pod,例如 redis 服务,这时不需要负载均衡和单独。此时,可以通过指定 clusterIP: None ,来创建无头服务 Headless Service

无头 Service 不会分配 ClusterIP,kube-proxy 不会处理它们, 不会进行负载均衡和路由。既不能通过集群 IP 访问,也不能通过 DNS 域名访问。其 DNS 记录返回该服务下的所有 Endpoint。

3.1、有选择符的服务

对于有选择符的无头服务,创建 EndpointSlice 对象,返回 DNS 记录是服务的所有 EndPoint。

例:定义有选择符的无头服务

apiVersion: v1
kind: Service
metadata:
  name: myapp-headless-svc
spec:
  clusterIP: None
  type: ClusterIP
  selector:
    app: myapp
  ports:
  - protocol: TCP
    name: http
    port: 8080
    targetPort: 80

应用服务

kubectl apply -f myapp-headless-svc.yaml
kubectl describe -f myapp-headless-svc.yaml

测试

# 进入 curl pod
kubectl exec -it curl -- sh
# 查询 DNS 记录 
# serviceName.namespace
# 列举出所有的端点
nslookup myapp-headless-svc.default.svc.cluster.local

3.2、无选择符的服务

不会创建 EndpointSlice 对象。 返回 DNS 记录是服务的所有 EndPoint。

例:定义无头无选择服务

apiVersion: v1
kind: Service
metadata:
  name: notselector-headless-svc
spec:
  clusterIP: None
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80

应用资源

kubectl apply -f notselector-headless-svc.yaml
kubectl describe svc notselector-headless-svc
# 显示:Endpoints:<none>

手动创建 Endpoint 对象。

apiVersion: v1
kind: Endpoints
metadata:
  name: notselector-headless-svc
subsets:
- addresses:
  - ip: 10.244.1.60
  ports:
  - port: 80
- addresses:
  - ip: 192.168.88.131
  ports:
  - port: 80

测试服务

# 应用资源
kubectl apply -f notselector-points.yaml
kubectl describe -f notselector-headless-svc.yaml

# 查看 dns 记录
kubectl exec -it curl -- sh
nslookup notselector-headless-svc.default.svc.cluster.local

4、服务发现

4.1、环境变量

必须先创建 service,才能在创建 Pod 时设定环境变量。

当 Pod 运行在节点上,kubelet 会为每个活跃的 Service 添加一组环境变量。

  • {SVCNAME}_SERVICE_HOST
  • {SVCNAME}_SERVICE_PORT
# 查看 pod 的环境变量
kubectl exec myapp-deploy-59f8994d89-7gjpd -- printenv | grep SERVICE

4.2、DNS

支持集群的 DNS 服务器监视 Kubernetes API 中的新服务,并为每个服务创建一组 DNS 记录。 如果在整个集群中都启用了 DNS,则所有 Pod 都应该能够通过其 DNS 名称自动解析服务。

# 进入 curl pod
kubectl exec -it curl -- sh
# 查询DNS serviceName.namespace
nslookup myapp-svc.default

5、Service TLS

# 1、自签证书
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key -out /tmp/tls.crt -subj "/CN=myapp-svc.default.svc.cluster.local/O=my-hello"
# 或
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key -out /tmp/tls.crt -subj "/CN=10.109.36.83/O=my-hello"

# 2、创建 secret
kubectl create secret tls myhellotls --cert=/tmp/tls.crt --key=/tmp/tls.key
# 查看 secret
kubectl get secrets myhellotls -o yaml

# 部署应用程序,修改 myapp-deployment.yaml
# spec.template.spec 创建
volumes:
- name: myhello-tls-volume
  secret:
    secretName: myhellotls
# spec.template.containers 创建
volumeMounts:
  - mountPath: /app/cert
    name: myhello-tls-volume
    
# https 访问
curl https://10.109.36.83/ping --cacert /tmp/tls.crt 

# 结束测试,删除证书
rm /tmp/tls.*

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/134100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣(LeetCode)1801. 积压订单中的订单总数(C++)

优先队列模拟 根据题目描述模拟。 如果该订单是一笔采购订单 buy &#xff0c;则可以查看积压订单中价格 最低 的销售订单 sell 。提示我们&#xff0c;建立小根堆&#xff0c;维护价格最低的销售订单sell 。 反之亦然&#xff0c;如果该订单是一笔销售订单 sell &#xff0c;…

【技术分享】戴尔工作站安装Win10+Ubuntu20.04双系统教程与避坑指南

文章目录引言1.安装前的几个注意事项&#xff08;避坑指南&#xff09;1.1.有多块硬盘&#xff0c;该如何分配给Win10和Ubuntu系统&#xff1f;1.2.Ubuntu分区应该怎么分&#xff1f;2.系统安装步骤2.1.下载系统镜像2.2.制作U盘启动盘2.3.进入Win10系统分配系统空间2.4.BIOS设置…

强力推荐:关于谷歌ChatGPT模型140个示例的展示与实现功能

目录 1、ChatGPT 介绍与使用简要介绍安装ChatGPT与使用想写出有效的问答吗?使用 ChatGPT 桌面应用程序使用 prompts.chat2、ChatGPT模型140个示例充当 Linux 终端充当英语翻译和改进者担任`position`面试官充当 JavaScript 控制台充当 Excel 工作表充当英语发音帮手充当旅游指…

【C++】bitset(位图)的模拟实现

目录 一、bitset接口介绍 二、bitset的实现 1. 构造函数 2. 设置位&#xff08;set&#xff09; 3. 清空位&#xff08;reset&#xff09; 4. 获取位的状态&#xff08;test&#xff09; 三、源代码 一、bitset接口介绍 #include <iostream> #include <vecto…

Fujian Medical insurance and pension for urban and rural residents

【城乡居民医保、养老】二维码缴纳步骤&#xff0c;本文仅仅辅助需要人士&#xff0c;可忽略 第一步&#xff0c;长按二维码 第二步&#xff0c;点击【识别图中二维码】 第三步&#xff1a;个人社&#xff08;医&#xff09;保办费页面&#xff0c;点击【个人社&#xff08;医&…

一次 SQL 查询优化原理分析

一&#xff0c;前言 证实 参考资料 有一张财务流水表&#xff0c;未分库分表&#xff0c;目前的数据量为9555695&#xff0c;分页查询使用到了limit&#xff0c;优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms)&#xff0c;按照下文的方式调整SQL…

连接表「INNER JOIN」「LEFT JOIN」「RIGHT JOIN」+ 多表查询

目录表关联执行顺序 及 原理第一步、做笛卡尔积第二步&#xff1a;根据ON后的连接条件筛选笛卡尔积的结果第三步&#xff1a;补充左表&#xff08;LEFT JOIN&#xff09;或右表&#xff08;RIGHT JOIN&#xff09;不满足连接条件的数据&#xff08;INNER JOIN内关联时无此步骤&…

CMOS门电路总结

目录 MOS管&#xff1a; CMOS组成的常见门电路 反相器&#xff08;非门&#xff09;&#xff1a; 与非门 或非门 OD门 三态门 MOS管简介&#xff1a; > NMOS: 漏极&#xff08;D&#xff09;入&#xff0c;源极&#xff08;S&#xff09;出&#xff0c;栅极(G)加正电压…

【MyBatis】级联处理、association、collection、分布查询(详细模板,可直接套用)

目录 示例 一、处理“多对一”映射关系 1.1、级联查询 1.2、association 1.3、分步查询 二、处理“一对多”映射关系 2.1、collection 2.2、分步查询 示例 例如&#xff1a;员工与部门表 员工&#xff1a; 部门&#xff1a; 解释&#xff1a; 两张表通过dept_id联系起来…

ubuntu22.04安装MySQL、Hive及Hive连接MySQL操作

前言 这篇文章主要讲述的是ubuntu22.04上数据仓库Hive的安装和使用 正文 建议按照文章实践前稍微通读下全文 安装MySQL服务端和客户端 相关命令&#xff1a; sudo apt-get install mysql-server sudo apt-get install mysql-client 修改mysql的配置文件 在终端中输入…

手撕LRU缓存

请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存中&#xff0c;则返回关键字的值&#xff0c;否则返回 -…

python虚拟环境的概念,操作(pycharm为例)

1.在PyCharm中创建python项目时&#xff0c;需要配置python的运行环境&#xff0c;除了使用系统现有环境以外&#xff0c;还可以创建虚拟环境。 2.虚拟环境的创建是因为在实际开发中需要同期用到不同版本的python解释器&#xff0c;不同的第三方库以及同一个第三方库的不同版本…

牛客网 字符串通配符

做题链接&#xff1a;字符串通配符__牛客网 (nowcoder.com)要求&#xff1a;实现如下2个通配符(不区分大小写)&#xff1a; * &#xff1a;匹配0个或以上的字符&#xff08;注&#xff1a;能被*和?匹配的字符仅由英文字母和数字0到9组成&#xff0c;下同&#xff09;&#…

【回看2022 展望2023】一个普通大学生的2022回忆录

目录 一、前言 二、回望2022 2022年1月 2022年2月 2022年3月 2022年4月5月6月7月8月 2022年9月 2022年10月 2022年11月 2022年12月 三、总结与期望 结语 期望 一、前言 虽然我在csdn上已经有2年的码龄了&#xff0c;但我是从2021年4月才开始写我的第一篇博客。其实从学…

Cache实现

Cache&#xff08;S,E,B,m&#xff09;&#xff1a; S&#xff1a;每个set包含一个或者多个cache line&#xff08;高速缓冲行&#xff09; cache line&#xff1a;分别包含有效位&#xff08;valid&#xff09;、标记&#xff08;tag&#xff09;、数据块&#xff08;cache b…

机器学习中的数学原理——感知机模型

这个专栏主要是用来分享一下我在机器学习中的学习笔记及一些感悟&#xff0c;也希望对你的学习有帮助哦&#xff01;感兴趣的小伙伴欢迎私信或者评论区留言&#xff01;这一篇就更新一下《白话机器学习中的数学——感知机》&#xff01; 目录 一、什么是感知机 二、模型分析…

HDLC、ppp、MGRE实验(1.1)

1、首先为每个路由器的每个接口配置ip r1&#xff1a; [r1]interface Serial 4/0/0 [r1-Serial4/0/0]ip address 12.1.1.1 24 [r1-Serial4/0/0]int gi 0/0/0 [r1-GigabitEthernet0/0/0]ip add 192.168.1.1 24 r2&#xff1a; [r2-Serial4/0/0]ip add 12.1.1.2 24 [r2-Seria…

二十三、shiro安全框架详解(一)

一、 权限概述 1. 什么是权限 权限管理&#xff0c;一般指根据系统设置的安全策略或者安全规则&#xff0c;用户可以访问而且只能访问自己被授权的资源&#xff0c;不多不少。权限管理几乎出现在任何系统里面&#xff0c;只要有用户和密码的系统。 权限管理在系统中一般分为…

手把手代码实现五级流水线CPU——第三篇:流水线控制逻辑

系列文章目录 第一篇&#xff1a;初级顺序流水线 第二篇&#xff1a;分支预测流水线 文章目录系列文章目录一、控制逻辑二、具体操作1.判断暂停2.控制冒险3.跳转问题4.实现代码一、控制逻辑 通过暂停和插入气泡来动态调整流水线的状态 二、具体操作 1.判断暂停 识别&#x…

MySQL高级 索引【索引使用索引设计原则】

目录 1&#xff1a;索引使用 1.1&#xff1a;验证索引效率 1.2&#xff1a;最左前缀法则 1.3&#xff1a;范围查询&#xff08;存在索引失效的情况&#xff09; 1.4&#xff1a;索引失效情况 1.4.1&#xff1a;索引列运算&#xff08;索引会失效&#xff09; 1.4.2&…