3

我对 Kubernetes 真的很陌生。我使用 kubeadm使用本指南创建了一个 kubernetes 集群。集群由一个主节点和两个节点组成。由于我想通过主 apiserver(通过我笔记本电脑上的浏览器)访问 kubernetes Web UI,我/etc/kubernetes/manifests/kube-apiserver.yaml按照这些K8 WebUI进行了修改,访问控制。我所做的是我在中添加了以下参数/etc/kubernetes/manifests/kube-apiserver.yaml

- --authentication-mode=basic
- --basic-auth-file=/etc/kubernetes/auth.csv
- hostPath:
  path: /etc/kubernetes/auth.csv
  name: kubernetes-dashboard
- mountPath: /etc/kubernetes/auth.csv
  name: kubernetes-dashboard
  readOnly: true

我在auth.csv文件中有密码和用户名。但是,在我修改.yaml文件后,我的 kube-apiserver 进程崩溃了。我通过运行检查ps -aux|grep kube以了解哪些进程正在运行。结果是kube-scheduler,kube-controller-manager,/usr/bin/kubelet全部运行,但kube-apiserver没有找到进程。我想知道什么是重新启动 kubernetes 并让我的集群立即恢复到更改.yaml.

此外,如果有人可以向我展示添加用户名/密码身份验证的确切步骤,以便我可以通过笔记本电脑上的浏览器访问 Kubernetes Dashboad UI,或者任何其他可以帮助我在我的 Mac 上查看 K8 Web UI 的方式,我将不胜感激笔记本电脑。我发现了一个类似的问题类似的问题,但我仍然无法做到。

环境:

  • 三台ubuntu 16服务器:一主两节点
  • Kubernetes 1.9 版
  • 我可以通过 SSH 连接到三台机器并拥有 root 权限。

更新:kube-apiserver.yaml附加的文件。

apiVersion: v1
kind: Pod
metadata:
  annotations:
    scheduler.alpha.kubernetes.io/critical-pod: ""
  creationTimestamp: null
  labels:
    component: kube-apiserver
    tier: control-plane
  name: kube-apiserver
  namespace: kube-system
spec:
  containers:
  - command:
    - kube-apiserver
    - --requestheader-client-ca-file=/etc/kubernetes/pki/front-proxy-ca.crt
    - --proxy-client-cert-file=/etc/kubernetes/pki/front-proxy-client.crt
    - --insecure-port=0
    - --advertise-address=172.16.28.125
    - --kubelet-client-certificate=/etc/kubernetes/pki/apiserver-kubelet-client.crt
    - --secure-port=6443
    - --enable-bootstrap-token-auth=true
    - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
    - --requestheader-group-headers=X-Remote-Group
    - --requestheader-allowed-names=front-proxy-client
    - --service-account-key-file=/etc/kubernetes/pki/sa.pub
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    - --kubelet-client-key=/etc/kubernetes/pki/apiserver-kubelet-client.key
    - --allow-privileged=true
    - --requestheader-username-headers=X-Remote-User
    - --requestheader-extra-headers-prefix=X-Remote-Extra-
    - --service-cluster-ip-range=10.96.0.0/12
    - --admission-control=Initializers,NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,NodeRestriction,ResourceQuota
    - --tls-cert-file=/etc/kubernetes/pki/apiserver.crt
    - --proxy-client-key-file=/etc/kubernetes/pki/front-proxy-client.key
    - --authorization-mode=Node,RBAC
    - --etcd-servers=http://127.0.0.1:2379
    - --authentication-mode=basic
    - --basic-auth-file=/etc/kubernetes/auth.csv
    image: gcr.io/google_containers/kube-apiserver-amd64:v1.9.4
    livenessProbe:
      failureThreshold: 8
      httpGet:
        host: 172.16.28.125
        path: /healthz
        port: 6443
        scheme: HTTPS
      initialDelaySeconds: 15
      timeoutSeconds: 15
    name: kube-apiserver
    resources:
      requests:
        cpu: 250m
    volumeMounts:
    - mountPath: /etc/kubernetes/pki
      name: k8s-certs
      readOnly: true
    - mountPath: /etc/ssl/certs
      name: ca-certs
      readOnly: true
    - mountPath: /etc/pki
      name: ca-certs-etc-pki
      readOnly: true
    - mountPath: /etc/kubernetes/auth.csv
      name: kubernetes-dashboard
      readOnly: true
  hostNetwork: true
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki
      type: DirectoryOrCreate
    name: k8s-certs
  - hostPath:
      path: /etc/ssl/certs
      type: DirectoryOrCreate
    name: ca-certs
  - hostPath:
      path: /etc/pki
      type: DirectoryOrCreate
    name: ca-certs-etc-pki
  - hostPath:
      path: /etc/kubernetes/auth.csv
    name: kubernetes-dashboard
status: {}
4

1 回答 1

2

根据官方文档--authentication-mode=basic对于 Kubernetes 1.9 api 服务器不是一个有效的选项。

尝试删除它,希望它会有所帮助。

将仪表板暴露给外部访问怎么样,更好的方法是使用 kube-proxy,但是如果你想直接访问仪表板,唯一或多或少安全的方法是使用Ingress

我建议您使用 Helm 包管理器来管理集群中的所有安装,这比手动编写所有配置更容易和有用。

因此,要在裸机上的 Ingress 后面获得仪表板,您需要:

  1. 确保您再次集群工作:)
  2. 使用官方文档将 Helm 安装到您的 PC 。
  3. 通过调用初始化 Helm helm init。它将其服务器路径(分蘖)到您的 kubernetes 集群。您可以在文档中查看有关初始化的所有详细信息,但通常它只是工作。
  4. 现在您需要安装 Ingress。简而言之,Kubernetes 中的 Ingress 是一种类似于代理的特殊服务,它可以让您为集群内的应用程序获取静态入口点。我们将使用基于Nginx的 Ingress 图表。您可以在其 repo 中查看可用选项。要使用基本配置安装它,请调用:

helm install stable/nginx-ingress --set=controller.service.type=NodePort

  1. 所以,现在我们有了一个 Ingress 并且是时候使用它的chart来安装 Dashboard 了。我强烈建议您使用 HTTPS 连接而不是 HTTP,但现在我们将使用 HTTP 来加快部署速度。您可以在此处阅读有关如何在 Ingress 上启用 HTTPS 连接的信息(您需要添加一个包含 TLS 密钥和证书的密钥,并在图表中设置 TLS 配置)。所以,让我们安装仪表板:

helm install stable/kubernetes-dashboard \ --set=ingress.enabled=True,ingress.hosts=my-dashboard.local

  1. 现在检查您的 Ingress pod 在哪个节点上工作,并使用 FQDNkubectl describe pod $pod-with-ingress将该 pod 的 IP 地址添加到您的文件中。hostsmy-dashboard.local

最后,仪表板必须在您的浏览器中按http://my-dashboard.local地址可用。

PS 我强烈建议您在集群上设置 RBAC 以管理其中每个用户和应用程序的权限,包括仪表板。

于 2018-03-17T17:31:06.200 回答