模块八 - 作业二
Service
https://kubernetes.io/zh/docs/concepts/services-networking/service/
四层负载均衡,由 kube-proxy 来配置,早期默认 iptable, 在 1.11 之后变成 ipvs,这两个都是 netfilter 框架的产物
在
ipvs
模式下,kube-proxy 监视 Kubernetes 服务和端点,调用netlink
接口相应地创建 IPVS 规则, 并定期将 IPVS 规则与 Kubernetes 服务和端点同步。 该控制循环可确保 IPVS 状态与所需状态匹配。访问服务时,IPVS 将流量定向到后端 Pod 之一。
IPVS 代理模式基于类似于 iptables 模式的 netfilter 挂钩函数, 但是使用哈希表作为基础数据结构,并且在内核空间中工作。 这意味着,与 iptables 模式下的 kube-proxy 相比,IPVS 模式下的 kube-proxy 重定向通信的延迟要短,并且在同步代理规则时具有更好的性能。 与其他代理模式相比,IPVS 模式还支持更高的网络流量吞吐量。
IPVS 提供了更多选项来平衡后端 Pod 的流量。 这些是:
rr:轮替(Round-Robin)
lc:最少链接(Least Connection),即打开链接数量最少者优先
dh:目标地址哈希(Destination Hashing)
sh:源地址哈希(Source Hashing)
sed:最短预期延迟(Shortest Expected Delay)
nq:从不排队(Never Queue)
四种类型
Cluster IP 集群内访问
NodePort 暴露给外部访问 (kubenode:port) 30000~33000
loadBalancer 暴露给外部访问 ( 依赖外部负载均衡器 )metallb(https://github.com/kubernetes/cloud-provider-aws)
ExternalName 类似 cname,可以实现跨 namespace 的 ingress
YAMLapiVersion: v1kind: Servicemetadata: name: my-service namespace: prodspec: type: ExternalName externalName: my.database.example.com
当查找主机 my-service.prod.svc.cluster.local
时,集群 DNS 服务返回 CNAME 记录, 其值为 my.database.example.com
https://www.infoq.cn/article/p0v9d4br7udzwtgihuyq
ingress
社区推荐 nginx-ingress
通俗意义上的七层负载均衡,service 和 pod 仅可在集群内部网络中通过 IP 地址访问。所有到达边界路由器的流量或被丢弃或被转发到其他地方。从概念上讲,可能像下面这样:
Plain Text internet | ------------ [Services]
Ingress 是授权入站连接到达集群服务的规则集合。
Plain Text internet | [Ingress] --|-----|-- [Services]
你可以给 Ingress 配置提供外部可访问的 URL、负载均衡、SSL、基于名称的虚拟主机等。用户通过 POST Ingress 资源到 API server 的方式来请求 ingress。 Ingress controller 负责实现 Ingress,通常使用负载均衡器,它还可以配置边界路由和其他前端,这有助于以高可用的方式处理流量。
安装:
https://docs.nginx.com/nginx-ingress-controller/installation/installation-with-helm/
Shell Session~ ❯❯❯ helm repo add nginx-stable https://helm.nginx.com/stable~ ❯❯❯ helm install ingress-nginx nginx-stable/ingress-nginx --create-namespace --namespace ingressNAME: ingress-nginxLAST DEPLOYED: Sun Feb 27 02:44:22 2022NAMESPACE: ingressSTATUS: deployedREVISION: 1TEST SUITE: NoneNOTES:The ingress-nginx controller has been installed.It may take a few minutes for the LoadBalancer IP to be available.You can watch the status by running 'kubectl --namespace ingress get services -o wide -w ingress-nginx-controller'
An example Ingress that makes use of the controller:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example
namespace: foo
spec:
ingressClassName: nginx
rules:
- host: www.example.com
http:
paths:
- backend:
service:
name: exampleService
port:
number: 80
path: /
# This section is only required if TLS is to be enabled for the Ingress
tls:
- hosts:
- www.example.com
secretName: example-tls
If TLS is enabled for the Ingress, a Secret containing the certificate and key must also be provided:
apiVersion: v1
kind: Secret
metadata:
name: example-tls
namespace: foo
data:
tls.crt: <base64 encoded cert>
tls.key: <base64 encoded key>
type: kubernetes.io/tls
~ ❯❯❯ kubectl get pod -n ingress
NAME READY STATUS RESTARTS AGE
ingress-nginx-controller-54bfb9bb-vgdtm 1/1 Running 0 12h
~ ❯❯❯ kubectl get svc -n ingress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.0.78.161 52.170.175.195 80:31909/TCP,443:32228/TCP 12h
ingress-nginx-controller-admission ClusterIP 10.0.222.50 <none> 443/TCP 12h
~ ❯❯❯
Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Shell SessionapiVersion: networking.k8s.io/v1kind: Ingressmetadata: name: httpserver-80spec: ingressClassName: nginx rules: - host: mod8.51.cafe http: paths: - backend: service: name: httpsvc port: number: 80 path: / pathType: Prefix
版权声明: 本文为 InfoQ 作者【hunk】的原创文章。
原文链接:【http://xie.infoq.cn/article/f668130c5cafc5c0ba76f6468】。未经作者许可,禁止转载。
评论