如何启动(重启)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 的任何其他方式。我发现了一个类似的问题,但我还是做不到。
环境:
- 三台ubuntu16台服务器:一主两节点
- Kubernetes 版本 1.9
- 我可以通过 SSH 连接到三个 mac 网络并拥有 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 包管理器来管理集群中的所有安装,这比手动编写所有配置更容易和有用。
因此,要在 bare-metal 上获得 Ingress 后面的仪表板,您需要:
- 确保你再次集群工作:)
- 使用 official documentation.
在您的 PC 上安装 Helm
- 通过调用
helm init
初始化 Helm。它将其服务器路径(tiller)指向您的 kubernetes 集群。有关初始化的所有详细信息,您可以在文档中查看,但通常情况下,它只是工作。
- 现在您需要安装 Ingress。简而言之,Kubernetes 中的 Ingress 是一种类似代理的特殊服务,它可以让你获得集群内应用程序的静态入口点。我们将使用基于 Nginx 的 Ingress 图表。您可以在其仓库中查看可用选项。要使用基本配置安装它,请调用:
helm install stable/nginx-ingress --set=controller.service.type=NodePort
- 所以,现在我们有了一个 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
- 现在通过
kubectl describe pod $pod-with-ingress
检查您的 Ingress pod 在哪个节点上工作,并使用 FQDN my-dashboard.local
. 将该 pod 的 IP 地址添加到您的 hosts
文件中
最后,仪表板必须在您的浏览器中通过 http://my-dashboard.local
地址可用。
P.S。我强烈建议您还在集群上设置 RBAC,以管理集群中每个用户和应用程序的权限,包括仪表板。
我真的是 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 的任何其他方式。我发现了一个类似的问题
环境:
- 三台ubuntu16台服务器:一主两节点
- Kubernetes 版本 1.9
- 我可以通过 SSH 连接到三个 mac 网络并拥有 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 包管理器来管理集群中的所有安装,这比手动编写所有配置更容易和有用。
因此,要在 bare-metal 上获得 Ingress 后面的仪表板,您需要:
- 确保你再次集群工作:)
- 使用 official documentation. 在您的 PC 上安装 Helm
- 通过调用
helm init
初始化 Helm。它将其服务器路径(tiller)指向您的 kubernetes 集群。有关初始化的所有详细信息,您可以在文档中查看,但通常情况下,它只是工作。 - 现在您需要安装 Ingress。简而言之,Kubernetes 中的 Ingress 是一种类似代理的特殊服务,它可以让你获得集群内应用程序的静态入口点。我们将使用基于 Nginx 的 Ingress 图表。您可以在其仓库中查看可用选项。要使用基本配置安装它,请调用:
helm install stable/nginx-ingress --set=controller.service.type=NodePort
- 所以,现在我们有了一个 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
- 现在通过
kubectl describe pod $pod-with-ingress
检查您的 Ingress pod 在哪个节点上工作,并使用 FQDNmy-dashboard.local
. 将该 pod 的 IP 地址添加到您的
hosts
文件中
最后,仪表板必须在您的浏览器中通过 http://my-dashboard.local
地址可用。
P.S。我强烈建议您还在集群上设置 RBAC,以管理集群中每个用户和应用程序的权限,包括仪表板。