[บันทึกช่วยจำ] มาทำ Private Container Registry ด้วย Harbor และเอาไปใช้บนกับ VMware vSphere with Tanzu กันเถอะ

Kritsadanshon Sadeewong
7 min readDec 15, 2020

สารบัญ

หลังจากที่ได้เล่น VMware vSphere with Tanzu กันไปในระดับหนึ่งแล้วส่วนใหญ่เอาใช้ Container Registry จาก Public Cloud หรือจะ Private แบบเสียเงินก็มี ที่นี้เราก็มาลองทำ Container Registry ไว้ใช้งานเอาภายใน On-Premises ด้วย Harbor กันดีกว่า

Harbor คืออะไร

เป็นโครงการ Open Source สำหรับทำ Container Registry โดยตัวมันเองมันความสามารถหลายอย่างไม่ว่าจะเป็น role-based access control หรือจะเป็นสแกน Container Images หาช่องโว่ความปลอดภัย หรือจะเป็นรองรับการ Replicate ไปไว้ Container Registry อีกที่ก็ยังได้ เป็นต้น

การติดตั้งก็ง่ายได้ ว่าแล้วเราก็ลงมือทำกันเถอะ

เตรียม VMs

ในส่วนนี้จะเป็นการเตรียม VM สำหรับติดตัง Harbor โดยในตัวอย่างจะใช้เป็น Photon OS จากทาง VMware

ขั้นตอนที่ 1 — Download OVF VMware Photon 3.0 Rev 3 https://github.com/vmware/photon/wiki/Downloading-Photon-OS

ขั้นตอนที่ 2 — ให้คลิ้กขวาที่ Cluster แล้วทำการเลือก Deploy OVF Template

ขั้นตอนที่ 3 — ให้เลือก OVF HAProxy ที่เราได้ทำการ download มาแล้วคลิ้ก Next

ขั้นตอนที่ 4 — ตั้งชื่อให้กับ Harbor ในที่นี้ใช้ชื่อว่า “TZHARBOR01.lab.local” และเลือก Folder ที่จะให้ VM นี้อยู่แล้วคลิ้ก Next

ขั้นตอนที่ 5 — เลือก Cluster หรือ ESXi Host ที่จะให้ VM นี้ทำงานแล้วคลิ้ก Next

ขั้นตอนที่ 6 — ระบบจะแสดงแสดงข้อมูลเบื้องต้นของ Harbor ให้คลิ้ก Next

ขั้นตอนที่ 7 — กด Accpect License Agreements แล้วคลิ้ก Next

ขั้นตอนที่ 8— เลือก Datastore ที่ต้องการให้ VM แล้วคลิ้ก Next

ขั้นตอนที่ 9— เลือก Network สำหรับ Management แล้วคลิ้ก Next

ขั้นตอนที่ 10— ตรวจสอบข้อมูลอีกครั้งถ้ามั่นใจแล้วคลิ้ก Finish เพื่อเริ่ม Deploy แล้วก็รอจน Deploy เสร็จ แล้วก็ทำการ PowerOn และรอจนระบบ Boot เรียบร้อย

ขั้นตอนที่ 10 — ให้คลิ้กขวาที่ VM “TZHARBOR01.lab.local” แล้วเลือกไปที่ Edit Setting…

ขั้นตอนที่ 11 — ทำการแก้ไขดังต่อไป แล้วทำการ PowerOn ขึ้นมา

  • CPU =2
  • Memory = 6 GB
  • Add new disk 30 GB

ขั้นตอนที่ 12— หลังจาก PowerOn ขึ้นมาแล้วให้ทำการ Logon ด้วย

  • User = root
  • Pass = changeme

ระบบจะให้เปลี่ยน password ใหม่

ขั้นตอนที่ 13 — ทำการเปลี่ยน Hostname ด้วยคำสั่ง

$ hostnamectl set-hostname tzharbor01.lab.local

ขั้นตอนที่ 14 — ตั้งค่าให้ root ไม่มีวันหมดอายุ

$ chage -M 9999 root

ขั้นตอนที่ 15 — ตั้งค่า Network

$ cat > /etc/systemd/network/10-static-en.network << "EOF"

[Match]
Name=eth0
[Network]
Address=172.17.36.66/24
Gateway=172.17.36.254
DNS=192.168.0.10
EOF

หลังจากนั้นให้สิทธิ์ และ Restart service network

$ chmod 644 /etc/systemd/network/10-static-en.network
$ systemctl restart systemd-networkd
$ ifconfig

ขั้นตอนที่ 16 — อัพเดต OS และติดตั้ง Package

$ tdnf updateinfo
$ tdnf -y distro-sync
$ tdnf install -y bindutils tar parted
$ reboot now

ขั้นตอนที่ 17 — เพิ่ม iptables เพื่อให้สามารถ SSH เข้าไปได้

$ iptables -A INPUT -p SSH-j ACCEPT
$ iptables -A OUTPUT -p SSH -j ACCEPT
$ iptables-save > /etc/systemd/scripts/ip4save

ขั้นตอนที่ 18 — ทดสอบ SSH ไปที่ Server

ขั้นตอนที่ 19— ติดตั้ง docker-compose

$ curl -sL "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose

ติดตั้งเสร็จแล้วก็ตรวจสอบ docker-compose version

$ docker-compose version

ขั้นตอนที่ 20— Enable และ Start docker service

$ systemctl start docker
$ systemctl enable docker

ติดตั้งเสร็จแล้วก็ตรวจสอบ docker version

$ docker version

ขั้นตอนที่ 21 — ให้ทำการแก้ไข resolved.conf ดังรูปตัวอย่าง

$ vi /etc/systemd/resolved.conf

แล้วทำการ Restart service

$ systemctl restart systemd-resolved.service

ขั้นตอนที่ 22— สร้าง Endpoint Folder สำหรับ disk ที่ add เพิ่ม

$ fdisk -l
$ parted /dev/sdb mklabel gpt mkpart ext4 0% 100%
$ mkfs -t ext4 /dev/sdb1
$ mkdir /data
$ vim /etc/fstab

ทำการเพิ่มข้อมูลการ mount

$ /dev/sdb1 /data ext4 defaults 0 0
$ mount /data
$ df -h

ติดตั้ง Harbor

ต่อมาจะเป็นส่วนในการติดตั้ง Harbor

ขั้นตอนที่ 1 — ทำการสร้างโฟลเดอร์สำหรับติดตั้ง ตามตัวอย่าง และ Donwload และแตกไฟล์

$ mkdir -p /harbor
$ cd /harbor
$ curl -sLO https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz
$ tar xvf harbor-offline-installer-v2.1.0.tgz --strip-components=1

ขั้นตอนที่ 2— ก็อบปี้ไฟล์ harbor.yml.tmpl ออกมาเป็น harbor.yml เตรียมไว้สำหรับ Config และติดตั้ง

$ cp harbor.yml.tmpl harbor.yml

ขั้นตอนที่ 3— เตรียม Certificate

**ในตัวอย่างจะใช้เป็น Self-Signed SSL Certificate

$ openssl genrsa -out ca.key 4096$ openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/C=TH/ST=Bangkok/L=Bangkok/O=LAB/OU=IT/CN=TZHARBOR01.lab.local"  -key ca.key -out ca.crt$ openssl genrsa -out TZHARBOR01.lab.local.key 4096$ openssl req -sha512 -new -subj "/C=TH/ST=Bangkok/L=Bangkok/O=LAB/OU=IT/CN=TZHARBOR01.lab.local" -key TZHARBOR01.lab.local.key -out TZHARBOR01.lab.local.csr$ cat > v3.ext << "EOF"
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=TZHARBOR01.lab.local
DNS.2=TZHARBOR01
DNS.3=172.17.36.66
EOF
$ openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in TZHARBOR01.lab.local.csr -out TZHARBOR01.lab.local.crt$ openssl x509 -inform PEM -in TZHARBOR01.lab.local.crt -out TZHARBOR01.lab.local.cert$ mkdir -p /etc/docker/certs.d/TZHARBOR01.lab.local
$ cp TZHARBOR01.lab.local.cert /etc/docker/certs.d/TZHARBOR01.lab.local
$ cp TZHARBOR01.lab.local.key /etc/docker/certs.d/TZHARBOR01.lab.local
$ cp ca.crt /etc/docker/certs.d/TZHARBOR01.lab.local

ขั้นตอนที่ 4 — แก้ไข Config หลักๆ จะมีอ 5 จุดได้แก้

  • hostname = TZHARBOR01.lab.local
  • https -> certificate = /etc/docker/cert.d/TZHARBOR01.lab.local/TZHARBOR01.lab.local.cert
  • https -> private_key = /etc/docker/cert.d/TZHARBOR01.lab.local/TZHARBOR01.lab.local.key
  • database -> password = VMware1!
  • harbor_admin_password = VMware1!

ขั้นตอนที่ 5— สั่งติดตั้งโดยให้ติดตั้ง notary, trivy และ chartmuseum ด้วย

$ ./install.sh --with-notary --with-trivy --with-chartmuseum

ขั้นตอนที่ 5 — ลองเรียกใช้งานหน้าเว็บ

ใช้งานพื้นฐาน

ต่อมาในส่วนจะเป็นการทดลองเข้าใช้งานเบื้องต้นกัน

ขั้นตอนที่ 1 — Login เข้า Harbor Console

  • Username = admin
  • Password = VMware1!

ขั้นตอนที่ 2 — ให้ไปที่ Administrator -> Users เพื่อสร้าง User สำหรับให้ทีมอื่นเข้ามาใช้งาน

ขั้นตอนที่ 3— เพิ่ม Use ใหม่โดยการคลิ้ก New User แล้วกรอกข้อมูลที่ต้องการลงไป

  • Username = devops
  • Password = VMware1!

ขั้นตอนที่ 4— ให้ไปที่ Project เพื่อที่จะสร้างโปรเจคใหม่มาใช้งาน โดยการคลิ้ก New Project

  • Project Name = devops

ขั้นตอนที่ 5— กำหนดสิทธิ์ให้กับโปรเจคใหม่ ให้ไปที่ Members แล้วคลิ้ก +User

ขั้นตอนที่ 6 — พิมท์ชื่อ User ที่ต้องการ และกำหนดสิทธิ์ให้กับ User

  • Username = devops
  • Role = Project Admin

ขั้นตอนที่ 7 — Docker login เข้าไปที่ server harbor

  • Username = devops
  • Password = VMware1!
$ docker login TZHARBOR01.lab.local

**หากเจอ Error “x509: certificate signed by unknown authority” ให้ทำการนำ Root CA ของเครื่อง Harbor มาติดตั้งที่เครื่องที่จะ Login เข้าใช้งาน Harbor

ขั้นตอนที่ 8— Pull container images มาทดสอบ

$ docker pull nginxdemo/hello

ขั้นตอนที่ 9 — Tag container imagees ให้เป็น Harbor โดยเราสามารถดูตัวอย่างการ Tag, Push และ Pull ได้จาก หน้า Admin Conso

$ docker tag nginxdemo/hello TZHARBOR01.lab.local/devops/hello:latest

ขั้นตอนที่ 10— Push container images ขึ้นไปยัง Harbor หรือยัง

$ docker push TZHARBOR01.lab.local/devops/hello:latest

ขั้นตอนที่ 11— ตรวจสอบที่หน้า Admin โดยไปที่ Projects -> devops เพื่อตรวจสอบว่า container images ได้ Push มาแล้วหรือยัง

เชื่อมต่อกับ Tanzu

หลังจากที่ได้ทดลองใช้งานพื้นฐานสำหรับ Harbor แล้วต่อมาเราจะนำไปใช้กับ vSphere with Tanzu เรามาดูว่าจะยาก ง่ายขนาดไหนกันดีกว่า

ขั้นตอนที่ 1 — Login เข้า Super Cluster จากบทความครั้งที่แล้ว คลิ้ก

$ kubectl.exe vsphere login --server=172.17.37.100 -u devops@vsphere.local --insecure-skip-tls-verify

ขั้นตอนที่ 2 — เช็ค secrets ทั้งหมดว่ามีข้อมูล ssh-pass ของ TKC ที่เราต้องการหรือไม่

$ kubectl.exe get secrets

ในตัวอย่างจะเป็น devops-tkc-01-ssh-password

ขั้นตอนที่ 3 — ดึงค่า password สำ SSH เข้าเครื่อง Worker ของ TKC

$ kubectl.exe get secrets devops-tkc-01-ssh-password -o jsonpath='{.data.ssh-passwordkey}'

ขั้นตอนที่ 4 — ให้นำ password ที่ได้ทำการ decode จาก Base64 ก่อนเพื่อนำไปใช้งานต่อไป

**ในตัวอย่างใช้เว็บออนไลน์แปลง https://www.base64decode.org

ขั้นตอนที่ 5 — ให้ทำการ SSH ไปที่ Worker ของ TKC ด้วย User vmware-system-user แล้วทำการเปลี่ยนเป็นสิทธิ์ root และย้ายไปที่ path /etc/pki/tls/certs/

$ sudo su
$ cd /etc/pki/tls/certs/
$ ls -l
$ cp ca-bundle.crt ca-bundle.crt.old

ขั้นตอนที่ 6 — เพิ่ม RootCA ของ Harbor เข้าไปที่ไฟล์ ca-bundle.crt

$ echo "-----BEGIN CERTIFICATE-----
MIIEGTCCAwGgAwIBAgIJAMsrnQMLhki7MA0GCSqGSIb3DQEBCwUAMIGXMQswCQYD
VQQDDAJDQTEXMBUGCgmSJomT8ixkARkWB3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZ
FgVsb2NhbDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExGTAXBgNV
BAoMEFRaVkNTQS5sYWIubG9jYWwxGzAZBgNVBAsMElZNd2FyZSBFbmdpbmVlcmlu
ZzAeFw0yMDEyMDIxMDA3MzZaFw0zMDExMzAxMDA3MzZaMIGXMQswCQYDVQQDDAJD
QTEXMBUGCgmSJomT8ixkARkWB3ZzcGhlcmUxFTATBgoJkiaJk/IsZAEZFgVsb2Nh
bDELMAkGA1UEBhMCVVMxEzARBgNVBAgMCkNhbGlmb3JuaWExGTAXBgNVBAoMEFRa
VkNTQS5sYWIubG9jYWwxGzAZBgNVBAsMElZNd2FyZSBFbmdpbmVlcmluZzCCASIw
DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMy5yOXW26tKpxIyKktNchybPpX5
AO0LgZxP5GecuvKumCNk568rJRO4mB2wCkAot4saTA9AAaBBLNxtYBE5OBlnFNih
nMxpv//TGCh2J7pLTm0oe0gB0Gv4sdQ4HY9NrDrgYxhUjsN5064qh73Jdp7BO0sP
DGpSn1tdaq+vij+0D07PvG3rkU4pf/6DGiy01XMrZN1pX/NgBtPjl7PAcrdQcxcf
rJTvI21452Q1vDRBzgfO5CXNHzALthTXFpVtK9ZgCf+b3/u1d4efX5ZUVte7Cj3i
FUjMMby9HEFSkAcv/PN/+pO0gXVkUU45pnO575Yyxunx78nHy9899VmcFLECAwEA
AaNmMGQwHQYDVR0OBBYEFEDEWY8kwlB2AuKVWiAm3xwa1d3JMB8GA1UdEQQYMBaB
DmVtYWlsQGFjbWUuY29thwR/AAABMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8E
CDAGAQH/AgEAMA0GCSqGSIb3DQEBCwUAA4IBAQA17T2qt3xVjVp/SuT56OYslZk0
QjK2Y5OThSdlbibByZYoSe6cQJWpEaos0CfKzULa++hRX77IQjPifWxWxqs5ZDfz
iDtzfExebmOhy1T/syCnwkF7uWdm0SDuHvsK7MLUXwFy8QAau+cyUt9fyl0K43YW
x8aJR0959zjw1Z2kksX8F/u1xWcwAw6p9aKnh6JQKA4Gk7LjzWMiHgkhyFWzuo9J
B8i4+5s3P6cdMI3582V0EneNmO/oK9O5RRHBnkqg5uiRr7OJuri4tqiHi5v1asDB
LtBC1zTk3AGgPrJL1hRq0p/kkALwFgE4dBbORmsZZE//JTxOdC49cY2OQ0td
-----END CERTIFICATE-----" >> /etc/pki/tls/certs/ca-bundle.crt

ขั้นตอนที่ 7— ทำการ Restart Service containerd

systemctl restart containerd.service

ขั้นตอนที่ 8— ทดลอง apply service ที่มีการเรียกใช้งาน container images จาก Harbor

$ kubectl.exe apply -f helloapp.yaml

ขั้นตอนที่ 9— ตรวจสอบ Service ที่เราสร้างขึ้นว่าสามารถ deploy ได้หรือไม่

$ kubectl.exe get all

ขั้นตอนที่ 10— ทดลองเรียก Service ดูซิ

เพียงเท่านี้เราก็จะมี Private Registry สำหรับเก็บ Container Images ไว้ใช้งานภายในองค์กรณ์แล้ว แต่เราก็จะเห็นว่าการเอาไปใช้กับ vSphere with Tanzu ค่อยข้างจะยุ่งยาก และยังต้องทำแบบ Manual อยู่ ในบทความครั้งหน้าเราจะไปดูเกี่ยวกับเรื่องเราจะนำ NSX-T มาใช้งานแทน HAProxy บน vSphere with Tanzu ดูว่าเราจะสามารถทำอะไรบ้าง และมีข้อดูอะไรบ้าง

สุดท้ายแล้วหากท่านไหนหลงเข้ามาอ่านแล้วเห็นเป็นประโยชน์ก็สามารถนำไปต่อยอดได้เลย หรือหากมีคำแนะนำดีๆ ก็สามารถบอกกล่าวให้ทราบได้เช่นกันครับ

.

Ref: https://goharbor.io/

Ref: https://cormachogan.com/2020/12/01/deploying-harbor-v2-1-0-step-by-step/

Ref: https://neonmirrors.net/post/2020-10/deploying-harbor-on-photon-os/

Ref: https://docs.vmware.com/en/VMware-vSphere/7.0/vmware-vsphere-with-tanzu/GUID-37DC1DF2-119B-4E9E-8CA6-C194F39DDEDA.html

.

--

--

Kritsadanshon Sadeewong

นายช่างระบบระบบคอมพิวเตอร์ ที่ชอบทดลอง และเรียนรู้สิ่งใหม่ไปเรื่อยๆ