设置 Kubernetes 集群

在本模块中,您将设置一个已安装 Istio 的 Kubernetes 集群,以及在整个教程中使用的命名空间。

  1. 确保您可以访问 Kubernetes 集群。您可以使用 Google Kubernetes EngineIBM Cloud Kubernetes Service

  2. 创建一个环境变量来存储您在运行教程命令时使用的命名空间的名称。您可以使用任何名称,例如 tutorial

    $ export NAMESPACE=tutorial
    
  3. 创建命名空间

    $ kubectl create namespace $NAMESPACE
    
  4. 使用 demo 配置文件 安装 Istio

  5. 本示例中使用了 KialiPrometheus 插件,需要安装它们。所有插件均使用以下命令安装

    压缩
    $ kubectl apply -f @samples/addons@
    
  6. 使用下方所示的 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
    
  7. 创建一个角色,用于提供对 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
    
  8. 为每个参与者创建一个服务账户

    $ kubectl apply -f - <<EOF
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: ${NAMESPACE}-user
      namespace: $NAMESPACE
    EOF
    
  9. 限制每个参与者的权限。在教程期间,参与者只需要在自己的命名空间中创建资源,并从 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
    
  10. 每个参与者都需要使用自己的 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
    
  11. ${NAMESPACE}-user-config.yaml 配置文件设置 KUBECONFIG 环境变量

    $ export KUBECONFIG=$PWD/${NAMESPACE}-user-config.yaml
    
  12. 通过打印当前命名空间来验证配置是否生效

    $ kubectl config view -o jsonpath="{.contexts[?(@.name==\"$(kubectl config current-context)\")].context.namespace}"
    tutorial
    

    您应该在输出中看到您的命名空间的名称。

  13. 如果您正在为自己设置集群,请将之前步骤中提到的 ${NAMESPACE}-user-config.yaml 文件复制到您的本地计算机,其中 ${NAMESPACE} 是您在之前步骤中提供的命名空间名称。例如,tutorial-user-config.yaml。您将在本教程的后面步骤中需要使用这个文件。

    如果您是讲师,请将生成的配置文件发送给每个参与者。参与者必须将他们的配置文件复制到他们的本地计算机。

恭喜您,您已为本教程配置了您的集群!

您已经准备好 设置本地计算机

这些信息对您有帮助吗?
您有什么改进建议吗?

感谢您的反馈!