Harbor 2.13 and EKS Hybrid Nodes Integration Guide
Created: 2025-08-20 | Updated: 2026-02-14 | Reading time: ~3 min
Overview
This guide provides step-by-step configuration instructions for integrating Harbor 2.13 with EKS Hybrid Nodes (Kubernetes 1.33). Officially launched in December 2024, EKS Hybrid Nodes enables unified management of on-premises infrastructure and AWS EKS, while Harbor 2.13 provides enhanced security features and AI model management capabilities.
Part 1: Harbor Private Repository Installation and Configuration
Step 1: Prepare Harbor 2.13 Installation
Verify System Requirements
- Docker Engine 20.10.10+
- Docker Compose 2.0+
- Minimum Hardware: 2 CPU cores, 4GB RAM
- Supported OS: Ubuntu 20.04/22.04, RHEL 8/9, CentOS 7/8
Download Harbor 2.13.2
# Download Harbor 2.13.2 (latest stable version)
wget https://github.com/goharbor/harbor/releases/download/v2.13.2/harbor-offline-installer-v2.13.2.tgz
# Extract
tar xvf harbor-offline-installer-v2.13.2.tgz
cd harbor
Step 2: SSL/TLS Certificate Configuration
Generate Self-Signed Certificates
# 1. Generate CA certificate
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-key ca.key \
-out ca.crt \
-subj "/C=KR/ST=Seoul/L=Seoul/O=MyOrganization/CN=Harbor-CA"
# 2. Generate server certificate
openssl genrsa -out harbor.key 4096
openssl req -new -sha512 \
-key harbor.key \
-out harbor.csr \
-subj "/C=KR/ST=Seoul/L=Seoul/O=MyOrganization/CN=harbor.yourdomain.com"
# 3. Create v3.ext file (SAN configuration)
cat > v3.ext <<EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.yourdomain.com
DNS.2=yourdomain.com
IP.1=192.168.1.100
EOF
# 4. Sign the certificate
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.csr \
-out harbor.crt
# 5. Create certificate directory and copy files
mkdir -p /data/cert
cp harbor.crt /data/cert/
cp harbor.key /data/cert/
Step 3: Harbor Configuration File Setup
Modify harbor.yml
# Copy and edit harbor.yml
cp harbor.yml.tmpl harbor.yml
vi harbor.yml
Key configuration settings:
# Hostname setting
hostname: harbor.yourdomain.com
# HTTPS configuration
https:
port: 443
certificate: /data/cert/harbor.crt
private_key: /data/cert/harbor.key
# Harbor admin password
harbor_admin_password: Harbor12345!
# Database settings
database:
password: root123
max_idle_conns: 100
max_open_conns: 900
conn_max_lifetime: 5m
conn_max_idle_time: 0
# Data storage path
data_volume: /data
# Log settings
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
# Trivy vulnerability scanner settings
trivy:
ignore_unfixed: false
skip_update: false
offline_scan: false
insecure: false
# Metrics settings
metric:
enabled: true
port: 9090
path: /metrics
Step 4: Run Harbor Installation
# Run preparation script
sudo ./prepare
# Install Harbor (with Trivy)
sudo ./install.sh --with-trivy
# Verify installation
docker-compose ps
Step 5: Configure Harbor User Authentication
LDAP Authentication Setup (Optional)
# LDAP configuration via API
curl -X PUT "https://harbor.yourdomain.com/api/v2.0/configurations" \
-H "Content-Type: application/json" \
-u "admin:Harbor12345!" \
-d '{
"auth_mode": "ldap_auth",
"ldap_url": "ldap://ldap.company.com:389",
"ldap_base_dn": "ou=users,dc=company,dc=com",
"ldap_filter": "(objectClass=person)",
"ldap_uid": "uid",
"ldap_scope": 2,
"ldap_search_dn": "cn=admin,dc=company,dc=com",
"ldap_search_password": "admin_password",
"ldap_verify_cert": false
}'
Create Robot Account (for Kubernetes Integration)
# Create via Harbor UI or API
curl -X POST "https://harbor.yourdomain.com/api/v2.0/robots" \
-H "Content-Type: application/json" \
-u "admin:Harbor12345!" \
-d '{
"name": "k8s-robot",
"duration": 365,
"description": "Robot account for Kubernetes",
"disable": false,
"level": "system",
"permissions": [
{
"namespace": "*",
"kind": "project",
"access": [
{
"resource": "repository",
"action": "pull"
}
]
}
]
}'