Cài đặt Private Docker Registry trên Kubernetes

Nhắc đến Docker Registry, có lẽ đối với nhiều kỹ sư DevOps cũng không còn xa lạ gì. Hôm nay mình sẽ hướng dẫn bạn đọc cài đặt một Private Docker Registry để lưu trữ các container image. Nhờ đó tăng bảo mật cho các sản phẩm của cá nhân hoặc công ty, tổ chức.

Chuẩn bị môi trường #

  • k8s-master – 192.1681.40 – CentOS 7.
  • k8s-worker1 – 192.168.1.41 – CentOS 7.
  • k8s-worker2 – 192.168.1.42 – CentOS 7.
  • User có quyền sudo trên cả 3 node.
  • NFS Share: /opt/certs và /opt/registry.

Trong bài viết này, mình sẽ cài đặt NFS Server trên master node và cấu hình cho thư mục /opt/certs và /opt/registry dưới dạng nfs share. Do vậy, trước khi bắt đầu cài đặt, bạn hãy mount nfs share trên các worker node còn lại:

$ sudo mkdir /opt/certs /opt/registry
$ sudo mount 192.168.1.40:/opt/certs /opt/certs
$ sudo mount 192.168.1.40:/opt/registry /opt/registry

Tạo self-signeed certificates cho Private Registry #

Đầu tiên, bạn cần tạo một chứng chỉ ssl để sử dụng cho việc kết nối với Private Docker Registry. Thực thi câu lệnh bên dưới trên master node để tạo:

[tel4vn@k8s-master ~]$ cd /opt
[tel4vn@k8s-master opt]$ sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout ./certs/registry.key -x509 -days 365 -out ./certs/registry.crt

Lúc này bạn sẽ có file .key và file .crt để sử dụng cho các cấu hình sau này:

[tel4vn@k8s-master opt]$ ls -l certs/
total 8
-rw-r--r--. 1 root root 2114 Sep 26 03:26 registry.crt
-rw-r--r--. 1 root root 3272 Sep 26 03:26 registry.key
[tel4vn@k8s-master opt]$

Cài đặt Private Registry sử dụng file yaml với Kubernetes #

Trên master node, thực hiện tạo mới file private-registry.yaml với nội dung sau:

[tel4vn@k8s-master ~]$ mkdir docker-repo
[tel4vn@k8s-master ~]$ cd docker-repo/
[tel4vn@k8s-master docker-repo]$ vi private-registry.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: private-repository-k8s
  labels:
 app: private-repository-k8s
spec:
  replicas: 1
  selector:
 matchLabels:
   app: private-repository-k8s
  template:
 metadata:
   labels:
     app: private-repository-k8s
 spec:
   volumes:
   - name: certs-vol
     hostPath:
       path: /opt/certs
       type: Directory
   - name: registry-vol
     hostPath:
       path: /opt/registry
       type: Directory

   containers:
     - image: registry:2
       name: private-repository-k8s
       imagePullPolicy: IfNotPresent
       env:
       - name: REGISTRY_HTTP_TLS_CERTIFICATE
         value: "/certs/registry.crt"
       - name: REGISTRY_HTTP_TLS_KEY
         value: "/certs/registry.key"
       ports:
         - containerPort: 5000
       volumeMounts:
       - name: certs-vol
         mountPath: /certs
       - name: registry-vol
         mountPath: /var/lib/registry

Lưu lại file và thực thi với kubectl:

[tel4vn@k8s-master docker-repo]$ kubectl create -f private-registry.yaml
deployment.apps/private-repository-k8s created
[tel4vn@k8s-master docker-repo]$

Kiểm tra lại trạng thái deployment:

[tel4vn@k8s-master ~]$ kubectl get deployments private-repository-k8s
NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
private-repository-k8s   1/1 1         1        3m32s
[tel4vn@k8s-master ~]$
[tel4vn@k8s-master ~]$ kubectl get pods | grep -i private-repo
private-repository-k8s-85cf76b9d7-qsjxq   1/1 Running   0       5m14s
[tel4vn@k8s-master ~]$

Tiếp theo, bạn hãy copy chứng chỉ ssl vừa tạo ở trên vào thư mục /etc/pki/ca-trust/source/anchors trên tất cả các node:

$ sudo cp /opt/certs/registry.crt /etc/pki/ca-trust/source/anchors/
$ sudo update-ca-trust
$ sudo systemctl restart docker

Tiếp theo, bạn cần expose sử dụng nodeport để có thể truy cập được trên tất cả các node:

[tel4vn@k8s-master ~]$ cd docker-repo/
[tel4vn@k8s-master docker-repo]$ vi private-registry-svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
 app: private-repository-k8s
  name: private-repository-k8s
spec:
  ports:
  - port: 5000
 nodePort: 31320
 protocol: TCP
 targetPort: 5000
  selector:
 app: private-repository-k8s
  type: NodePort

Lưu lại file và thực thi với kubectl để expose:

[tel4vn@k8s-master docker-repo]$ kubectl create -f private-registry-svc.yaml
service/private-repository-k8s created

Kiểm tra lại trạng thái của service để biết port đang expose:

[tel4vn@k8s-master ~]$ kubectl get svc private-repository-k8s
NAME                  TYPE    CLUSTER-IP   EXTERNAL-IP   PORT(S)       AGE
private-repository-k8s   NodePort   10.100.113.39   <none>     5000:31320/TCP   2m1s

Kiểm tra và sử dụng Private Docker Registry #

Để kiểm tra, bạn hãy thử pull một image về và push lên như bên dưới:

[tel4vn@k8s-master ~]$ sudo docker pull nginx
[tel4vn@k8s-master ~]$ sudo docker tag nginx:latest k8s-master:31320/nginx:1.17
[tel4vn@k8s-master ~]$ sudo docker push k8s-master:31320/nginx:1.17

Sau đó kiểm tra lại để chắc chắn image đã được push lên:

[tel4vn@k8s-master ~]$ sudo docker image ls | grep -i nginx
nginx                             latest           7e4d58f0e5f3     2 weeks ago      133MB
k8s-master:31320/nginx            1.17             7e4d58f0e5f3     2 weeks ago      133MB

Tiếp tục, bạn hãy thử deploy một deployment đơn giản trên Kubernetes sử dụng Private Docker Registry vừa tạo:

[tel4vn@k8s-master ~]$ vi nginx-test-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test-deployment
  labels:
 app: nginx
spec:
  replicas: 3
  selector:
 matchLabels:
   app: nginx
  template:
 metadata:
   labels:
     app: nginx
 spec:
   containers:
   - name: nginx-1-17
     image: k8s-master:31320/nginx:1.17
     ports:
     - containerPort: 80

Bạn có thể thấy trong file yaml trên, đường dẫn lấy image đã được chỉ định là Private Docker Registry vừa tạo. Thực thi với kubectl để kiểm tra kết quả:

[tel4vn@k8s-master ~]$ kubectl create -f nginx-test-deployment.yaml
deployment.apps/nginx-test-deployment created
[tel4vn@k8s-master ~]$ kubectl get deployments  nginx-test-deployment
NAME                 READY   UP-TO-DATE   AVAILABLE   AGE
nginx-test-deployment   3/3 3         3        13s
[tel4vn@k8s-master ~]$
[tel4vn@k8s-master ~]$ kubectl get  pods | grep nginx-test-deployment
nginx-test-deployment-f488694b5-2rvmv  1/1 Running   0       80s
nginx-test-deployment-f488694b5-8kb6c  1/1 Running   0       80s
nginx-test-deployment-f488694b5-dgcxl  1/1     Running   0       80s

Kết luận #

Như vậy, qua bài viết này, mình đã hướng dẫn bạn đọc cách cài đặt một Private Docker Registry để sử dụng với Kubernetes. Cuối cùng, với bất kì thắc mắc nào, bạn hãy bình luận bên dưới để mình hỗ trợ nhé.

Nguồn bài viết: https://www.linuxtechi.com/

Mình là Tùng, hiện đang là DevOps tại Công Ty CP EcoIT. Với kinh nghiệm có được từ trong công việc, mình muốn chia sẻ cho bạn đọc cùng biết và cùng nhau học thêm nhiều điều mới trong lĩnh vực DevOps.

Powered by BetterDocs

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *