k8s-ingress控制器

1.ingress控制器部署

Ingress 公开了从集群外部到集群内服务的 HTTP 和 HTTPS 路由。 流量路由由 Ingress 资源上定义的规则控制。
你可以在集群中部署任意数量的 ingress 控制器。 创建 ingress 时,应该使用适当的 ingress.class 注解每个

Ingress 以表明在集群中如果有多个 Ingress 控制器时,应该使用哪个 Ingress 控制器。
如果不定义 ingress.class,云提供商可能使用默认的 Ingress 控制器。

Ingress 是对集群中服务的外部访问进行管理的 API 对象,典型的访问方式是 HTTP。
Ingress 可以提供负载均衡、SSL 终结和基于名称的虚拟托管

部署 nginx ingress控制器

默认配置从所有名称空间监视Ingress对象。

若要更改此行为,请使用该标志--watch-namespace将范围限制为特定的名称空间。

裸机安装: 版本不同具体根据查看官网 https://kubernetes.github.io/ingress-nginx/deploy/

wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.40.2/deploy/static/provider/baremetal/deploy.yaml 

# 下载好镜像,更具具体版本  可以配置docker socks5代理下载镜像
docker pull k8s.gcr.io/ingress-nginx/controller:v0.40.2

# 部署到本地仓库,它有三个镜像,有两个job
# 修改yaml文件镜像地址

kubectl apply -f deploy.yaml 
kubectl  get pod -n ingress-nginx
kubectl get svc -n ingress-nginx

配置通过主机80,443端口访问

# 更改为DaemonSet控制器
kind: DaemonSet
# 更改为主机网络
       hostNetwork: true

Nginxinc版

github

安装文档

部署traefik ingress控制器

# 安装helm3
wget https://get.helm.sh/helm-v3.4.0-linux-amd64.tar.gz
tar axf helm-v3.4.0-linux-amd64.tar.gz
cp   linux-amd64/helm  /usr/local/bin


helm repo add traefik https://helm.traefik.io/traefik
helm repo update
helm pull traefik/traefik

kubectl create ns traefik
helm install traefik ./traefik -n  traefik

IngressClass资源

Kubernetes中的Ingress API使大量控制器能够提供简单而强大的方法来管理到Kubernetes工作负载的入站网络流量。在Kubernetes 1.18中,我们对该API进行了3个重要的添加:

  • 一个新pathType字段,可以指定应如何匹配Ingress路径。
  • IngressClass可以指定控制器应如何实现Ingress的新资源。
  • 支持主机名中的通配符

ingressclass概念:

  • 安装Ingress Controller 时可以指定参数 -ingress-class <string > ,默认是nginx

  • 这个参数指定的就是这个ingress控制器是属于那个IngressClass

  • 当创建一个ingress时,通过 spec.ingressClassName: <string > 来指定这个ingress属于那个IngressClass,属于那个ingress控制器

  • 在IngressClass资源上将annotations ingressclass.kubernetes.io/is-default-class设置 为true,将确保未指定ingressClassName新的Ingress分配此默认值IngressClass

# 这是 Nginxinc版提供安装方式中会有这个资源清单 common/ingress-class.yaml
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
  #annotations:
    #ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: nginx.org/ingress-controller

# k8s版nginx
apiVersion: networking.k8s.io/v1beta1
kind: IngressClass
metadata:
  name: nginx
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: k8s.io/ingress-nginx

2.ingress单个Service

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-dm
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx
  template:
    metadata:
      labels:
        name: nginx
    spec:
      containers:
      - name: nginx
        image: ikubernetes/myapp:v7
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 80

---

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    name: nginx            # 关联标签nam:nginx的 pod

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test
spec:
  rules:
  - host: www.kubetest.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: nginx-svc             # 关联名称 nginx-svc 的service
            port:
              number: 80

kubectl get svc -n ingress-nginx

ingress-nginx-controller             NodePort    10.110.171.65   <none>        80:32180/TCP,443:30700/TCP   66m
ingress-nginx-controller-admission   ClusterIP   10.110.217.3    <none>        443/TCP                      66m

外部访问http://www.kubetest.com:32180/hostname.html

原理相当于把规则注入到nginx配置文件中
进入ingress-nginx可以看到相关nginx配置文件配置
kubectl exec -it ingress-nginx-controller-785557f9c9-skgkw -n ingress-nginx /bin/bash

3.ingress基于名称的虚拟托管

基于名称的虚拟主机支持将针对多个主机名的 HTTP 流量路由到同一 IP 地址上。

graph TD
A{ingress}-->|www.ingress.com|B{SVC1}
A{ingress}-->|res.ingress.com|C{SVC2}
B-->D[pod1 v1]
B-->E[pod2 v1]
C-->F[pod1 v2]
C-->G[pod1 v2]

ingress.http1.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment1
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx1
  template:
    metadata:
      labels:
        name: nginx1
    spec:
      containers:
      - name: nginx
        image: ikubernetes/myapp:v7
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc1
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    name: nginx1

ingress.http2.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: deployment2
spec:
  replicas: 2
  selector:
    matchLabels:
      name: nginx2
  template:
    metadata:
      labels:
        name: nginx2
    spec:
      containers:
      - name: nginx
        image: ikubernetes/myapp:v7
        imagePullPolicy: IfNotPresent
        ports:
          - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: svc2
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    name: nginx2

ingressrule.yaml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  rules:
  - host: www.ingress.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc1
            port:
              number: 80
  - host: res.ingress.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc2
            port:
              number: 80

4.ingress https代理访问

https://kubernetes.github.io/ingress-nginx/examples/auth/client-certs/

创建自签证书

openssl req -x509 -sha256 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 356 -nodes -subj '/CN=My Cert Authority'

# 创建包含CA证书和服务器证书的密钥,该密钥可同时用于TLS和客户端身份验证
kubectl create secret tls tls-secret --key ca.key --cert ca.crt

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
spec:
  tls:
  - hosts:
      - www.ingress.com
    secretName: tls-secret
  rules:
  - host: www.ingress.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc1
            port:
              number: 80
  - host: res.ingress.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: svc2
            port:
              number: 80

外部访问 https://www.ingress.com:30700/

根据查看配置文件及测试发现 只要配置了tls,所有ingress的所有域名都有https

5.nignx-ingress基本认证

Basic Authentication

本示例说明如何使用包含由生成的文件的机密在Ingress规则中添加身份验证htpasswd。生成的文件的名称很重要auth(实际上-机密具有密钥data.auth),否则入口控制器将返回503。

yum -y install httpd
# 创建用户foo
htpasswd -c auth foo     
kubectl create secret generic basic-auth --from-file=auth 
kubectl get secret basic-auth -o yaml
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-with-auth
  annotations:
    nginx.ingress.kubernetes.io/auth-type: basic
    nginx.ingress.kubernetes.io/auth-secret: basic-auth
    nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required - foo'
spec:
  rules:
  - host: foo.bar.com
    http:
      paths:
      - path: /
        backend:
          serviceName: svc1
          servicePort: 80

验证
curl -v http://10.0.0.2:32180 -H 'Host: foo.bar.com' -u 'foo:123'

6.nginx-ingress重写

部署方式

可以使用以下注释控制重写:

名称 描述 价值观
nginx.ingress.kubernetes.io/rewrite-target 必须将流量重定向到的目标URI
nginx.ingress.kubernetes.io/ssl-redirect 指示位置部分是否仅可访问SSL(Ingress包含证书时默认为True) 布尔
nginx.ingress.kubernetes.io/force-ssl-redirect 即使未启用TLS,也强制将重定向到HTTPS 布尔
nginx.ingress.kubernetes.io/app-root 定义如果在“ /”上下文中,控制器必须重定向的应用程序根
nginx.ingress.kubernetes.io/use-regex 指示在Ingress上定义的路径是否使用正则表达式 布尔

#    nginx.ingress.kubernetes.io/app-root: /app1
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: rewrite-target
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: https://www.ingress.com:30700/
spec:
  rules:
  - host: r.ingress.com
    http:
      paths:
      - path: /
        backend:
          serviceName: svc1
          servicePort: 80

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,542评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,596评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,021评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,682评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,792评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,985评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,107评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,845评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,299评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,612评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,747评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,441评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,072评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,828评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,069评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,545评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,658评论 2 350