Kubernetes(k8s第四部分之servers)

1,为什么不使用round-robin DNS?

因为DNS有缓存,不会清理,无法负载均衡

ipvs代理模式,这种模式,kube-proxy会监视Kubernetes Service 对象和Endpoints,调用netlink接口以相应地创建ipvs规则并定期与Kubernetes Service 对象和Endpoints对象同步ipvs规则,以确保ipvs状态与期望一致。访问服务时,流量将被重定向到其中一个后端Pod

与iptables类似。ipvs于netfilter的hook功能,但使用哈希表作为底层数据结构并在内核空间中工作。这意味着ipvs可以更快的重定向流量,并且在同步代理规则时具有更好的性能。此外,ipvs为负载均衡算法提供了更多选项,例如:

rr:轮询调度。

lc:最小连接数。

dh:目标哈希。

sh:嘻哈源。

sed:最短期望延迟。

nq:不排队调度。

ClusterIP

clusterIP主要在每个node节点使用iptables,将发向clusterIP对应端口的数据。转发到kube-proxy中。然后kube-proxy自己内部实现有负载均衡的方法。并可以查询到这个service下对应pod的地址和端口,进而把数据转发给对应的pod的地址和端口。

为了实现上图的功能,主要需要以下几个组件的协同工作。

apiserver用户通过kubectl命令向apiserver发送创建service命令,apiserver接受到请求后将数据存储到etcd中。

kube-proxy kubernetes的每个节点中都有一个叫做kube-porxy的进程。这个进程负责感知service,pod的变化。并将变化的信息写入本地的iptables规则中。

iptables使用NAT等技术将virtualIP。的流量转至endpoint中。

Headless Service

有时不需要或不想要负载均衡。,以及单独的Service IP。遇到这种情况。可以通过指定Cluster IP(spec.clusterIP)的值为"None"来创建Headless Service。这类Service并不会分配Cluster IP,kube-proxy不会处理他们,而且平台也不会为他们进行负载均衡和路由。

通过这种去绑定。

kubectl get pod -n kube-system

kubectl get pod -n kube-system -o wide

kubectl get pod

kubectl get pod -o wide

NodePort

nodePort的原理在于在node上开了一个端口。将向该端口的流量导入到kube-proxy,然后有kube-proxy进一步到给对应的pod。

master\]vim myapp-service.yaml apiVersion: v1 kind: Service metadate: name: myapp namespace: default spec: type: NodePort selector: app: myapp release: stable ports: name: http port: 80 targetPort: 80 查询流程 iptables -t nat -nvl KUBE-NODEPORTS ## LoadBalancer loadBalancer和nodePort其实是一种方式。区别在于loadBalancer比nodePort多了一步,就是可以调用cloud provider去创建LB来向节点导流。 ![](https://file.jishuzhan.net/article/1766110705079029761/5836f51b73ee8d95471585d788716559.webp) LAAS流量服务,特别贵,云服务器搭建的k8s ## ExternalName 这种类型的Service通过返回CNAME和他的值,可以将服务映射到externalName字段的内容(例如:hub.atguigu.com)ExternalName Service是Service的特例。他没有selector,也没有定义任何的端口和Endpoint。相反的。对于运行在集群外部的服务。它通过返回该外部服务的别名。这种方式来提供服务。 kind:Service apiVersion: v1 metadata: name : my-service-1 namespace: default spec: type: ExternalName externalName: my.database.example.com 当查询主机my-service.defalut.cluster.local(SVC_NAME.NAMESPACE。svc.cluster.local) 时,集群的DNS服务将返回一个值my.database.example.com的CNAME记录。访问这个服务的工作方式和其他的相同,唯一不同的是重定向发生在DNS层,而且不会进行代理或转发。 ## 资料信息 ![](https://file.jishuzhan.net/article/1766110705079029761/001f8bb063fbcf68a5745a9e025d36fb.webp) ![](https://file.jishuzhan.net/article/1766110705079029761/ebd5ae041f5c73e86cd03a22790c1113.webp) ## ingress ![](https://file.jishuzhan.net/article/1766110705079029761/85d9d2fbf6d90adaa96135104e1e08fa.webp) ## Ingress HTTP代理访问 ![](https://file.jishuzhan.net/article/1766110705079029761/8dac86fe8e74235a5163ef7f33abf5a9.webp) ![](https://file.jishuzhan.net/article/1766110705079029761/0c0f03f6d4a0e90d96180be6fb45f7de.webp) ![](https://file.jishuzhan.net/article/1766110705079029761/2e552169efed0f4612aed25c19091cad.webp) vim ingress.http.yaml kubectl apply -f ingress.http.yaml kubectl get svc curl 10.102.54.180 kubectl apply -f ingress1.ymal ![](https://file.jishuzhan.net/article/1766110705079029761/075737402ae4aec16ef947cf2a1579cc.webp) 进入容器的命令 kubectl exec 容器名称 -n 名称 -it -- /bin/bash 根据不同的域名实现不同的虚拟主机 ### 创建证书,以及cert存储方式 openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN-nginxsvc/0=nginxsvc" kubectl create secret tls tls-secret --key tls,key --cert tls.crt ### deployment.service.IngressYaml文件 APIVersion:extensions/v1betal kind: Ingress metadata: name: nginx-test spec: tls: - hosts - foo.bar.com secretName: tls-secret rules: - host: foo.bar.com http: paths: / backend: serviceName: nginx-svc servicePort: 80 ## Nginx进行BasicAuth ![](https://file.jishuzhan.net/article/1766110705079029761/51d5e0f5a386b1d4d0356edb4a6988d7.webp) ![](https://file.jishuzhan.net/article/1766110705079029761/f7ae8404d3ce1e18bf01a20b52d6c4ef.webp) ![](https://file.jishuzhan.net/article/1766110705079029761/cd0cb2ddae74e56d8b2c2a76ec93af7e.webp) ![](https://file.jishuzhan.net/article/1766110705079029761/694a9ead5633178bb55289b3d62009ce.webp) ![](https://file.jishuzhan.net/article/1766110705079029761/05f263282f26b49e574a457b72332031.webp)

相关推荐
NGC_6611几秒前
ArrayList扩容机制
java·前端·算法
HalvmånEver7 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林7 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
小夏卷编程8 小时前
Ubuntu 20.04.4 宝塔 docker showdoc v3.2 更新到v3.7.3
运维·docker·容器
JEECG低代码平台8 小时前
JeecgBoot低代码平台 Docker 部署 OnlyOffice 文档服务完整指南
低代码·docker·容器
赶路人儿8 小时前
UTC时间和时间戳介绍
java·开发语言
dreamread8 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端
6+h8 小时前
【java】基本数据类型与包装类:拆箱装箱机制
java·开发语言·python
一直都在5729 小时前
Spring面经
java·后端·spring
xiaoye37089 小时前
如何在Spring中使用注解配置Bean的生命周期回调方法?
java·spring