Kubernetes Dashboard

Minikube 环境搭建
Kubernetes 的基本架构
Kubernetes 声明式语言 YAML
YAML操作Kubernetes核心对象
CentOs搭建Kubernetes集群
Kubernetes进阶对象Deployment、DaemonSet、Service
Kubernetes进阶对象Ingress、Ingress Class、Ingress Controller
Kubernetes集群部署项目实践
Kubernetes高级对象PersistentVolume、PersistentVolumeClaim、StorageClass
CentOS部署NFS
Kubernetes使用NFS实现数据持久化
Kubernetes高级对象StatefulSet
Kubernetes 应用滚动更新
Kubernetes 容器资源管理Resources和探针Probe
Kubernetes 名称空间Namespace
Kubernetes 系统监控Metrics Server、HorizontalPodAutoscaler、Prometheus
Kubernetes集群持久化部署实践
Kubernetes Dashboard

Dashboard

Dashboard 的项目网站,可以查看说明文档和基本的使用情况。

下载yaml

bash 复制代码
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.6.0/aio/deploy/recommended.yaml

注意需要修改镜像,不然可能会拉去不下来镜像(ps:国外拉不下来的镜像,可以到阿里云找对应的国内镜像替代)

bash 复制代码
 cat recommended.yaml | grep -i image
 		 #image: kubernetesui/dashboard:v2.6.0 --原有镜像
          image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/dashboard:v2.0.0-beta8
          imagePullPolicy: Always
         #image: kubernetesui/metrics-scraper:v1.0.8 --原有镜像  
          image: registry.cn-hangzhou.aliyuncs.com/kube-iamges/metrics-scraper:v1.0.1

yaml简单说明

  • 所有的对象都属于"kubernetes-dashboard"名字空间。
  • Dashboard 使用 Deployment 部署了一个实例,端口号是 8443。
  • 容器启用了 Liveness 探针,使用 HTTPS 方式检查存活状态。
  • Service 对象使用的是 443 端口,它映射了 Dashboard 的 8443 端口

使用命令 kubectl apply 就可以轻松部署 Dashboard :

bash 复制代码
kubectl apply -f recommended.yaml 
# 查看pod
kubectl get pod -n kubernetes-dashboard 
bash 复制代码
#查看dashboard svc
kubectl get svc  -n kubernetes-dashboard


svc不是typeNode类型,无法外部直接访问,下面提供两种方式支持外部访问

1修改SVC类型为NodePort

修改SVC类型为NodePort,允许机器外部提供访问能力

bash 复制代码
# 修改服务的配置
kubectl edit svc kubernetes-dashboard -n kubernetes-dashboard
bash 复制代码
	# 找到 type: ClusterIP
	#修改成
	type: NodePort  # 将类型更改为 NodePort
bash 复制代码
#修改后保存查看,已有外部访问端口
kubectl get svc  -n kubernetes-dashboard

2Ingress/Ingress Controller

也可以通过ingress Controller 提供外部访问能力

由于 Dashboard 默认使用的是加密的 HTTPS 协议,拒绝明文 HTTP 访问,所以我们要先生成证书,让 Ingress 也走 HTTPS 协议。

直接用 Linux 里的命令行工具"openssl"来生成一个自签名的证书(如果你有条件,也可以考虑找 CA 网站申请免费证书):

bash 复制代码
openssl req -x509 -days 365 -out k8s.test.crt -keyout k8s.test.key \
  -newkey rsa:2048 -nodes -sha256 \
    -subj '/CN=k8s.test' -extensions EXT -config <( \
       printf "[dn]\nCN=k8s.test\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:k8s.test\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")

它生成的是一个 X509 格式的证书,有效期 365 天,私钥是 RSA2048 位,摘要算法是 SHA256,签发的网站是"k8s.test"。

运行命令行后会生成两个文件,一个是证书"k8s.test.crt",另一个是私钥"k8s.test.key",我们需要把这两个文件存入 Kubernetes 里供 Ingress 使用。

注意:

使用上述命令生成的自签名证书 k8s.test.crt 和私钥 k8s.test.key 是自签名的证书,其安全性在开发或测试环境中通常是可以接受的,但不会被主流浏览器(如Chrome、Firefox、Edge等)视为安全,因为它们未经公共颁发机构(CA)的认证和签名。

在开发或测试环境中,可以使用这样的自签名证书来进行测试和开发工作。浏览器通常会显示安全警告,因为它们无法验证该证书的真实性和信任级别,因此认为连接可能不是私密的或不安全的。

要在浏览器中消除这些警告,需要手动将生成的证书导入到浏览器的信任存储中,具体步骤可以参考之前提到的浏览器信任证书的操作。这样浏览器就会信任您的自签名证书,不再显示安全警告。

因为这两个文件属于机密信息,存储的方式需要用 Secret

dashborad.yml

yaml 复制代码
apiVersion: v1
kind: Secret
metadata:
  name: dash-tls
  namespace: kubernetes-dashboard
type: kubernetes.io/tls

data:
  tls.crt: LS0tLS1CRUdJTiBDRVJU...自己生成的crt
  tls.key: LS0tLS1CRUdJTiBQUklW...自己生成的key
bash 复制代码
vim dashboard-secret.yml 
kubectl apply -f dashboard-secret.yml 
#或者根据文件生成  kubectl create secret tls dash-tls -n kubernetes-dashboard --cert=k8s.test.crt --key=k8s.test.key

kubectl get secrets -n kubernetes-dashboard


Ingress Class

dash-ink.yml

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: IngressClass

metadata:
  name: dash-ink
  namespace: kubernetes-dashboard
spec:
  controller: nginx.org/ingress-controller

Ingress 对象可以用 kubectl create 命令自动生成

bash 复制代码
kubectl create ing dash-ing --rule="k8s.test/=kubernetes-dashboard:443" --class=dash-ink -n kubernetes-dashboard $out

因为是 HTTPS 协议,所以我们要在 Ingress 里多加一点东西,一个是"annotations"字段,指定后端目标是 HTTPS 服务,另一个是"tls"字段,指定域名和证书,也就是刚才创建的 Secret:

dash-ingress.yml

yaml 复制代码
apiVersion: networking.k8s.io/v1
kind: Ingress

metadata:
  name: dash-ing
  namespace: kubernetes-dashboard
  annotations:
    nginx.org/ssl-services: "kubernetes-dashboard"

spec:
  ingressClassName: dash-ink

  tls:
    - hosts:
      - k8s.test
      secretName: dash-tls

  rules:
  - host: k8s.test
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443

Ingress Controller
dash-kic.yml

yaml 复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: dash-kic-dep
  namespace: nginx-ingress
spec:
  selector:
    matchLabels:
      app: dash-kic-dep
  template:
    metadata:
      labels:
        app: dash-kic-dep
        app.kubernetes.io/name: nginx-ingress
    spec:
      serviceAccountName: nginx-ingress
      hostNetwork: true
      automountServiceAccountToken: true
      securityContext:
        seccompProfile:
          type: RuntimeDefault
      containers:
      - image: nginx/nginx-ingress:2.2-alpine
        imagePullPolicy: IfNotPresent
        name: nginx-ingress
        ports:
        - name: http
          containerPort: 80
        - name: https
          containerPort: 443
        - name: readiness-port
          containerPort: 8081
        - name: prometheus
          containerPort: 9113
        readinessProbe:
          httpGet:
            path: /nginx-ready
            port: readiness-port
          periodSeconds: 1
        resources:
          requests:
            cpu: "100m"
            memory: "128Mi"
         #limits:
         #  cpu: "1"
         #  memory: "1Gi"
        securityContext:
          allowPrivilegeEscalation: true
#          readOnlyRootFilesystem: true
          runAsUser: 101 #nginx
          runAsNonRoot: true
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        env:
        - name: POD_NAMESPACE
          valueFrom:
            fieldRef:
              fieldPath: metadata.namespace
        - name: POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        args:
          - -nginx-configmaps=$(POD_NAMESPACE)/nginx-config
          - -ingress-class=dash-ink

要让我们在外面能够访问 Ingress Controller,还要为它再定义一个 Service,类型是"NodePort",端口指定是"30443":
dash-kic-svc.yml

yaml 复制代码
apiVersion: v1
kind: Service
metadata:
  name: dash-kic-svc
  namespace: nginx-ingress

spec:
  ports:
  - port: 443
    protocol: TCP
    targetPort: 443
    nodePort: 30443

  selector:
    app: dash-kic-dep
  type: NodePort

创建上面的 Ingress Class、Ingress、Ingress Controller、Service

bash 复制代码
 vim dash-ink.yml
 vim dash-ingress.yml
 vim dash-kic.yml
 vim dash-kic-svc.yml
 kubectl apply -f dash-ink.yml -f dash-ingress.yml -f dash-kic.yml -f dash-kic-svc.yml 

kubectl get ingressclasses.networking.k8s.io -n kubernetes-dashboard
kubectl get ingress -n kubernetes-dashboard
kubectl get pod,svc -n kubernetes-dashboard 
kubectl get pod,svc -n nginx-ingress 


查看nginx相关配置

bash 复制代码
# 查看nginx controller容器
kubectl get pod -n nginx-ingress
#进入nginx容器中
kubectl exec -it -n nginx-ingress dash-kic-dep-cx2vq -- sh
#查看配置文件
 cat /etc/nginx/nginx.conf
 # 其他配置
 ls /etc/nginx/conf.d/


对象关系图

外部访问 Dashboard

创建用户,登录进 Dashboard。Dashboard官网示例

dashboard-adminuser.yml

yaml 复制代码
apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard
bash 复制代码
vim dashboard-adminuser.yml
kubectl apply -f dashboard-adminuser.yml 

获取sa的token,通过token的方式登录部署好的dashboard

bash 复制代码
# 获取账户
kubectl get secret -n kubernetes-dashboard
# 根据上面的命令 获取token
kubectl describe secrets -n kubernetes-dashboard admin-user-token-xxxx


登录访问

使用dashboard service

ip+service typenode端口

在当前页面用键盘输入 thisisunsafe ,不是在地址栏输入,就直接敲键盘就行了,页面即会自动刷新进入网页。

使用域名

https://k8s.test:30443/ (注意添加域名解析)

访问流程

https://k8s.test:30443/ 时,请求的处理过程如下:

外部请求到 NodePort 服务

浏览器请求 https://k8s.test:30443/。

假设 30443 是一个 NodePort,Kubernetes 会将请求转发到集群内部。

NodePort 服务到 Nginx Ingress Controller 的 Service

请求会先到达暴露在 NodePort 30443 上的服务,即 dash-kic-svc。

该服务会将请求转发到与其关联的 Pod,通常是 Nginx Ingress Controller 的 Pod。

Nginx Ingress Controller

运行在 dash-kic-dep(Deployment)中的 Nginx Ingress Controller Pod 接收到请求。

Nginx Ingress Controller 根据配置的 Ingress 资源进行处理。

Ingress 资源规则

Nginx Ingress Controller 会根据你配置的 Ingress 资源规则 (dash-ing) 解析请求。

例如,根据 host 和 path,确定应该将请求转发到哪个后端服务。

转发到后端服务

在这个例子中,Ingress 资源会将请求转发到 kubernetes-dashboard 服务的 443 端口。

相关推荐
梦魇梦狸º1 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github
南猿北者4 小时前
docker镜像仓库常用命令
运维·docker·容器
2301_806131365 小时前
Kubernetes的基本构建块和最小可调度单元pod-0
云原生·容器·kubernetes
SilentCodeY5 小时前
containerd配置私有仓库registry
容器·kubernetes·containerd·镜像·crictl
微刻时光5 小时前
Docker镜像分成
java·运维·开发语言·docker·容器·镜像
Walden-20207 小时前
构建基于 DCGM-Exporter, Node exporter,PROMETHEUS 和 GRAFANA 构建算力监控系统
docker·容器·grafana·prometheus
licy__9 小时前
Docker 基础命令简介
docker·云原生·eureka
强_子11 小时前
docker搭建guacamole,web远程桌面
前端·docker·容器
binqian11 小时前
【k8s】ClusterIP能http访问,但是不能ping 的原因
http·容器·kubernetes
0_1_bits12 小时前
【系统设计】高效的分布式系统:使用 Spring Boot 和 Kafka 实现 Saga 模式
spring boot·后端·云原生·架构·kafka·linq