1. Service
-
Service可以看作是一组提供相同服务的Pod对外的访问接口。借助Service,应用可以方便地实现服务发现和负载均衡
-
service默认只支持4层负载均衡能力,没有7层功能。(可以通过Ingress实现)
-
service的类型:
- ClusterIP:默认值,k8s系统给service自动分配的虚拟IP,只能在集群内部访问
- NodePort:将Service通过指定的Node上的端口暴露给外部,访问任意一个
- NodeIP:nodePort都将路由到ClusterIP
- LoadBalancer:在 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参数