k8s通过service访问pod(五)--技术流ken

2023-05-16

 

service

 

每个 Pod 都有自己的 IP 地址。当 controller 用新 Pod 替代发生故障的 Pod 时,新 Pod 会分配到新的 IP 地址。这样就产生了一个问题:

如果一组 Pod 对外提供服务(比如 HTTP),它们的 IP 很有可能发生变化,那么客户端如何找到并访问这个服务呢?

Kubernetes 给出的解决方案是 Service。

 

创建 Service

 

Kubernetes Service 从逻辑上代表了一组 Pod,具体是哪些 Pod 则是由 label 来挑选。Service 有自己 IP,而且这个 IP 是不变的。客户端只需要访问 Service 的 IP,Kubernetes 则负责建立和维护 Service 与 Pod 的映射关系。无论后端 Pod 如何变化,对客户端不会有任何影响,因为 Service 没有变。

 

第一步:创建下面的这个 Deployment:

查看支持的apiversion使用命令kubectl api-versions

 

第二步:部署并查看pod

我们启动了三个 Pod,运行 httpd 镜像,label run: httpdService 将会用这个 label 来挑选 Pod


[root@ken ~]# kubectl apply -f httpd.yml
deployment.apps/httpd created
[root@ken ~]# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
httpd-8c6c4bd9b-ljvlb   1/1     Running   0          41s   10.244.1.27   host1   <none>           <none>
httpd-8c6c4bd9b-ngxqv   1/1     Running   0          41s   10.244.1.28   host1   <none>           <none>
httpd-8c6c4bd9b-wxblj   1/1     Running   0          41s   10.244.2.18   host2   <none>           <none>  

 

第三步:集群内部测试连通性

Pod 分配了各自的 IP,这些 IP 只能被 Kubernetes Cluster 中的容器和节点访问。


[root@ken ~]# curl 10.244.1.28
<html><body><h1>It works!</h1></body></html>
[root@ken ~]# curl 10.244.1.27
<html><body><h1>It works!</h1></body></html>
[root@ken ~]# curl 10.244.2.18
<html><body><h1>It works!</h1></body></html>  

 

第四步:接下来创建 Service,其配置文件如下:

① v1 是 Service 的 apiVersion。

② 指明当前资源的类型为 Service。

③ Service 的名字为 httpd-svc。

④ selector 指明挑选那些 label 为 run: httpd 的 Pod 作为 Service 的后端。

⑤ 将 Service 的 8080 端口映射到 Pod 的 80 端口,使用 TCP 协议。

 

 

第五步: 执行 kubectl apply 创建 Service httpd-svc。


[root@ken ~]# kubectl apply -f service.yml
service/httpd-svc created
[root@ken ~]# kubectl get service
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
httpd-svc    ClusterIP   10.106.64.97   <none>        8080/TCP   17s
kubernetes   ClusterIP   10.96.0.1      <none>        443/TCP    11h  

 

httpd-svc 分配到一个 CLUSTER-IP 10.106.64.97。可以通过该 IP 访问后端的 httpd Pod。


[root@ken ~]# curl 10.106.64.97:8080
<html><body><h1>It works!</h1></body></html>  

根据前面的端口映射,这里要使用 8080 端口。另外,除了我们创建的 httpd-svc,还有一个 Service kubernetesCluster 内部通过这个 Service 访问 kubernetes API Server

 

通过 kubectl describe 可以查看 httpd-svc Pod 的对应关系。


[root@ken ~]# kubectl describe service httpd-svc
Name:              httpd-svc
Namespace:         default
Labels:            <none>
Annotations:       kubectl.kubernetes.io/last-applied-configuration:
                     {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"name":"httpd-svc","namespace":"default"},"spec":{"ports":[{"port":8080,"...
Selector:          run=httpd
Type:              ClusterIP
IP:                10.106.64.97
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.244.1.27:80,10.244.1.28:80,10.244.2.18:80
Session Affinity:  None
Events:            <none>  

Endpoints 罗列了三个 Pod 的 IP 和端口。

 

DNS访问service

 

在 Cluster 中,除了可以通过 Cluster IP 访问 Service,Kubernetes 还提供了更为方便的 DNS 访问。

 

第一步:查看coredns

kubeadm 部署时会默认安装 coredns 组件。


[root@ken ~]# kubectl get deployment --namespace=kube-system
NAME      READY   UP-TO-DATE   AVAILABLE   AGE
coredns   2/2     2            2           11h  

 

coredns 是一个 DNS 服务器。每当有新的 Service 被创建,coredns 会添加该 Service 的 DNS 记录。Cluster 中的 Pod 可以通过 <SERVICE_NAME>.<NAMESPACE_NAME> 访问 Service。

 

第二步:dns访问

比如可以用 httpd-svc.default 访问 Service httpd-svc。


[root@ken ~]# kubectl run busybox --rm -it --image=busybox /bin/sh
/ # wget httpd-svc:8080
Connecting to httpd-svc:8080 (10.106.64.97:8080)
index.html           100% |*************|    45  0:00:00 ETA
/ # ls
bin         home        root        usr
dev         index.html  sys         var
etc         proc        tmp
/ # cat index.html 
<html><body><h1>It works!</h1></body></html>  

由于这个 Pod 与 httpd-svc 同属于 default namespace,可以省略 default 直接用 httpd-svc 访问 Service

 

第三步:查看namespace

如果要访问其他 namespace 中的 Service,就必须带上 namesapce 了。kubectl get namespace 查看已有的 namespace


[root@ken ~]# kubectl get namespace
NAME          STATUS   AGE
default       Active   11h
kube-public   Active   11h
kube-system   Active   11h  

 

第四步:在 kube-public 中部署 Service httpd2-svc

配置如下:

 

 第五步:创建资源

通过 namespace: kube-public 指定资源所属的 namespace。多个资源可以在一个 YAML 文件中定义,用 --- 分割。执行 kubectl apply 创建资源:


[root@ken ~]# kubectl apply -f service.yml
deployment.apps/httpd2 created
service/httpd2-svc created  

 

第六步:查看 kube-public 的 Service:


[root@ken ~]# kubectl get service --namespace=kube-public
NAME         TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
httpd2-svc   ClusterIP   10.111.175.138   <none>        8080/TCP   63s  

 

第七步:在 busybox Pod 中访问 httpd2-svc:


[root@ken ~]# kubectl run busybox --rm -it --image=busybox /bin/sh
/ # wget httpd2-svc:8080
wget: bad address 'httpd2-svc:8080'
/ # wget httpd2-svc.kube-public:8080
Connecting to httpd2-svc.kube-public:8080 (10.111.175.138:8080)
index.html           100% |*************|    45  0:00:00 ETA  

因为属于不同的 namespace,必须使用 httpd2-svc.kube-public 才能访问到。

 

外网访问service

 

除了 Cluster 内部可以访问 Service,很多情况我们也希望应用的 Service 能够暴露给 Cluster 外部。Kubernetes 提供了多种类型的 Service,默认是 ClusterIP

 

ClusterIP

Service 通过 Cluster 内部的 IP 对外提供服务,只有 Cluster 内的节点和 Pod 可访问,这是默认的 Service 类型,前面实验中的 Service 都是 ClusterIP

 

NodePort

Service 通过 Cluster 节点的静态端口对外提供服务。Cluster 外部可以通过 <NodeIP>:<NodePort> 访问 Service

 

LoadBalancer

Service 利用 cloud provider 特有的 load balancer 对外提供服务,cloud provider 负责将 load balancer 的流量导向 Service。目前支持的 cloud provider GCPAWSAzur 等。

 

第一步:实践 NodePort,Service httpd-svc 的配置文件修改如下:

添加 type: NodePort,重新创建 httpd-svc

 

第二步:创建service


[root@ken ~]# kubectl apply -f service.yml
service/httpd-svc created
[root@ken ~]# kubectl get service httpd-svc
NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
httpd-svc   NodePort   10.108.118.202   <none>        8080:31785/TCP   12s  

Kubernetes 依然会为 httpd-svc 分配一个 ClusterIP,不同的是:

EXTERNAL-IP 为 nodes,表示可通过 Cluster 每个节点自身的 IP 访问 Service。

PORT(S) 为 8080:31785。8080 是 ClusterIP 监听的端口(每个节点都有该端口),31785 则是节点上监听的端口。Kubernetes 会从 30000-32767 中分配一个可用的端口,每个节点都会监听此端口并将请求转发给 Service。


[root@ken ~]# ss -tnl | grep 31785
LISTEN     0      128         :::31785                   :::*  

 

第三步:测试nodeport是否正常工作


[root@ken ~]# curl 172.20.10.2:31785
<html><body><h1>It works!</h1></body></html>
[root@ken ~]# curl 172.20.10.7:31785
<html><body><h1>It works!</h1></body></html>
[root@ken ~]# curl 172.20.10.9:31785
<html><body><h1>It works!</h1></body></html>  

通过三个节点 IP + 32312 端口都能够访问 httpd-svc

 

第四步:指定特定端口

NodePort 默认是的随机选择,不过我们可以用 nodePort 指定某个特定端口。

现在配置文件中就有三个 Port 了:

nodePort 是节点上监听的端口。

port 是 ClusterIP 上监听的端口。

targetPort 是 Pod 监听的端口。

 

最终,Node 和 ClusterIP 在各自端口上接收到的请求都会通过 iptables 转发到 Pod targetPort

 

第四步:应用新的 nodePort 并验证:


[root@ken ~]# kubectl apply -f service.yml
service/httpd-svc configured

[root@ken ~]# kubectl get service httpd-svc
NAME        TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
httpd-svc   NodePort   10.108.118.202   <none>        8080:30000/TCP   6m8s

[root@ken ~]# curl 172.20.10.2:30000
<html><body><h1>It works!</h1></body></html>
[root@ken ~]# curl 172.20.10.7:30000
<html><body><h1>It works!</h1></body></html>
[root@ken ~]# curl 172.20.10.9:30000
<html><body><h1>It works!</h1></body></html>  

nodePort: 30000 已经生效了。

转载于:https://www.cnblogs.com/kenken2018/p/10335998.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k8s通过service访问pod(五)--技术流ken 的相关文章

  • 作为后台进程/服务运行命令

    我有一个 Shell 命令 我想在后台运行 并且我读到这可以通过添加后缀来完成 到导致它作为后台进程运行的命令 但我需要一些更多的功能 并且想知道如何去做 我希望每次系统重新启动时该命令都在后台启动并运行 我希望能够像人们一样在需要时启动和
  • 如何在我的类型类中访问我的服务(DependencyInjection)?

    我创建了一个服务 DependencyInjection 并在控制器上将其用作 this gt get service name gt someMethod 我想知道如何在我的表单类上使用它 这是我的课程示例形式 namespace Com
  • 棒棒糖中的 takePicture 失败

    以下代码正在使用 可在后台拍照 它对于棒棒糖以下的所有版本都工作正常 但在以下版本中给出运行时异常takePicture null null mcall 有任何想法吗 public void takePictures final int d
  • 无法在活动和远程服务之间共享 SharedPreferences - Android 错误或功能?

    我想在 SharedPreferences 更改时更新远程服务 以下内容用于 API 级别 8 Android 2 2 我的活动有一个OnPreferencesChangedListener它通过服务绑定器对象调用远程服务 远程服务的接口提
  • 无法从 AsyncTask 启动服务

    我正在尝试从 AsyncTask 启动服务 但看不到它的启动 我还在清单文件中添加了服务 这里是代码 protected Integer doInBackground Void values throws InterruptedExcept
  • 如何在视图中调用 Grails 服务?

    简单的问题 我有一个服务类 比方说helpersService 和一个方法def constructURI params 如何从模板视图调用此方法 我尝试了以下代码但没有成功 img src 但我得到以下结果 No signature of
  • SC创建binpath错误

    我正在尝试在 PowerShell 中运行以下命令 sc create StrongSwan binpath C Users Kanishk Desktop Strong Strong stronswan strongswan 5 6 3
  • 无法从 Windows 7 上的 Windows 服务启动桌面应用程序

    HI 我在 Windows 7 上有 C WCF Windows 服务 以具有管理员权限的用户身份登录 我正在尝试在服务启动后启动桌面应用程序 我发现的所有讨论都是关于 Windows 工作站和桌面 我创建了一个单独的线程 设置线程工作站和
  • 无法启动 Windows 服务,错误 1064

    我编写了一个在 Win10 上运行的 Windows 服务 它运行得非常好 直到我决定对其进行一些更改 我重写了一些逻辑 在调试和发布配置中进行了测试 一切都很好 然后 我使用卸载了当前版本的服务installutil exe u serv
  • Symfony2 - 将 Swiftmailer 添加为服务

    我想将我的电子邮件代码从我的控制器移至服务中 到目前为止我已完成以下操作 在 services yml 中创建条目 在 acme demobundle services EmailManager php 中创建了一个 EmailManage
  • Symfony2 条件服务声明

    我目前正在尝试找到一个可靠的解决方案来动态更改 Symfony2 服务的依赖关系 详细信息 我有一个服务 它使用 HTTP 驱动程序与外部 API 进行通信 class myAwesomeService private httpDriver
  • onTaskRemoved() 在华为和小米设备中没有被调用

    我一直在使用onTaskRemoved 服务中的方法 用于检测应用程序何时通过滑动从设备最近列表中删除 我执行一些日志记录和发生这种情况时需要执行的一些其他操作 它工作完美 然后我在运行Android 6 0的华为设备上检查了这个方法 该方
  • 停止或终止服务

    我正在开发一个任务管理器应用程序 在该应用程序中 我向用户显示正在运行的应用程序列表以及每个应用程序旁边的终止按钮 当用户按下终止按钮时 相应的活动将被终止 我使用了 activitymanager killbackgroundproces
  • 在 Android KitKat 中接收彩信

    所以这个视频Android 4 4 短信 API http www youtube com watch v mdq0R2WQssQ DevBytes 解释了 KitKat 中 SMS API 的最新变化 他们还提供了示例项目的链接 http
  • AltBeacon 服务位于单独的 Android 进程中

    我需要帮助 有一个适用于 Xamarin Android 的应用程序 在其中 启动了一个与 AltBeacon 库配合使用的服务 在此服务中 创建了一个线程 在该线程中不断扫描信标 服务以 StartForeground 启动 该服务应该有
  • Android异步服务调用策略

    这是场景 客户端对服务进行远程调用 返回 void 并提供 回调对象 服务在后台线程上执行一些长时间运行的逻辑 然后使用回调对象来触发以太成功或失败 因为这些操作视觉元素 执行 Activity runOnUiThread 块 该场景运行良
  • 在 Android Studio 中调试服务的正确方法?

    在 Android Studio 中调试服务有正确的方法吗 或者 Android Studio 无法做到这一点 当我尝试调试时 它只会断开套接字 与目标虚拟机断开连接 地址 localhost 8600 传输 socket 希望你能在这里帮
  • 有没有办法强制 svcutil.exe 忽略 SSL 证书问题?

    我需要 svcutil exe 为我生成代理类 但问题是 Web 服务只能通过 HTTPS 访问 并且 SSL 证书是自签名的 如何强制 svcutil exe 忽略此问题 似乎有效的一件事是启动 Fiddler 并让它在您发出 SVCUT
  • Grails Spock 单元测试需要模拟事务管理器

    在 Grails 3 1 12 中 我想对服务进行单元测试 Transactional class PlanService List
  • AngularJS 中的非单例服务

    AngularJS 在其文档中明确指出服务是单例 AngularJS services are singletons 违反直觉的是 module factory还返回一个 Singleton 实例 鉴于非单例服务有很多用例 实现工厂方法以返

随机推荐

  • 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)

    概述 在软件开发系统中 xff0c 客户程序经常会与复杂系统的内部子系统之间产生耦合 xff0c 而导致客户程序随着子系统的变化而变化 那么如何简化客户程序与子系统之间的交互接口 xff1f 如何将复杂系统的内部子系统与客户程序之间的依赖解
  • tld 标签元素

    每个自定义标签都必须在tld文件中声明 xff0c tld文件只不过是一个XML文件 根元素是 lt taglib gt xff0c 它包含一个或者多个 lt tag gt 标签 xff0c 该元素用来声明定制标签 TLD 文件中的元素标签
  • cuda中用cublas库做矩阵乘法

    这里矩阵C 61 A B xff0c 原始文档给的公式是C 61 alpha A B 43 beta C xff0c 所以这里alpha 61 1 xff0c beta 61 0 主要使用cublasSgemm这个函数 xff0c 这个函数
  • cv_bridge中的编码模式与实现

    image encodings cpp文件是关于图像编码模式的源文件 xff0c 其中规定了RGB的图像以及深度图的编码模式 该编码文件image encodings cpp所依赖的头文件图 命令空间 sensor msgs image e
  • Pixhawk进阶开发

    使用者 初见Pixhawk 大家知道Pix是一个出色的开源飞控 xff0c 那到底什么是Pixhawk呢 xff0c 它有那些种类 它的硬件是怎么设计的 xff0c 软件是基于什么方式设计的 xff0c 我们怎么连接 初始化配置 怎么调节参
  • Java程序心得体会

    学习Java是一件快乐的事情 xff0c 刚开始学习的时候还有点难 xff0c 后来慢慢熟悉了Java的程序操作 xff0c 在错误中获得技巧 xff0c 一次又一次的失败 xff0c 让我对Java产生了兴趣 xff0c 现在对Java既
  • linux网卡顺序发生变化,(linux)复制的虚拟机网卡eth0变成了eth1或其他名称后修正方法...

    正在使用的虚拟机 xff0c 复制之后 xff0c 发现网卡名称发生了变化 xff0c 修正方法如下 xff1a 比如eth0变成了eth1 xff1a ifconfig xff1a udev动态管理设备文件 xff1a cat etc u
  • Android中的Android中的Surface和SurfaceView

    一 什么是Surface 简单的说Surface对应了一块屏幕缓冲区 xff0c 每个window对应一个Surface xff0c 任何View都要画在Surface上 传统的view共享一块屏幕缓冲区 xff0c 所有的绘制必须在UI线
  • 创新AI技术引领手机芯片发展方向,麒麟970荣获中国好设计金奖

    11月24日 xff0c 2017年中国好设计颁奖仪式在深圳正式召开 xff0c 奖项一共设置为金奖 银奖 创意奖 入围奖四个级别 而麒麟970作为人工智能领域的代表性产品 xff0c 也是唯一的芯片产品 xff0c 在今年的85个项目中脱
  • 史上最全阿里 Java 面试题总结

    以下为大家整理了阿里巴巴史上最全的 Java 面试题 xff0c 涉及大量 Java 面试知识点和相关试题 JAVA基础 JAVA中的几种基本数据类型是什么 xff0c 各自占用多少字节 String类能被继承吗 xff0c 为什么 Str
  • 图象传输协议——PCoIP

    PCoIP 是一种高性能显示协议 专为交付虚拟桌面而构建 无论最终用户具有什么任务或处于何位置 均可为其提供内容极为丰富的最佳桌面体验 借助 PCoIP 整个计算体验先经过在数据中心进行 压缩 加密和编码 然后再通过标准 IP 网络传输到启
  • VB6 对象库未注册问题

    以下是个人使用VB6出现对象库未注册问题的解决方法 已成功 xff01 一 注册ocx文件 mscomctl ocx文件放进路径C Windows System32 xff08 64是此路径 xff0c 由于本人是64位系统32位未测试 x
  • 源码阅读技巧篇

    转载请注明原创出处 xff0c 谢谢 xff01 说在前面 本人水平有限 xff0c 下面的一些都是本人的思考与理解 xff0c 如果有那里不对 xff0c 希望各位大佬积极指出 xff0c 欢迎在留言区进行评论交流 探讨 主题 为什么要读
  • 黑箱方法-神经网络①

    人工神经网络 人工神经网络的概念 人工神经网络 xff08 Artificial Neural Networks xff0c ANN xff09 是对一组输入信号和一组输出信号之间的关系进行建模 xff0c 使用的模型来源于人类大脑对来自感
  • 飞行前的准备工作

    1 飞控固件 Mission Planner 里的版本 xff0c 好像没有offboard和一些参数的设置 Mission Planner中固件下载 3 3 3 3 4 6 Qground Control中的固件QGC中的固件中有offb
  • make menuconfig 无法启动处理方法

    ake menuconfig Unable to find the ncurses libraries required header files 问题 xff1a lzz 64 lzz virtual machine linux 2 6
  • Ubuntu下自动输入sudo密码

    sudo 自动输入密码 echo 34 password 34 sudo S netstat tlnp S参数 The S stdin option causes sudo to read the password from the sta
  • ssh 或 putty 连接linux报错解决方法

    由于当天多次输入错误密码 xff0c ssh和putty就连接不上了 xff0c 纠结了很久解决问题 ssh连接提示错误 xff1a server unexpectedly closed network connection putty 连
  • Postman 安装及使用入门教程

    安装 本文只是基于 Chrome 浏览器的扩展插件来进行的安装 xff0c 并非单独应用程序 首先 xff0c 你要台电脑 xff0c 其次 xff0c 安装有 Chrome 浏览器 xff0c 那你接着往下看吧 1 官网安装 xff08
  • k8s通过service访问pod(五)--技术流ken

    service 每个 Pod 都有自己的 IP 地址 当 controller 用新 Pod 替代发生故障的 Pod 时 xff0c 新 Pod 会分配到新的 IP 地址 这样就产生了一个问题 xff1a 如果一组 Pod 对外提供服务 x