4.8. 配置网络
4.8.1. 配置网络策略
默认情况下,OpenShift 集群中的所有 Pod 都可以相互通信,即使它们位于不同的命名空间中。在 OpenShift Dev Spaces 中,这可能会导致一个用户项目中的工作区 Pod 将流量发送到其他用户项目中的另一个工作区 Pod。
为安全起见,可以使用 NetworkPolicy 对象配置多租户隔离,以限制用户项目中的所有传入的通信。但是,OpenShift Dev Spaces 项目中的 Pod 必须能够与用户项目中的 Pod 通信。
先决条件
- OpenShift 集群有网络限制,如多租户隔离。
流程
将
allow-from-openshift-devspaces
NetworkPolicy 应用到每个用户项目。allow-from-openshift-devspaces
NetworkPolicy 允许从 OpenShift Dev Spaces 命名空间的传入流量到用户项目中的所有 Pod。例 4.45.
allow-from-openshift-devspaces.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-devspaces spec: ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: openshift-devspaces podSelector: {} policyTypes: - Ingress
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-devspaces spec: ingress: - from: - namespaceSelector: matchLabels: kubernetes.io/metadata.name: openshift-devspaces
1 podSelector: {}
2 policyTypes: - Ingress
Copy to Clipboard Copied! OPTIONAL : 在使用网络策略应用配置多租户隔离时,还必须应用
allow-from-openshift-apiserver
和allow-from-workspaces-namespaces
NetworkPolicies 到openshift-devspaces
。allow-from-openshift-apiserver
NetworkPolicy 允许从openshift-apiserver
命名空间中的传入流量到devworkspace-webhook-server
启用 Webhook。allow-from-workspaces-namespaces
NetworkPolicy 允许从每个用户项目的传入流量到che-gateway
pod。例 4.46.
allow-from-openshift-apiserver.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-apiserver namespace: openshift-devspaces spec: podSelector: matchLabels: app.kubernetes.io/name: devworkspace-webhook-server ingress: - from: - podSelector: {} namespaceSelector: matchLabels: kubernetes.io/metadata.name: openshift-apiserver policyTypes: - Ingress
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-openshift-apiserver namespace: openshift-devspaces
1 spec: podSelector: matchLabels: app.kubernetes.io/name: devworkspace-webhook-server
2 ingress: - from: - podSelector: {} namespaceSelector: matchLabels: kubernetes.io/metadata.name: openshift-apiserver policyTypes: - Ingress
Copy to Clipboard Copied! 例 4.47.
allow-from-workspaces-namespaces.yaml
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-workspaces-namespaces namespace: openshift-devspaces spec: podSelector: {} ingress: - from: - podSelector: {} namespaceSelector: matchLabels: app.kubernetes.io/component: workspaces-namespace policyTypes: - Ingress
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-from-workspaces-namespaces namespace: openshift-devspaces
1 spec: podSelector: {}
2 ingress: - from: - podSelector: {} namespaceSelector: matchLabels: app.kubernetes.io/component: workspaces-namespace policyTypes: - Ingress
Copy to Clipboard Copied! - 第 4.2 节 “配置项目”
- 网络隔离
- 使用网络策略配置多租户隔离
4.8.2. 配置 Dev Spaces 主机名
此流程描述了如何将 OpenShift Dev Spaces 配置为使用自定义主机名。
先决条件
-
对目标 OpenShift 集群具有管理权限的活动
oc
会话。请参阅 CLI 入门。 - 生成证书和私钥文件。
要生成私钥和证书的对,相同的证书颁发机构(CA)必须与其他 OpenShift Dev Spaces 主机一起使用。
请求 DNS 供应商将自定义主机名指向集群入口。
流程
为 OpenShift Dev Spaces 预创建项目:
oc create project openshift-devspaces
$ oc create project openshift-devspaces
Copy to Clipboard Copied! 创建 TLS secret:
oc create secret tls <tls_secret_name> \ --key <key_file> \ --cert <cert_file> \ -n openshift-devspaces
$ oc create secret tls <tls_secret_name> \
1 --key <key_file> \
2 --cert <cert_file> \
3 -n openshift-devspaces
Copy to Clipboard Copied! 在 secret 中添加所需的标签:
oc label secret <tls_secret_name> \ app.kubernetes.io/part-of=che.eclipse.org -n openshift-devspaces
$ oc label secret <tls_secret_name> \
1 app.kubernetes.io/part-of=che.eclipse.org -n openshift-devspaces
Copy to Clipboard Copied! - 1
- TLS secret 名称
配置
CheCluster
自定义资源。请参阅 第 4.1.2 节 “使用 CLI 配置 CheCluster 自定义资源”。spec: networking: hostname: <hostname> tlsSecretName: <secret>
spec: networking: hostname: <hostname>
1 tlsSecretName: <secret>
2 Copy to Clipboard Copied! - 如果 OpenShift Dev Spaces 已部署,请等待所有 OpenShift Dev Spaces 组件的推出完成。
4.8.3. 将不可信 TLS 证书导入到 Dev Spaces
OpenShift Dev Spaces 组件与外部服务通信通过 TLS 加密。它们需要由可信证书颁发机构(CA)签名的 TLS 证书。因此,您必须导入到 OpenShift Dev Spaces 中由外部服务使用的所有不受信任的 CA 链,例如:
- 代理
- 身份供应商(OIDC)
- 源代码存储库供应商(Git)
OpenShift Dev Spaces 使用 OpenShift Dev Spaces 项目中的标记 ConfigMap 作为 TLS 证书的源。ConfigMap 可以有任意数量的键,每个键都有随机数量的证书。所有证书都挂载到:
-
OpenShift Dev Spaces 服务器和仪表板 pod 的
/public-certs
位置 -
工作区 pod 的
/etc/pki/ca-trust/extracted/pem
位置
配置 CheCluster
自定义资源,以禁用在 /etc/pki/ca-trust/extracted/pem
处的 CA 捆绑包挂载。证书将被挂载到 /public-certs
,以保持之前版本中的行为。
配置 CheCluster
自定义资源,以禁用在路径 /etc/pki/ca-trust/extracted/pem
下挂载 CA 捆绑包。在这种情况下,证书将被挂载到路径 /public-certs
下。
spec: devEnvironments: trustedCerts: disableWorkspaceCaBundleMount: true
spec:
devEnvironments:
trustedCerts:
disableWorkspaceCaBundleMount: true
在 OpenShift 集群中,OpenShift Dev Spaces Operator 会自动将 Red Hat Enterprise Linux CoreOS (RHCOS)信任捆绑包添加到挂载的证书中。
先决条件
流程
将所有 CA 链 PEM 文件链到
custom-ca-certificates.pem
文件中,并删除与 Java 信任存储不兼容的返回字符。cat ca-cert-for-devspaces-*.pem | tr -d '\r' > custom-ca-certificates.pem
$ cat ca-cert-for-devspaces-*.pem | tr -d '\r' > custom-ca-certificates.pem
Copy to Clipboard Copied! 使用所需的 TLS 证书创建
custom-ca-certificates
ConfigMap:oc create configmap custom-ca-certificates \ --from-file=custom-ca-certificates.pem \ --namespace=openshift-devspaces
$ oc create configmap custom-ca-certificates \ --from-file=custom-ca-certificates.pem \ --namespace=openshift-devspaces
Copy to Clipboard Copied! 标记
custom-ca-certificates
ConfigMap:oc label configmap custom-ca-certificates \ app.kubernetes.io/component=ca-bundle \ app.kubernetes.io/part-of=che.eclipse.org \ --namespace=openshift-devspaces
$ oc label configmap custom-ca-certificates \ app.kubernetes.io/component=ca-bundle \ app.kubernetes.io/part-of=che.eclipse.org \ --namespace=openshift-devspaces
Copy to Clipboard Copied! - 如果之前尚未部署,部署 OpenShift Dev Spaces。否则,请等待 OpenShift Dev Spaces 组件的推出完成。
- 重启正在运行的工作区以使更改生效。
验证步骤
验证 ConfigMap 是否包含您的自定义 CA 证书。此命令返回 PEM 格式的 CA 捆绑包证书:
oc get configmap \ --namespace=openshift-devspaces \ --output='jsonpath={.items[0:].data.custom-ca-certificates\.pem}' \ --selector=app.kubernetes.io/component=ca-bundle,app.kubernetes.io/part-of=che.eclipse.org
oc get configmap \ --namespace=openshift-devspaces \ --output='jsonpath={.items[0:].data.custom-ca-certificates\.pem}' \ --selector=app.kubernetes.io/component=ca-bundle,app.kubernetes.io/part-of=che.eclipse.org
Copy to Clipboard Copied! 在 OpenShift Dev Spaces 服务器日志中验证导入的证书计数是否不是 null :
oc logs deploy/devspaces --namespace=openshift-devspaces \ | grep tls-ca-bundle.pem
oc logs deploy/devspaces --namespace=openshift-devspaces \ | grep tls-ca-bundle.pem
Copy to Clipboard Copied! - 启动一个工作区,获取创建它的项目名称:< workspace_namespace > 并等待工作区启动。
验证
ca-certs-merged
ConfigMap 是否包含您的自定义 CA 证书。此命令以 PEM 格式返回 OpenShift Dev Spaces CA 捆绑包证书:oc get configmap che-trusted-ca-certs \ --namespace=<workspace_namespace> \ --output='jsonpath={.data.tls-ca-bundle\.pem}'
oc get configmap che-trusted-ca-certs \ --namespace=<workspace_namespace> \ --output='jsonpath={.data.tls-ca-bundle\.pem}'
Copy to Clipboard Copied! 验证工作区 pod 是否挂载
ca-certs-merged
ConfigMap:oc get pod \ --namespace=<workspace_namespace> \ --selector='controller.devfile.io/devworkspace_name=<workspace_name>' \ --output='jsonpath={.items[0:].spec.volumes[0:].configMap.name}' \ | grep ca-certs-merged
oc get pod \ --namespace=<workspace_namespace> \ --selector='controller.devfile.io/devworkspace_name=<workspace_name>' \ --output='jsonpath={.items[0:].spec.volumes[0:].configMap.name}' \ | grep ca-certs-merged
Copy to Clipboard Copied! 获取工作区 pod 名称 < workspace_pod_name>:
oc get pod \ --namespace=<workspace_namespace> \ --selector='controller.devfile.io/devworkspace_name=<workspace_name>' \ --output='jsonpath={.items[0:].metadata.name}' \
oc get pod \ --namespace=<workspace_namespace> \ --selector='controller.devfile.io/devworkspace_name=<workspace_name>' \ --output='jsonpath={.items[0:].metadata.name}' \
Copy to Clipboard Copied! 验证工作区容器是否具有您的自定义 CA 证书。此命令以 PEM 格式返回 OpenShift Dev Spaces CA 捆绑包证书:
oc exec <workspace_pod_name> \ --namespace=<workspace_namespace> \ -- cat /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
oc exec <workspace_pod_name> \ --namespace=<workspace_namespace> \ -- cat /etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
Copy to Clipboard Copied!
其他资源
4.8.4. 添加标签和注解
4.8.4.1. 配置 OpenShift 路由以使用路由器划分
您可以为 OpenShift Route 配置标签、注解和域,以用于 路由器分片。
先决条件
-
具有 OpenShift 集群管理权限的活跃的
oc
会话。请参阅 OpenShift CLI 入门。 -
DSC
.请参阅:第 2.2 节 “安装 dsc 管理工具”。
流程
配置
CheCluster
自定义资源。请参阅 第 4.1.2 节 “使用 CLI 配置 CheCluster 自定义资源”。spec: networking: labels: <labels> domain: <domain> annotations: <annotations>
spec: networking: labels: <labels>
1 domain: <domain>
2 annotations: <annotations>
3 Copy to Clipboard Copied!
4.8.5. 配置工作区端点基域
了解如何为工作区端点配置基域。默认情况下,OpenShift Dev Spaces Operator 会自动检测到基域。要更改它,您需要在 CheCluster
自定义资源中配置 CHE_INFRA_OPENSHIFT_ROUTE_HOST_DOMAIN__SUFFIX
属性。
spec: components: cheServer: extraProperties: CHE_INFRA_OPENSHIFT_ROUTE_HOST_DOMAIN__SUFFIX: "<...>"
spec:
components:
cheServer:
extraProperties:
CHE_INFRA_OPENSHIFT_ROUTE_HOST_DOMAIN__SUFFIX: "<...>"
- 1
- 工作区端点基域,如
my-devspaces.example.com
。
流程
配置工作区端点基域:
oc patch checluster/devspaces \ --namespace openshift-devspaces \ --type='merge' -p \ '{"spec": {"components": {"cheServer": {"extraProperties": {"CHE_INFRA_OPENSHIFT_ROUTE_HOST_DOMAIN__SUFFIX": "my-devspaces.example.com"}}}}}'
oc patch checluster/devspaces \ --namespace openshift-devspaces \ --type='merge' -p \ '{"spec": {"components": {"cheServer": {"extraProperties": {"CHE_INFRA_OPENSHIFT_ROUTE_HOST_DOMAIN__SUFFIX": "my-devspaces.example.com"}}}}}'
Copy to Clipboard Copied!
4.8.6. 配置代理
了解如何为 Red Hat OpenShift Dev Spaces 配置代理。步骤包括为代理凭证创建 Kubernetes Secret,并在 CheCluster 自定义资源中配置必要的代理设置。代理设置通过环境变量传播到操作对象和工作区。
在 OpenShift 集群中,您不需要配置代理设置。OpenShift Dev Spaces Operator 会自动使用 OpenShift 集群范围的代理配置。但是,您可以通过在 CheCluster 自定义资源中指定代理设置来覆盖代理设置。
流程
(可选)在 openshift-devspaces 命名空间中创建 Secret,其中包含代理服务器的用户和密码。secret 必须具有
app.kubernetes.io/part-of=che.eclipse.org
标签。如果代理服务器不需要身份验证,请跳过这一步。oc apply -f - <<EOF kind: Secret apiVersion: v1 metadata: name: devspaces-proxy-credentials namespace: openshift-devspaces labels: app.kubernetes.io/part-of: che.eclipse.org type: Opaque stringData: user: <user> password: <password> EOF
oc apply -f - <<EOF kind: Secret apiVersion: v1 metadata: name: devspaces-proxy-credentials namespace: openshift-devspaces labels: app.kubernetes.io/part-of: che.eclipse.org type: Opaque stringData: user: <user>
1 password: <password>
2 EOF
Copy to Clipboard Copied! 通过在 CheCluster 自定义资源中设置以下属性,为 OpenShift 集群配置代理或覆盖集群范围的代理配置:
oc patch checluster/devspaces \ --namespace openshift-devspaces \ --type='merge' -p \ '{"spec": {"components": {"cheServer": {"proxy": {"credentialsSecretName" : "<secretName>", "nonProxyHosts" : ["<host_1>"], "port" : "<port>", "url" : "<protocol>://<domain>"}}}}}'
oc patch checluster/devspaces \ --namespace openshift-devspaces \ --type='merge' -p \ '{"spec": {"components": {"cheServer": {"proxy": {"credentialsSecretName" : "<secretName>",
1 "nonProxyHosts" : ["<host_1>"],
2 "port" : "<port>",
3 "url" : "<protocol>://<domain>"}}}}}'
4 Copy to Clipboard Copied! 重要在一些代理配置中,
localhost
可能不会转换为127.0.0.1
。在这种情况下,应该同时指定localhost
和127.0.0.1
。- 代理服务器的端口。
- 代理服务器的协议和域。
验证步骤
- 启动工作区
-
验证工作区 pod 是否包含
HTTP_PROXY
、HTTPS_PROXY
、http_proxy
和https_proxy
环境变量,每个变量都设置为 <protocol> ://<user& gt;:<password@<domain>:<port>
。 -
验证工作区 pod 是否包含
NO_PROXY
和no_proxy
环境变量,每个变量都设置为用逗号分开的非代理主机列表。