Kubernetes Dashboard 與 LDAP 的集成
本文展示了如何使用 Apache 來集成 LDAP 進行 Kubernetes Dashboard 的身份認證,本文使用的系統(tǒng)為 Ubuntu 20、Kubernetes 1.18 版本,單節(jié)點集群,主節(jié)點 IP 地址為 192.168.15.200,LDAP 的 IP 地址為 192.168.15.10。

集群安裝
主節(jié)點安裝
安裝所需軟件包的列表。
$ apt-get update$ apt-get install apt-transport-https wget gnupg ntpdate curl mlocate
安裝 Docker 服務(wù)。
apt-get install docker.io設(shè)置開機啟動。
systemctl enable docker.service編輯 Docker 服務(wù)配置文件。
updatedblocate docker.servicevi /etc/systemd/system/multi-user.target.wants/docker.service
在啟動的項(EXECSTART)末尾添加以下配置:
--exec-opt native.cgroupdriver=systemd下面是配置之前的文件。
[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comBindsTo=containerd.serviceAfter=network-online.target firewalld.service containerd.serviceWants=network-online.targetRequires=docker.socket[Service]Type=notifyExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sockExecReload=/bin/kill -s HUP $MAINPIDTimeoutSec=0RestartSec=2Restart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTasksMax=infinityDelegate=yesKillMode=process[Install]WantedBy=multi-user.target
下面是配置后的文件。
[Unit]Description=Docker Application Container EngineDocumentation=https://docs.docker.comBindsTo=containerd.serviceAfter=network-online.target firewalld.service containerd.serviceWants=network-online.targetRequires=docker.socket[Service]Type=notifyExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemdExecReload=/bin/kill -s HUP $MAINPIDTimeoutSec=0RestartSec=2Restart=alwaysStartLimitBurst=3StartLimitInterval=60sLimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityTasksMax=infinityDelegate=yesKillMode=process[Install]WantedBy=multi-user.target
然后創(chuàng)建系統(tǒng)配置文件。
vi /etc/sysctl.d/k8s.conf這是文件內(nèi)容。
net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1net.ipv4.ip_forward = 1
然后啟用系統(tǒng)配置文件。
sysctl --system然后編輯如下 modules 配置文件,在文件末尾添加以下配置:
vi /etc/modules-load.d/modules.conf文件末尾添加下面的配置overlaybr_netfilter
編輯 FSTAB 配置文件并禁用交換內(nèi)存。
$ vi /etc/fstab# 注釋掉 swap 的配置/dev/disk/by-uuid/a24f00e7-918a-4a05-b4c9-35bdef750fb4 / ext4 defaults 0 0# /swap.img none swap sw 0 0
設(shè)置一個唯一的主機名。
hostnamectl set-hostname kubernetes-01.local創(chuàng)建文件來配置所需的環(huán)境變量。
$ vi /etc/profile.d/kubernetes.sh# 文件內(nèi)容如下所示export KUBECONFIG=/etc/kubernetes/admin.conf# 然后重啟節(jié)點$ reboot
然后配置 Kubernetes 軟件源:
國內(nèi)用戶可以自行配置阿里云的軟件源curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add添加官方的存儲庫apt-add-repository "deb http://apt.kubernetes.io/ kubernetes-xenial main"安裝 Kubernetes 軟件包apt-get updateapt-get install kubeadm kubectl kubelet
提前下載所需的鏡像:
$ kubeadm config images pull[] Pulled k8s.gcr.io/kube-apiserver:v1.18.6[] Pulled k8s.gcr.io/kube-controller-manager:v1.18.6[] Pulled k8s.gcr.io/kube-scheduler:v1.18.6[] Pulled k8s.gcr.io/kube-proxy:v1.18.6[] Pulled k8s.gcr.io/pause:3.2[] Pulled k8s.gcr.io/etcd:3.4.3-0[] Pulled k8s.gcr.io/coredns:1.6.7
然后初始化 Kubernetes 集群:
$ kubeadm init --pod-network-cidr=10.244.0.0/16# 命令輸出為Your Kubernetes control-plane has initialized successfully!To start using your cluster, you need to run the following as a regular user:mkdir -p $HOME/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:https://kubernetes.io/docs/concepts/cluster-administration/addons/Then you can join any number of worker nodes by running the following on each as root:kubeadm join 192.168.100.9:6443 --token l7fezg.2nm80pvehn2f2bbz \--discovery-token-ca-cert-hash sha256:6dfc8c80e8e125c6d4d79ec82ea64deb0dcfa0a4bda33e16a8a9fa93794e3aae
安裝上面的提示執(zhí)行下面的命令:
$ mkdir -p $HOME/.kube$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
接著安裝所需的網(wǎng)絡(luò)插件:
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml默認情況下,不允許 Kubernetes 主節(jié)點運行普通的 Pod,我們可以執(zhí)行下面的命令移除污點來解決,因為我們這里的示例只是一個單節(jié)點的 Kubernetes 集群:
kubectl taint nodes --all node-role.kubernetes.io/master-安裝 Dashboard
安裝所需的軟件包:
$ apt-get update$ apt-get install wget curl mlocate
下載要部署的 YAML 資源清單文件:
$ mkdir /downloads$ cd /downloads$ wget https://raw.githubusercontent.com/kubernetes/dashboard/master/aio/deploy/recommended.yaml
直接安裝 Dashboard:
kubectl create -f recommended.yaml安裝完成后為 Dashboard 創(chuàng)建一個 ServiceAccount 帳號,并綁定 cluster-admin 集群角色:
$ kubectl create serviceaccount apache-proxy -n kube-system$ kubectl create clusterrolebinding apache-proxy --clusterrole=cluster-admin --serviceaccount=kube-system:apache-proxy
然后獲取 Apache 代理 ServiceAccount 對應(yīng)的 Token 密鑰:
$ kubectl get secrets --all-namespaces | grep -E "NAME|apache"NAMESPACE NAME TYPE DATA AGEkube-system apache-proxy-token-8gk9p kubernetes.io/service-account-token 3 39s# 獲取 TOKEN 值$ kubectl describe -n kube-system secret apache-proxy-token-8gk9pName: apache-proxy-token-8gk9pNamespace: kube-systemLabels:Annotations: kubernetes.io/service-account.name: apache-proxykubernetes.io/service-account.uid: e07884b4-282c-4ef1-8662-e2a3eaf3c448Type: kubernetes.io/service-account-tokenData====ca.crt: 1025 bytesnamespace: 11 bytestoken: eyJhbGciOiJSUzI1NiIsImtpZCI6InhrMHFrdEdYQ1gxVlRqZjBpN1hxdEgwaTlRRENMWmhUdC1IMC13OTgyM28ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhcGFjaGUtcHJveHktdG9rZW4tOGdrOXAiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYXBhY2hlLXByb3h5Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTA3ODg0YjQtMjgyYy00ZWYxLTg2NjItZTJhM2VhZjNjNDQ4Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmFwYWNoZS1wcm94eSJ9.qKzSvCYOqDfvJ1S9W4-nEzZScmGwjYsi3g5df542_aDyZRugbiWbFmjrBTB70tDwuGTeupbPmS3ptweyjbb_7K5VbSk-2zCazgNeiCZ_q7M4yXgPi6rNYNiBX9pQEBaBQCWgH8-VVFGe34xrLR88cv9YNLfH9ZzrdJf2jPEBhptvdVKr6Ljpbhz-4P-mr5_IRsru_72wsRRZZptL80ARp6PkPdrYIQZ3bMQNsq3GEWxMl8SRPVqEuvVXykxfEt1Hx5URwtiwh_MLEZ5ClCIuGsGs8fWQhCLm_l0SY6p9B2DmU-XhhT_HjuotDI3pm2p5pJb9WmO4dMLx_NsBnLSz_Q
上面的 token 值就是需要的數(shù)據(jù)。然后獲取訪問 Dashboard Service 的 ClusterIP 地址:
$ kubectl get Service -n kubernetes-dashboardNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEdashboard-metrics-scraper ClusterIP 10.99.244.167 <none> 8000/TCP 20mkubernetes-dashboard ClusterIP 10.107.55.24 <none> 443/TCP 20m
在我們的示例中,Dashboard 使用 TCP 端口 443 和 IP 地址 10.107.55.24,如果你本地不能訪問到 ClusterIP,則可以將 Dashboard 更改為 NodePort 類型進行訪問。
使用 Apache 進行身份驗證
接下來安裝 Apache 來對 Dashboard 進行身份驗證。首先在節(jié)點上安裝 Apache:
$ apt-get update$ apt-get install apache2 apache2-utils openssl
啟用所需的 Apache 模塊:
a2enmod authnz_ldapa2enmod ssla2enmod rewritea2enmod headersa2enmod proxya2enmod proxy_http
編輯 Apache 配置文件:
vi /etc/apache2/apache2.conf在文件末尾添加如下信息AllowOverride All
然后使用 OpenSSL 命令創(chuàng)建私鑰和證書:
mkdir /etc/apache2/certificatecd /etc/apache2/certificateopenssl req -new -newkey rsa:4096 -x509 -sha256 -days 365 -nodes -out apache-certificate.crt -keyout apache.key# 輸入請求的信息Generating a RSA private key............++++.......................................................++++writing new private key to 'apache.key'-----You are about to be asked to enter information that will be incorporatedinto your certificate request.What you are about to enter is what is called a Distinguished Name or a DN.There are quite a few fields but you can leave some blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [AU]:CNState or Province Name (full name) [Some-State]:ChengDuLocality Name (eg, city) []:Organization Name (eg, company) [Internet Widgits Pty Ltd]:TechExpertOrganizational Unit Name (eg, section) []:Common Name (e.g. server FQDN or YOUR name) []:192.168.15.200Email Address []:
在 Common Name 選項上輸入 IP 地址或者主機名,我們這里的示例 IP 地址就是 192.168.15.200。
使用格式 PEM 將現(xiàn)有的 Kubernetes 代理證書及其密鑰轉(zhuǎn)換為單個文件:
$ cat /etc/kubernetes/pki/front-proxy-client.crt /etc/kubernetes/pki/front-proxy-client.key > /etc/apache2/certificate/front-proxy-client.pem然后修改默認網(wǎng)站的 Apache 配置文件:
vi /etc/apache2/sites-enabled/000-default.conf# 做如下配置RewriteEngine OnRewriteCond %{HTTPS} !=onRewriteRule ^/?(.*) https://%{SERVER_NAME}/$1 [R=301,L]ServerAdmin webmaster@localhostDocumentRoot /var/www/htmlErrorLog ${APACHE_LOG_DIR}/error.logCustomLog ${APACHE_LOG_DIR}/access.log combinedSSLEngine onSSLCertificateFile /etc/apache2/certificate/apache-certificate.crtSSLCertificateKeyFile /etc/apache2/certificate/apache.keySSLProxyEngine OnSSLProxyVerify noneSSLProxyCheckPeerCN offSSLProxyCheckPeerName offSSLProxyCheckPeerExpire offSSLProxyCACertificateFile /etc/kubernetes/pki/ca.crtSSLProxyMachineCertificateFile /etc/apache2/certificate/front-proxy-client.pemRequestHeader set Authorization "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6InhrMHFrdEdYQ1gxVlRqZjBpN1hxdEgwaTlRRENMWmhUdC1IMC13OTgyM28ifQ.eyJpc3MiOiJrdWJ cm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm hbWUiOiJhcGFjaGUtcHJveHktdG9rZW4tOGdrOXAiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYXBhY2hlLXByb3h5Iiwia3ViZXJuZXRlcy5pby9zZ J2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTA3ODg0YjQtMjgyYy00ZWYxLTg2NjItZTJhM2VhZjNjNDQ4Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmFw WNoZS1wcm94eSJ9.qKzSvCYOqDfvJ1S9W4-nEzZScmGwjYsi3g5df542_aDyZRugbiWbFmjrBTB70tDwuGTeupbPmS3ptweyjbb_7K5VbSk-2zCazgNeiCZ_q7M4yXgPi6rNYNiBX9pQEBaBQCWgH8-VVF e34xrLR88cv9YNLfH9ZzrdJf2jPEBhptvdVKr6Ljpbhz-4P-mr5_IRsru_72wsRRZZptL80ARp6PkPdrYIQZ3bMQNsq3GEWxMl8SRPVqEuvVXykxfEt1Hx5URwtiwh_MLEZ5ClCIuGsGs8fWQhCLm_l0SY p9B2DmU-XhhT_HjuotDI3pm2p5pJb9WmO4dMLx_NsBnLSz_Q"AuthType BasicAuthName "Secure area - Authentication required"AuthBasicAuthoritative OffAuthBasicProvider ldapAuthLDAPURL "ldap://192.168.15.10/CN=Users,DC=tech,DC=local?sAMAccountName?sub?(objectClass=*)"AuthLDAPBindDN "[email protected]"AuthLDAPBindPassword kamisama123..AuthLDAPGroupAttribute memberRequire ldap-group CN=KUBERNETES-ADMIN,CN=Users,DC=TECH,DC=LOCALProxyPass https://10.107.55.24:443/ProxyPassReverse https://10.107.55.24:443/
將名為 AuthLDAPURL 的配置項的 IP 地址更改為 LDAP 的 IP 地址,根據(jù)你自己的 LDAP 環(huán)境進行相應(yīng)的配置,將名為 PROXYPASS 和 PROXYPASSREVERSE 的配置項的 IP 地址更改為 Dashboard 的 ClusterIP 地址。將名為 REQUESTHEADER 的配置項的 Token 值更改為以前創(chuàng)建的 Apache ServiceAccount 的 Token 值。
在示例中,我們使用自簽名證書啟用了 HTTPS。
SSLEngine onSSLCertificateFile /etc/apache2/certificate/apache-certificate.crtSSLCertificateKeyFile /etc/apache2/certificate/apache.key
此外我們還配置了 LDAP 身份驗證的信息:
AuthType BasicAuthName "Secure area - Authentication required"AuthBasicAuthoritative OffAuthBasicProvider ldapAuthLDAPURL "ldap://192.168.15.10/CN=Users,DC=tech,DC=local?sAMAccountName?sub?(objectClass=*)"AuthLDAPBindDN "[email protected]"AuthLDAPBindPassword kamisama123..AuthLDAPGroupAttribute memberRequire ldap-group CN=KUBERNETES-ADMIN,CN=Users,DC=TECH,DC=LOCAL
Apache 將代理用戶與 Dashboard 在集群中的 ClusterIP 之間進行 HTTPS 通信:
ProxyPass https://10.107.55.24:443/ProxyPassReverse https://10.107.55.24:443/
Apache 將使用在 Kubernetes 服務(wù)器安裝期間自動創(chuàng)建的證書和密鑰對 Dashboard 執(zhí)行相互 TLS 身份驗證:
SSLProxyEngine OnSSLProxyVerify noneSSLProxyCheckPeerCN offSSLProxyCheckPeerName offSSLProxyCheckPeerExpire offSSLProxyCACertificateFile /etc/kubernetes/pki/ca.crtSSLProxyMachineCertificateFile /etc/apache2/certificate/front-proxy-client.pem
此外 Apache 服務(wù)器還將向發(fā)送到 Dashboard 的所有數(shù)據(jù)包添加 Header 頭信息,用來配置 Token 信息:
RequestHeader set Authorization "Bearer eyJhbGciOiJSUzI1NiIsImtpZCI6InhrMHFrdEdYQ1gxVlRqZjBpN1hxdEgwaTlRRENMWmhUdC1IMC13OTgyM28ifQ.eyJpc3MiOiJrdWJ cm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm hbWUiOiJhcGFjaGUtcHJveHktdG9rZW4tOGdrOXAiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiYXBhY2hlLXByb3h5Iiwia3ViZXJuZXRlcy5pby9zZ J2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZTA3ODg0YjQtMjgyYy00ZWYxLTg2NjItZTJhM2VhZjNjNDQ4Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmFw WNoZS1wcm94eSJ9.qKzSvCYOqDfvJ1S9W4-nEzZScmGwjYsi3g5df542_aDyZRugbiWbFmjrBTB70tDwuGTeupbPmS3ptweyjbb_7K5VbSk-2zCazgNeiCZ_q7M4yXgPi6rNYNiBX9pQEBaBQCWgH8-VVF e34xrLR88cv9YNLfH9ZzrdJf2jPEBhptvdVKr6Ljpbhz-4P-mr5_IRsru_72wsRRZZptL80ARp6PkPdrYIQZ3bMQNsq3GEWxMl8SRPVqEuvVXykxfEt1Hx5URwtiwh_MLEZ5ClCIuGsGs8fWQhCLm_l0SY p9B2DmU-XhhT_HjuotDI3pm2p5pJb9WmO4dMLx_NsBnLSz_Q"此外 Apache 還會將 HTTP 用戶重定向到 HTTPS :
RewriteEngine OnRewriteCond %{HTTPS} !=onRewriteRule ^/?(.*) https://%{SERVER_NAME}/$1
最后配置完成后,我們可以重新啟動 Apache 服務(wù):
service apache2 restart配置完成后我們就可以在瀏覽器中訪問 Apache 服務(wù)器的 IP 地址,我們這里在瀏覽器中輸入https://192.168.15.200即可,Apache 服務(wù)器會要求執(zhí)行用戶身份驗證。

登錄成功后,就可以正常使用 Kubernetes Dashboard 了:

Apache 代理將自動使用名為"AUTH HEADER"的功能在 Kubernetes Dashboard 上執(zhí)行身份驗證。

到這里我們就成功完成了使用 Apache 作為 Kubernetes Dashboard 的代理配置。
?
原文鏈接:https://techexpert.tips/kubernetes/kubernetes-dashboard-ldap-authentication/
K8S進階訓(xùn)練營,點擊下方圖片了解詳情

