启用工作负载载入

为了启用工作负载载入,你需要以下信息:

  • 用于分配工作负载载入端点的 DNS 名称
  • 该 DNS 名称的 TLS 证书

在本示例中,你将使用 DNS 名称 onboarding-endpoint.example,因为我们不希望你使用可路由的 DNS 名称。

准备证书

出于生产目的,你需要使用由可信任的证书颁发机构(CA)签名的 TLS 证书,例如 Let’s Encrypt 或内部 CA(如 Vault)。

在本示例中,你将设置一个示例 CA,它将在本指南的其余部分中使用。

通过执行以下命令创建一个自签名证书(example-ca.crt.pem)和 CA 私钥(example-ca.key.pem):

openssl req \
  -x509 \
  -subj '/CN=Example CA' \
  -days 3650 \
  -sha256 \
  -newkey rsa:2048 \
  -nodes \
  -keyout example-ca.key.pem \
  -out example-ca.crt.pem \
  -config <(cat <<EOF
# "openssl req" 命令的配置部分
[ req ]
distinguished_name     = req                 # 包含要提示输入的显著名称字段的部分的名称
x509_extensions        = v3_ca               # 包含要添加到自签名证书的扩展列表的部分的名称

# 包含要添加到自签名证书的扩展列表的部分的名称
[ v3_ca ]
basicConstraints       = CA:TRUE             # 为了与破损的软件兼容性而不标记为关键
subjectKeyIdentifier   = hash                # PKIX 建议
authorityKeyIdentifier = keyid:always,issuer # PKIX 建议
EOF
)

然后,通过执行以下命令创建证书签名请求(onboarding-endpoint.example.csr.pem)和 工作负载载入端点的私钥(onboarding-endpoint.example.key.pem):

openssl req \
  -subj '/CN=onboarding-endpoint.example' \
  -sha256 \
  -newkey rsa:2048 \
  -nodes \
  -keyout onboarding-endpoint.example.key.pem \
  -out onboarding-endpoint.example.csr.pem

最后,通过执行以下命令创建 DNS 名称 onboarding-endpoint.example 的证书 (onboarding-endpoint.example.crt.pem),该证书由你在前面步骤中创建的 CA 签名:

openssl x509 \
  -req \
  -days 3650 \
  -sha256 \
  -in onboarding-endpoint.example.csr.pem \
  -out onboarding-endpoint.example.crt.pem \
  -CA example-ca.crt.pem \
  -CAkey example-ca.key.pem \
  -CAcreateserial \
  -extfile <(cat <<EOF
# 包含要添加到证书的扩展列表的名称部分
extensions = usr_cert

# 包含要添加到证书的扩展列表的名称部分
[ usr_cert ]
basicConstraints       = CA:FALSE            # 为了与破损的软件兼容性而不标记为关键
subjectKeyIdentifier   = hash                # PKIX 建议
authorityKeyIdentifier = keyid:always,issuer # PKIX 建议

keyUsage               = digitalSignature, keyEncipherment
extendedKeyUsage       = serverAuth
subjectAltName         = DNS:onboarding-endpoint.example
EOF
)

然后,通过执行以下命令将证书部署到 Kubernetes 集群:

kubectl create secret tls onboarding-endpoint-tls-cert \
  -n istio-system \
  --cert=onboarding-endpoint.example.crt.pem \
  --key=onboarding-endpoint.example.key.pem

启用工作负载载入

一旦 TLS 证书准备好,你可以通过执行以下命令启用工作负载载入:

cat <<EOF | kubectl apply -f -
apiVersion: install.tetrate.io/v1alpha1
kind: ControlPlane
metadata:
  name: controlplane
  namespace: istio-system
spec:
  meshExpansion:
    onboarding:
      endpoint:
        hosts:
        - onboarding-endpoint.example
        secretName: onboarding-endpoint-tls-cert
      localRepository: {}
EOF

上述命令指定了应使用 DNS 名称 onboarding-endpoint.example 设置工作负载载入端点,使用在 secret onboarding-endpoint-tls-cert 中可用的证书。

它还指定应部署一个本地存储库,其中包含用于 Workload Onboarding 代理和 Istio Sidecar 的 DEB/RPM 包。

执行上述命令后,请等待直到各个 Workload Onboarding 组件可用:

kubectl wait --for=condition=Available -n istio-system \
  deployment/vmgateway \
  deployment/onboarding-plane \
  deployment/onboarding-repository

验证工作负载载入端点

由于你未使用可路由的 DNS 名称,因此需要找出已公开的工作负载载入端点的地址。

执行以下命令以获取地址(DNS 名称或 IP 地址):

ONBOARDING_ENDPOINT_ADDRESS=$(kubectl get svc vmgateway \
  -n istio-system \
  -ojsonpath="{.status.loadBalancer.ingress[0]['hostname', 'ip']}")

在本指南的其余部分中,你将使用存储在 ONBOARDING_ENDPOINT_ADDRESS 环境变量中的地址。

最后,执行以下命令以验证端点是否可用于外部流量。

curl -f -i \
  --cacert example-ca.crt.pem \
  --connect-to "onboarding-endpoint.example:443:${ONBOARDING_ENDPOINT_ADDRESS}:443" \
  "https://onboarding-endpoint.example/install/"

你应该会看到类似以下内容的输出:

HTTP/2 200
content-type: text/html; charset=utf-8
server: istio-envoy

<pre>
<a href="deb/">deb/</a>
<a href="rpm/">rpm/</a>
</pre>