Cách Phơi Sáng Dịch Vụ Ra Ngoài Mạng Trong K8S

Mục Lục

  • 1. NodePort
  • 2. LoadBalancer
    • 2.1 Xác Nhận Chế Độ strictARP
    • 2.2 Cài Đặt metalLB
    • 2.3 Cấu Hình IP Pool
    • 2.4 Kiểm Tra Kết Quả
  • 3. Ingress
    • 3.1 Cài Đặt ingress controller
    • 3.2 Cấu Hình Quy Tắc Routing ingress
    • 3.3 Chỉ Định Dịch Vụ Hậu Cầu

1. NodePort

Tạo pod với kubectl run
[root@server ~]#kubectl create deployment nginx --image=nginx:1.15 --replicas=4
deployment.apps/nginx created
[root@server ~]#kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-79d6c79b5f-klmnp   1/1     Running   0          40s
nginx-79d6c79b5f-tgqzv   1/1     Running   0          40s
nginx-79d6c79b5f-xr5jw   1/1     Running   0          40s
nginx-79d6c79b5f-zl2kx   1/1     Running   0          40s
[root@server ~]#kubectl get all
NAME                         READY   STATUS    RESTARTS   AGE
pod/nginx-79d6c79b5f-klmnp   1/1     Running   0          60s
pod/nginx-79d6c79b5f-tgqzv   1/1     Running   0          60s
pod/nginx-79d6c79b5f-xr5jw   1/1     Running   0          60s
pod/nginx-79d6c79b5f-zl2kx   1/1     Running   0          60s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   3d9h

NAME                    READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx   4/4     4            4           60s

NAME                               DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-79d6c79b5f   4         4         4       60s
`Phơi sáng container với kubectl expose`
[root@server ~]#kubectl expose deployment nginx --port=80 --target-port=80 --name=dichvu-nginx --type=NodePort
service/dichvu-nginx exposed

# Xem trạng thái mạng của Pod và cổng đã phơi sáng của Service
[root@server ~]#kubectl get svc,pod -o wide
NAME                         TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE     SELECTOR
service/kubernetes           ClusterIP   10.96.0.1      <none>        443/TCP        3d9h    <none>
service/dichvu-nginx         NodePort    10.96.158.55   <none>        80:31083/TCP   3m37s   app=nginx

NAME                         READY   STATUS    RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
pod/nginx-79d6c79b5f-klmnp   1/1     Running   0          7m48s   10.244.1.3   node01   <none>           <none>
pod/nginx-79d6c79b5f-tgqzv   1/1     Running   0          7m48s   10.244.2.3   node02   <none>           <none>
pod/nginx-79d6c79b5f-xr5jw   1/1     Running   0          7m48s   10.244.2.4   node02   <none>           <none>
pod/nginx-79d6c79b5f-zl2kx   1/1     Running   0          7m48s   10.244.1.4   node01   <none>           <none>

2. LoadBalancer

Trong Kubernetes, các service có thể được cấu hình với các loại khác nhau như PodIP, ClusterIP và ExternalIP. Đối với môi trường cục bộ, cần cài đặt thêm một số thành phần hỗ trợ LoadBalancer. `Cấu hình LoadBalancer sử dụng metalLB`

2.1 Xác nhận chế độ strictARP

Nếu bạn đang chạy trong chế độ IPVS (mặc định là iptables), thì cần bật chế độ strictARP.
[root@server ~]# curl localhost:10249/proxyMode
ipvs
[root@server ~]# kubectl edit configmap -n kube-system proxy-config
# Thay đổi giá trị strictARP thành true ở đoạn sau:
......
    apiVersion: kubeproxy.config.k8s.io/v1alpha1
    kind: KubeProxyConfiguration
    mode: "ipvs"
    ipvs:
      strictARP: true
......

2.2 Cài đặt metalLB

[root@server ~]# kubectl apply -f https://gitlab.com/metal-lb/metallb/-/raw/v0.11.0/manifests/namespace.yaml
[root@server ~]# kubectl apply -f https://gitlab.com/metal-lb/metallb/-/raw/v0.11.0/manifests/metallb.yaml
[root@server ~]# kubectl get pods -n metallb-system
NAME                          READY   STATUS    RESTARTS   AGE
controller-95867d5d9-h8z6p    1/1     Running   0          42s
speaker-klmnp                 1/1     Running   0          42s
speaker-tgqzv                 1/1     Running   0          42s
speaker-xr5jw                 1/1     Running   0          42s

2.3 Cấu hình IP pool

[root@server ~]#vim metallb.ip-pool.yaml
[root@server ~]#cat metallb.ip-pool.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 192.168.10.180-192.168.10.210
[root@server ~]#kubectl apply -f metallb.ip-pool.yaml

2.4 Kiểm tra kết quả

[root@server ~]#vim test-nginx.yaml
[root@server ~]#cat test-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-metallb-test
spec:
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: dichvu-nginx
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: nginx-test

[root@server ~]#kubectl apply -f test-nginx.yaml
deployment.apps/nginx-metallb-test created
service/dichvu-nginx created

3. Ingress

Ingress trong Kubernetes bao gồm hai phần chính: tài nguyên Ingress để quản lý các quy tắc routing và ingress-controller để xử lý các yêu cầu.

3.1 Cài đặt ingress controller

[root@server ~]#kubectl apply -f https://gitlab.com/myrepo/ingress-nginx-deploy.yaml
[root@server ~]#kubectl get pods,svc -n ingress-nginx -o wide
NAME                                            READY   STATUS      RESTARTS   AGE     IP           NODE     NOMINATED NODE   READINESS GATES
pod/ingress-nginx-admission-create--1-fgh45     0/1     Completed   0          2m12s   10.244.1.3   node01   <none>           <none>
pod/ingress-nginx-admission-patch--1-vxz8q      0/1     Completed   2          2m12s   10.244.2.3   node02   <none>           <none>
pod/ingress-nginx-controller-867b8ccd99-7gdhf   1/1     Running     0          2m12s   10.244.2.4   node02   <none>           <none>

NAME                                         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE     SELECTOR
service/ingress-nginx-controller             NodePort    10.101.83.140   <none>        80:31700/TCP,443:30401/TCP   2m12s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
service/ingress-nginx-controller-admission   ClusterIP   10.101.43.212   <none>        443/TCP                      2m12s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx

3.2 Cấu hình quy tắc routing ingress

[root@server ~]#vim ingress-rules.yaml
[root@server ~]#cat ingress-rules.yaml 
apiVersion: networking.k8s.io/v1 
kind: Ingress
metadata:
  name: demo-ingress
  namespace: dev
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: k8s.example.com
    http:
      paths:
      - pathType: Prefix
        path: /api/v1
        backend:
          service:
            name: service-api1
            port: 
              number: 80
      - pathType: Prefix
        path: /api/v2
        backend:
          service:
            name: service-api2
            port: 
              number: 80
[root@server ~]#kubectl create ns dev
namespace/dev created
[root@server ~]#kubectl apply -f ingress-rules.yaml
ingress.networking.k8s.io/demo-ingress created

3.3 Chỉ định dịch vụ hậu cầu

[root@server ~]#vim backend-service1.yaml
[root@server ~]#vim backend-service2.yaml
[root@server ~]#cat backend-service1.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-api1
  namespace: dev
spec:
  selector:
    matchLabels:
      app: nginx-api1
  template:
    metadata:
      labels:
        app: nginx-api1
    spec:
      containers:
      - name: nginx-api1
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: dev
  name: service-api1
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-api1
  type: NodePort

[root@server ~]#cat backend-service2.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-api2
  namespace: dev
spec:
  selector:
    matchLabels:
      app: nginx-api2
  template:
    metadata:
      labels:
        app: nginx-api2
    spec:
      containers:
      - name: nginx-api2
        image: nginx:latest
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  namespace: dev
  name: service-api2
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-api2
  type: NodePort

[root@server ~]#kubectl apply -f backend-service1.yaml
deployment.apps/nginx-api1 created
service/service-api1 created
[root@server ~]#kubectl apply -f backend-service2.yaml
deployment.apps/nginx-api2 created
service/service-api2 created

Thẻ: Kubernetes LoadBalancer Ingress NodePort metalLB

Đăng vào ngày 22 tháng 6 lúc 21:43