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)

相关推荐
云飞云共享云桌面18 分钟前
东莞精密机械制造工厂如何10个SolidWorks共用一台服务器资源
java·运维·服务器·网络·数据库·电脑·制造
毕设源码-赖学姐24 分钟前
【开题答辩全过程】以 网络药店管理系统为例,包含答辩的问题和答案
java·eclipse
努力也学不会java24 分钟前
【Java并发】揭秘Lock体系 -- 深入理解ReentrantReadWriteLock
java·开发语言·python·机器学习
埃泽漫笔37 分钟前
消息队列延迟与过期问题的实战解决
java·mq
花花无缺1 小时前
资源泄露问题
java·后端·http
爱敲代码的TOM1 小时前
深入剖析Java通信架构下的三种IO模式2
java·开发语言·架构
杨DaB1 小时前
【JavaSE】JVM
java·jvm
lang201509281 小时前
掌握MyBatis Java API:高效操作数据库
java·数据库·mybatis
東雪蓮☆2 小时前
K8S 概念、安装与核心工作机制详解
linux·运维·云原生·容器·kubernetes
晨晖22 小时前
将聚合工程的ssm项目部署到本地tomcat
java·tomcat