Xin chào các bạn! Trong bài viết này, chúng ta sẽ cùng nhau tìm hiểu cách thiết lập SSL cho các dịch vụ công khai trên Kubernetes (K8s) thông qua Ingress. Việc này không chỉ giúp bảo mật thông tin mà còn đảm bảo trải nghiệm người dùng tốt hơn khi truy cập vào ứng dụng của bạn.
Giới Thiệu
Để thực hiện việc thiết lập SSL, chúng ta cần chuẩn bị những điều kiện cơ bản sau:
- Cluster Kubernetes: Đảm bảo cluster K8s hoạt động ổn định và bạn có quyền quản trị.
- Chứng Chỉ SSL: Bạn có thể sử dụng chứng chỉ từ nhà cung cấp uy tín hoặc tự ký (self-signed certificate) với file .crt và .key.
- Các Tài Nguyên Cần Thiết:
- Namespace (ví dụ:
ssl-test
) - Deployment cần triển khai SSL
- Ingress Controller
- Ingress Resource
- Service
- Load Balancer
- Namespace (ví dụ:
Tạo Secret Chứa Chứng Chỉ SSL
Có hai cách để tạo Secret chứa chứng chỉ SSL trong Kubernetes:
1. Tạo Secret bằng File
Bạn có thể tạo một file secret.yaml
với nội dung sau:
yaml
apiVersion: v1
kind: Secret
metadata:
name: my-ssl-secret
namespace: <Namespace>
data:
tls.crt: <base64encode> CERTIFICATE
tls.key: <base64encode> PRIVATE KEY
type: kubernetes.io/tls
Sử dụng lệnh sau để tạo Secret từ file:
bash
kubectl apply -f secret.yaml
2. Tạo Secret bằng CLI
Bạn cũng có thể tạo Secret trực tiếp từ dòng lệnh bằng cách sử dụng lệnh sau:
bash
kubectl create secret tls my-ssl-secret --cert=path/to/tls.crt --key=path/to/tls.key -n <Namespace>
Luồng Traffic từ User Đến Pod (Ứng Dụng)
Dưới đây là quy trình luồng traffic từ người dùng đến ứng dụng mà chúng ta cần thiết lập:
- User: Người dùng gửi yêu cầu HTTP hoặc HTTPS từ trình duyệt hoặc ứng dụng.
- Load Balancer: Đóng vai trò là điểm tiếp nhận, lắng nghe trên cổng 80 và 443.
- Ingress Controller: Xử lý yêu cầu HTTP/HTTPS và định tuyến đến các dịch vụ phù hợp.
- Ingress Resource: Chứa quy tắc quy định cách định tuyến cho các dịch vụ.
- Service: Chuyển tiếp lưu lượng đến pod dựa trên quy tắc đã thiết lập.
- Pod (Ứng Dụng): Là nơi chạy ứng dụng và xử lý các yêu cầu từ người dùng.
Cấu Hình Tệp YAML Cho Các Tài Nguyên
Dưới đây là các tệp YAML cho từng tài nguyên cần thiết:
1. Load Balancer
yaml
apiVersion: v1
kind: Service
metadata:
name: <Load balancer name>
namespace: <Namespace>
annotations:
service.beta.kubernetes.io/aws-load-balancer-internal: "true"
spec:
type: LoadBalancer
selector:
app: <Ingress Controller Label>
ports:
- name: http
port: 80
targetPort: 80
- name: https
port: 443
targetPort: 443
2. Ingress Controller
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: <Ingress Controller Name>
namespace: <Namespace>
spec:
replicas: 1
selector:
matchLabels:
app: <Ingress Controller Label>
template:
metadata:
labels:
app: <Ingress Controller Label>
spec:
containers:
- name: <Ingress Container Name>
image: nginx:latest
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
3. Ingress Resource
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: <Ingress Resource Name>
namespace: <Namespace>
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
tls:
- hosts:
- <DOMAIN NAME>
secretName: my-ssl-secret
rules:
- host: <DOMAIN NAME>
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: <SERVICE NAME>
port:
number: 3000
4. Service
yaml
apiVersion: v1
kind: Service
metadata:
name: <Service Name>
namespace: <Namespace>
spec:
selector:
app: <Deployment App Name>
ports:
- protocol: TCP
port: 3000
targetPort: 3000
Một Số Lỗi Phổ Biến và Cách Khắc Phục
Dưới đây là một số lỗi thường gặp và cách xử lý:
- x509: certificate signed by unknown authority: Kiểm tra chứng chỉ và CA.
- Failed calling webhook validate.nginx.ingress.kubernetes.io: Xác nhận trạng thái của admission controller.
- No endpoints available for service: Kiểm tra các pod và đảm bảo chúng chạy ổn định.
- Default backend - 404 từ Ingress: Xác minh lại cấu hình host và path trong Ingress.
- Máy chủ Load Balancer chỉ ở trạng thái pending: Kiểm tra dải IP và subnet cho cluster K8s của bạn.
Hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về cách thiết lập SSL cho dịch vụ Public trên Kubernetes thông qua Ingress. Hãy cùng tiến hành áp dụng để đảm bảo sự bảo mật cho ứng dụng của bạn. Cảm ơn các bạn đã theo dõi!
Mình là Hiếu, Một Developer đang học hỏi về DevOps. Hẹn gặp lại các bạn trong các bài viết tiếp theo!
source: viblo