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.
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