在 Windows 10 | Docker Desktop | Kubernetes 环境 通过 ingress-nginx 为 Kubernetes Dashboard 2.6.1 提供 Chrome 支持的 HTTPS 访问

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注