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

标签 docker kubernetes kubectl kubernetes-health-check

我真的是 kubernetes 的新手。我使用本指南创建了一个 kubernetes 集群 using kubeadm .集群由一个主节点和两个节点组成。因为我想通过 master apiserver(通过我笔记本电脑上的浏览器)访问 kubernetes web UI,所以我在这些 K8 WebUI 之后修改了 /etc/kubernetes/manifests/kube-apiserver.yaml , Access control .我所做的是在 /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。我发现了一个类似的问题similar question , 但我还是做不到。

环境:

  • 三台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: {}

最佳答案

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

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

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

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

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

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

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

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

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

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

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

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

关于docker - 如何启动(重启)kubernetes apiservice并添加用户名密码认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49338154/

相关文章:

python - 如何从 dockerpy 中的 docker-run 管道标准输出

linux - 在 Docker 中为 Linux 主机预留 CPU 和内存

amazon-web-services - 在 AWS 上运行多个 Kubernetes 集群

kubernetes - kubernetes kubectl停顿2分钟

azure - AWS ECR PULL 没有基本身份验证凭据

maven - 使用 Bitbucket 管道构建 JavaFx 应用程序

java.net.UnknownHostException 从 spring boot 应用程序 dockerized mysql

postgresql - 许多 Postgres 进程可以使用相同的数据目录运行吗?

Kubernetes 无法上传大于 1MB 的文件

kubernetes - K8s 仪表板未登录(k8s 版本 1.11)