设置 Kubernetes 集群
在本模块中,您将设置一个已安装 Istio 的 Kubernetes 集群,以及在整个教程中使用的命名空间。
确保您可以访问 Kubernetes 集群。您可以使用 Google Kubernetes Engine 或 IBM Cloud Kubernetes Service。
创建一个环境变量来存储您在运行教程命令时使用的命名空间的名称。您可以使用任何名称,例如
tutorial
。$ export NAMESPACE=tutorial
创建命名空间
$ kubectl create namespace $NAMESPACE
使用
demo
配置文件 安装 Istio。本示例中使用了 Kiali 和 Prometheus 插件,需要安装它们。所有插件均使用以下命令安装
$ kubectl apply -f @samples/addons@
使用下方所示的
kubectl
命令为这些常用的 Istio 服务创建 Kubernetes Ingress 资源。在本教程的这一阶段,不必熟悉这些服务的具体细节。kubectl
命令可以接受内联配置来创建每个服务的 Ingress 资源$ kubectl apply -f - <<EOF apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: istio-system namespace: istio-system annotations: kubernetes.io/ingress.class: istio spec: rules: - host: my-istio-dashboard.io http: paths: - path: / pathType: Prefix backend: service: name: grafana port: number: 3000 - host: my-istio-tracing.io http: paths: - path: / pathType: Prefix backend: service: name: tracing port: number: 9411 - host: my-istio-logs-database.io http: paths: - path: / pathType: Prefix backend: service: name: prometheus port: number: 9090 - host: my-kiali.io http: paths: - path: / pathType: Prefix backend: service: name: kiali port: number: 20001 EOF
创建一个角色,用于提供对
istio-system
命名空间的读取权限。这个角色需要限制参与者在以下步骤中的权限。$ kubectl apply -f - <<EOF kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: istio-system-access namespace: istio-system rules: - apiGroups: ["", "extensions", "apps"] resources: ["*"] verbs: ["get", "list"] EOF
为每个参与者创建一个服务账户
$ kubectl apply -f - <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: ${NAMESPACE}-user namespace: $NAMESPACE EOF
限制每个参与者的权限。在教程期间,参与者只需要在自己的命名空间中创建资源,并从
istio-system
命名空间中读取资源。即使使用自己的集群,也建议避免干预集群中的其他命名空间,这是一个良好的实践。创建一个角色,允许每个参与者对自己的命名空间进行读写操作。将参与者的服务帐户绑定到此角色,并绑定到用于从
istio-system
读取资源的角色。$ kubectl apply -f - <<EOF kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ${NAMESPACE}-access namespace: $NAMESPACE rules: - apiGroups: ["", "extensions", "apps", "networking.k8s.io", "networking.istio.io", "authentication.istio.io", "rbac.istio.io", "config.istio.io", "security.istio.io"] resources: ["*"] verbs: ["*"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ${NAMESPACE}-access namespace: $NAMESPACE subjects: - kind: ServiceAccount name: ${NAMESPACE}-user namespace: $NAMESPACE roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: ${NAMESPACE}-access --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: ${NAMESPACE}-istio-system-access namespace: istio-system subjects: - kind: ServiceAccount name: ${NAMESPACE}-user namespace: $NAMESPACE roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: istio-system-access EOF
每个参与者都需要使用自己的 Kubernetes 配置文件。这个配置文件指定了集群详细信息、服务帐户、凭据和参与者的命名空间。
kubectl
命令使用配置文件来操作集群。为每个参与者生成一个 Kubernetes 配置文件
$ cat <<EOF > ./${NAMESPACE}-user-config.yaml apiVersion: v1 kind: Config preferences: {} clusters: - cluster: certificate-authority-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}') server: $(kubectl config view -o jsonpath="{.clusters[?(.name==\"$(kubectl config view -o jsonpath="{.contexts[?(.name==\"$(kubectl config current-context)\")].context.cluster}")\")].cluster.server}") name: ${NAMESPACE}-cluster users: - name: ${NAMESPACE}-user user: as-user-extra: {} client-key-data: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath='{.data.ca\.crt}') token: $(kubectl get secret $(kubectl get sa ${NAMESPACE}-user -n $NAMESPACE -o jsonpath={.secrets..name}) -n $NAMESPACE -o jsonpath={.data.token} | base64 --decode) contexts: - context: cluster: ${NAMESPACE}-cluster namespace: ${NAMESPACE} user: ${NAMESPACE}-user name: ${NAMESPACE} current-context: ${NAMESPACE} EOF
为
${NAMESPACE}-user-config.yaml
配置文件设置KUBECONFIG
环境变量$ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml
通过打印当前命名空间来验证配置是否生效
$ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}" tutorial
您应该在输出中看到您的命名空间的名称。
如果您正在为自己设置集群,请将之前步骤中提到的
${NAMESPACE}-user-config.yaml
文件复制到您的本地计算机,其中${NAMESPACE}
是您在之前步骤中提供的命名空间名称。例如,tutorial-user-config.yaml
。您将在本教程的后面步骤中需要使用这个文件。如果您是讲师,请将生成的配置文件发送给每个参与者。参与者必须将他们的配置文件复制到他们的本地计算机。
恭喜您,您已为本教程配置了您的集群!
您已经准备好 设置本地计算机。