目录
Service四层负载均衡
Service介绍
Service代理规则-iptables
Serviceipvs代理规则-ipvs
Service常用访问方式介绍
Cluster IP应用案例
NodePort应用案例
Ingress七层负载均衡
Ingress控制器介绍
Ingress HTTP应用案例
Ingress HTTPS应用案例
Service四层负载均衡
Service介绍
在k8s集群中,由于Pod经常处于用后即焚状态,Pod经常被重新生成,因此Pod对应的IP地址也会经常变化,导致无法直接访问Pod提供的服务。
ks中使用了Service来解决这一问题,即在Pod前面使用Service对Pod进行代理,无论Pod怎样变化 ,只要有Label,就可以让Service能够联系上Pod,进而实现通过Service访问Pod目的。
Service的本质就是一条代理规则,真正实现代理功能的其实是kube-proxy代理组件,当创建Service时,就等于创建了一条代理规则,而这条规则就是告诉kube-proxy通过那种方式进行代理。
Service代理规则-iptables
iptables规则通过内核模块netfilter实现流量转发,基于内核进行流量转发本身效率就高,但是iptables模式不能提供灵活的负载均衡策略,只是随机的将流量转发到后端的Pod,当后端Pod不可用时也无法进行健康检查。
Serviceipvs代理规则-ipvs
ipvs(Virtual Server)与iptables类似,都是基于 netfilter 进行流量转发,但是ipvs在转发时支持的负载均衡算法非常的灵活,例如:轮询、加权轮询、基于端口转发、最小负载、最少连接等,ipvs 支持服务器健康检查和连接重试等功能。
想要使用ipvs转发模式需要安装ipvs内核模块,否则会降级为iptables模式(安装ipvs请看前几期)
#查看ipvs功能是否开启 [root@master01 ~]#ipvsadm -Ln IP Virtual Server version 1.2.1 (size=4096) Prot LocalAddress:Port Scheduler Flags -> RemoteAddress:Port Forward Weight ActiveConn InActConn TCP 172.16.1.150:32244 rr TCP 172.16.241.64:32244 rr TCP 172.17.0.1:32244 rr TCP 10.0.0.110:32244 rr TCP 10.96.0.1:443 rr -> 10.0.0.110:6443 Masq 1 3 0 -> 10.0.0.111:6443 Masq 1 1 0 -> 10.0.0.112:6443 Masq 1 0 0 TCP 10.96.0.2:53 rr -> 172.16.235.1:53 Masq 1 0 0 TCP 10.96.0.2:9153 rr -> 172.16.235.1:9153 Masq 1 0 0 TCP 10.96.31.28:80 rr TCP 10.96.131.122:443 rr -> 172.16.30.76:4443 Masq 1 2 0 UDP 10.96.0.2:53 rr -> 172.16.235.1:53 Masq 1 0 0提示:如果是通过kubeadm部署的集群,需要手动修改kube-proxy来开启ipvs模式
#编辑kube-proxy的cm资源,开启ipvs模式 kubectl edit cm kube-proxy -n kube-system ... mode: "ipvs" #修改为ipvs模式 #删除当前正在使用的kube-proxy的pod(按照标签删除) kubectl get pod --show-labels -n kube-system | grep kube-proxy* kubectl delete pod -l k8s-app=kube-proxy -n kube-system #查看kube-proxy的pod是否被重建 kubectl get po -n kube-systemService常用访问方式介绍
ClusterIP:默认访问方式,分配一个集群内部可以访问的虚拟IP(该方式只能用于集群内部访问,外部无法访问)
NodePort:在每个Node上分配一个端口作为外部访问入口,端口范围为30000-32767(该访问适用于外部访问)
LoadBalancer:通过在集群外部的公有云平台上,例如:阿里云、华为云、AWS等做一个负载均衡,通过外部负载均衡将流量转发到集群中。
Cluster IP应用案例
案例:创建3个Pod并设置标签为app=deploy-nginx通过Service ClusterIP访问方式进行代理
参考地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
资源文档查询方法:kubectl explain svc
#创建文件 [root@master01 ~/test]#cat hpa-nginx.yml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx namespace: test spec: replicas: 3 selector: matchLabels: app: deploy-nginx template: metadata: labels: app: deploy-nginx spec: containers: - name: nginx image: nginx:1.20.0 resources: #资源限额 limits: #资源上限 cpu: 100m #cpu 1核心的10%的资源(生产环境建议600m-800m) --- apiVersion: v1 kind: Service metadata: name: svc-nginx namespace: test spec: type: ClusterIP #定义service默认访问方式 ports: #定义端口信息 - port: 80 #访问service的端口 targetPort: 80 #pod中容器的端口 selector: #标签选择 app: deploy-nginx #标签(需要与deploy中的模板标签一致) --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-nginx namespace: test spec: minReplicas: 3 #最小的pod数量 maxReplicas: 10 #最大的pod数量 metrics: # 定义自动扩缩容(HPA)的指标类型和规则 - type: Resource #指标类型(内存或cpu) resource: name: cpu #资源名称 target: #目标值配置 #可选值: Utilization(使用率百分比)、AverageValue(平均值)、Value(具体值) type: Utilization #目标值类型为"使用率",表示百分比 averageUtilization: 10 #目标cpu使用率为百分之10 # 含义:HPA会调整Pod副本数,使所有Pod的平均CPU使用率尽量接近50% scaleTargetRef: #指定要控制的deploy信息 apiVersion: apps/v1 #deploy版本 kind: Deployment #deploy类型 name: deploy-nginx #deploy名称 #创建pod [root@master01 ~/test]#kubectl create -f hpa-nginx.yml deployment.apps/deploy-nginx created service/svc-nginx created horizontalpodautoscaler.autoscaling/hpa-nginx created #查看pod信息 [root@master01 ~/test]#kubectl get pod -n test -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES deploy-nginx-7f78966fd6-8wwgr 1/1 Running 0 46s 172.16.30.87 worker02 <none> <none> deploy-nginx-7f78966fd6-gthv8 1/1 Running 0 46s 172.16.30.88 worker02 <none> <none> deploy-nginx-7f78966fd6-mr6wb 1/1 Running 0 46s 172.16.30.86 worker02 <none> <none> #查看svc信息 [root@master01 ~/test]#kubectl get svc -n test NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc-nginx ClusterIP 10.96.238.237 <none> 80/TCP 85s #为了验证,我们使用ab模拟并发 [root@master01 ~/test]#ab -n 300000 -c 100 http://10.96.238.237/index.html #过一会查看我们pod的资源情况(均发到所有的pod中) [root@master01 ~/test]#kubectl top pod -n test NAME CPU(cores) MEMORY(bytes) deploy-nginx-7f78966fd6-8wwgr 3m 1Mi deploy-nginx-7f78966fd6-925cv 3m 1Mi deploy-nginx-7f78966fd6-c7nqq 3m 1Mi deploy-nginx-7f78966fd6-dzkbz 3m 1Mi deploy-nginx-7f78966fd6-gthv8 3m 1Mi deploy-nginx-7f78966fd6-m7qft 3m 1Mi deploy-nginx-7f78966fd6-m9z4p 3m 1Mi deploy-nginx-7f78966fd6-mr6wb 3m 1Mi deploy-nginx-7f78966fd6-wl4mj 3m 1Mi deploy-nginx-7f78966fd6-xd4s4 3m 1Mi总结:Cluster IP的访问方式只能用在集群内部主机之间访问,集群外部主机没办法访问。
NodePort应用案例
在生产环境中,Service是需要暴露给外部访问的,那么就要用到NodePort类型,NodePort的工作原理其实就是在Node节点上暴露一个端口,然后外部主机就可以通过节点IP+NodePort端口来访问集群中的pod。
案例:将前边案例中的清单文件Cluster IP改为NodePort 类型,实现外部访问。
参考地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/service/
[root@master01 ~/test]#cat hpa-nginx.yml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx namespace: test spec: replicas: 3 selector: matchLabels: app: deploy-nginx template: metadata: labels: app: deploy-nginx spec: containers: - name: nginx image: nginx:1.20.0 resources: #资源限额 limits: #资源上限 cpu: 100m #cpu 1核心的10%的资源(生产环境建议600m-800m) --- apiVersion: v1 kind: Service metadata: name: svc-nginx namespace: test spec: type: NodePort #定义service访问方式 ports: #定义端口信息 - port: 80 #访问service的端口 targetPort: 80 #pod中容器的端口 nodePort: 30007 #外部访问service的端口 selector: #标签选择 app: deploy-nginx #标签(需要与deploy中的模板标签一致) --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-nginx namespace: test spec: minReplicas: 3 #最小的pod数量 maxReplicas: 10 #最大的pod数量 metrics: # 定义自动扩缩容(HPA)的指标类型和规则 - type: Resource #指标类型(内存或cpu) resource: name: cpu #资源名称 target: #目标值配置 #可选值: Utilization(使用率百分比)、AverageValue(平均值)、Value(具体值) type: Utilization #目标值类型为"使用率",表示百分比 averageUtilization: 10 #目标cpu使用率为百分之10 # 含义:HPA会调整Pod副本数,使所有Pod的平均CPU使用率尽量接近50% scaleTargetRef: #指定要控制的deploy信息 apiVersion: apps/v1 #deploy版本 kind: Deployment #deploy类型 name: deploy-nginx #deploy名称 #创建pod [root@master01 ~/test]#kubectl create -f hpa-nginx.yml deployment.apps/deploy-nginx created service/svc-nginx created horizontalpodautoscaler.autoscaling/hpa-nginx created #查看Service信息 [root@master01 ~/test]#kubectl get svc -n test NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc-nginx NodePort 10.96.218.129 <none> 80:30007/TCP 24s #提示: 80 #Service内部端口 32388 #Service的NodePortNode,这个端口监听在集群节点上,提供外部访问的外部主机访问:http://10.0.0.110:30007
Ingress七层负载均衡
Ingress控制器介绍
Ingress相当于一个7层的负载均衡器,是k8s对反向代理的一个抽象,它的工作原理类似于Nginx反向代理,用户编写Ingress规则,说明哪个域名对应集群中的Service,然后生成一段对应的Nginx反向代理配置进行流量转发。
Ingress 控制器种类很多,本实验使用ingress-nginx来部署,资源清单文件下载地址:https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/baremetal/deploy.yaml
#将ingress-nginx.yaml文件中的Servcie类型LoadBalancerg改为NodePort vim ingress-nginx.yaml ... 340 type: NodePort #创建ingress-nginx [root@master01 ~/work]#kubectl create -f ingress-nginx.yaml #查看ingress-nginx空间的Pod信息(ingress-nginx-controller运行在那个节点,该节点就是一台Nginx代理服务器) [root@master01 ~/work]#kubectl get pod -n ingress-nginx -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES ingress-nginx-admission-create-8xj5w 0/1 Completed 0 45s 172.16.30.100 worker02 <none> <none> ingress-nginx-admission-patch-k5lqr 0/1 Completed 0 45s 172.16.30.101 worker02 <none> <none> ingress-nginx-controller-5d9df7655c-dqfzj 1/1 Running 0 45s 172.16.30.102 worker02 <none> <none> #查看Ingress-nginx空间的service [root@master01 ~/work]#kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller NodePort 10.96.1.20 <none> 80:31091/TCP,443:32450/TCP 67s ingress-nginx-controller-admission ClusterIP 10.96.165.148 <none> 443/TCP 67sIngress HTTP应用案例
案例:创建Nginx的pod,并通过Ingress进行HTTP访问
参考地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
#创建文件 [root@master01 ~/test]#cat hpa-nginx.yml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx namespace: test spec: replicas: 3 selector: matchLabels: app: deploy-nginx template: metadata: labels: app: deploy-nginx spec: containers: - name: nginx image: nginx:1.20.0 resources: #资源限额 limits: #资源上限 cpu: 100m #cpu 1核心的10%的资源(生产环境建议600m-800m) --- apiVersion: v1 kind: Service metadata: name: svc-nginx namespace: test spec: type: NodePort #定义service访问方式 ports: #定义端口信息 - port: 80 #访问service的端口 targetPort: 80 #pod中容器的端口 nodePort: 30007 #外部访问service的端口 selector: #标签选择 app: deploy-nginx #标签(需要与deploy中的模板标签一致) --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: http-nginx #定义ingress名称 namespace: test spec: rules: #自定义主机列表 - host: www.nginx.com #自定义域名 http: paths: - pathType: Prefix #路径类型 path: / #定义站点路径 backend: #定义后端引用的服务 service: #关联service name: svc-nginx #对应上面创建的service名称 port: number: 80 #service的ClusterIP端口 --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-nginx namespace: test spec: minReplicas: 3 #最小的pod数量 maxReplicas: 10 #最大的pod数量 metrics: # 定义自动扩缩容(HPA)的指标类型和规则 - type: Resource #指标类型(内存或cpu) resource: name: cpu #资源名称 target: #目标值配置 #可选值: Utilization(使用率百分比)、AverageValue(平均值)、Value(具体值) type: Utilization #目标值类型为"使用率",表示百分比 averageUtilization: 10 #目标cpu使用率为百分之10 # 含义:HPA会调整Pod副本数,使所有Pod的平均CPU使用率尽量接近50% scaleTargetRef: #指定要控制的deploy信息 apiVersion: apps/v1 #deploy版本 kind: Deployment #deploy类型 name: deploy-nginx #deploy名称 #创建pod [root@master01 ~/test]#kubectl create -f hpa-nginx.yml deployment.apps/deploy-nginx created service/svc-nginx created ingress.networking.k8s.io/http-nginx created horizontalpodautoscaler.autoscaling/hpa-nginx created #查看pod [root@master01 ~/test]#kubectl get pod -n test NAME READY STATUS RESTARTS AGE deploy-nginx-7f78966fd6-fgflt 1/1 Running 0 15s deploy-nginx-7f78966fd6-ltfsl 1/1 Running 0 15s deploy-nginx-7f78966fd6-mlsq4 1/1 Running 0 15s #查看svc [root@master01 ~/test]#kubectl get svc -n test NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE svc-nginx NodePort 10.96.184.213 <none> 80:30007/TCP 20s #查看ingress详情 [root@master01 ~/test]#kubectl describe ing -n test Name: http-nginx Labels: <none> Namespace: test Address: Default backend: default-http-backend:80 (<error: endpoints "default-http-backend" not found>) Rules: Host Path Backends ---- ---- -------- www.nginx.com / svc-nginx:80 (172.16.30.103:80,172.16.30.104:80,172.16.30.105:80) Annotations: <none> Events: <none>配置windows本地解析:C:\Windows\System32\drivers\etc\hosts
访问测试:www.nginx.com:30007
Ingress HTTPS应用案例
生成证书
[root@master01 ~/test]#openssl req -x509 -sha256 -nodes -days 3650 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/C=CN/ST=HB/O=joren/CN=web.joren.com" Generating a 2048 bit RSA private key .............................................................................+++ ............................+++ writing new private key to 'tls.key' ----- #说明: CN //证书的主题名称,例如,网站证书的CN通常是其域名(自签的证书,该名称自定义) C //国家 ST //省份 O //公司通过secret存储证书
[root@master01 ~/test]#kubectl create secret tls tls-secret --key tls.key --cert tls.crt -n test secret/tls-secret created案例:创建Nginx的pod,并通过Ingress进行HTTPS访问
Ingress参考地址:https://kubernetes.io/zh-cn/docs/concepts/services-networking/ingress/
#创建文件 [root@master01 ~/test]#cat hpa-nginx.yml apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nginx namespace: test spec: replicas: 3 selector: matchLabels: app: deploy-nginx template: metadata: labels: app: deploy-nginx spec: containers: - name: nginx image: nginx:1.20.0 resources: #资源限额 limits: #资源上限 cpu: 100m #cpu 1核心的10%的资源(生产环境建议600m-800m) --- apiVersion: v1 kind: Service metadata: name: svc-nginx namespace: test spec: type: NodePort #定义service访问方式 ports: #定义端口信息 - port: 80 #访问service的端口 targetPort: 80 #pod中容器的端口 nodePort: 30007 #外部访问service的端口 selector: #标签选择 app: deploy-nginx #标签(需要与deploy中的模板标签一致) --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: http-nginx #定义ingress名称 namespace: test annotations: kubernetes.io/ingress.class: nginx spec: tls: - hosts: - www.nginx.com #指定使用证书的域名 secretName: tls-secret #指定secret名称(与前边创建的保持一致) rules: #自定义主机列表 - host: www.nginx.com #自定义域名 http: paths: - pathType: Prefix #路径类型 path: / #定义站点路径 backend: #定义后端引用的服务 service: #关联service name: svc-nginx #对应上面创建的service名称 port: number: 80 #service的ClusterIP端口 --- apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: hpa-nginx namespace: test spec: minReplicas: 3 #最小的pod数量 maxReplicas: 10 #最大的pod数量 metrics: # 定义自动扩缩容(HPA)的指标类型和规则 - type: Resource #指标类型(内存或cpu) resource: name: cpu #资源名称 target: #目标值配置 #可选值: Utilization(使用率百分比)、AverageValue(平均值)、Value(具体值) type: Utilization #目标值类型为"使用率",表示百分比 averageUtilization: 10 #目标cpu使用率为百分之10 # 含义:HPA会调整Pod副本数,使所有Pod的平均CPU使用率尽量接近50% scaleTargetRef: #指定要控制的deploy信息 apiVersion: apps/v1 #deploy版本 kind: Deployment #deploy类型 name: deploy-nginx #deploy名称 #创建pod [root@master01 ~/test]#kubectl create -f hpa-nginx.yml deployment.apps/deploy-nginx created service/svc-nginx created ingress.networking.k8s.io/http-nginx created horizontalpodautoscaler.autoscaling/hpa-nginx created ##查看ingress-nginx空间的Service NodePort的443对应端口 [root@master01 ~/test]#kubectl get svc -n ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller NodePort 10.96.1.20 <none> 80:31091/TCP,443:32450/TCP 54m ingress-nginx-controller-admission ClusterIP 10.96.165.148 <none> 443/TCP 54m访问测试:http://www.nginx.com:32450