第九讲《k8s负载均衡:ingress & ingress controller》
我们知道Service的表现形式为IP地址和端口号(ClusterIP:Port),即工作在TCP/IP层。而对于基于http的服务来说,不同的URL地址经常对应不同的后端服务或者虚拟服务器,这些应用层的转发机制仅通过k8s的service机制是无法实现的。k8s引入了ingress资源对象,用于将k8s集群外的客户端请求路由到集群内部的服务上,同时提供7层(HTTP和HTTPS)路由功能。k8s
一、概念
我们知道Service的表现形式为IP地址和端口号(ClusterIP:Port),即工作在TCP/IP层。而对于基于http的服务来说,不同的URL地址经常对应不同的后端服务或者虚拟服务器,这些应用层的转发机制仅通过k8s的service机制是无法实现的。k8s引入了ingress资源对象,用于将k8s集群外的客户端请求路由到集群内部的服务上,同时提供7层(HTTP和HTTPS)路由功能。
k8s使用了一个Ingress策略定义和一个具体提供转发服务的Ingress Controller,两者结合,实现了灵活Ingress策略定义的服务路由功能。
1.Ingress
Ingress 是对集群中服务的外部访问进行管理的 API 对象,公开从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
下面是一个将所有流量都发送到同一 Service 的简单 Ingress 示例:
Ingress 可为 Service 提供外部可访问的 URL、负载均衡流量、终止 SSL/TLS,以及基于名称的虚拟托管。
2.Ingress Controller
Ingress 控制器 通常负责通过负载均衡器来实现 Ingress,尽管它也可以配置边缘路由器或其他前端来帮助处理流量。使用Ingress进行服务路由时,Ingress Controller基于Ingress规则将客户端请求直接转发到Service对应的后端Endpoint(Pod)上,这样就跳过kube-proxy设置的路由转发规则。
3.负载均衡器
IngressController需要实现基于不同HTTP URL向后转发的负载分发规则,并可以灵活设置7层负载分发策略。目前Ingress Controller已经有许多实现方案,包括:Nginx、HAProxy、Kong、Traefik、Skepper、Istio等开源软件实现,用那种需要结合自身实际需求去选择。
二、Ingress资源详解
1.Ingress资源定义
apiVersion: networking.k8s.io/v1 ## Ingress接口版本
kind: Ingress ## 资源类型
metadata: ## 元数据
name: minimal-ingress ## 资源名称
annotations: ## 注解
nginx.ingress.kubernetes.io/rewrite-target: / ## 重写,更多注解参考nginx官网
spec: ## 详细信息
ingressClassName: nginx-example ## 这是最关键的一个配置,这个配置就是用来关联ingress-controller,这个值是ingressClass的名称
rules: ## 路由规则
- http: ## 协议类型
paths: ## 路径信息
- path: /testpath ## 具体路径
pathType: Prefix ## 路径匹配类型
backend: ## 关联后端信息
service: ## 后端service
name: test ## service name
port: ## service端口
number: 80 ## 端口号
路径匹配类型
- ImplementationSpecific:对于这种路径类型,匹配方法取决于 IngressClass。 具体实现可以将其作为单独的
pathType 处理或者与 Prefix 或 Exact 类型作相同处理。 - Exact:精确匹配 URL 路径,且区分大小写。
- Prefix:基于以 / 分隔的 URL 路径前缀匹配。匹配区分大小写,并且对路径中的元素逐个完成。 路径元素指的是由 /
分隔符分隔的路径中的标签列表。 如果每个 p 都是请求路径 p 的元素前缀,则请求与路径 p 匹配。
2.默认后端
没有设置规则的 Ingress 将所有流量发送到同一个默认后端,而 .spec.defaultBackend 则是在这种情况下处理请求的那个默认后端。 defaultBackend 通常是 Ingress 控制器的配置选项, 而非在 Ingress 资源中指定。 如果未设置任何的 .spec.rules,那么必须指定 .spec.defaultBackend。 如果未设置 defaultBackend,那么如何处理所有与规则不匹配的流量将交由 Ingress 控制器决定。
如果没有 hosts 或 paths 与 Ingress 对象中的 HTTP 请求匹配,则流量将被路由到默认后端。
3.资源后端
Resource 后端是一个引用,指向同一命名空间中的另一个 Kubernetes 资源,将其作为 Ingress 对象。 Resource 后端与 Service 后端是互斥的,在二者均被设置时会无法通过合法性检查。 Resource 后端的一种常见用法是将所有入站数据导向带有静态资产的对象存储后端。
4.Ingress类
Ingress 可以由不同的控制器实现,通常使用不同的配置。 每个 Ingress 应当指定一个类,也就是一个对 IngressClass 资源的引用。 IngressClass 资源包含额外的配置,其中包括应当实现该类的控制器名称。
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: external-lb
spec:
controller: example.com/ingress-controller
parameters:
apiGroup: k8s.example.com
kind: IngressParameters
name: external-lb
IngressClass 中的 .spec.parameters 字段可用于引用其他资源以提供额外的相关配置。
参数(parameters)的具体类型取决于你在 .spec.controller 字段中指定的 Ingress 控制器
三、演练
演练使用kuboard内置IngressController,无需搭建,主要展示ingress规则及路由效果
1.创建资源
1.1deployment资源
[root@k8s-master ingress]# vim app-nginx.yaml ##应用的yaml文件
apiVersion: apps/v1
kind: Deployment ##资源类型deployment
metadata:
name: nginx-app ##pod名称
namespace: test ##名称空间
spec:
replicas: 2 ##副本数
selector:
matchLabels: ##标签选择器
app: nginx
template: ##以下是pod模板
metadata:
labels:
app: nginx ##给pod作标签
spec:
containers:
- name: nginx ##容器名称
image: core.harbor.domain/test/nginx-1.16.1:v4 ##镜像版本
ports:
- containerPort: 80 ##容器端口
1.2service资源
apiVersion: v1
kind: Service
metadata:
name: nginx-app-svc ##svc名称
namespace: test ##名称空间
spec:
type: ClusterIP ##用clusterIP模式
ports:
- protocol: TCP
port: 80 ##svc暴露的端口
targetPort: 80 ##关联容器端口
selector:
app: nginx
1.3ingress资源
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-app-ingress
namespace: test
annotations:
spec:
ingressClassName: nginx
rules:
- host: test.k8s.com
http:
paths:
- path: /
backend:
serviceName: nginx-app-svc
servicePort: 80
1.4创建
[root@k8s-master ingress]# kubectl apply -f app-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f service-nginx.yaml
[root@k8s-master ingress]# kubectl apply -f ingress-app.yaml
2.查看ingress注册情况
[root@k8s-master nginx-image]# kubectl get ingress -A
NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
harbor harbor-ingress nginx core.harbor.domain 10.5.0.213 80, 443 64d
harbor harbor-ingress-notary <none> notary.harbor.domain 80, 443 64d
test nginx-app nginx test.k8s.com 10.5.0.213 80 6d3h
test nginx-v1 nginx ng-test.com 10.5.0.213 80 57d
test nginx-v2 nginx ng-test.com 10.5.0.213 80 57d
[root@k8s-master nginx-image]# kubectl get pod -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-nginx-6mnlh 0/1 Completed 0 64d
ingress-nginx-admission-patch-nginx-zvjpt 0/1 Completed 0 64d
ingress-nginx-controller-nginx-7549777f47-gxhfd 1/1 Running 0 64d
ingress-nginx-controller-nginx-7549777f47-nslfp 1/1 Running 0 64d
[root@k8s-master nginx-image]# kubectl exec -it ingress-nginx-controller-nginx-7549777f47-gxhfd -n ingress-nginx -- /bin/bash
bash-5.1$
bash-5.1$ ls
fastcgi.conf fastcgi_params.default koi-win mime.types.default nginx.conf owasp-modsecurity-crs template win-utf
fastcgi.conf.default geoip lua modsecurity nginx.conf.default scgi_params uwsgi_params
fastcgi_params koi-utf mime.types modules opentracing.json scgi_params.default uwsgi_params.default
bash-5.1$ vim nginx.conf // 详情见下图
3.访问测试
由于浏览器是走公网,使用的域名没有备案,所以被封了,可以在服务器上访问测试
服务器上配置host
[root@k8s-master nginx-image]# kubectl get svc -n ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller-admission-nginx ClusterIP 10.106.130.250 <none> 443/TCP 64d
ingress-nginx-controller-nginx NodePort 10.105.158.159 <none> 80:30718/TCP,443:31427/TCP 64d
[root@k8s-master nginx-image]# cat /etc/hosts
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
10.5.0.211 iZuf6i1h1s2lsfa536a42xZ iZuf6i1h1s2lsfa536a42xZ
10.5.0.211 k8s-master
10.5.0.212 k8s-node01
10.5.0.213 k8s-node02
10.5.0.214 k8s-node03
10.105.158.159 core.harbor.domain ng-test.com test.k8s.com
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.241
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.241
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.242
[root@k8s-master nginx-image]# curl test.k8s.com
10.244.58.242
4.配置tls
4.1生成证书
参考:https://blog.csdn.net/weixin_43866248/article/details/129663815
4.2创建secret文件
[root@k8s-master CA]# base64 --wrap=0 ca.key // 这个值要记录,填入secret的tls.key字段
[root@k8s-master CA]# base64 --wrap=0 ca.crt // 这个值要记录,填入secret的tls.crt字段
[root@k8s-master CA]# vim nginx-tls.yaml
apiVersion: v1
kind: Secret
metadata:
name: nginx-tls
namespace: test
type: kubernetes.io/tls
data:
tls.crt: |
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVLRENDQXhDZ0F3SUJBZ0lKQVBJcldIdFRpc3B5TUEwR0NTcUdTSWIzRFFFQkN3VUFNSDh4Q3pBSkJnTlYKQkFZVEFsVlRNUXN3Q1FZRFZRUUlEQUpPV1RFUk1BOEdBMVVFQnd3SVRtVjNJRmx2Y21zeEZUQVRCZ05WQkFvTQpERVY0WVcxd2JHVXNJRXhNUXpFWU1CWUdBMVVFQXd3UFJYaGhiWEJzWlNCRGIyMXdZVzU1TVI4d0hRWUpLb1pJCmh2Y05BUWtCRmhCMFpYTjBRR1Y0WVcxd2JHVXVZMjl0TUI0WERUSXpNRGN4TXpFeU1EQXlOMW9YRFRNek1EY3gKTURFeU1EQXlOMW93ZnpFTE1Ba0dBMVVFQmhNQ1ZWTXhDekFKQmdOVkJBZ01BazVaTVJFd0R3WURWUVFIREFoTwpaWGNnV1c5eWF6RVZNQk1HQTFVRUNnd01SWGhoYlhCc1pTd2dURXhETVJnd0ZnWURWUVFEREE5RmVHRnRjR3hsCklFTnZiWEJoYm5reEh6QWRCZ2txaGtpRzl3MEJDUUVXRUhSbGMzUkFaWGhoYlhCc1pTNWpiMjB3Z2dFaU1BMEcKQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUUN5V0RjOE11OVp3TFhWQkdYYTFWL0ZoVUJvZ0QxQgpCTGdjNzN2UUhUZGhTOVpjc29lRFozMkxhSExRZEV3cy9wdVNJVnJ6cGt0VlJwRElnS1A3YnZiNzFySHVHOWZTClZJQ3JXanROUHAyYjFVN0V6RW5lVnVzbnNDcTR4d1ArUTlJV0NnNEYrSEZ5ZFlCdVF2RXVKNzUrcTIwOWwxNnEKV3N1ekNZMGoyTVlOejhpN2NtdWlzNnlPSmc5eFpzb1dVbGJ5SjlCMWpOalkvZ3dzQ1FlRlFaeDdYd0UxV0RFVwpCSEs0WlpsUTNKbXoybkFvV2hyeVZ2eGVpVGp0VzJBUm5ja3NEQXZNcjMvUTA4V056TnN1OGhvWjd2K1UxUnBrCkRGUVlOVGNpMTFhRXdsYWVySzV6eTBzaERCT2hsemlOTWVKNnhmWjBaYkVZRnUrbkVZMlIrVjNkQWdNQkFBR2oKZ2FZd2dhTXdIUVlEVlIwT0JCWUVGTnh5Q2FyemRWUG5WbWhJSTlOQWdsMlVIV2VPTUI4R0ExVWRJd1FZTUJhQQpGTnh5Q2FyemRWUG5WbWhJSTlOQWdsMlVIV2VPTUFrR0ExVWRFd1FDTUFBd0N3WURWUjBQQkFRREFnV2dNQnNHCkExVWRFUVFVTUJLQ0VIZDNkeTUwWlhOMExXczRjeTVqYjIwd0xBWUpZSVpJQVliNFFnRU5CQjhXSFU5d1pXNVQKVTB3Z1IyVnVaWEpoZEdWa0lFTmxjblJwWm1sallYUmxNQTBHQ1NxR1NJYjNEUUVCQ3dVQUE0SUJBUUFFV0pKcwo0U3pQVldadWM1N2F4MkFYNWYwOXVQdVlid1V1cUVNaDE5QTR6UndxOUhKWFlvb0Yza0NIanpzTzc0dUlNS0tuCnh3L2g4L1J3RERTZ0pnZDJIcnJuWWs1MWd1MVR4MnhkWmRKYjljV3hKU203ZFF2TTlZMmJMTmpmM2JIai94QVcKRDlhRThmOVhjRm11RTl4a1pqSStLYzVvMEZGWm44ZVVGR3ljRC9qN2tiQTdOWGZ1angxaCs5WFpBNXNxdUhIZApMUzArUEQ5U1lwRno4Zm9jTWVMdFk3L3dMa0ZLMXB2aG5DV0tubHZ3NHNoQkRDNlp6cS9zeS9uUWN1Z0VRRGZ5ClJoMWc5UGhycWNCK05lcjZRSXVKekU2RE9OaU4wa01sTm14aU1EOTFIemFVUExNaGd2bnBxMmRqbC9GOWxiaGQKazBPVzIwS2htTys5VmVMYgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
tls.key: |
LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUV2UUlCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktjd2dnU2pBZ0VBQW9JQkFRQ3lXRGM4TXU5WndMWFYKQkdYYTFWL0ZoVUJvZ0QxQkJMZ2M3M3ZRSFRkaFM5WmNzb2VEWjMyTGFITFFkRXdzL3B1U0lWcnpwa3RWUnBESQpnS1A3YnZiNzFySHVHOWZTVklDcldqdE5QcDJiMVU3RXpFbmVWdXNuc0NxNHh3UCtROUlXQ2c0RitIRnlkWUJ1ClF2RXVKNzUrcTIwOWwxNnFXc3V6Q1kwajJNWU56OGk3Y211aXM2eU9KZzl4WnNvV1VsYnlKOUIxak5qWS9nd3MKQ1FlRlFaeDdYd0UxV0RFV0JISzRaWmxRM0ptejJuQW9XaHJ5VnZ4ZWlUanRXMkFSbmNrc0RBdk1yMy9RMDhXTgp6TnN1OGhvWjd2K1UxUnBrREZRWU5UY2kxMWFFd2xhZXJLNXp5MHNoREJPaGx6aU5NZUo2eGZaMFpiRVlGdStuCkVZMlIrVjNkQWdNQkFBRUNnZ0VCQUp2SVRzYzR2cllwalNzN0lqVmF1TU55TithUVRmRWpUQ2VLVVI1aXh1TW8KT1dEVFdXZkEySHNUaTJibWp6dW1Vd0g4UE5RamFCNWUrMDBJZ1RTNW91Z3NpMU92NG4rSTdMUEFwNWc3bjdSbApTTjdDaTZ1NVJNTndNSUVpNWl3TjFjOEdqV1ZOdE5zRUpHRXIvRHdTMzJVS0hPdjE4dXpmVHB0Zk5uZ2ZmRERHCjMrQVUvUk9EMk02K3B4bXBZUzU4QlNXQzI4ZlN6cVRScVBSZ2dEUlVZNXlGTmJKd1dUaTlLcHNNdTM3M1ZxaEYKbldXZDhQZzd3ZmVlZzMzMU1tSmM5TlEwQWhXdngyNDU4ZGpsanVGR2FWLzdDVzRrTUtkZXBwTldZRnhhMkJZegplTldOTEF2YWxMMlE3bk5yN2tFR09ESkFOZkVwMCtpenBDQ0hudk1GVDRFQ2dZRUEyL2JwWnFsRHZaRDZWRldOCmY3ay9DczJNMFZWQTVTRHdmUGtOMUxKNENLdDQxQVJQYkJLMTFaYWJjb08wZXJ2d2pPTUhmNTd1V3F4c3l2OUIKcjlmUEtsZFBnUnhjSVhNNkNraEpDWHdoSE5Gb3dvd2krd3FWZUViZ2lQai82bm9FM0twc3c5MU5pQW1BMENEVApZVG5lKzBOUGlvRlBxRzVXY1h2L09lMk5RMjBDZ1lFQXo0L09yWTRMVXBwY2pCSlczZzNZWjE3RWI4ZXBFc2hiCk03WlhrN2VvZFdQVjlkazVLRWpzb0xuNDZxTXQ4ZkpnVEFaUThNaVl5TkduWk9LL1hPT1FnQUZhaUovRmJMUGQKNXJuWnJtQWY2RFcycmxSWU9XVmMyKzhjREpiamQ2b1BISHg1T0xDaG45RVY5THVkSnNUOU84VVBWWHhDVDJFNgphN1VWMmxvTmpqRUNnWUFBMXM1SkgvZ3NMdk5sZ3ZZSk9MR3UzdDNjcHBDYXp5ZGJzcStFMGpGM0J3QnMvcDgyCjhGTlZQei9VamdBUVA4dEpIa3lYQmdvdXVsMm40SlZsa0ZNdi9DbEhlczQzS25OY09xNWNwT2FUYjVFUXZPd2QKUFFzWTdGeEs2WGhBY3JxMkJNaHBidHl1MmlwdG9OSnRtb1RwUEhaL05zTVJCMnE1QUJvWEpIclhlUUtCZ0ZqeApBNXhsT0w3ZHZIaWRSeklCOXRCYzBJb2hvWGFWK2xiUGRQbXNnbmhESHFVcHZ3OWZLRjY3TWtuQlFPZmpkNVk4ClFxVGJJSFUxT2FqR2JUL3RsN2J5WFl3Y0FxcFE3TzU0aHluc3NOOTlYTm1ZOVBFcldUNDVXT2lnSTdyY1dYdFkKYjAxMml0dUQ2Z2VqK1hScWh5VDhqVlNSV1l6UVdndGJYcERoYzl1UkFvR0FIaEZ2eHZSN1A3WnBWNWd0c3dpMwpQRytkdVdTQ1Jod2pGeXVlS1J3bmFCc0J6TC9oUStmNTlvU3JQM2Q4T254VnBWNTZOcWp3dkhNeW9ZOFVLK3ZDCmVmbVF2bnJXeFBORnpiVHhsNUpXdG5zWkhIems1M091VGxHSWRhT2VtQXRaMktVd2pNcSsyZFFBNjE2L1NRaHcKNVllQ2t4c2RETzlMcEdUY01oa2FuWEk9Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0K
[root@k8s-master CA]# kubectl apply -f nginx-tls.yaml
secret/nginx-tls created
4.3修改ingress
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: nginx-app-ingress
namespace: test
annotations:
spec:
tls: // 添加
- hosts: // 添加
- test.k8s.com // 添加
secretName: nginx-tls // 添加
ingressClassName: nginx
rules:
- host: test.k8s.com
http:
paths:
- path: /
backend:
serviceName: nginx-app-svc
servicePort: 80
[root@k8s-master test]# kubectl edit ingress nginx-app -n test
ingress.networking.k8s.io/nginx-app edited
4.4https访问测试
[root@k8s-master test]# curl -k https://test.k8s.com
10.244.58.242
[root@k8s-master test]# curl -k https://test.k8s.com
10.244.58.242
[root@k8s-master test]# curl -k https://test.k8s.com
10.244.58.241
[root@k8s-master test]# curl -k https://test.k8s.com
10.244.58.241
更多推荐
所有评论(0)