kubernetes基础篇 —— Service

    技术2023-11-29  96

    1. Service

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

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

    service的类型:

    ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个NodeIP:nodePort都将路由到ClusterIPLoadBalancer:在 NodePort 的基础上,借助 cloud provider 创建一个外部的负载均衡器,并将请求转发到 :NodePort,此模式只能在云服务器上使用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地址域名格式: ( s e r v i c e n a m e ) . (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参数

    Processed: 0.011, SQL: 9