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/