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

时间:2018-03-17 14:44:42

标签: docker kubernetes kubectl kubernetes-health-check

我对kubernetes很新。我使用本指南using kubeadm创建了一个kubernetes集群。群集由一个主节点和两个节点组成。由于我想通过主apiserver(通过我的笔记本电脑上的浏览器)访问kubernetes Web UI,因此我在K8 WebUIAccess control之后修改了/etc/kubernetes/manifests/kube-apiserver.yaml。我所做的是在/etc/kubernetes/manifests/kube-apiserver.yaml中添加了以下args:

- --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: {}

1 个答案:

答案 0 :(得分:2)

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

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

如果要公开仪表板以进行外部访问,更好的方法是使用kube-proxy,但如果您想直接访问Dashboard,唯一或多或少安全的方法是使用Ingress

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

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

  1. 确保您再次集群工作:)
  2. 使用official documentation
  3. 将Helm安装到您的PC
  4. 通过电话helm init初始化头盔。它将是您的kubernetes集群的服务器路径(分蘖)。有关初始化的所有详细信息,您可以在文档中查看,但通常只是工作。
  5. 现在您需要安装Ingress。换句话说,Kubernetes中的Ingress是一种特殊服务,如代理,它可以让您获得集群内应用程序的静态入口点。我们将使用基于Nginx的Ingress图表。您可以在其仓库中查看可用选项。要使用基本配置进行安装,请致电:
  6. helm install stable/nginx-ingress --set=controller.service.type=NodePort

    1. 所以,现在我们有一个Ingress及其时间来使用chart来安装Dashboard。我强烈建议您使用HTTPS连接而不是HTTP,但现在我们将使用HTTP来加快部署速度。您可以阅读有关如何在Ingress here上启用HTTPS连接的信息(您需要添加一个包含TLS密钥和证书的秘密,并在图表中设置TLS配置)。所以,让我们安装仪表板:
    2. helm install stable/kubernetes-dashboard \ --set=ingress.enabled=True,ingress.hosts=my-dashboard.local

      1. 现在,检查您的Ingress窗格按kubectl describe pod $pod-with-ingress工作的节点,并将该窗格的IP地址添加到包含FQDN hosts的{​​{1}}个文件中。
      2. 最后,必须在my-dashboard.local地址的浏览器中提供信息中心。

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