Khai báo một Network Policy trong kubernetes cluster.

Phần này giúp ta khởi đầu với việc sử dụng NetworkPolicy API cho việc khai báo một network policy để các pod trong cluster giao tiếp với nhau như thế nào ?  

Chuẩn bị

1. Trước khi đi vào phần chính là khai báo một network policy trong cluster kubernetes thì bạn phải có sẵn một cluster trước. 

2. Và version của kubernetes server phải bằng v1.8 hoặc hơn. 

3. Có sẵn network providers cho hệ thống cluster của bạn, một số network provider có trên thị trường hiện nay:

 - Calio

 - Cilium 

 - Kube-router

 - Romana

 - Weave Net

Tạo một nginx deployment và expose nó ra một service.

Để tạo một deployment ta chạy lệnh sau: 

kubectl create deployment nginx --image=nginx
deployment.apps/nginx created
Vậy  một deployment được tạo, giờ ta expose deployment này ra một service có tên là nginx. 


kubectl expose deployment nginx --port=80
service/nginx expose

Service nginx và pod nginx này chạy trên namespace default và service nginx expose trên port 80.

kubectl get svc,pod
NAME                        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
service/kubernetes          10.100.0.1    <none>        443/TCP    46m
service/nginx               10.100.0.16   <none>        80/TCP     33s

NAME                        READY         STATUS        RESTARTS   AGE
pod/nginx-701339712-e0qfq   1/1           Running       0          35s

Kiểm tra việc truy cập đến service nginx từ một pod khác. 

Trước khi kiểm tra truy cập đến service ta tạo một pod với image là busybox và truy cập vào trong container. 

kubectl run busybox --rm -ti --image=busybox -- /bin/sh

Và chạy lệnh sau trong terminal :
wget --spider --timeout=1 nginx

Connecting to nginx (10.100.0.16:80)
remote file exists
Kết quả trả về là có thể truy cập được. 

Giới hạn việc truy cập đến service nginx. 

Để giới hạn việc truy cập đến service nginx mà chỉ có pod có label là access: true có thể kết nối tới ta tạo một network policy như sau: 

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: access-nginx
spec:
  podSelector:
    matchLabels:
      app: nginx
  ingress:
  - from:
    - podSelector:
        matchLabels:
          access: "true"

Trong đó  podSelector là nhóm các pod có label: nginx mà network policy này apply lên. 

Nếu ta định nghĩa podSelector empty thì network policy này sẽ apply cho tất cả các pod trong một namespace. 

Sau đó apply policy này : 

kubectl apply -f nginx-policy.yaml
networkpolicy.networking.k8s.io/access-nginx created

 Ok, done ta sẽ test lại việc truy cập từ pod busybox xem thử có kết nối được chưa ? 


kubectl run busybox --rm -ti --image=busybox -- /bin/sh
wget --spider --timeout=1 nginx

Và kết quả trả về: 

Connecting to nginx (10.100.0.16:80)
wget: download timed out
Oh, chưa kết nối được. 

Vậy ta xem lại network policy xem thế nào : 

ingress:
- from:
  - podSelector:
        matchLabels:
          access: "true"

Nhìn vào rule trên ta thấy là việc truy cập vào service nginx chỉ cho phép từ pod có label là access: true 

Vậy ta gán label access: true cho pod busybox. 

kubectl run busybox --rm -ti --labels="access=true" --image=busybox -- /bin/sh

Vậy ta test lại với việc chạy command: 
wget --spider --timeout=1 nginx

Và kết quả trả về như ý muốn: 

Connecting to nginx (10.100.0.16:80)
remote file exists

Done.














Nhận xét

Bài đăng phổ biến từ blog này

Trang web medium.com chết, vì sao ?

Cách sử dụng sys.argv trong python.

Thiết kế một RESTful API bằng python và flask.