You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

773 lines
34 KiB

2 months ago
<h1><center>KubeGems连接Kubernetes</center></h1>
------
**作者:行癫<盗版必究>**
## 一Kubernetes集群部署
#### 1.kubernetes环境
kubernetes高可用集群
kubernetes非高可用集群
#### 2.kubernetes验证
```shell
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 124d v1.25.1
node-1 Ready <none> 124d v1.25.1
node-2 Ready <none> 124d v1.25.1
node-3 Ready <none> 124d v1.25.1
```
## 二KubeGems部署
KubeGems部署需要基于Kubernetes集群的环境高可用集群和非高可用集群均可在这里基于非高可用集群部署
kubernetes 1.20 及以上版本( 1.23+最佳 )
#### 1.核心组件
| 名称 | 描述 |
| :------------------: | :---------------------------------------------------------: |
| `kubegems-installer` | kubegems 安装程序,安装 kubegems 组件及依赖组件 |
| `kubegems` | kubegems 核心组件,包含 UI 界面及相关 API 服务 |
| `kubegems-local` | kubegems 边缘组件,安装在托管集群上,获取集群信息和执行操作 |
#### 2.部署kubegems-installer
installer 是用于安装 kubegems 主要组件和插件的控制器
```shell
[root@master ~]# kubectl create namespace kubegems-installer
[root@master ~]# kubectl apply -f https://github.com/kubegems/kubegems/raw/main/deploy/installer.yaml
[root@master ~]# vi installer.yaml
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
annotations:
controller-gen.kubebuilder.io/version: v0.9.0
meta.helm.sh/release-name: kubegems-installer
meta.helm.sh/release-namespace: kubegems-installer
creationTimestamp: null
name: plugins.plugins.kubegems.io
spec:
group: plugins.kubegems.io
names:
kind: Plugin
listKind: PluginList
plural: plugins
singular: plugin
scope: Namespaced
versions:
- additionalPrinterColumns:
- description: Kind of the bundle
jsonPath: .spec.kind
name: Kind
type: string
- description: Status of the bundle
jsonPath: .status.phase
name: Status
type: string
- description: Install Namespace of the bundle
jsonPath: .status.namespace
name: Namespace
type: string
- description: Version of the bundle
jsonPath: .status.version
name: Version
type: string
- description: app version of the bundle
jsonPath: .status.appVersion
name: AppVersion
type: string
- description: UpgradeTimestamp of the bundle
jsonPath: .status.upgradeTimestamp
name: UpgradeTimestamp
type: date
- description: CreationTimestamp of the bundle
jsonPath: .metadata.creationTimestamp
name: Age
type: date
name: v1beta1
schema:
openAPIV3Schema:
properties:
apiVersion:
description: 'APIVersion defines the versioned schema of this representation
of an object. Servers should convert recognized schemas to the latest
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
type: string
kind:
description: 'Kind is a string value representing the REST resource this
object represents. Servers may infer this from the endpoint the client
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
metadata:
type: object
spec:
properties:
chart:
description: Chart is the name of the chart to install.
type: string
dependencies:
description: Dependencies is a list of bundles that this bundle depends
on. The bundle will be installed after all dependencies are exists.
items:
description: 'ObjectReference contains enough information to let
you inspect or modify the referred object. --- New uses of this
type are discouraged because of difficulty describing its usage
when embedded in APIs. 1. Ignored fields. It includes many fields
which are not generally honored. For instance, ResourceVersion
and FieldPath are both very rarely valid in actual usage. 2. Invalid
usage help. It is impossible to add specific help for individual
usage. In most embedded usages, there are particular restrictions
like, "must refer only to types A and B" or "UID not honored"
or "name must be restricted". Those cannot be well described when
embedded. 3. Inconsistent validation. Because the usages are
different, the validation rules are different by usage, which
makes it hard for users to predict what will happen. 4. The fields
are both imprecise and overly precise. Kind is not a precise
mapping to a URL. This can produce ambiguity during interpretation
and require a REST mapping. In most cases, the dependency is
on the group,resource tuple and the version of the actual struct
is irrelevant. 5. We cannot easily change it. Because this type
is embedded in many locations, updates to this type will affect
numerous schemas. Don''t make new APIs embed an underspecified
API type they do not control. Instead of using this type, create
a locally provided and used type that is well-focused on your
reference. For example, ServiceReferences for admission registration:
https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533
.'
properties:
apiVersion:
description: API version of the referent.
type: string
fieldPath:
description: 'If referring to a piece of an object instead of
an entire object, this string should contain a valid JSON/Go
field access statement, such as desiredState.manifest.containers[2].
For example, if the object reference is to a container within
a pod, this would take on a value like: "spec.containers{name}"
(where "name" refers to the name of the container that triggered
the event) or if no container name is specified "spec.containers[2]"
(container with index 2 in this pod). This syntax is chosen
only to have some well-defined way of referencing a part of
an object. TODO: this design is not final and this field is
subject to change in the future.'
type: string
kind:
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
name:
description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
type: string
namespace:
description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
type: string
resourceVersion:
description: 'Specific resourceVersion to which this reference
is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
type: string
uid:
description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
type: string
type: object
type: array
disabled:
description: Disabled indicates that the bundle should not be installed.
type: boolean
installNamespace:
description: InstallNamespace is the namespace to install the bundle
into. If not specified, the bundle will be installed into the namespace
of the bundle.
type: string
kind:
description: Kind bundle kind.
enum:
- helm
- kustomize
- template
type: string
path:
description: Path is the path in a tarball to the chart/kustomize.
type: string
url:
description: URL is the URL of helm repository, git clone url, tarball
url, s3 url, etc.
type: string
values:
description: Values is a nested map of helm values.
type: object
x-kubernetes-preserve-unknown-fields: true
valuesFrom:
description: ValuesFiles is a list of references to helm values files.
Ref can be a configmap or secret.
items:
properties:
kind:
description: Kind is the type of resource being referenced
enum:
- ConfigMap
- Secret
type: string
name:
description: Name is the name of resource being referenced
type: string
optional:
description: Optional set to true to ignore referense not found
error
type: boolean
prefix:
description: An optional identifier to prepend to each key in
the ConfigMap. Must be a C_IDENTIFIER.
type: string
required:
- kind
- name
type: object
type: array
version:
description: Version is the version of helm chart, git revision, etc.
type: string
type: object
status:
properties:
appVersion:
description: AppVersion is the app version of the bundle.
type: string
creationTimestamp:
description: CreationTimestamp is the first creation timestamp of
the bundle.
format: date-time
type: string
message:
description: Message is the message associated with the status In
helm, it's the notes contens.
type: string
namespace:
description: Namespace is the namespace where the bundle is installed.
type: string
phase:
description: Phase is the current state of the release
type: string
resources:
description: Resources is a list of resources created/managed by the
bundle.
items:
description: 'ObjectReference contains enough information to let
you inspect or modify the referred object. --- New uses of this
type are discouraged because of difficulty describing its usage
when embedded in APIs. 1. Ignored fields. It includes many fields
which are not generally honored. For instance, ResourceVersion
and FieldPath are both very rarely valid in actual usage. 2. Invalid
usage help. It is impossible to add specific help for individual
usage. In most embedded usages, there are particular restrictions
like, "must refer only to types A and B" or "UID not honored"
or "name must be restricted". Those cannot be well described when
embedded. 3. Inconsistent validation. Because the usages are
different, the validation rules are different by usage, which
makes it hard for users to predict what will happen. 4. The fields
are both imprecise and overly precise. Kind is not a precise
mapping to a URL. This can produce ambiguity during interpretation
and require a REST mapping. In most cases, the dependency is
on the group,resource tuple and the version of the actual struct
is irrelevant. 5. We cannot easily change it. Because this type
is embedded in many locations, updates to this type will affect
numerous schemas. Don''t make new APIs embed an underspecified
API type they do not control. Instead of using this type, create
a locally provided and used type that is well-focused on your
reference. For example, ServiceReferences for admission registration:
https://github.com/kubernetes/api/blob/release-1.17/admissionregistration/v1/types.go#L533
.'
properties:
apiVersion:
description: API version of the referent.
type: string
fieldPath:
description: 'If referring to a piece of an object instead of
an entire object, this string should contain a valid JSON/Go
field access statement, such as desiredState.manifest.containers[2].
For example, if the object reference is to a container within
a pod, this would take on a value like: "spec.containers{name}"
(where "name" refers to the name of the container that triggered
the event) or if no container name is specified "spec.containers[2]"
(container with index 2 in this pod). This syntax is chosen
only to have some well-defined way of referencing a part of
an object. TODO: this design is not final and this field is
subject to change in the future.'
type: string
kind:
description: 'Kind of the referent. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
type: string
name:
description: 'Name of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names'
type: string
namespace:
description: 'Namespace of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/namespaces/'
type: string
resourceVersion:
description: 'Specific resourceVersion to which this reference
is made, if any. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#concurrency-control-and-consistency'
type: string
uid:
description: 'UID of the referent. More info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#uids'
type: string
type: object
type: array
upgradeTimestamp:
description: UpgradeTimestamp is the time when the bundle was last
upgraded.
format: date-time
type: string
values:
description: Values is a nested map of final helm values.
type: object
x-kubernetes-preserve-unknown-fields: true
version:
description: Version is the version of the bundle. In helm, Version
is the version of the chart.
type: string
type: object
type: object
served: true
storage: true
subresources:
status: {}
---
apiVersion: v1
kind: ServiceAccount
metadata:
annotations:
meta.helm.sh/release-name: kubegems-installer
meta.helm.sh/release-namespace: kubegems-installer
labels:
app.kubernetes.io/component: installer
app.kubernetes.io/instance: kubegems-installer
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubegems-installer
helm.sh/chart: kubegems-installer-1.21.0
name: kubegems-installer
namespace: kubegems-installer
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
meta.helm.sh/release-name: kubegems-installer
meta.helm.sh/release-namespace: kubegems-installer
labels:
app.kubernetes.io/component: installer
app.kubernetes.io/instance: kubegems-installer
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubegems-installer
helm.sh/chart: kubegems-installer-1.21.0
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: kubegems-installer-view
rules:
- apiGroups:
- plugins.kubegems.io
resources:
- plugins
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
meta.helm.sh/release-name: kubegems-installer
meta.helm.sh/release-namespace: kubegems-installer
labels:
app.kubernetes.io/component: installer
app.kubernetes.io/instance: kubegems-installer
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubegems-installer
helm.sh/chart: kubegems-installer-1.21.0
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
name: kubegems-installer-edit
rules:
- apiGroups:
- plugins.kubegems.io
resources:
- plugins
verbs:
- get
- list
- watch
- create
- update
- patch
- delete
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
annotations:
meta.helm.sh/release-name: kubegems-installer
meta.helm.sh/release-namespace: kubegems-installer
labels:
app.kubernetes.io/component: installer
app.kubernetes.io/instance: kubegems-installer
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubegems-installer
helm.sh/chart: kubegems-installer-1.21.0
name: kubegems-installer
namespace: kubegems-installer
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: kubegems-installer
namespace: kubegems-installer
---
apiVersion: apps/v1
kind: Deployment
metadata:
annotations:
meta.helm.sh/release-name: kubegems-installer
meta.helm.sh/release-namespace: kubegems-installer
labels:
app.kubernetes.io/component: installer
app.kubernetes.io/instance: kubegems-installer
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubegems-installer
helm.sh/chart: kubegems-installer-1.21.0
name: kubegems-installer
namespace: kubegems-installer
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/component: installer
app.kubernetes.io/instance: kubegems-installer
app.kubernetes.io/name: kubegems-installer
strategy:
type: RollingUpdate
template:
metadata:
labels:
app.kubernetes.io/component: installer
app.kubernetes.io/instance: kubegems-installer
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: kubegems-installer
helm.sh/chart: kubegems-installer-1.21.0
spec:
containers:
- args:
- installer
- --enableleaderelection
- --probeaddr=:8080
- --metricsaddr=:9100
env:
- name: LOG_LEVEL
value: debug
image: docker.io/kubegems/kubegems:latest
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 6
httpGet:
path: /healthz
port: probe
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
name: installer
ports:
- containerPort: 8080
name: probe
protocol: TCP
- containerPort: 9100
name: metrics
protocol: TCP
readinessProbe:
failureThreshold: 6
httpGet:
path: /healthz
port: probe
initialDelaySeconds: 5
periodSeconds: 10
successThreshold: 1
timeoutSeconds: 5
resources:
limits: {}
requests: {}
serviceAccountName: kubegems-installer
```
验证
```shell
[root@master ~]# kubectl -n kubegems-installer get po
NAME READY STATUS RESTARTS AGE
kubegems-installer-757d4c64db-cf2x2 1/1 Running 0 20m
```
#### 2.安装local-path-provisioner
kubegems 需要持久化一些重要数据安装local-path-provisioner
```shell
[root@master ~]# kubectl create namespace local-path-storage
[root@master ~]# kubectl apply -f https://raw.githubusercontent.com/kubegems/kubegems/main/deploy/addon-local-path-provisioner.yaml
[root@master kubegems]# vi addon-local-path-provisioner.yaml
# https://github.com/rancher/local-path-provisioner/tree/master/deploy/chart
apiVersion: plugins.kubegems.io/v1beta1
kind: Plugin
metadata:
name: local-path-provisioner
namespace: local-path-storage
spec:
kind: helm
url: https://github.com/rancher/local-path-provisioner/archive/refs/tags/v0.0.22.tar.gz
path: local-path-provisioner-0.0.22/deploy/chart/local-path-provisioner
version: 0.0.22
values:
storageClass:
defaultClass: true
provisionerName: rancher.io/local-path
nodePathMap:
- node: DEFAULT_PATH_FOR_NON_LISTED_NODES
paths:
- /data
```
#### 3.部署 kubegems
```shell
[root@master ~]# kubectl create namespace kubegems
[root@master ~]# export STORAGE_CLASS=local-path # 改为您使用的 storageClass
[root@master ~]# export KUBEGEMS_VERSION=v1.21.1 # change to specify kubegems version
[root@master ~]# wget https://raw.githubusercontent.com/kubegems/kubegems/main/deploy/kubegems-mirror.yaml
apiVersion: plugins.kubegems.io/v1beta1
kind: Plugin
metadata:
name: kubegems
namespace: kubegems
spec:
kind: helm
url: https://charts.kubegems.io/kubegems
values:
global:
imageRegistry: registry.cn-beijing.aliyuncs.com
kubegemsVersion: latest
storageClass: local-path # change me to use a production storage class
mysql:
image:
repository: kubegems/mysql
persistence:
enabled: true
size: 20Gi
redis:
image:
repository: kubegems/redis
master:
persistence:
enabled: true
size: 5Gi
volumePermissions:
enabled: true
image:
repository: kubegems/bitnami-shell
argo-cd:
image:
repository: kubegems/argo-cd
redis:
image:
repository: kubegems/redis
gitea:
image:
repository: kubegems/gitea
persistence:
enabled: true
size: 10Gi
chartmuseum:
image:
repository: kubegems/chartmuseum
persistence:
enabled: true
size: 5Gi
ingress:
hostname: dashboard.kubegems.io
[root@master ~]# sed -i -e "s/local-path/${STORAGE_CLASS}/g" -e "s/latest/${KUBEGEMS_VERSION}/g" kubegems-mirror.yaml
[root@master ~]# kubectl create -f kubegems-mirror.yaml
```
验证
```shell
[root@master ~]# kubectl -n kubegems get pod
NAME READY STATUS RESTARTS AGE
kubegems-api-7856cddc86-zxf2m 1/1 Running 6 (148m ago) 152m
kubegems-argo-cd-app-controller-57c756777c-qgtkb 1/1 Running 0 152m
kubegems-argo-cd-repo-server-84bc9df4cd-cvhmk 1/1 Running 0 152m
kubegems-argo-cd-server-58d6ccc99-mqb4k 1/1 Running 0 152m
kubegems-chartmuseum-74d498759c-rl49v 1/1 Running 0 152m
kubegems-charts-init-v1.21.1-2tn8s 0/1 Completed 0 152m
kubegems-dashboard-777875598f-7pfvx 1/1 Running 0 152m
kubegems-gitea-0 1/1 Running 0 152m
kubegems-init-v1.21.1-gpvrw 0/1 Completed 5 152m
kubegems-msgbus-7c6c4c66c-kq8xw 1/1 Running 6 (148m ago) 152m
kubegems-mysql-0 1/1 Running 0 152m
kubegems-redis-master-0 1/1 Running 0 136m
kubegems-worker-85c8d75ff7-2b7rr 1/1 Running 6 (148m ago) 152m
```
#### 4.访问kubegems仪表板
你需要编辑kubegems插件为dashbnoard组件开启nodeport
```shell
[root@master ~]# kubectl -n kubegems edit plugins.plugins.kubegems.io kubegems
只添加nodeport
apiVersion: plugins.kubegems.io/v1beta1
kind: Plugin
metadata:
spec:
kind: helm
url: https://charts.kubegems.io/kubegems
values:
dashboard:
service:
type: NodePort
global:
kubegemsVersion: v1.21.1
storageClass: local-path
ingress:
hostname: dashboard.kubegems.io
```
使用 ingress 或其他方式访问
注意:
kubegems 默认创建了 hostname 为 `dashboard.kubegems.io` 的 ingress, 同时默认绑定了 `default-gateway`的`ingressClass`。 如果您想更改为其他域名或者绑定到其他网关可以编辑kubegems插件
`default-gateway`是平台默认网关,要使用它,你需要启用`网关-gateway`插件
```shell
[root@master ~]# kubectl -n kubegems edit plugins.plugins.kubegems.io kubegems
apiVersion: plugins.kubegems.io/v1beta1
kind: Plugin
metadata:
spec:
kind: helm
url: https://charts.kubegems.io/kubegems
values:
global:
kubegemsVersion: v1.21.1
storageClass: local-path
ingress:
hostname: dashboard.kubegems.io
ingressClassName: default-gateway
```
获取 ingress 访问地址
```shell
[root@master ~]# PORT=$(kubectl -n kubegems-gateway get svc default-gateway -ojsonpath='{.spec.ports[0].nodePort}')
[root@master ~]# ADDRESS=$(kubectl -n kubegems get ingress kubegems -ojsonpath='{.spec.rules[*].host}')
[root@master ~]# echo http://$ADDRESS:$PORT
```
#### 5.浏览器访问
用户admin
密码demo!@#admin
```shell
[root@master ~]# kubectl get svc -n kubegems | grep dashboard
kubegems-dashboard NodePort 10.103.140.101 <none> 80:32317/TCP,9100:30420/TCP 173m
```
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/gems-first-dashbaord-bbc455105192bd6a238ac0b41ed07503.jpg" alt="img" style="zoom:50%;" />
## 三连接Kubernetes集群
#### 1.获取集群kubeconfig
获取current-contextclusters.cluster.name
```shell
[root@master ~]# CURRENT_CONTEXT=`kubectl config current-context`
```
获取current-cluster
```shell
[root@master ~]# CURRENT_CLUSTER=`kubectl config view --raw -o=go-template='{{range .contexts}}{{if eq .name "'''${CURRENT_CONTEXT}'''"}}{{ index .context "cluster" }}{{end}}{{end}}'`
```
获取certificate-authority-data
```shell
[root@master ~]# certificate-authority-data=`kubectl config view --raw -o=go-template='{{range .clusters}}{{if eq .name "'''${CURRENT_CLUSTER}'''"}}"{{with index .cluster "certificate-authority-data" }}{{.}}{{end}}"{{ end }}{{ end }}')`
```
用户dashboard-admin获取token
```shell
[root@master ~]# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}'
```
kubeconfig文件创建
```shell
[root@master ~]# cat kubeconfig
apiVersion: v1
clusters:
- cluster:
certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeU1EUXlOakUwTXpjME1Wb1hEVE15TURReU16RTBNemMwTVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTUdZCkVpaTM5Y1ZFWjZvK3FvZmNnb2ErL0phb0M3NkkwbnJOS2gwR3NMZjRqVExxdm0vREl2QXNaOHlFQ2RUK0E0bVIKbnArZ0Fmbit2UkdiUXpRdVdKT21jUXF3cWowK0p1WUN2Z0hoSjZrQ2s0YUZCaTd2bWErbnFBOFZ6ZkhYeldMWApqcGhOMVluS2c2UThDdGdPVzh6cGxzSEg4VU0xaHRqTmVuYkM0WkRtMm5BRHBqT3plRVlzQldGY0lHTGV5THZBCjBXb3Z3Z0ZJYldONjhQaW02V3pDYVpCOTljN0VMVGl5aDJsOUVZYzArdlR4K24rcTdpd0c3U1BLSmIwTzVWa3gKeUNqK2s2eDVjRklkLzl1dmZJNGs3bk5aS1pQeU1oY2JhdEpBb3J5Y0xHYVQybTA3TW9LTTkzZmZkbWd1VW0xRwo5bWZBSHNYLzV3TEF6T3hzMmU4Q0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZJUFJsR1NOb3kxUzhubmpmVVV5QzJjK0JMQVRNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRjA1NTg5Mk8wa0J0dnhvKzlSUwppZ1BNNVRUWEg4VHo0eHh2SlFwbytVY09ZSVZvc2xScGE3ZWlxWi9qd3V5bW9TaDRVeGxBVVBMVFlpa0VxQ01hClF0MHpBTmY5NUJ6eDJhbFhkSFViMVRLN1JkZXE4NjFMSCs4UUxnVlFzSEpCWHRja3FxcFgrWEhaWkU4SkQwYmQKZmhXd3JHSitJTTRVbW1sQ1ZaaGhTNDMyUUtTNFkyNzFuTGtUeXdTQ29HMnpKUGtRUVo4eVJsNG1HWk01VGM3Rwp1bmEySGtJVmhFWk85czNYYW5FSnZjZFQ4ajgyQVpYN2NlZWowdTRHN3pIVjhhUitwUGtFMW0wTXJmQUF4UE9PCjg0Y0hqdW1uRVNIL1NBWVE0NWtsRnlJM0RObDM4RHBGRE12eGgvMXpOQkE5d3cxdEJFQlc4ZnowSzZpVTBhZncKRURzPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
server: https://10.0.0.220:6443
name: kubernetes-admin@kubernetes
contexts:
- context:
cluster: kubernetes-admin@kubernetes
user: dashboard-admin
name: kubernetes-admin@kubernetes
current-context: kubernetes-admin@kubernetes
kind: Config
preferences: {}
users:
- name: dashboard-admin
user:
token: eyJhbGciOiJSUzI1NiIsImtpZCI6InFsRE1GQi1KQnZsZHpUOGZ4WGc1dlU1UHg3UGVrcC02TUNyYmZWcHhFZ3MifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4teGxoenIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiYTM4ZThjZTMtODQ4ZS00ZDk0LWFiY2YtNGQ4MjRkZWViNjk3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.anEX2MBlIo0lKQCGOsl3oZKBQkYujg6twLoO8hbWLAVp3xveAgpt6nW-_FrkG0yy9tIyXa6lpvu-c99ueB4KvKrIF0vJggWT3fU73u75iIwTbqDSghWy_BRFjt9NYuUFL4Mu-sPqra0ELgxYIGSEVuQwmZ8qOFjrQQQ2pKjxt8SsUHGLW-9FgmSgZTHPvZKFnU2V23BC2n_vowff63PF6kfnj1bNzV3Z1YCzgZOdy3jKM6sNKSI3dbcHiJpv5p7XF18qvuSZMJ9tMU4vSwzkQ_OLxsdNYwwD_YfRhua6f0kgWO23Z0lBTRLInejssdIQ31yewg9Eoqv4DhN1jZqhOw
```
2.KubeGems连接
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235104152.png" alt="image-20220828235104152" style="zoom:50%;" />
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235127957.png" alt="image-20220828235127957" style="zoom:50%;" />
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235208725.png" alt="image-20220828235208725" style="zoom:50%;" />
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235303696.png" alt="image-20220828235303696" style="zoom:50%;" />
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235332423.png" alt="image-20220828235332423" style="zoom:50%;" />
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235402611.png" alt="image-20220828235402611" style="zoom:50%;" />
#### 2.查看kubernetes节点
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235439473.png" alt="image-20220828235439473" style="zoom:50%;" />
#### 3.查看资源概览
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235613811.png" alt="image-20220828235613811" style="zoom:50%;" />
#### 4.组件管理
<img src="https://xingdian-image.oss-cn-beijing.aliyuncs.com/xingdian-image/image-20220828235643825.png" alt="image-20220828235643825" style="zoom:50%;" />