Tanzu Mission Control(以下TMC)を活用し、なるべくCLIを使わずクラスタ構築からHarborの起動までをやってみる。
最初にHarborで使うドメインを環境変数で定義しておく。
export MYDOMAIN="harbor.tkg.tanzu"
この変数は色々なところで使い回すので、作業を中断してログアウト等した場合は再度設定するのを忘れないこと。
Harborの証明書の準備
Harborの証明書を持ち込んだ想定で実施するが、とはいいつつ正式な証明書を用意するのは面倒なので、自己署名証明書を手動で作成し、これを持ち込んでHarborを立ち上げる。
Harborの自己署名証明書の作成手順はHarborの公式サイトの手順を参考にした。
証明書の中身の説明は本旨ではないのでここでは省略する。
mkdir harbor-cert
cd harbor-cert
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Tokyo/L=Tokyo/O=example/OU=Personal/CN=$MYDOMAIN" \
-key ca.key \
-out ca.crt
openssl genrsa -out ${MYDOMAIN}.key 4096
openssl req -sha512 -new \
-subj "/C=CN/ST=Tokyo/L=Tokyo/O=example/OU=Personal/CN=$MYDOMAIN" \
-key ${MYDOMAIN}.key \
-out ${MYDOMAIN}.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=$MYDOMAIN
DNS.2=yourdomain
DNS.3=hostname
EOF
openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in ${MYDOMAIN}.csr \
-out ${MYDOMAIN}.crt
cd -
Workload Clusterをデプロイする
Tanzu Mission ControlからWorkload Clusterを作成する。
証明書を持ち込んでのクラスタ作成は以前書いた以下の記事を参考に実施する。
上記の記事でまとめているので、ここでは作成手順は割愛する。
Harborの前提パッケージのインストール
Harborの前提としてContourが必要であり、Contourの前提としてcert-managerが必要なので、それぞれをTMCでインストールする。
TMCで作成したクラスタを選択後、Add-ons
->BROWSE PACKAGES
からcert-managerの下のINSTALL PACKAGE
を選択する
次にkind: PackageInstall
やkind: App
をインストールするNamespaceを指定する。
右上のCARVEL SETTINGS
をクリックし、Namespaceを指定する。
なお、Namespaceを指定しない場合はNamespaceが自動で生成される。
Package name
はcert-manager
とし、その他は変更せずにINSTALL PACKAGE
をクリックしてインストールを実行する。
インストールが完了すると、GUI上からcert-managerの状態が緑色✅で表示される。
同じ手順でContourもインストールする。
Contourのvalues.yamlはこちらでベースが公開されているのでこれをコピーしてOverlay YAML
のところに貼り付ける。
NodePort
ではなくLoadbalancerIPで公開するため、貼り付けた後にenvoy.service.type
をLoadBalancer
に変更している。
Package name
をcontour
としてINSTALL PACKAGE
をクリックしてインストールを実行する。
インストールが完了すると、GUI上からcontourの状態が緑色✅で表示される。
Harborのインストール
Harborのインストール画面で、GENERATE YAML FROM TABLE
からベースとなるvalues.yamlを生成する。(なお、CLIの手順と比べて編集項目が増え、パスワードも自動で生成されないため、編集項目を減らしたい人はCLIの手順でvalues.yamlを作るのを推奨する)
コピーして、一旦harbor-data-values.yamlという名前で保存する。
保存したものを編集し、以下の項目を編集する。
- generate-passwords.shで設定される項目
core.secret
core.xsrfKey
database.password
-
harborAdminPassword
※ログイン時に利用する jobservice.secret
secretKey
-
contourHttpProxy.idleTimeout
: 30m -
contourHttpProxy.timeout
: 30m -
hostname
: 環境変数MYDOMAIN
と同じ値を指定 -
tlsCertificate."ca.crt"
: 作成した自己証明書のca.crt -
tlsCertificate."tls.crt"
: 作成した自己証明書の${MYDOMAIN}.crt -
tlsCertificate."tls.key"
: 作成した自己証明書の${MYDOMAIN}.key
作成したharbor-data-values.yamlをContourの時と同じようにOverlay YAML
のところに貼り付けてインストールを実施する。
インストールが完了し、$MYDOMAINのアドレスがContourのExternalIPとなるよう名前解決できていれば、Harborにログインできる。
Harborの利用
dockerコマンドでpushする
Dockerで利用するために、Harborの証明書をdockerdに読み込ませる。
sudo mkdir -p /etc/docker/certs.d/${MYDOMAIN}/
sudo cp ./harbor-cert/ca.crt /etc/docker/certs.d/${MYDOMAIN}/
sudo systemctl restart docker
docker loginする。
echo 'xxxx' | docker login -u admin --password-stdin ${MYDOMAIN}
イメージをpushする。
docker pull nginx
docker tag nginx ${MYDOMAIN}/library/nginx
docker push ${MYDOMAIN}/library/nginx
kubectl runで起動する
せっかくなので、TMCでPodが起動する環境の準備もする。
最初にデプロイ先のNamespaceを作成する。
左サイドバーのNamespaces
選択後、CREATE NAMESPACE
をクリックする。
Namespace名やClusterを選択してCREATE
で作成する。
ここではNamespace名はdemo
とする。
なお、Workspaceが必須となっているので、作っていない場合は作ってから実施すること。
次にHarborの認証情報を格納したSecretを作成する。
左サイドバーのClusters
からAdd-ons
を選択し、下の方にあるKubernetes secrets
を選択してCREATE SECRET
をクリックする。
クリック後、Secret名(ここではharbor-credとした)とHarborの認証情報を入力する。また、先程作ったNamespaceも指定する。
CREATE
をクリック後、今回はSecretの他Namespaceへの流用は実施しないため、そのままFINISH
をクリックして終了する。
次に、先程のnginxを起動する。
ターミナルに戻り、先程作成したSecretをdefaultのServiceAccountが利用するよう、ServiceAccountのimagePullSecret
を編集する。
kubectl patch serviceaccount default -p '{"imagePullSecrets": [{"name": "harbor-cred"}]}' -n demo
nginxを起動する。
kubectl run --image ${MYDOMAIN}/library/nginx nginx -n demo
起動したことを確認する。
$ kubectl get pod -n demo
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 24s
問題なさそうだ。