如何启动(重启)kubernetes apiservice并添加用户名密码认证

How to start (restart) kubernetes apiservice and adding username password authentication

我真的是 kubernetes 的新手。我使用本指南 using kubeadm. The cluster consists of one master node and two nodes. Since I want to access the kubernetes web UI via master apiserver (by browser on my laptop), I modified /etc/kubernetes/manifests/kube-apiserver.yaml following these K8 WebUI, Access control 创建了一个 kubernetes 集群。我所做的是在 /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 之前的状态的优雅方法。

此外,如果有人能告诉我添加 username/passwd 身份验证的确切步骤,以便我可以通过笔记本电脑上的浏览器访问 Kubernetes Dashboad UI,我将不胜感激,或者可以帮助我在 mac 笔记本电脑 上查看 K8 Web UI 的任何其他方式。我发现了一个类似的问题,但我还是做不到。

环境:

更新: 附加的 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: {}

基于官方 documentation--authentication-mode=basic 不是 Kubernetes 1.9 api 服务器的有效选项。

尝试将其删除,希望对您有所帮助。

公开你的仪表板以供外部访问怎么样,更好的方法是使用 kube-proxy,但如果你想直接访问仪表板,唯一或多或少安全的方法是使用 Ingress 为此。

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

因此,要在 bare-metal 上获得 Ingress 后面的仪表板,您需要:

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

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

  1. 所以,现在我们有了一个 Ingress,是时候使用它的 chart. I highly recommend you to use HTTPS connection instead of HTTP, but now we will use HTTP for making it faster to deploy. You can read about how to enable HTTPS connections on Ingress here 安装仪表板了(您需要添加一个包含您的 TLS 密钥和证书的秘密,并在图表中设置 TLS 配置)。那么,让我们安装仪表板:

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

  1. 现在通过 kubectl describe pod $pod-with-ingress 检查您的 Ingress pod 在哪个节点上工作,并使用 FQDN my-dashboard.local.
  2. 将该 pod 的 IP 地址添加到您的 hosts 文件中

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

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