Ingress-Nginx 控制器入門


Kubernetes 提供了兩種負載均衡的機制用於發布公共服務,一種是工作在傳輸層的Service資源,一種是Ingress資源。前者只能實現”TCP負載均衡”,而無法實現 HTTPS 協議,而Ingress 的出現為我們提供了應用層HTTP(S)的訪問能力。

部署 Ingress Controller

Ingress 是 Kubernetes API 的標准類型資源,它是一組 基於DNS 名稱或者 URL 路徑把用戶請求轉發到指定的Service資源的規則,用於將集群外部的請求流量轉發至集群內部完成服務發布。然而, Ingress 本身並不能進行流量轉發,它僅僅是一組路由規則,如果想要真正的使這對規則生效,則需要先部署 Ingress 的控制器,Ingress 控制器能夠監聽某一個套接字,然后根據Ingress上的路由規則對用戶的請求進行轉發。

~]# kubectl apply -f https://raw.githubusercontent.com/imirsh/kubernetes/master/mainfests/ingress-nginx/v0.33.0/deploy.yaml

驗證安裝

確認 ingress controller pods 是否啟動

~]# kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch
NAME                                        READY   STATUS      RESTARTS   AGE
ingress-nginx-admission-create-hh2ht        0/1     Completed   0          20m
ingress-nginx-admission-patch-9npbv         0/1     Completed   0          20m
ingress-nginx-controller-566d9467c5-8lssn   1/1     Running     0          20m
~]# kubectl  get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.103.127.175   <none>        80:30080/TCP,443:30443/TCP   21m
ingress-nginx-controller-admission   ClusterIP   10.98.11.81      <none>        443/TCP                      21m

測試http 7層負載

部署了完 ingress-nginx后,部署了一個 deployment,並它創建了一個名為 myapp-svc-v1 的 service:

~]# vim myapp-deploy.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-http-v1
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp-v1
      version: v1
  template:
    metadata:
      namespace: default
      labels:
        app: myapp-v1
        version: v1
    spec:
      containers:
      - name: myapp-v1
        image: ikubernetes/myapp:v1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-v1
  namespace: default
  labels:
    app: myapp-v1
    version: v1
spec:
  type: ClusterIP
  selector:
    app: myapp-v1
    version: v1
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 80

然后創建對應的一個ingress對象來暴露集群里這個 deployment 的 http 服務:

~]# vim ingress-myapp.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress-myapp-v1
  annotations:
    kubernetes.io/ingress.class: "nginx"
spec:
  rules:
  - host: myapp-v1.linux.io
    http:
      paths:
      - path: /
        backend:
          serviceName: myapp-svc-v1
          servicePort: 80

hosts 文件解析后,即可通過域名訪問了

~]# curl http://myapp-v1.linux.io:30080/
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM