iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0
DevOps

前端轉生~到了實驗室就要養幾隻可愛鯨魚:自架 Kubernetes 迷航日記系列 第 14

Day 14 — 有個私人的港口還好吧:私有儲存庫 Harbor (一)(使用 nodePort)

  • 分享至 

  • xImage
  •  

可愛鯨魚

都有自己的艦隊了~再架一個自己的港口還好吧~

圖片來源:Docker (@Docker) / Twitter

要如何讓 cluster 上所有機器都能取得 image 呢?
需要架設一個 registry 提供外部存取 image

公有的 registry 如 DockerHub
各大雲端平台也都有提供自己管理 registry 的功能 (AWS, AZURE, GCP, ...)

那... 想自己架自己管呢? Harbor
harbor
圖片來源:Harbor

Harbor 也是 CNCF project 之一哦!


這篇以 nodePort 架設,之後介紹完 ingress 和 ingress controller 才會回頭用 ingress 架設哦!


前置 — 安裝 Helm

接下來我們會使用 Helm 架設,先來簡單安裝一下~

curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

檢查一下安裝有沒有成功...

helm version

架設 Harbor in Kubernetes

接下來會直接把 Harbor 架設在 Kubernetes
預期 cluster Node 能從 Harbor 取得 image 後進行部署

本篇使用 Harbor helm version 1.9.3

建立 Namespace

kubectl create ns harbor

取得 Harbor values

helm repo add harbor https://helm.goharbor.io
helm show values harbor/harbor --version 1.9.3 >> values.yaml

然後就會取得一個大概 900 多行的設定檔... /images/emoticon/emoticon06.gif


以 nodePort 架設

使用 Node whale1 (ip: 10.1.0.1, port: 30003) 對外服務

  1. 修改 values
    • expose
      • type: nodePort: 使用 nodePort 公開服務
      • tls.enabled: true: 使用 tls
      • tls.certSource: auto: 自動產生憑證
      • tls.auto.commonName: "harbor.cluster.example": 設定憑證的 CN,改成自己管的 domain
      • nodePort.ports.https.nodePort: 30003: 使用 30003 port
    • externalURL: https://10.1.0.1:30003: 設定外部連接的 URL,和連接 registry 機制有關,這裡直接使用主機 ip
    • persistence.enabled: false: 先不使用 PersistenceVolume,之後的篇章會再補充介紹
    • harborAdminPassword: Harbor12345: 預設 admin 登入密碼
    • nginx.nodeSelector: {kubernetes.io/hostname: whale1}: 指定使用 Node

完整設定檔可以到我的 github Day 14 - values-nodePort.yaml 查看

  1. 設定完成後使用 helm install

    helm install harbor -f values-nodePort.yaml --namespace harbor harbor/harbor --version 1.9.3
    
  2. 等待 Pod 都開啟後就能連上網站~

記得登入後要修改 admin 密碼!

測試 nodePort Harbor - docker

  1. /etc/docker/daemon.json 增加 insecure-registries
{
    "insecure-registries" : ["10.1.0.1:30003"]
}
  1. 修改完成後重啟 docker
sudo systemctl restart docker
  1. 使用 Docker login 連線
$ docker login https://10.1.0.1:30003/
Username: admin
Password: 
WARNING! Your password will be stored unencrypted in /home/user/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded
  1. 測試 push image
$ docker image ls alpine
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
alpine       3.16.2    a6215f271958   6 weeks ago   5.29MB
$ docker tag alpine:3.16.2 10.1.0.1:30003/library/alpine:3.16.2
$ docker push 10.1.0.1:30003/library/alpine:3.16.2
The push refers to repository [10.1.0.1:30003/library/alpine]
994393dc58e7: Pushed 
3.16.2: digest: sha256:1304f174557314a7ed9eddb4eab12fed12cb0cd9809e4c28f29af86979a3c870 size: 528
  1. 回到網頁上就能看到 image 已經在上面了~

  2. 記得登出 registry

$ docker logout https://10.1.0.1:30003
Removing login credentials for 10.1.0.1:30003

測試 nodePort Harbor - kubernetes

前面已經將 alpine image 推上去,接著在 kubernetes 測試使用

  1. 在每一台 Docker 上... 修改 /etc/docker/daemon.json 增加 insecure-registries
{
    "insecure-registries" : ["10.1.0.1:30003"]
}
  1. 修改完成後重啟 docker
sudo systemctl restart docker
  1. 寫個簡單的 Pod
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
  namespace: harbor
  labels:
    name: test-pod
spec:
  containers:
  - name: test-pod
    image: 10.1.0.1:30003/library/alpine:3.16.2
    command: ["/bin/sh", "-c"]
    args:
      - "sleep 5m"
    resources:
      limits:
        memory: "128Mi"
        cpu: "500m"

可以直接複製 github Day 14 - test-pod.yaml

kubectl apply -f test-pod.yaml

從 describe 看 Pod Events

...
Events:
  Type    Reason     Age   From               Message
  ----    ------     ----  ----               -------
  Normal  Scheduled  33s   default-scheduler  Successfully assigned harbor/test-pod to whale1
  Normal  Pulling    31s   kubelet            Pulling image "10.1.0.1:30003/library/alpine:3.16.2"
  Normal  Pulled     30s   kubelet            Successfully pulled image "10.1.0.1:30003/library/alpine:3.16.2" in 710.688324ms
  Normal  Created    29s   kubelet            Created container test-pod
  Normal  Started    29s   kubelet            Started container test-pod

成功從 10.1.0.1:30003 取得 image!

清除 test-pod...

kubectl delete -f test-pod.yaml

這裡使用的是 library 公開的,所以 Kubernetes 不需登入也能 pull image 哦


Ref


如果你也覺得用 nodePort 很怪,接下來會介紹 ingress 還有安裝 ingress controller,之後會回頭使用 ingress 架設 Harbor

在更後面也會透過 openssl 自簽憑證讓 cluster 機器不用再設定 insecure-registries 哦!

敬請期待~ /images/emoticon/emoticon07.gif


上一篇
Day 13 — 抓不完的走私貨櫃:練習架設服務 - Minecraft Server in Kubernetes
下一篇
Day 15 — 艦艇開放參觀區域:Service 介紹
系列文
前端轉生~到了實驗室就要養幾隻可愛鯨魚:自架 Kubernetes 迷航日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言