k8s中,服务的自动注册、自动感知、负载均衡,三个功能的含义及测试验证

news/2024/9/28 19:05:32 标签: kubernetes, 负载均衡, docker

自动感知,指的是客户端只用访问服务的ip,而不用关心pod在哪个节点,以及pod的ip是多少。

服务可以自动感知pod的位置及ip,核心是通过selector标签选择器找到pod

自动注册,指的是服务创建之后,会自动在k8s的kube-dns服务注册,实现域名和ip的映射,kube-dns是一个系统服务,在部署k8s的时候就有这个服务了,这个服务在kube-system系统名称空间下。其他创建的服务,来找这个dns服务,自动注册。服务域名的格式是<服务名称>.<名称空间>.svc.cluster.local

负载均衡,指的是,当一个服务后端有多个pod的时候,访问服务的请求,会自动在后端pod之间实现负载均衡,不用配置。

服务为什么实现这些功能

底层lvs技术--负载均衡比如NATDR

包括iptables技术--数据转发比如SNATDNAT

两者都可以实现路由负载均衡功能

ipbables还可以实现,修改数据包源目IP标记

四表五链实现很多各种复杂三四层路由

不需要管理员管理

都是kube-proxy配置管理

相当于员工负责管理公司防火墙负载均衡这个员工就叫kubeproxy

所以kubeproxy管理lvs负载均衡iptables防火墙域名注册

k8s底层就是一个负载均衡集群

kubeproxy自我修复机制

即使kube-proxypod全部删掉集群自动重建kube-proxypod

而且配置时候基于每一台主机一台主机上面都有kubeproxymaster主机

集群坏了kubeproxy替你维护集群kubeproxy坏了集群又会重建kubeproxy

关于k8sdns服务实现实验

kube-dns服务kube-system系统名称空间

服务自动注册测试:

服务没有创建时候

服务的域名没有被dns解析为ip

服务创建之后

服务域名dns解析10.245.23.28

这就验证k8sdns服务

对于其他服务自动注册,自动解析功能

~]# kubectl get service
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.245.0.1   <none>        443/TCP   2d22h
~]# kubectl get service -n kube-system 
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                  AGE
kube-dns         ClusterIP   10.245.0.10      <none>        53/UDP,53/TCP,9153/TCP   2d22h
metrics-server   ClusterIP   10.245.105.229   <none>        443/TCP                  2d
~]# host 
-bash: host: command not found
~]# nslookup
-bash: nslookup: command not found
~]# yum -y install  bind-utils
~]# host  websvc.default.svc.cluster.local 10.245.0.10
# host是DNS命令行工具, websve.de...是域名,10.245.0.10是DNS服务器
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: 

Host websvc.default.svc.cluster.local not found: 3(NXDOMAIN)
~]# kubectl apply -f  websvc.yaml 
service/websvc created
~]# host  websvc.default.svc.cluster.local 10.245.0.10
Using domain server:
Name: 10.245.0.10
Address: 10.245.0.10#53
Aliases: 

websvc.default.svc.cluster.local has address 10.245.23.28
~]# cat websvc.yaml 
---
kind: Service
apiVersion: v1
metadata:
  name: websvc
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
~]# kubectl get service
NAME         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.245.0.1     <none>        443/TCP   2d23h
websvc       ClusterIP   10.245.23.28   <none>        80/TCP    18m
]# curl  10.245.23.28
curl: (7) Failed to connect to 10.245.23.28 port 80: Connection refused
#    这里为什么报错因为服务本身不对外提供应用只是一个代理转发没有pod时候自然访问不到
~]# kubectl replace --force -f  web1.yaml
pod "web1" deleted
pod/web1 replaced
~]# curl  10.245.23.28
Welcome to The Apache.
]# cat web1.yaml 
---
kind: Pod
apiVersion: v1
metadata:
  name: web1
  labels:
    app: web
spec:
  containers:
  - name: apache
    image: myos:httpd
    # 创建pod之后可以访问这时候不知道podip但是不用知道podip因为访问服务服务自动请求转发podpod在哪podip多少无所谓因为服务自动感知pod位置ip
~]# curl 10.245.23.28
Welcome to The Apache.
~]# kubectl get pods web1 -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP              NODE        NOMINATED NODE   READINESS GATES
web1   1/1     Running   0          18s   10.244.21.135   node-0001   <none>           <none>
~]# kubectl replace --force -f web1.yaml 
pod "web1" deleted
pod/web1 replaced
~]# curl 10.245.23.28
Welcome to The Apache.
~]# kubectl get pods web1 -o wide
NAME   READY   STATUS    RESTARTS   AGE   IP               NODE        NOMINATED NODE   READINESS GATES
web1   1/1     Running   0          7s    10.244.240.141   node-0004   <none>           <none>
#  比如pod重建之后node001跑到node004,ip也从21.135变成了240.141,访问服务依然访问apache服务这就验证服务对于pod自动感知功能自动感知什么实现标签因为服务制定了selector标签pod资源文件中规定这个标签所以服务可以自动感知pod
~]# kubectl get pods --show-labels 
NAME   READY   STATUS    RESTARTS   AGE     LABELS
web1   1/1     Running   0          4m56s   app=web
~]# cat websvc.yaml 
---
kind: Service
apiVersion: v1
metadata:
  name: websvc
spec:
  type: ClusterIP
  selector:
    app: web
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
~]# kubectl label pods web1 app-
pod/web1 unlabeled
~]# curl 10.245.23.28
curl: (7) Failed to connect to 10.245.23.28 port 80: Connection refused
# 把pod的标签删除之后服务不可用因为服务不能通过标签找到pod
~]# kubectl label pods web1 app=web
pod/web1 labeled
~]# curl 10.245.23.28
Welcome to The Apache.
# pod设置标签之后服务可以访问所以证明服务标签pod

# 测试服务自动负载均衡功能
~]# sed  's,web1,web2,'  web1.yaml    | kubectl  apply -f  -
pod/web2 created
~]# sed  's,web1,web3,'  web1.yaml    | kubectl  apply -f  -
pod/web3 created
~]# kubectl get pods 
NAME   READY   STATUS    RESTARTS   AGE
web1   1/1     Running   0          11m
web2   1/1     Running   0          19s
web3   1/1     Running   0          7s
~]# curl 10.245.23.28/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 10.244.219.64
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.61.1
    [REQUEST_URI] => /info.php
)
php_host:       web2
1229
~]# curl 10.245.23.28/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 10.244.219.64
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.61.1
    [REQUEST_URI] => /info.php
)
php_host:       web1
1229
~]# curl 10.245.23.28/info.php
<pre>
Array
(
    [REMOTE_ADDR] => 10.244.219.64
    [REQUEST_METHOD] => GET
    [HTTP_USER_AGENT] => curl/7.61.1
    [REQUEST_URI] => /info.php
)
php_host:       web3
1229
# 因为info.php文件主机名打印出来所以访问三次可以看到分别访问pod  web1web2web3证明服务自动实现负载均衡

hostDNS命令工具

nslookup也是DNS命令行工具

一个是交互式

一个交互式


http://www.niftyadmin.cn/n/5681678.html

相关文章

累加求和-C语言

1.问题&#xff1a; 计算123……100的和&#xff0c;要求分别用while、do while、for循环实现。 2.解答&#xff1a; 累加问题&#xff0c;先后将100个数相加。要重复进行100次加法运算&#xff0c;可以用循环结构来实现。重复执行循环体100次&#xff0c;每次加一个数。 3.代…

海外盲盒APP系统:盲盒出海热潮下的选择

近年来&#xff0c;盲盒市场展现出了强劲的发展态势&#xff0c;不仅在国内持续上演“盲盒热”&#xff0c;在海外市场中更是“一盒难求”&#xff01;在盲盒出海的浪潮下&#xff0c;盲盒在国际市场中迅速火爆&#xff0c;一时席卷了全球市场。 海外盲盒系统是企业拓展海外市…

洛谷P1197.星球大战

洛谷P1197.星球大战 并查集 贪心 正着不好想&#xff0c;逆向思维将摧毁变为修建 一开始处理图的时候就是将所有没有被炸的点能连的连在一起(图论)并求出连通块数量(并查集)然后逐步反向将被摧毁的点复原 #include <bits/stdc.h>using namespace std;const int N 4…

DarkLabel2.4版本导入MOT17数据集

目录 背景导入效果MOT17数据集说明DarkLabel导入视频导入gt文件 背景 做目标追踪&#xff0c;目前找了一圈开源工具&#xff0c;发现DarkLabel还是很好用的&#xff0c;提供自动目标跟踪&#xff0c;标注很方便。 由于目标追踪我用的是bytetrack&#xff0c;官网是用mot17数据…

Arthas redefine(加载外部的.class文件,redefine到JVM里 )

文章目录 二、命令列表2.2 class/classloader相关命令2.2.3 redefine&#xff08;加载外部的.class文件&#xff0c;redefine到JVM里 &#xff09;举例1&#xff1a;加载新的代码&#xff0c;jad/mc 命令使用举例2&#xff1a;上传 .class 文件到服务器的技巧 二、命令列表 2.…

互联网安全为什么要做风险评估:构建数字世界的坚固防线

在当今这个数字化时代&#xff0c;互联网已经成为社会运转不可或缺的基础设施&#xff0c;它深刻地改变了人们的生活方式、工作模式以及信息交流的渠道。然而&#xff0c;随着互联网的普及和应用范围的扩大&#xff0c;网络安全问题也日益凸显&#xff0c;成为制约互联网健康发…

Mybatis 9种动态 sql 标签使用

MyBatis提供了9种动态SQL标签&#xff1a;trim、where、set、foreach、if、choose、when、otherwise、bind&#xff1b; 1.if 标签 <select id"getUser">select * from User<where><if test" age ! null ">and age > #{age}</if…

Python Web WebAssembly 与 Python 的协同工作

Python Web WebAssembly 与 Python 的协同工作 目录 &#x1f310; WebAssembly&#xff08;Wasm&#xff09;的基础 1.1 什么是 WebAssembly 以及它如何改变 Web 开发1.2 WebAssembly 的性能优势与跨平台特性 &#x1f40d; Python 与 WebAssembly 2.1 在 WebAssembly 中运行…