k8s ingress详解(1)

本文介绍了 Kubernetes 中 Ingress 的概念及其应用场景,包括如何搭建 Ingress Service、配置 HTTP 和 HTTPS 服务、添加 TLS 证书等内容,并探讨了多种高级配置选项。

ingress 是除了 hostport  nodeport  clusterIP以及云环境专有的负载均衡器外的访问方式,官方提供了Nginx ingress controller。

通常情况下,service和pod的IP可以被集群网络访问。外部访问的所有流量被丢弃或转发到别处。ingress是允许入站连接到达群集服务的规则集合.可以为外部提供可访问服务的URL,流量负载均衡,可被终止的ssl连接,以及基于配置的虚拟主机。

配置服务器或负载平衡器是比想象中要难。大多数Web服务器的配置文件非常相似。虽然一些应有有一些奇怪的特点,但是我们可以用相似的逻辑去实现期望的结果。ingress体现了这一理念,ingress controller是用来处理所有共同特性的。

ingress controller通过监听/ingresses接口从而更新ingress 从而达到ingress的预期,这里我们先讲述怎么搭建ingress service

api: /apis/extensions/v1beta1/ingresses



使用官方的部署方式
git clone https://github.com/kubernetes/contrib
cd contrib/ingress/controllers/nginx
能翻墙的可以自己pull image,不过我翻墙相当慢,相关镜像最好从灵雀云时速云等的镜像市场拉,自行tag一下。

1.Default backend server
在部署ingress之前需要先部署Default backend server,实现了简单的ingress作为默认返回值,做了两件事
1).为/提供服务,返回404
2).在/healthz返回200
#创建rc  default-http-backend
kubectl create -f examples/default-backend.yaml
#暴露端口
kubectl expose rc default-http-backend --port=80 --target-port=8080 --name=default-http-backend
2.创建ingress controller server
#默认是一个rc 可以根据具体情况自己修改
kubectl create -f examples/default/rc-default.yaml

使用calico等overlay网络可能导致hostport不可用,可以增加“hostNetwork: true” 配置启用host模式


3.创建http服务
kubectl run echoheaders --image=gcr.io/google_containers/echoserver:1.4 --replicas=1 --port=8080
kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders-x
kubectl expose deployment echoheaders --port=80 --target-port=8080 --name=echoheaders-y
4.添加ingress
kubectl create -f examples/ingress.yaml
查看kubectl get ing可以看到对应的ingress
5.验证
 curl -H "Host:foo.bar.com"  127.0.0.1/foo
 curl -H "Host:bar.baz.com"  127.0.0.1/bar
6.配置https
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /tmp/tls.key -out /tmp/tls.crt -subj "/CN=foo.bar.com"
kubectl create secret tls foo-secret --key /tmp/tls.key --cert /tmp/tls.crt
echo "
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: foo
  namespace: default
spec:
  tls:
  - hosts:
    - foo.bar.com
    secretName: foo-secret
  rules:
  - host: foo.bar.com
    http:
      paths:
      - backend:
          serviceName: echoheaders-x
          servicePort: 80
        path: /
" | kubectl create -f -
 kubectl get ing
 curl https://127.0.0.1 -H 'Host:foo.bar.com' -k

7. 默认证书配置,不配置则使用自签名证书
--default-ssl-certificate 添加默认页面ssl证书
echo "        - --default-ssl-certificate=default/foo-secret" >>rc-default.yaml

8. 服务端跳转
默认配置访问ingress http,跳转https 
在configmap 中ssl-redirect: "false" 关闭跳转
configmap 通过--nginx-configmap指定
例如:
apiVersion: v1
data:
  ssl-redirect: "false"
kind: ConfigMap
metadata:
  namespace: nginx-ingress
  name: nginx

9关闭HSTS(强制客户端(如浏览器)使用HTTPS与服务器创建连接)
hsts=false

10 Kube-Lego实现密钥自动管理
例子:
https://github.com/jetstack/kube-lego


11 暴露TCP服务

默认不暴露TCP端口
--tcp-services-configmap 实现
apiVersion: v1
kind: ConfigMap
metadata:
  name: tcp-configmap-example
data:
  9000: "default/example-go:8080"

12暴露UDP端口

  --udp-services-configmap 配置方式同tcp

13 Proxy Protocol
在nginx-configmap中启用
apiVersion: v1
data:
  use-proxy-protocol: "true"
kind: ConfigMap
metadata:
  namespace: nginx-ingress
  name: nginx

14.自定义错误

实际就是通过更改官方例子中的custom-default-backend角色实现,通过X-Code 和 X-Format两个维度控制

通过aledbf/nginx-error-server:0.1 替换default-backend进行测试
curl -v http://10.10.10.150/ -H 'Accept: application/json'
curl -v http://10.10.10.150/

https://github.com/kubernetes/contrib/tree/b13fc59e59f56e74dfb613eb6f4fbda9c96e20f2/ingress/controllers/nginx/examples/custom-errors

15.状态页面
enable-vts-status=true

16.运行多个ingress

通过备注告诉哪个ingress controller添加该ingress

annotations:
    kubernetes.io/ingress.class: "nginx"

不指出则会在所有ingreess 上面配置

17禁用 ingress
kubernetes.io/ingress.class设置为空或不存在的字符则不会再ingress controller 中加载

K8s ingress(进入)是Kubernetes(K8s)中负责管理和控制入口流量的一种资源对象。它允许我们灵活地将外部流量路由到Kubernetes集群中的不同服务和后端容器。 K8s ingress作为一种API对象,定义了一组规则,用于指定流量如何从集群外部进入特定的服务。它可以基于IP地址、主机名、URL路径等信息来进行路由和转发。 K8s ingress使用了标准的HTTP和HTTPS协议,并可以与一些标准的负载均衡器(如Nginx、HAProxy等)进行集成。在创建ingress资源时,常常会指定一个负载均衡器作为入口流量的进入点。该负载均衡器可以在集群外部接收流量,并将其转发到Kubernetes内部的不同服务上。 K8s ingress不仅提供了流量路由和负载均衡的功能,还支持请求的TLS终结(也称为SSL终结),即可以通过TLS协议对传入的TLS流量进行解密并转发至后端的服务。这极大地简化了为服务配置和管理SSL证书的过程。 另外,K8s ingress还支持多种流量处理的方式,如:会话粘滞、重试和故障转移等。这些功能使得在Kubernetes集群中实现高可用和灵活的流量管理变得更加容易。 总之,K8s ingress为我们提供了管理Kubernetes集群入口流量的强大工具。通过定义一些规则和策略,我们可以根据流量的特点和需求将其精确地路由和转发到后端服务上,并提供一些额外的功能,如负载均衡、SSL终结和多流量处理等。这使得我们可以更好地管理和控制流量,提高服务的可用性和稳定性。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值