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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。