TLS 有効・マルチユーザーモード・マルチノード・シングルホストでデプロイ。
che-che.xxx.xxx.xxx.xxx.nip.io
じゃなくて、 myide.xxx.xxx.xxx.xxx.nip.io
でアクセスしたいので、シングルホストモードでやってみる。
前提条件
- OS: Windows 10 Pro
- Docker Desktop インストール済み
- DNS に
nip.io
を利用 - 自己証明書を使用
- 3 ノードでデプロイ
作業用コンテナ起動
AKS 接続用の Docker コンテナを使う。
Azure へログイン
https://microsoft.com/devicelogin
へアクセスして、表示されたコードを入力する。
Kubernetes クラスタ作成
### 必要な情報整理
RESOURCE_GROUP="eclipse-che"
AKS_NAME="eclipse-che"
az group create --name ${RESOURCE_GROUP} --location japaneast
az aks create --resource-group ${RESOURCE_GROUP} --name ${AKS_NAME} --node-vm-size Standard_DS2_v2 --node-count 3 --enable-addons monitoring --generate-ssh-keys
az aks get-credentials --name ${AKS_NAME} --resource-group ${RESOURCE_GROUP}
kubectl config current-context
Ingress デプロイ
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.41.0/deploy/static/provider/cloud/deploy.yaml
ingress-nginx
の LoadBalancer
に EXTERNAL-IP
が割り当てられるまで待つ。
bash-5.0# kubectl get pods --namespace ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-fcfvr 0/1 Completed 0 55s
ingress-nginx-admission-patch-zxkjf 0/1 Completed 0 55s
ingress-nginx-controller-7c6c46898c-gbgsk 1/1 Running 0 56s
bash-5.0# kubectl get services --namespace ingress-nginx
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx-controller LoadBalancer 10.0.38.32 20.48.68.182 80:30680/TCP,443:32484/TCP 78s
ingress-nginx-controller-admission ClusterIP 10.0.14.233 <none> 443/TCP 78s```
Ingress の公開 IP アドレスをメモ。
```sh
DOMAIN_IP=$(kubectl get services --namespace ingress-nginx -o jsonpath='{.items[].status.loadBalancer.ingress[0].ip}')
DOMAIN="$(echo ${DOMAIN_IP} | sed -e "s/\./-/g").nip.io"
自己証明書の作成
新しく openssl コンテナを立ち上げて、その中で証明書を作成する。
cd ${WORK_DIR}
mkdir che_demo_ca
cd .\che_demo_ca
curl https://raw.githubusercontent.com/mikoto2000/docker-images/2fb7b9f119f65aec12ccc8db364bebeba8201090/openssl/docker-compose.yml -OutFile .\docker-compose.yml
mkdir usr_lib_ssl
curl https://raw.githubusercontent.com/mikoto2000/docker-images/2fb7b9f119f65aec12ccc8db364bebeba8201090/openssl/usr_lib_ssl/openssl.cnf -OutFile .\usr_lib_ssl\openssl.cnf
curl https://raw.githubusercontent.com/mikoto2000/docker-images/2fb7b9f119f65aec12ccc8db364bebeba8201090/openssl/usr_lib_ssl/v3_ca.txt -OutFile .\usr_lib_ssl\v3_ca.txt
docker-compose run --rm openssl bash
コンテナ内で証明書作成
# 必要な情報整理
## ドメイン定義
DOMAIN_IP="20.194.178.18"
DOMAIN="$(echo ${DOMAIN_IP} | sed -e "s/\./-/g").nip.io"
## SAN 設定作成
echo "subjectAltName = @alt_names" >> ./usr_lib_ssl/v3.txt
echo "" >> ./usr_lib_ssl/v3.txt
echo "[ alt_names ]" >> ./usr_lib_ssl/v3.txt
echo "DNS.1 = "'*'".${DOMAIN}" >> ./usr_lib_ssl/v3.txt
## 各種生成物定義
CA_KEY_FILE="/ca/private/cakey.pem"
CA_CSR_FILE="/ca/ca.csr"
CA_CRT_FILE="/ca/cacert.pem"
CA_COUNTRY="JP"
CA_STATE="KEN"
CA_LOCALITY="KU"
CA_ORGANIZATION="KOJIN"
CA_ORGANIZATION_UNIT="NONE"
CA_COMMON="${DOMAIN}"
CA_EMAIL="mikoto2000@gmail.com"
# CA 初期化
cd /ca
## 各種ディレクトリ作成
mkdir cert private crl newcerts
chmod 700 private
## シリアル初期化
echo "01" | tee -a serial
## crlnumber 初期化
echo "01" | tee -a crlnumber
## インデックス初期化
touch index.txt
echo "unique_subjec = yes" > index.txt.attr
# CA 鍵と CA 証明書作成
## CA 用秘密鍵作成
openssl genrsa -out ${CA_KEY_FILE} 2048
## CA 証明書要求作成
CA_SUBJECT="/C=${CA_COUNTRY}/ST=${CA_STATE}/L=${CA_LOCALITY}/O=${CA_ORGANIZATION}/OU=${CA_ORGANIZATION_UNIT}/CN=${CA_COMMON}"
openssl req -new -key ${CA_KEY_FILE} -out ${CA_CSR_FILE} -subj "${CA_SUBJECT}"
## CA 証明書要求確認
openssl req -noout -text -in ${CA_CSR_FILE}
## CA 証明書作成
openssl x509 -days 365 -req -in ${CA_CSR_FILE} -signkey ${CA_KEY_FILE} -out ${CA_CRT_FILE} -extfile /usr/lib/ssl/v3_ca.txt
## CA 証明書確認
openssl x509 -text -noout -in ${CA_CRT_FILE}
## CA 証明書を out ディレクトリへコピー
cp ${CA_CRT_FILE} /client/ca.crt
# サーバー証明書発行
SERVER_COMMON="${DOMAIN}"
SERVER_KEY_FILE="/client/server-${SERVER_COMMON}.key"
SERVER_CSR_FILE="/client/server-${SERVER_COMMON}.csr"
SERVER_CRT_FILE="/client/server-${SERVER_COMMON}.crt"
SERVER_COUNTRY="JP"
SERVER_STATE="KEN"
SERVER_LOCALITY="KU"
SERVER_ORGANIZATION="KOJIN"
SERVER_ORGANIZATION_UNIT="NONE"
SERVER_COMMON="server-${DOMAIN}"
SERVER_EMAIL="mikoto2000@gmail.com"
## サーバー秘密鍵作成
openssl genrsa -out ${SERVER_KEY_FILE} 2048
## サーバー証明書要求作成
SERVER_SUBJECT="/C=${SERVER_COUNTRY}/ST=${SERVER_STATE}/L=${SERVER_LOCALITY}/O=${SERVER_ORGANIZATION}/OU=${SERVER_ORGANIZATION_UNIT}/CN=${SERVER_COMMON}"
openssl req -new -key ${SERVER_KEY_FILE} -out ${SERVER_CSR_FILE} -subj "${SERVER_SUBJECT}"
## クライアント証明書要求確認
openssl req -noout -text -in ${SERVER_CSR_FILE}
# サーバー証明書作成
cd /client
yes | openssl ca -out ${SERVER_CRT_FILE} -extfile /usr/lib/ssl/v3.txt -infiles ${SERVER_CSR_FILE}
# ホスト証明書発行
HOST_COMMON="${DOMAIN}"
HOST_KEY_FILE="/client/host-${HOST_COMMON}.key"
HOST_CSR_FILE="/client/host-${HOST_COMMON}.csr"
HOST_CRT_FILE="/client/host-${HOST_COMMON}.crt"
HOST_COUNTRY="JP"
HOST_STATE="KEN"
HOST_LOCALITY="KU"
HOST_ORGANIZATION="KOJIN"
HOST_ORGANIZATION_UNIT="NONE"
HOST_COMMON="host-${DOMAIN}"
HOST_EMAIL="mikoto2000@gmail.com"
## ホスト秘密鍵作成
openssl genrsa -out ${HOST_KEY_FILE} 2048
## ホスト証明書要求作成
HOST_SUBJECT="/C=${HOST_COUNTRY}/ST=${HOST_STATE}/L=${HOST_LOCALITY}/O=${HOST_ORGANIZATION}/OU=${HOST_ORGANIZATION_UNIT}/CN=${HOST_COMMON}"
openssl req -new -key ${HOST_KEY_FILE} -out ${HOST_CSR_FILE} -subj "${HOST_SUBJECT}"
## クライアント証明書要求確認
openssl req -noout -text -in ${HOST_CSR_FILE}
# ホスト証明書作成
cd /client
yes | openssl ca -out ${HOST_CRT_FILE} -extfile /usr/lib/ssl/v3.txt -infiles ${HOST_CSR_FILE}
Kubernetes へ自己証明書を登録
kubectl create namespace che
kubectl create secret generic self-signed-certificate --from-file=che_demo_ca/client/ca.crt -n che
kubectl create secret generic che-tls --from-file=ca.crt=che_demo_ca/client/ca.crt --from-file=tls.key=che_demo_ca/client/server-${DOMAIN}.key --from-file=tls.crt=che_demo_ca/client/server-${DOMAIN}.crt -n che
Eclipse Che のインストール
git clone --depth 1 https://github.com/eclipse/che
cd che/deploy/kubernetes/helm/che/
# マルチユーザーモード
sed -i -e 's/ multiuser: false/ multiuser: true/g' values.yaml
# TLS 有効化
sed -i -e 'N;N;s/ tls:\n enabled: false/ tls:\n enabled: true/g' values.yaml
# PVC の作成単位をワークスペースごとに修正
sed -i -e 's/ cheWorkspacesPVCStrategy: "common"/ cheWorkspacesPVCStrategy: "per-workspace"/g' values.yaml
# PVC の容量アップ
sed -i -e 's/ pvcClaim: "1Gi"/ pvcClaim: "10Gi"/g' values.yaml
# 1 ユーザーごとに 10 個ワークスペースを作れるように修正
sed -i -e 's/ # userWorkspacesRunCount/ userWorkspacesRunCount: 10/g' values.yaml
# シングルホストモード有効化
sed -i -e 's/serverStrategy: multi-host/serverStrategy: single-host/g' values.yaml
sed -i -e 's/ singleHostExposure: native/ singleHostExposure: gateway/g' values.yaml
sed -i -e 's/ deploy: false/ deploy: true/g' values.yaml
# デプロイ
helm dependency update
kubectl create namespace che
helm upgrade --install che --namespace che --set global.ingressDomain=myide.${DOMAIN} ./
kubectl get pods
で che の Pod が立ち上がったことを確認したら、以下 URL でアクセスできる。
- Keycloak:
https://myide.20-194-178-18.nip.io/auth/
- Che:
https://myide.20-194-178-18.nip.io/dashboard/
以上。