Hướng dẫn cài đặt Ingress controller trên K8s

Khi bạn cài đặt hệ thống K8s có nhiều dịch vụ web muốn public cho bên ngoài truy cập thì có thể xem xét các phương án:

1, Sử dụng Node port

2, Sử dụng Ingress controller

3, Sử dụng Gateway API

Trong bài này hướng dẫn các bạn cài đặt và sử dụng Ingress contrller bằng Nginx để public 1 dịch vụ web.

Mô hình triển khai nginx ingress controller

Cài đặt

Để xem phiên bản nginx thì truy cập đến github tại: https://github.com/kubernetes/ingress-nginx

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/do/deploy.yaml
kubectl config set-context --current --namespace=ingress-nginx
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx --watch
kubectl get svc --namespace=ingress-nginx
kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -owide
kubectl get all
NAME                                            READY   STATUS    RESTARTS       AGE
pod/ingress-nginx-controller-5fb67f5d97-dcdld   1/1     Running   9 (139m ago)   7d1h

NAME                                         TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE
service/ingress-nginx-controller             LoadBalancer   10.106.137.216   10.1.1.129    80:20425/TCP,443:21842/TCP   16d
service/ingress-nginx-controller-admission   ClusterIP      10.99.247.139    <none>        443/TCP                      16d

NAME                                       READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/ingress-nginx-controller   1/1     1            1           16d

NAME                                                  DESIRED   CURRENT   READY   AGE
replicaset.apps/ingress-nginx-controller-5fb67f5d97   1         1         1       8d
replicaset.apps/ingress-nginx-controller-77667b9d9b   0         0         0       16d


NAME                                       COMPLETIONS   DURATION   AGE
job.batch/ingress-nginx-admission-create   1/1           19s        16d
job.batch/ingress-nginx-admission-patch    1/1           20s        16d

Như hình trên ta thấy ingress đã được cài đặt và được cấp phát địa chỉ IP external 10.1.1.129 (Trước đó đã cài dịch vụ MetalLB để cấp phát IP cho các service type loadBalancer)

Thử nghiệm thiết lập public cho dashboard k8s truy cập từ bên ngoài.

Mở trình duyệt để truy cập đến địa chỉ IP 10.1.1.129

Nếu không hiện thông tin gì thì kiểm tra log

Nếu thấy log lỗi dạng

Nếu bị lỗi khi connect qua nginx controller "Empty response"
[error] 4294#4294: *189556 broken header: "��j�<#��UHDѸ�7
��N�|�mB�.� �A2��.�|JC�������Qt� �)����� **�+�/�,�0̨̩����/5����" while reading PROXY protocol

Thì thực hiện chỉnh sửa: vào configmap của ingress-nginx-controller để xóa bỏ: proxy-protocol: "true" và thêm vào: "use-forwarded-headers": "true"

k get cm
NAME DATA AGE
ingress-nginx-controller 2 16d
istio-ca-root-cert 1 9d
kube-root-ca.crt 1 16d

C:\Users\admin>k get cm ingress-nginx-controller
NAME DATA AGE
ingress-nginx-controller 2 16d

C:\Users\admin>k edit cm ingress-nginx-controller
apiVersion: v1
data:
  allow-snippet-annotations: "false"
  use-forwarded-headers: "true"
kind: ConfigMap
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"v1","data":{"allow-snippet-annotations":"false","use-proxy-protocol":"true"},"kind":"ConfigMap","metadata":{"annotations":{},"labels":{"app.kubernetes.io/component":"controller","app.kubernetes.io/instance":"ingress-nginx","app.kubernetes.io/name":"ingress-nginx","app.kubernetes.io/part-of":"ingress-nginx","app.kubernetes.io/version":"1.11.1"},"name":"ingress-nginx-controller","namespace":"ingress-nginx"}}
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.11.1
  name: ingress-nginx-controller
  namespace: ingress-nginx

Mở lại trình duyệt và kiểm tra

Tạo file dashboard-ing.yaml với nội dung như sau

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/ssl-passthrough: 'true'
  name: dashboard.uptime59.com
  namespace: kubernetes-dashboard
spec:
  ingressClassName: nginx
  rules:
    - host: dashboard.uptime59.com
      http:
        paths:
          - backend:
              service:
                name: kubernetes-dashboard
                port:
                  number: 443
            path: /
            pathType: Prefix
  tls:
    - hosts:
        - dashboard.uptime59.com

Ingress này sẽ thực hiện passthrough SSL từ controller để sử dụng SSL tại backend của dịch vụ Dashboard với các cấu hình annotation:

    nginx.ingress.kubernetes.io/backend-protocol: HTTPS
    nginx.ingress.kubernetes.io/force-ssl-redirect: 'true'
    nginx.ingress.kubernetes.io/ssl-passthrough: 'true'

Thực hiện apply:

kubectl apply -f dashboard-ing.yaml -n kubernetes-dashboard

Kiểm tra kết quả chạy

k get ing
NAME CLASS HOSTS ADDRESS PORTS AGE
dashboard.uptime59.com nginx dashboard.uptime59.com 10.1.1.129 80, 443 10d

Đặt file host trỏ domain dashboard.uptime59.com về địa chỉ 10.1.1.129

Mở trình duyệt và kiểm tra.

Ví dụ tạo ingress cho dịch vụ awx không sử dụng ssl-passthrough

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:    
    nginx.ingress.kubernetes.io/proxy-connect-timeout: '30'
    nginx.ingress.kubernetes.io/proxy-read-timeout: '1800'
    nginx.ingress.kubernetes.io/proxy-send-timeout: '1800'
  creationTimestamp: '2024-07-27T08:31:03Z'
  generation: 6
  labels:
    app: ingress-awx
  name: awx
  namespace: awx
spec:
  ingressClassName: nginx
  rules:
    - host: awx.uptime59.com
      http:
        paths:
          - backend:
              service:
                name: awx-demo-service
                port:
                  number: 80
            path: /
            pathType: Prefix
  tls:
    - hosts:
        - awx
      secretName: awx-demo-receptor-ca

Ví dụ tạo ingress cho dịch vụ Jenkin

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
  name: jenkin
  namespace: devops-tools
spec:
  ingressClassName: nginx
  rules:
  - host: jenkin.uptime59.com
    http:
      paths:
      - backend:
          service:
            name: jenkins-service
            port:
              number: 80
        path: /
        pathType: Prefix

Để tìm hiểu kỹ hơn về cách sử dụng annotion với nginx thì tham khảo.

https://github.com/kubernetes/ingress-nginx/blob/main/docs/user-guide/nginx-configuration/annotations.md

Thiết lập HPA cho nginx

Tạo file ingress-nginx-hpa yaml và apply

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: ingress-nginx-hpa
  namespace: ingress-nginx
spec:
  behavior:
    scaleDown:
      policies:
      - periodSeconds: 10
        type: Pods
        value: 1
      selectPolicy: Max
      stabilizationWindowSeconds: 30
    scaleUp:
      policies:
      - periodSeconds: 10
        type: Pods
        value: 1
      selectPolicy: Max
      stabilizationWindowSeconds: 10
  maxReplicas: 5
  metrics:
  - resource:
      name: cpu
      target:
        averageUtilization: 110
        type: Utilization
    type: Resource
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: ingress-nginx-controller

k apply -f ingress-nginx-hpa.yaml

Kiểm tra tình trạng hpa

k edit horizontalpodautoscaler.autoscaling/ingress-nginx-hpa

C:\Users\admin>k get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ingress-nginx-hpa Deployment/ingress-nginx-controller 6%/110% 1 5 1 9d
C:\Users\admin>k describe horizontalpodautoscaler.autoscaling/ingress-nginx-hpa
Name:                                                  ingress-nginx-hpa
Namespace:                                             ingress-nginx
Labels:                                                <none>
Annotations:                                           <none>
CreationTimestamp:                                     Sun, 28 Jul 2024 21:20:33 +0700
Reference:                                             Deployment/ingress-nginx-controller
Metrics:                                               ( current / target )
  resource cpu on pods  (as a percentage of request):  6% (6m) / 110%
Min replicas:                                          1
Max replicas:                                          5
Behavior:
  Scale Up:
    Stabilization Window: 10 seconds
    Select Policy: Max
    Policies:
      - Type: Pods  Value: 1  Period: 10 seconds
  Scale Down:
    Stabilization Window: 30 seconds
    Select Policy: Max
    Policies:
      - Type: Pods  Value: 1  Period: 10 seconds
Deployment pods:    1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from cpu resource utilization (percentage of request)
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:           <none>

C:\Users\admin>k get hpa
NAME                REFERENCE                             TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
ingress-nginx-hpa   Deployment/ingress-nginx-controller   6%/110%   1         5         1          9d

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply