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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。