1. 安装 http 方式的 dashboard
kubectl apply -f https://github.com/kubernetes/dashboard/blob/v2.6.1/aio/deploy/alternative.yaml
2. 使用 openssl 创建自签名证书
# 创建目录
cd /data/k8s-data
mkdir certs
# 一、成为证书颁发机构
#
# 生成 CA 私钥
openssl genrsa -out arnoCA.key 4096
#
# 或者 生成 需要密码的 私钥
# openssl genrsa -des3 -out arnoCA.key 4096
#
# 生成 CA 公钥/根 证书
# C = Country Name (2 letter code)
# ST = State or Province Name (full name)
# L = Locality Name (eg, city)
# O = Organization Name (eg, company)
# OU = Organizational Unit Name (eg, section)
# CN = Common Name (e.g. server FQDN or YOUR name)
# emailAddress = Email Address
# -days 7300 为 20 年
openssl req -x509 -new -nodes -key arnoCA.key -sha256 -days 7300 -out arnoCA.pem -subj "/C=CN/ST=Guang Dong/L=Shen Zhen/O=ArnoJin/OU=IT Department/CN=Arno Jin Root CA/emailAddress=arno@arnojin.com"
ls -lah
# 此时生成了2个文件 arnoCA.key arnoCA.pem
# 其中 arnoCA.pem 用于在 Chrome 或者 Windows, Linux 中导入
# 二、创建 使用 CA 公钥/根 证书 签名的 域名 证书
NAME=k8s.arno
# 生成 用于 域名的 私钥
openssl genrsa -out ${NAME}.key 4096
# 生成 用于 域名的 证书,注意这里 CN 必须设置为对应的域名
openssl req -new -key ${NAME}.key -out ${NAME}.csr -subj "/C=CN/ST=Guang Dong/L=Shen Zhen/O=ArnoJin/OU=IT Department/CN=${NAME}/emailAddress=arno@arnojin.com"
# 创建 证书签名 扩展配置文件(必须做以下设置,否则 Chrome 还是会不认)
tee $NAME.ext <<-'EOF'
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = k8s.arno
EOF
# 使用 CA 公钥/根 证书 为 域名 证书签名(可选)
openssl x509 -req -in $NAME.csr -CA arnoCA.pem -CAkey arnoCA.key -CAcreateserial -out $NAME.crt -days 7300 -sha256 -extfile $NAME.ext
# 验证 域名 证书 对域名的有效性
openssl verify -CAfile arnoCA.pem -verify_hostname ${NAME} ${NAME}.crt
# 将 arnoCA.pem 通过 Chrome 的 chrome://settings/security 管理证书 -> 受信任的根证书颁发机构 -> 导入
#
# 此时生成了 k8s.arno.crt k8s.arno.key k8s.arno.ext k8s.arno.crs
# 其中 k8s.arno.crt k8s.arno.key 这2个文件用于 Nginx
# 将 arnoCA.pem 通过 Chrome 的 chrome://settings/security 管理证书 -> 受信任的根证书颁发机构 -> 导入
#
# 涉及的 openssl 配置文件路径 /etc/ssl/openssl.cnf
#
# 将 arnoCA.pem 根证书添加到 ubuntu 的信任列表
# sudo cp arnoCA.pem /usr/local/share/ca-certificates/arnoCA.crt
# sudo update-ca-certificates
3. 创建 k8s secret
kubectl -n kubernetes-dashboard create secret tls kubernetes-dashboard-certs-k8s-arno --cert=$NAME.crt --key=$NAME.key
4. 创建 kubernetes-dashboard ingress
# kubectl apply -f kubernetes-dashboard-ingress.yaml
kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
namespace: kubernetes-dashboard
name: kubernetes-dashboard
annotations:
kubernetes.io/ingress.class: "nginx"
nginx.ingress.kubernetes.io/enable-access-log: "true"
nginx.ingress.kubernetes.io/configuration-snippet: |
access_log /var/log/nginx/dashboard-access.log upstreaminfo if=$loggable;
error_log /var/log/nginx/dashboard-error.log;
spec:
tls:
- hosts:
- "k8s.arno"
secretName: kubernetes-dashboard-certs-k8s-arno
rules:
- host: "k8s.arno"
http:
paths:
- pathType: Prefix
path: /
backend:
service:
name: kubernetes-dashboard
port:
number: 80
# 创建 ingress
kubectl apply -f kubernetes-dashboard-ingress.yaml
# 通过 https 访问 Kubernetes Dashboard
curl -L https://k8s.arno
# 如果 证书没有安装到系统,则可以使用如下参数规避 SSL 安全警告
# curl -L -k --tlsv1 https://k8s.arno
# curl -L -k -v https://k8s.arno
5. 创建 token 登录 dashboard
# kubectl apply -f account.yaml
kind: ServiceAccount
apiVersion: v1
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: admin-user
roleRef:
kind: ClusterRole
apiGroup: rbac.authorization.k8s.io
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
# 使用 Token 登录
kubectl apply -f account.yaml
kubectl -n kubernetes-dashboard create token admin-user
6. 参考
1. Getting Chrome to accept self-signed localhost certificate
2. 自签名证书配置HTTPS