kubernetes基础篇 —— Service

1. Service

  • Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡

  • service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)

  • service的类型:

    1. ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问
    2. NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个
    3. NodeIP:nodePort都将路由到ClusterIP
    4. LoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用
    5. ExternalName:将服务通过 DNS CNAME 记录方式转发到指定的域名(通过spec.externlName 设定)
  • Service 是由 kube-proxy 组件,加上 iptables 来共同实现的

  • kube-proxy 通过 iptables 处理 Service 的过程,需要在宿主机上设置相当多的iptables 规则,如果宿主机有大量的Pod,不断刷新iptables规则,会消耗大量的CPU资源

  • IPVS模式的service,可以使K8s集群支持更多量级的Pod

1.1 开启kube-proxy的ipvs模式

所有节点安装ipvsadm

yum install -y ipvsadm

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改IPVS模式

kubectl edit cm kube-proxy -n kube-system

在这里插入图片描述
更新kube-proxy pod

kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'

在这里插入图片描述注意: IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡: kube-ipvs0,并分配service IP

ifconfig kube-ipvs0
###
若还没有ifconfig命令,安装net-tools.x86_64
###

在这里插入图片描述
查看属性
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod
在这里插入图片描述
Flannel vxlan模式跨主机通信原理
在这里插入图片描述
创建service:(ClusterIP方式)

vim service-test.yaml

在这里插入图片描述

kubectl create -f service-test.yaml 
kubectl describe service web-service 

在这里插入图片描述
Kubernetes 提供了一个 DNS 插件 Service

kubectl get services kube-dns --namespace=kube-system
kubectl run test --image=reg.harbor.com/library/busybox -it
###
nslookup web-service
###

在这里插入图片描述
Headless Service “无头服务”

  • Headless Service不需要分配一个VIP,而是直接以DNS记录的方式解析出被代理Pod的IP地址
  • 域名格式:(servicename).(servicename).(namespace).svc.cluster.local

Headless Service 示例
在这里插入图片描述

kubectl create -f service.yaml
kubectl get services

在这里插入图片描述

yum install -y bind-utils-9.9.4-72.el7.x86_64

在这里插入图片描述

dig -t A nginx-svc.default.svc.cluster.local @10.96.0.10

在这里插入图片描述
Pod滚动更新后,依然可以解析

kubectl delete pod --all
dig -t A nginx-svc.default.svc.cluster.local @10.96.0.10

在这里插入图片描述
创建service:(NodePort方式)

vim service-example.yaml

在这里插入图片描述

kubectl create -f service-example.yaml 
kubectl get services my-nginx

在这里插入图片描述
在这里插入图片描述
外部访问 Service 的第二种方式,适用于公有云上的 Kubernetes 服务。这时候,你可以指定一个 LoadBalancer 类型的Service

vim lb-service.yaml

在这里插入图片描述
在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端
在这里插入图片描述
在这里插入图片描述
从外部访问的第三种方式叫做ExternalName

vim ex-service.yaml

在这里插入图片描述

kubectl create -f ex-service.yaml 
dig -t A my-service.default.svc.cluster.local @10.96.0.10

在这里插入图片描述
service允许为其分配一个公有IP

vim ex-service.yaml

在这里插入图片描述

kubectl create -f ex-service.yaml 
kubectl get services ex-service 

在这里插入图片描述
在这里插入图片描述

1.2 ingress-nginx

在这里插入图片描述

  • 一种全局的、为了代理不同后端 Service 而设置的负载均衡服务,就是 Kubernetes 里的Ingress 服务
  • Ingress由两部分组成:Ingress controller和Ingress服务
  • Ingress Controller 会根据你定义的 Ingress 对象,提供对应的代理能力。业界常用的各种反向代理项目,比如 Nginx、HAProxy、Envoy、Traefik 等,都已经为Kubernetes 专门维护了对应的 Ingress Controller

官网: https://kubernetes.github.io/ingress-nginx/
应用ingress controller定义文件

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml

在这里插入图片描述
应用ingress-service定义文件

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

在这里插入图片描述

kubectl -n ingress-nginx get pod
kubectl -n ingress-nginx get services

在这里插入图片描述
创建ingress服务

vim ingress.yaml

在这里插入图片描述

kubectl apply -f ingress.yaml
kubectl get ingresses

在这里插入图片描述
用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务

  • 优点是整个请求链路最简单,性能相对NodePort模式更好
  • 缺点是由于直接利用宿主机节点的网络和端口,一个node只能部署一个ingress-controller pod
  • 比较适合大并发的生产环境使用

在这里插入图片描述
修改ingress controller部署文件

vim mandatory.yaml  ##我已经将需要的镜像下载上传到harbor仓库,所以这里使用harbor仓库

在这里插入图片描述
设置ingress controller节点的标签

kubectl label nodes server6 type=ingress

在这里插入图片描述
应用更新配置

kubectl -n ingress-nginx delete deployments.apps nginx-ingress-controller 

在这里插入图片描述

kubectl apply -f mandatory.yaml

在这里插入图片描述
Ingress TLS 配置

openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt

在这里插入图片描述

vim ingress-https.yaml

在这里插入图片描述
Ingress 认证配置

yum install -y httpd-tools
htpasswd -c auth dsd
kubectl create secret generic basic-auth --from-file=auth

在这里插入图片描述
在这里插入图片描述

vim ingress-auth.yaml

在这里插入图片描述

kubectl create -f ingress-auth.yaml

在这里插入图片描述
Ingress地址重写

vim ingress-rewrite.yaml

在这里插入图片描述

kubectl apply -f ingress-rewrite.yaml 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
annotations参数
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章