当前位置: 首页 > news >正文

Kind创建k8s - JAVA操作控制

kind

    • 简介
    • kind 架构
      • 安装 Kind (必备工具)
        • docker官网
        • kubectl官网
        • kind官网
        • 校验安装结果
      • 关于kind 命令
    • 安装一个集群
      • 查看当前 Kubernetes 集群中的节点信息。
      • 查看当前命名空间下中的Pod(容器实例)的信息。
      • 使用 kind create cluster 安装,关于安装方式
        • 查看当前集群运行组件
        • 查看一下 kind 下面是基础容器内部的 /kind 目录
          • 关于: Kubelet、kubeadm 和 kubectl
          • 关于"Weave"
    • 创建集群
      • 查看当前拥有哪些集群
      • 删除某个集群
    • 通过yaml 文件创建集群
      • 端口暴露
        • 搭建集群 带端口映射
      • 部署nginx测试
      • 创建集群搭建 kubernetes-dashboard 控制台
        • 创建 kubernetes-dashboard .yaml
        • 配置 dashboard-config.yaml
        • 确认 kubernetes-dashboard.yaml 映射情况
        • 创建集群
        • 如果没有设置nodePort 会报错 not be used when `type` is 'ClusterIP'
        • 创建Secret - service-account-secret.yaml
        • 应用权限并拿到token
        • thisisunsafe
    • java链接kind 创建的k8s
        • 关于IPv4和IPv6
    • k8s概念
      • 先说一下常用命令
        • get常用命令
        • config常用命令
        • apply 常用命令
      • 关于k8s整体概念

简介

kind 是 Kubernetes in Docker 的简写,是一个使用 Docker 容器作为 Nodes,在本地创建和运行 Kubernetes 群集的工具。适用于在本机创建 Kubernetes 群集环境进行开发和测试。

官网:https://kind.sigs.k8s.io/

kind 由以下组件构成:

  • Go packages implementing cluster creation, image build, etc.
  • A command line interface (kind) built on these packages.
  • Docker image(s) written to run systemd, Kubernetes, etc.
  • kubetest integration also built on these packages (WIP)

kind 使用 kubeadm 创建和启动群集节点。

kind 架构

kind 官方架构图如下,它将 docker 容器作为 kubernetes 的 “node”,并在该 “node” 中安装 kubernetes 组件,包括一个或者多个 Control Plane 和 一个或者多个 Work nodes。这就解决了在本机运行多个 node 的问题,而不需要虚拟化 (sysin)。
在这里插入图片描述

安装 Kind (必备工具)

docker官网
yum -y install yum-utils device-mapper-persistent-datalvm2yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyum makecache fastyum install docker-ce docker-ce-cli containerd.iosystemctl start dockersystemctl enable dockerdocker run hello-world
kubectl官网

kubectl 是Kubernetes的命令行工具,可以让我们通过命令访问、操作、管理Kubernetes集群。brew安装方法如下

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"mv kubectl /usr/local/bin/kubectl
kind官网
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.20.0/kind-linux-amd64
# 如果安装不了 用下面的
chmod +x ./kind
mv ./kind /usr/local/bin/kind
校验安装结果
kubectl version --client
kind version

关于kind 命令

  • build 用来从 k8s source 构建一个镜像。
  • create、delete 创建、删除集群。
  • export 命令目前只有一个 logs 选项,作用是将内部所有容器的日志拷贝到宿主机的某个目录下。
  • get 查看当前有哪些集群,哪些节点,以及 kubectl 配置文件的地址
  • load 可以从宿主机向 k8s 容器内导入镜像。

安装一个集群

kind create cluster

在这里插入图片描述

export KUBECONFIG="$(kind get kubeconfig-path --name="kind")"
kubectl cluster-info

在这里插入图片描述

查看当前 Kubernetes 集群中的节点信息。

kubectl get node

在这里插入图片描述

查看当前命名空间下中的Pod(容器实例)的信息。

kubectl get namespace
kubectl get po -A
kubectl get po -n kube-system

在这里插入图片描述

使用 kind create cluster 安装,关于安装方式

在这里插入图片描述
从安装打印出的输出来看,分为4步:

  1. 查看本地上是否存在一个基础的安装镜像,默认是 kindest/node:v1.13.4,这个镜像里面包含了需要安装的所有东西,包括了 kubectl、kubeadm、kubelet 二进制文件,以及安装对应版本 k8s 所需要的镜像
  2. 准备你的 node,这里就是做一些启动容器、解压镜像之类的工作
  3. 生成对应的 kubeadm 的配置,之后通过 kubeadm 安装,安装之后还会做另外的一些操作,比如像我刚才仅安装单节点的集群,会帮你删掉 master 节点上的污点,否则对于没有容忍的 pod 无法部署。
  4. 启动完毕
查看当前集群运行组件
kubectl get po -n kube-system

默认方式启动的节点类型是 control-plane 类型,包含了所有的组件

  1. 两个coredns
  2. etcd
  3. api-server
  4. controller-manager
  5. kube-proxy
  6. sheduler
  7. 网络插件方面默认使用的是 weave
查看一下 kind 下面是基础容器内部的 /kind 目录

进入容器

docker exec -it kind-control-plane /bin/bashcd /bin
  1. 在 bin 目录下安装了 kubelet、kubeadm、kubectl 这些二进制文件
  2. 在images 下面是镜像的 tar 包,kind 在启动基础镜像后会执行一遍 docker load 操作将这些 tar 包导入
  3. 在manifests 下面是 weave 的 cni
关于: Kubelet、kubeadm 和 kubectl

Kubelet、kubeadm 和 kubectl 是 Kubernetes 生态系统中的三个关键组件,各自具有不同的功能和职责。

  1. Kubelet: Kubelet 是运行在每个 Kubernetes 节点上的组件,负责管理和控制节点上的容器。它与容器运行时(如 Docker、containerd)交互,确保 Pod 的容器在节点上正确创建、启动、停止和删除。Kubelet 还与 Kubernetes 控制平面交互,汇报节点状态和接收分配给节点的任务。
  2. Kubeadm: Kubeadm 是 Kubernetes 官方提供的用于部署和管理 Kubernetes 集群的工具。它简化了 Kubernetes 集群的初始化过程,帮助管理员在几个节点上快速创建一个稳定的、符合最佳实践的集群。Kubeadm 处理集群的引导、证书生成、网络配置、设置控制平面组件等任务,使得集群部署变得更加容易。
  3. Kubectl: kubectl 是 Kubernetes 的命令行工具,用于与 Kubernetes 集群进行交互和管理。它是与 Kubernetes API 通信的主要方式,允许用户执行各种操作,如创建、删除和管理资源(如 Pod、Service、Deployment 等)、查看集群状态、进行日志和调试等。kubectl 是与 Kubernetes 交互的主要入口。
    综上所述,Kubelet 是在每个节点上运行的组件,负责管理和控制容器;kubeadm 是用于部署和初始化 Kubernetes 集群的工具;kubectl 是用于与 Kubernetes 集群进行交互和管理的命令行工具。它们各自扮演着不同的角色,共同构建和管理 Kubernetes 集群。
关于"Weave"

Weave是一种 Kubernetes 网络插件,它提供了一个容器网络接口(Container Networking Interface,CNI)的实现。

  • CNI 是 Kubernetes 中用于管理容器网络的标准接口,它定义了一组规范和API,用于在容器运行时环境中创建、配置和连接容器网络。CNI 插件负责实现这些规范和API,以便 Kubernetes 能够为容器提供网络功能。
  • “Weave CNI” 是基于 Weave 网络的 CNI 插件。它使用 Weave 的技术和协议来创建和管理容器网络。当您在 Kubernetes 中使用 Weave CNI 时,它将负责在各个节点上创建和配置网络接口,使得容器能够在集群中进行通信。

Weave CNI 提供了一种简单而灵活的容器网络解决方案,它能够自动创建虚拟网络,并在不同节点上的容器之间建立安全的通信通道。它还支持网络策略和服务发现等功能,使您能够对容器网络进行更精细的控制和管理。
总而言之,通过使用 Weave CNI 插件,您可以轻松地在 Kubernetes 集群中创建和管理容器网络,实现容器之间的通信和连接。

创建集群

从上诉下载的文档来看默认安装的集群只带上了一个控制节点
在这里插入图片描述
默认的群集名称为kind,使用参数–name指定创建的群集的名称,可以创建多个群集:
在 node 中可以配置的不是很多,除了 role 另外的可以更改 node 使用的镜像,不过我还是使用默认的镜像创建集群

# default
kind create cluster --image kindest/node:latest
# 1.20.0
kind create cluster --image kindest/node:v1.20.0

因为前面已经创建了kind 所以命令如下 使用默认景象,创建为kind-test2 集群

kind create cluster --name kind-2

查看当前拥有哪些集群

通过 kind get clusters 可以看到当前有两个集群
在这里插入图片描述

既然有两个集群,可以通过集群切换到指定对应集群处理。kind-集群

# 切换到群集`kind`
kubectl cluster-info --context kind-kind# 切换到群集`kind-2`
kubectl cluster-info --context kind-kind-2

删除某个集群

 kind get clusters # 指定删除某个kind delete cluster --name kind# 删除全部kind delete cluster --all

通过yaml 文件创建集群

  1. 首先删除所有集群
kind delete cluster --all
  1. 创建配置文件 kind-config.yaml
vim kind-config.yaml 
  1. 创建集群 两个节点 一个平面
apiVersion: kind.sigs.k8s.io/v1alpha3
kind: Cluster
nodes:- role: control-plane- role: worker- role: worker
kind create cluster --name multi-node --config=kind-config.yaml

端口暴露

docker ps

在这里插入图片描述
在这里我被坑了好久,127.0.0.1:38884 映射容器里里面的k8s 6443 导致后无法访问serviceApi 6443端口,因为他要本地的12.0.0.1的ip4网段,这个后面会说

127.0.0.1:38884->6443/tcp

目前可以看到只有33884这个端口可以从外部访问,用kind创建K8s时,相当在本地运行了一个容器,而K8s Cluster就运行在这个容器中。
所以,如果我想从外部访问kind K8s的话,就需要把这个容器的端口(K8s的端口)暴露出来。首先删除所有 k8s cluster

kind delete cluster --all
搭建集群 带端口映射
vim kind-single  #创建一个测试单节点集群
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:- role: control-planekubeadmConfigPatches:- |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"extraPortMappings:- containerPort: 80hostPort: 8001protocol: TCP

创建单节点集群脚本 主机端口 8001 映射到内部容器 80

关于于 ingress-ready=true 需要解释一下

  • role: control-plane 表示该节点将作为控制平面节点运行。
  • kubeadmConfigPatches 是一个配置补丁列表,用于向节点的 kubeadm 配置添加额外的配置项。
  • kind: InitConfiguration 表示正在修改节点的初始化配置。
  • nodeRegistration 部分用于修改节点注册的相关配置。
  • kubeletExtraArgs 是一个用于在节点的 kubelet 配置中添加额外参数的字段。在这个例子中,我们添加了一个 node-labels 参数,并将它设置为 “ingress-ready=true”。
    “ingress-ready=true” 下面扩展端口映射确保只将流量发送到已准备好的节点上
kind create cluster --name tsk8s --config /usr/local/kind-config/kind-single

在这里插入图片描述

部署nginx测试

切换到当前 kind

kubectl cluster-info --context kind-kind
docker ps

创建一个需要部署的应用 nginx.yaml

 
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: web-nginxname: web-nginx-Deployment
spec:replicas: 3selector:matchLabels:app: web-nginxtemplate:metadata:labels:app: web-nginxspec:containers:- image: nginxname: nginxports:- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:name: web-nginx
spec:selector:app: web-nginxtype: NodePortports:- port: 80nodePort: 30080

这是一个 Kubernetes 的 YAML 配置文件示例,描述了一个 Deployment 和一个 Service 的定义。

  • apiVersion: apps/v1 和 apiVersion: v1 分别指定了所使用的 Kubernetes API 的版本。apps/v1 表示使用的是 Apps API 的 v1 版本,而 v1 表示使用的是核心 API 的 v1 版本。
  • kind: Deployment 和 kind: Service 定义了资源的类型。
  • Deployment 表示定义一个 Deployment 资源,用于管理应用程序的副本。
  • Service 表示定义一个 Service 资源,用于暴露应用程序的网络服务。
  • metadata 区域包含元数据信息,如资源的标签和名称。
  • spec 区域定义了资源的规范或配置。

对于 Deployment 部分:

  • replicas: 3 指定了要创建的副本数量为 3。
  • selector 指定了用于选择要进行部署的 Pod 的标签。
  • template 定义了要创建的 Pod 的模板,其中包含了 Pod 的标签、容器以及相关的配置信息。

在 containers 下的

  • image: nginx 指定了要使用的容器镜像
  • name: nginx 为容器命名,
  • ports 下的 - containerPort: 80 指定了容器监听的端口号为 80。
    对于 Service 部分:
  • selector 指定了要将该 Service 与哪些 Pod 进行关联,通过匹配标签 app: web-nginx。
  • type: NodePort 表示 Service 类型为 NodePort,可以通过任意节点的 IP 和指定的 NodePort 来访问该 Service。
  • ports 下的 - port: 80 指定了 Service 其他 Pod 可以通过的端口号为 80,nodePort: 30080 指定了节点上的端口号为 30080,用于外部访问 Service。

这个配置文件描述了一个使用 Nginx 镜像构建的 Deployment 和一个相关的 Service,用于管理和暴露一个名为 web-nginx 的应用程序。

执行以下命令启动应用部署3个pod单位的nginx 本次发布部署为 web-nginx-Deployment

kubectl create -f nginx.yaml

http://你的主机:30070/ . 可以看到

创建集群搭建 kubernetes-dashboard 控制台

可能你会需要kubernetes的控制台

创建 kubernetes-dashboard .yaml
# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.apiVersion: v1
kind: Namespace
metadata:name: kubernetes-dashboard---apiVersion: v1
kind: ServiceAccount
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard---kind: Service
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:ports:- port: 443targetPort: 8443selector:k8s-app: kubernetes-dashboard---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-certsnamespace: kubernetes-dashboard
type: Opaque---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-csrfnamespace: kubernetes-dashboard
type: Opaque
data:csrf: ""---apiVersion: v1
kind: Secret
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-key-holdernamespace: kubernetes-dashboard
type: Opaque---kind: ConfigMap
apiVersion: v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard-settingsnamespace: kubernetes-dashboard---kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
rules:# Allow Dashboard to get, update and delete Dashboard exclusive secrets.- apiGroups: [""]resources: ["secrets"]resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]verbs: ["get", "update", "delete"]# Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.- apiGroups: [""]resources: ["configmaps"]resourceNames: ["kubernetes-dashboard-settings"]verbs: ["get", "update"]# Allow Dashboard to get metrics.- apiGroups: [""]resources: ["services"]resourceNames: ["heapster", "dashboard-metrics-scraper"]verbs: ["proxy"]- apiGroups: [""]resources: ["services/proxy"]resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]verbs: ["get"]---kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboard
rules:# Allow Metrics Scraper to get metrics from the Metrics server- apiGroups: ["metrics.k8s.io"]resources: ["pods", "nodes"]verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
roleRef:apiGroup: rbac.authorization.k8s.iokind: Rolename: kubernetes-dashboard
subjects:- kind: ServiceAccountname: kubernetes-dashboardnamespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: kubernetes-dashboard
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: kubernetes-dashboard
subjects:- kind: ServiceAccountname: kubernetes-dashboardnamespace: kubernetes-dashboard---kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: kubernetes-dashboardname: kubernetes-dashboardnamespace: kubernetes-dashboard
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: kubernetes-dashboardtemplate:metadata:labels:k8s-app: kubernetes-dashboardspec:securityContext:seccompProfile:type: RuntimeDefaultcontainers:- name: kubernetes-dashboardimage: kubernetesui/dashboard:v2.5.0imagePullPolicy: Alwaysports:- containerPort: 8443protocol: TCPargs:- --auto-generate-certificates- --namespace=kubernetes-dashboard# Uncomment the following line to manually specify Kubernetes API server Host# If not specified, Dashboard will attempt to auto discover the API server and connect# to it. Uncomment only if the default does not work.# - --apiserver-host=http://my-address:portvolumeMounts:- name: kubernetes-dashboard-certsmountPath: /certs# Create on-disk volume to store exec logs- mountPath: /tmpname: tmp-volumelivenessProbe:httpGet:scheme: HTTPSpath: /port: 8443initialDelaySeconds: 30timeoutSeconds: 30securityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsUser: 1001runAsGroup: 2001volumes:- name: kubernetes-dashboard-certssecret:secretName: kubernetes-dashboard-certs- name: tmp-volumeemptyDir: {}serviceAccountName: kubernetes-dashboardnodeSelector:"kubernetes.io/os": linux# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedule---kind: Service
apiVersion: v1
metadata:labels:k8s-app: dashboard-metrics-scrapername: dashboard-metrics-scrapernamespace: kubernetes-dashboard
spec:ports:- port: 8000targetPort: 8000selector:k8s-app: dashboard-metrics-scraper---kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: dashboard-metrics-scrapername: dashboard-metrics-scrapernamespace: kubernetes-dashboard
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: dashboard-metrics-scrapertemplate:metadata:labels:k8s-app: dashboard-metrics-scraperspec:securityContext:seccompProfile:type: RuntimeDefaultcontainers:- name: dashboard-metrics-scraperimage: kubernetesui/metrics-scraper:v1.0.7ports:- containerPort: 8000protocol: TCPlivenessProbe:httpGet:scheme: HTTPpath: /port: 8000initialDelaySeconds: 30timeoutSeconds: 30volumeMounts:- mountPath: /tmpname: tmp-volumesecurityContext:allowPrivilegeEscalation: falsereadOnlyRootFilesystem: truerunAsUser: 1001runAsGroup: 2001serviceAccountName: kubernetes-dashboardnodeSelector:"kubernetes.io/os": linux# Comment the following tolerations if Dashboard must not be deployed on mastertolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulevolumes:- name: tmp-volumeemptyDir: {}
配置 dashboard-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:- role: control-planekubeadmConfigPatches:- |kind: InitConfigurationnodeRegistration:kubeletExtraArgs:node-labels: "ingress-ready=true"extraPortMappings:- containerPort: 31000hostPort: 31000protocol: TCP

查看端口映射情况

docker ps

0.0.0.0:31000->31000/tcp, 127.0.0.1:35017->6443/tcp

确认 kubernetes-dashboard.yaml 映射情况

在这里插入图片描述
节点映射 31000. 设置类型为nodePort 供外部访问

在这里插入图片描述


spec:type: NodePortselector:app: kubernetes-dashboardports:- port: 443targetPort: 8443nodePort:31000protocol: TCP
创建集群
kind create cluster  --name kind-dashboard --config=/usr/local/kind-config/cluster/dashboard-cluster-config.yaml

切换到当前容器

kubectl cluster-info --context kind-kind-dashboard

应用 Dashboard

kubectl apply -f /usr/local/kind-config/kubernetes-dashboard.yaml
如果没有设置nodePort 会报错 not be used when type is ‘ClusterIP’
The Service "kubernetes-dashboard" is invalid: spec.ports[0].nodePort: Forbidden: may not be used when `type` is 'ClusterIP'

表明在 Service 对象的定义中,当 type 字段设置为 ClusterIP 时,不允许使用 nodePort 字段。nodePort 字段是用于 NodePort 类型的 Service,而不是 ClusterIP 类型的 Service。
为了解决这个问题,您可以考虑以下两种方法之一:

  • 修改 Service 对象的 type 字段为 NodePort:
  • 如果您只需要 ClusterIP 类型的 Service,请删除 nodePort 字段:

因为是修改dashboard.yaml service 端口映射,如果没有类型默认是 类型 所以要修改一下
在这里插入图片描述

创建Secret - service-account-secret.yaml
# 在kubernetes-dashboard命名空间下创建名为 admin-user 的服务账户
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard---# 将服务账户admin-user绑定到内置的ClusterRole集群角色cluster-admin上, 实现授权
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard---# 对名为admin-user的服务账户手动创建Secret
apiVersion: v1
kind: Secret
metadata:name: admin-user-secretnamespace: kubernetes-dashboardannotations:kubernetes.io/service-account.name: admin-user
type: kubernetes.io/service-account-token

也可以不创建但是需要,创建 ClusterRoleBinding 获得群集 admin 访问权限:都是一样的,这个后面说

应用权限并拿到token
kubectl apply -f /usr/local/kind-config/service-account-secret.yaml

通过service-account-secret.yaml配置文件,给kubernetes-dashboard命名空间下名为admin-user的服务账户手动创建了一个名为admin-user-secret的Secret。现在可以通过该Secret获取相应的Token。通过kubectl describe、kubectl get两种方式获取。

kubectl describe secret admin-user-secret -n kubernetes-dashboard

查看是否ok

kubectl get po,svc -n kubernetes-dashboard

service 上面有对应的端口映射,我们前文已经暴露了,所以31000应该打service的31000
如果不想像上面一样拿token获取,还有一种,不过前期学习不建议,操作如下

  1. 创建 ClusterRoleBinding 获得群集 admin 访问权限:
kubectl create clusterrolebinding default-admin --clusterrole cluster-admin --serviceaccount=default:default
#提示:
clusterrolebinding.rbac.authorization.k8s.io/default-admin created
  1. 创建登录 Dashboard 的 token:
token=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)
  1. 拿到token
echo $token

最后访问:https://你的主机ip:31000/。拿到对应的token去访问,如果访问为不安全的的可能是证书问题,如何解决

thisisunsafe

如果不处理证书,似乎没有什么终极解决办法,

两种方案:

一,点击“高级”,再点击“继续浏览……”,下一次再打开该网页时谷歌浏览器就不会提示不是私密连接了。

二、看到“你的连接不是私密连接”画面时,直接在键盘上敲击“thisisunsafe”12个字母,谷歌浏览器会自动刷新显示网页。

java链接kind 创建的k8s

上面的案例如果看完了,基本我的坑就走完了,你已经大致明白了如何通过kind去如何创建一个k8s了,我也是摸了好多坑肝出来了,但是在机器上面操作并不满足我们的日常需求,太麻烦了,所以能不能像k8s一样去链接service端进行操作。首先说结论,是可行的。连接方式跟我们连接k8s是一样的,你完全可以按我的demo进行操作,不过我也刚打通,里面的还不是很清楚

整体demo依赖可以建一个空项目

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>k8sDemo</artifactId><version>1.0.0-SNAPSHOT</version><name>springboot-k8s</name><description>k8s 介入</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.4.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.google.api-client</groupId><artifactId>google-api-client</artifactId><version>1.32.1</version><exclusions><exclusion><artifactId>guava</artifactId><groupId>com.google.guava</groupId></exclusion></exclusions></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.7</version></dependency><dependency><groupId>io.kubernetes</groupId><artifactId>client-java</artifactId><version>12.0.1</version></dependency><dependency><groupId>io.fabric8</groupId><artifactId>kubernetes-client</artifactId><version>5.10.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version></dependency></dependencies></project>
package com.k8s.demo;import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.Configuration;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.models.V1Pod;
import io.kubernetes.client.openapi.models.V1PodList;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.KubeConfig;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import org.springframework.util.ResourceUtils;import java.io.FileReader;
import java.io.IOException;@Slf4j
public class KubernetesExample {public static void main(String[] args) {try {// 创建ApiClientString kubeConfigPath = ResourceUtils.getURL("classpath:config").getPath();ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();OkHttpClient httpClient = client.getHttpClient().newBuilder().hostnameVerifier((hostname, session) -> true)  // 允许任何主机名.build();client.setHttpClient(httpClient);Configuration.setDefaultApiClient(client);CoreV1Api api = new CoreV1Api();// invokes the CoreV1Api clientV1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null, null);System.out.println("Listing all pods: ");for (V1Pod item : list.getItems()) {System.out.println(item.getMetadata().getName());}} catch (IOException e) {log.error("读取kubeConfigPath异常", e);} catch (Exception e) {log.error("构建K8s-Client异常", e);}}
}

关于这个:classpath:config:在你主机上输入

vim ~/.kube/config

把这个配置文件拿下来,里面有你这个主机所有集群的配置,你也可以作为参数传入进去,这个就看你自己
在这里插入图片描述

如果你看到这个样子,已经通了。但是这个连接没有证书,后面可能需要处理一下,既然已经到这里了,其实还是要聊一下k8s
可能你在连接的时候会出现以下错误


当你连接到 Kubernetes 集群时,可能会遇到 javax.net.ssl.SSLPeerUnverifiedException 异常,而异常消息是 Hostname not verified 或者类似的错误信息。

这个错误通常是由于连接的主机名与证书中的主机名不匹配引起的。为了确保安全,SSL/TLS 连接需要验证证书中的主机名与实际连接的主机名是否匹配。上文我已经忽略了


还有可能出现,Kubernetes control plane is running at https://[::1]:对应端口 这是你用了ipv6 但是又没有指定,以为他是支持ipv4 和 ipv6的
你如果对于ipv4和ipv6不了解没关系下面我会说一下


你还可能会出现 你的主机不是 127.0.0.1,而你无法通过 kubectl 访问 kind 创建的本地 Kubernetes 集群这时候你需要指定,在创建集群的时候,来源为kind 的配置文件

kind配置文件网址 对应配置 以下为我摘要的

您可以在 iptables 和 ipvs 之间配置将使用的 kube-proxy 模式。默认情况下使用 iptables

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:kubeProxyMode: "ipvs"

在这里插入图片描述

所以你可能需要配置一下地址,为0.0.0.0 这样所有ipv4的都可以访问
在这里插入图片描述


关于IPv4和IPv6

IPv4和IPv6是互联网协议的两个版本,它们之间的主要区别在于地址的格式和长度。

IPv4使用32位地址,表示为4个十进制数,每个数的取值范围为0-255,例如:192.168.0.100。IPv4地址空间有限,随着互联网的快速发展,IPv4地址已经趋于枯竭。

IPv6使用128位地址,表示为8组16进制数,每组之间用冒号分隔,例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334。IPv6拥有更大的地址空间,可以容纳更多的设备和连接。

在容器服务中,使用IPv4或IPv6来访问容器的服务有以下区别:

IP地址格式:IPv4使用点分十进制表示法,IPv6使用冒号分隔的16进制表示法。

地址空间:IPv4地址空间有限,而IPv6地址空间更加广阔。

支持设备数量:IPv6能够支持更多的设备和连接,可以满足互联网发展的需求。

兼容性:由于IPv4和IPv6是不同的地址格式,不同的网络设备和应用程序可能对IPv6支持程度不同。一些旧的设备和应用程序可能仅支持IPv4。

在选择使用IPv4还是IPv6来访问容器服务时,需要考虑网络环境、设备支持和应用程序需求等因素。同时,还需要确保网络配置正确并与容器服务的网络配置相匹配,以确保能够成功访问容器的服务。

k8s概念

先说一下常用命令


#获取资源列表:kubectl get pods:获取所有 Pods 列表。
kubectl get deployments:获取所有部署列表。
kubectl get services:获取所有服务列表。
kubectl get nodes:获取所有节点列表。
kubectl get namespaces:获取所有命名空间列表。#查看资源详细信息:
kubectl describe pod <pod名称>:查看特定 Pod 的详细信息。
kubectl describe deployment <deployment名称>:查看特定部署的详细信息。
kubectl describe service <service名称>:查看特定服务的详细信息。#创建、更新和删除资源:
kubectl create -f <文件>:根据指定的 YAML 文件创建资源。
kubectl apply -f <文件>:根据指定的 YAML 文件创建或更新资源。
kubectl delete <资源类型> <资源名称>:删除指定的资源。#执行操作:
kubectl exec -it <pod名称> -- <命令>:在特定 Pod 中执行命令。
kubectl logs <pod名称>:查看特定 Pod 的日志。#其他常用命令:
kubectl config view:查看当前的 kubeconfig 配置。
kubectl cluster-info:查看集群的信息。
get常用命令
#以ps输出格式列出所有Pod
kubectl get pods#以更详细的信息(如节点名称)的ps输出格式列出所有Pod
kubectl get pods -o wide#以ps输出格式列出指定名称的单个复制控制器
#kubectl get replicationcontroller web#以JSON输出格式列出"apps" API组的"v1"版本中的部署
kubectl get deployments.v1.apps -o json#以JSON输出格式列出单个Pod
kubectl get -o json pod web-pod-13je7#以JSON输出格式列出在"pod.yaml"文件中指定的类型和名称的Pod
kubectl get -f pod.yaml -o json#使用kustomization.yaml文件从目录中列出资源 - 示例:dir/kustomization.yaml
kubectl get -k dir/#只返回指定Pod的阶段值
kubectl get -o template pod/web-pod-13je7 --template={{.status.phase}}#使用自定义列来列出资源信息
kubectl get pod test-pod -o custom-columns=CONTAINER:.spec.containers[0].name,IMAGE:.spec.containers[0].image#以ps输出格式同时列出所有复制控制器和服务
kubectl get rc,services#通过类型和名称列出一个或多个资源
kubectl get rc/web service/frontend pods/web-pod-13je7#列出单个Pod的"status"子资源
kubectl get pod web-pod-13je7 --subresource status
config常用命令
#显示当前上下文(context)
kubectl config current-context#从kubeconfig中删除指定的集群。
kubectl config delete-cluster #:从kubeconfig中删除指定的上下文。
kubectl config delete-context#:从kubeconfig中删除指定的用户。
kubectl config delete-user#:显示在kubeconfig中定义的集群。
kubectl config get-clusters#:描述一个或多个上下文。
kubectl config get-contexts#:显示在kubeconfig中定义的用户。
kubectl config get-users#:重命名kubeconfig文件中的上下文。
kubectl config rename-context#:在kubeconfig文件中设置单个值。
kubectl config set#:在kubeconfig中设置一个集群条目。
kubectl config set-cluster#:在kubeconfig中设置一个上下文条目。
kubectl config set-context#:在kubeconfig中设置一个用户条目。
kubectl config set-credentials#:在kubeconfig文件中取消设置单个值。
kubectl config unset#:在kubeconfig文件中设置当前上下文。
kubectl config use-context#:显示合并的kubeconfig设置或指定的kubeconfig文件。
kubectl config view
apply 常用命令
#:将pod.json文件中的配置应用到一个Pod。
kubectl apply -f ./pod.json#:从包含kustomization.yaml的目录中应用资源配置。例如:dir/kustomization.yaml。
kubectl apply -k dir/#:将stdin中的JSON配置应用到一个Pod。
cat pod.json | kubectl apply -f -#:应用所有以'.json'结尾的文件中的配置。
kubectl apply -f '*.json'#:应用manifest.yaml文件中匹配标签app=nginx的配置,并删除所有不在文件中且不匹配标签app=nginx的其他资源(注意:--prune仍处于Alpha阶段)。
kubectl apply --prune -f manifest.yaml -l app=nginx#:应用manifest.yaml文件中的配置,并删除除了文件中的ConfigMap之外的所有其他配置(--prune-allowlist指定了要保留的资源类型)。
kubectl apply --prune -f manifest.yaml --all --prune-allowlist=core/v1/ConfigMap#:编辑资源/对象的最新last-applied-configuration注释。
kubectl edit-last-applied#:将一个活动对象上的last-applied-configuration注释设置为与文件内容匹配。
kubectl set-last-applied#:查看资源/对象的最新last-applied-configuration注释
kubectl view-last-applied。

关于k8s整体概念

相关文章:

Kind创建k8s - JAVA操作控制

kind 简介kind 架构安装 Kind (必备工具)docker官网kubectl官网kind官网校验安装结果 关于kind 命令 安装一个集群查看当前 Kubernetes 集群中的节点信息。查看当前命名空间下中的Pod&#xff08;容器实例&#xff09;的信息。使用 kind create cluster 安装&#xff0c;关于安…...

Qt sender()函数

sender函数原型&#xff1a; QObject *sender() const; 如果在由信号激活的插槽中调用该函数&#xff0c;返回指向发送信号的对象的指针&#xff0c;否则返回0&#xff0c;该指针仅在从该对象的线程上下文调用此函数的槽执行期间有效。 主要代码如下&#xff1a; 其中运用了Q…...

Java开发框架和中间件面试题(6)

目录 61.什么是Spring Batch&#xff1f; 62.请举例解释Required与Qualifier注解&#xff1f; 61.什么是Spring Batch&#xff1f; Spring batch是一个轻量级的&#xff0c;完善的批处理框架&#xff0c;他主要的目的在于帮助企业建立健壮&#xff0c;高效的批处理应用。Spri…...

附录E SQL入门之SQL保留字

本专栏目录 第1课 SQL入门之了解SQL 第2课 SQL入门之检索数据 第3课 SQL入门之排序检索数据 第4课 SQL入门之过滤数据 第5课 SQL入门之高级数据过滤 第6课 SQL入门之用通配符进行过滤 第7课 SQL入门之创建计算字段 第8课 SQL入门之使用数据处理函数 第9课 SQL入门之汇总数据 第…...

thinkphp6.0升级到8.0

目录 一&#xff1a;升级过程 二&#xff1a;报错处理 最近写的项目需要使用thinkphp8.0&#xff0c;之前的老项目需要从php6.0升级到8.0&#xff0c;特此记录下升级过程。 一&#xff1a;升级过程 查看版本&#xff1a; php think version,我目前的版本是6.1.4 生成thin…...

机器学习(一) -- 概述

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理 未完待续…… 目录 系列文章目录 前言 一、机器学习定义&#xff08;是什么&#xff09; 二、机器学习的应用&#xff08;能做什么&#xff09; 三、***机器…...

SpringBoot定时监听RocketMQ的NameServer

问题分析 自己在测试环境部署了RocketMQ&#xff0c;发现namesrv很容易挂掉&#xff0c;于是就想着监控&#xff0c;挂了就发邮件通知。查看了rocketmq-dashboard项目&#xff0c;发现只能监控Broker&#xff0c;遂放弃这一路径。于是就从报错的日志入手&#xff0c;发现最终可…...

电子招标采购系统源码之从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理

在数字化时代&#xff0c;采购管理也正经历着前所未有的变革。全过程数字化采购管理成为了企业追求高效、透明和规范的关键。该系统通过Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;打造了从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通过…...

各部门请注意,VELO维乐潮流骑士尼莫出街啦,快来加入吧!

VELO潮流骑士丨车界“小学生”尼莫&#xff0c;下面是来自她的自诉&#xff1a;      大家好&#xff01;我是尼莫&#xff0c;一枚骑车届的“小学生”&#xff0c;我爱上骑车已经有一年的时间啦&#xff01;在这一年的时间里&#xff0c;骑车改变了我很多&#xff1a;爱上…...

Flutter配置Android和IOS允许http访问

默认情况下&#xff0c;Android和IOS只支持对https的访问&#xff0c;如果需要访问不安全的连接&#xff0c;也就是http&#xff0c;需要做以下配置。 Android 在res目录下的xml目录中(如果不存在&#xff0c;先创建xml目录)&#xff0c;创建一个xml文件network_security_con…...

[设计模式 Go实现] 创建型~抽象工厂模式

抽象工厂模式用于生成产品族的工厂&#xff0c;所生成的对象是有关联的。 如果抽象工厂退化成生成的对象无关联则成为工厂函数模式。 比如本例子中使用RDB和XML存储订单信息&#xff0c;抽象工厂分别能生成相关的主订单信息和订单详情信息。 如果业务逻辑中需要替换使用的时候…...

移动端开发框架mui代码在安卓模拟器上运行(HbuilderX连接到模拟器)

开发工具 HBuilder X 3.8.12.20230817 注意&#xff1a;开发工具尽量用最新的或较新的。太旧的版本在开发调试过程中可能会出现莫名其妙的问题。 1、电脑下载安装安卓模拟器 我这里使用的是 夜神模拟器 &#xff0c;也可以选择其他安卓模拟器 夜神模拟器官网&#xff1a;夜神安…...

upload-labs Pass-03(黑名单验证,特殊后缀)问题纠正

php任何后缀名解析 背景&#xff1a;为了验证php解析不依靠后缀名&#xff0c;可以是任何后缀名&#xff0c;纠正upload-labs Pass-03&#xff08;黑名单验证&#xff0c;特殊后缀&#xff09;里所说的几个固定的后缀名理论是错误的。1 部署1.1 环境准备1.1.1 系统、内核&#…...

微信小程序-父子页面传值

父子页面传值 父页面向子页面传值 方法一&#xff1a; 父页面&#xff1a; 1. /page/xxx/xxx?id1子页面&#xff1a; onLoad:function(option){ }方法二 <bindtap“func” data-xxx””> 子页面向父页面传值 定义父子页面 父页面&#xff1a;hotspot 子页面&a…...

【JavaScript】浮点数精度问题

✨ 专栏介绍 在现代Web开发中&#xff0c;JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性&#xff0c;还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言&#xff0c;JavaScript具有广泛的应用场景&#x…...

使用axios发送get和post请求

使用axios发送get和post请求的方法如下&#xff1a; 1.发送GET请求&#xff1a; axios.get(url).then(response > {// 请求成功的处理逻辑console.log(response.data);}).catch(error > {// 请求失败的处理逻辑console.error(error);});2.发送POST请求&#xff1a; ax…...

【基于VirtualBox及openEuler20.03 TLS SP1编译openGauss2.1.0源码】

【openEuler 20.03 TLS编译openGauss2.1.0源码】 一、安装环境二、安装步骤 一、安装环境 项目Value虚拟机virtualbox操作系统openEuler 20.03 TLSopenGauss2.1.0openGauss-third_party2.1.0 二、安装步骤 以下操作需要在root用户下执行 编辑/etc/selinux/config vim /etc/s…...

hibernate 使用注解+拦截器实现自动开启、关闭session,提交、回滚事务

hibernate 使用注解+注解拦截器实现自动开启、关闭session,开启、提交、回滚事务 项目为springboot项目 ,springboot版本为:2.5.11, hiernate-core5.4.3 版本。spring-xxx 等为5.3.17版本 注意:在spring-xxx4.x版本+ hiernate-core5.x.x版本中,hibernate的配置 true是有效的…...

Solidworks学习笔记

本内容为solidworks的学习笔记&#xff0c;根据自己的理解进行记录&#xff0c;部分可能不正确&#xff0c;请自行判断。 学习视频参考&#xff1a;【SolidWorks2018视频教程 SW2018中文版软件基础教学知识 SolidWorks自学教程软件操作教程 sw视频教程 零基础教程 视频教程】 h…...

Redis经典五大类型源码及底层实现(一)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…...

数据库闭包求法 附相关习题及解析

闭包就是由一个属性直接或间接推导出的所有属性的集合 以下是写的比较科学规范的闭包求解方法&#xff0c;设X和Y均为关系R的属性集的子集&#xff0c;F是R上的函数依赖集&#xff0c;若对R的任一属性集B&#xff0c;一旦X→B&#xff0c;必有B⊆Y&#xff0c;且对R的任一满足…...

idea利用JRebel插件,无需重启,实现Spring Boot项目热重载,节省开发时间和精力!

插件介绍 官方介绍 翻译过来的意思是&#xff1a; JRebel 是一款提高开发效率的工具&#xff0c;允许开发者立即重新加载代码更改。它跳过了在Java开发中常见的重新构建、重启和重新部署循环。JRebel 能够让开发者在相同的时间内完成更多工作&#xff0c;并且在编码时能够保持…...

学习体系结构 - AArch64内存管理

学习体系结构 - AArch64内存管理 Learn the architecture - AArch64 memory management Version 1.2 个人的英语很一般&#xff0c;对拿不准的翻译校准在后面添加了英文原文。 1、 概述 本指南介绍了AArch64中的内存转换&#xff0c;这是内存管理的关键。它解释了如何将虚拟地…...

Vue3 精通指南:如何在 setup 函数中巧妙利用 Vuex

在 Vue 3 中&#xff0c;如果你使用了组合式 API&#xff08;Composition API&#xff09;&#xff0c;你可以通过 setup 函数来设置组件的响应式状态和逻辑。要在 setup 函数中访问 Vuex 的 $store&#xff0c;你可以使用 useStore 钩子&#xff0c;它是 Vuex 4 为 Vue 3 提供…...

Linux 服务器安全策略技巧:启用账户锁定策略

Linux 服务器安全策略技巧:启用账户锁定策略 在Linux服务器上,启用账户锁定策略是一种重要的安全措施。通过锁定账户,可以防止未经授权的访问和恶意活动。本文将介绍如何在Linux服务器上启用账户锁定策略。 什么是账户锁定策略? 账户锁定策略是一种安全措施,用于限制对…...

野火霸道-V2+3.2寸屏+FreeRTOS+LVGL移植

摘要 基于野火霸道-V23.2寸屏的开发板&#xff0c;下载器为STLINK分为两个版本&#xff0c;FreeRTOS和裸机版本 裸机 裸机准备 lvgl v8.2版本的源码野火的《触摸画板-3.2寸》与《基本定时器》的代码例程 移植 将基本定时器代码移植到触摸画板-3.2寸的例程中&#xff0c;…...

操作教程|MeterSphere UI测试+VNC:简单、快捷地查看UI测试实时执行详情

编者注&#xff1a;本文为CSDN博主hxe116的原创文章。 原文链接为&#xff1a;https://blog.csdn.net/hxe116/article/details/134714960?spm1001.2014.3001.5502 作为一款一站式的开源持续测试平台&#xff0c;MeterSphere涵盖了测试跟踪、接口测试、UI测试和性能测试等功能…...

工具--Git详解

在当今的数字时代&#xff0c;版本控制系统已成为开发人员和团队之间协作的重要工具。其中&#xff0c;Git是最受欢迎的版本控制系统之一。它不仅在软件开发中广泛使用&#xff0c;还被应用于许多其他领域。在这篇博客中&#xff0c;我们将深入了解Git的工作原理、基本命令以及…...

windows server 2022 启用SYN攻击保护

2023.12.28 SYN攻击是什么&#xff1a; SYN攻击是黑客攻击的常用手段&#xff0c;也是最容易被利用的一种攻击手法&#xff0c;属于DDoS攻击的一种。它利用TCP协议缺陷&#xff0c;通过发送大量的半连接请求&#xff0c;耗费CPU和内存资源。 SYN攻击包括大量TCP连接的第一个包&…...

汽车保养软件app开发步骤

“增强您的动力&#xff0c;为您的旅程加油——每一刻都讲述着关爱的故事。构建汽车维护软件app&#xff0c;为您的车辆提供数字化的维修站&#xff0c;从而开启长寿之路。智能驾驶、互联驾驶、自信驾驶。” 疯狂地搜索旧收据并猜测上次换油时间的日子已经一去不复返了。如果您…...

【HarmonyOS】ArkTS语言介绍与组件方式运用

从今天开始&#xff0c;博主将开设一门新的专栏用来讲解市面上比较热门的技术 “鸿蒙开发”&#xff0c;对于刚接触这项技术的小伙伴在学习鸿蒙开发之前&#xff0c;有必要先了解一下鸿蒙&#xff0c;从你的角度来讲&#xff0c;你认为什么是鸿蒙呢&#xff1f;它出现的意义又是…...

音频播放软件Foobar2000 mac特点介绍

Foobar2000 mac是一款高度可定制的音频播放器&#xff0c;适用于Windows平台。它支持各种音频格式&#xff0c;包括MP3、FLAC、AAC、WMA等&#xff0c;同时也支持各种音频插件和效果器&#xff0c;可以提供更好的音质和用户体验。 Foobar2000 mac软件特点 1. 高度可定制&#…...

Oracle动态性能视图 v$parameter 和 v$parameter2 的区别

v$parameter 的说明见这里&#xff1a; V$PARAMETER displays information about the initialization parameters that are currently in effect for the session. v$parameter2 的说明见这里&#xff1a; V$PARAMETER2 displays information about the initialization paramet…...

ssrf之dict协议和file协议

1.dict协议 dict是什么协议呢&#xff1f; 定义&#xff1a;词典网络协议&#xff0c;在RFC 2009中进行描述。它的目标是超越Webster protocol&#xff0c;并允许客户端在使 用过程中访问更多字典。Dict服务器和客户机使用TCP端口2628。 官方介绍&#xff1a;http://dict.o…...

OpenAI GPT 模型 API 接口新增参数 top_logprobs 和 logprobs

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 在最新的 OpenAI 官方 APIs 文档中&#xff0c;Create chat completion 中新增了 top_logprobs 和 logprobs 这两个关键参数。 官方文档地址&#xff…...

React项目打包流程

一、React项目打包流程 一、React项目打包流程1. 项目打包打包命令&#xff1a;npm run build2. 预览接着命令行会提示执行&#xff1a; 先&#xff1a;npm install -g serve 然后执行此命令&#xff1a;serve -s build二、打包优化 - 配置路由懒加载 二、打包优化 - 配置路…...

04-获取认证的用户身份信息

存储用户信息的方式 获取用户信息的流程 用户提交账号和密码后,DaoAuthenticationProvider调用UserDetailsService接口实现类的loadUserByUsername()方法,该方法可以接收请求参数username的值,然后根据该值查询用户信息,最后将账号,密码,权限封装到UserDetails对象中并返回给…...

二叉树的中序遍历,力扣

目录 题目地址&#xff1a; 题目&#xff1a; 解题方法&#xff1a; 解题分析&#xff1a; 解题思路&#xff1a; 代码实现&#xff1a; 注&#xff1a; 代码实现&#xff08;递归&#xff09;&#xff1a; 代码实现&#xff08;迭代&#xff09;&#xff1a; 题目地址&#xf…...

shiro1.10版本后-IniSecurityManagerFactory过期失效

1、问题概述&#xff1f; 今天在研究了shiro的新版本shiro1.13.0版本&#xff0c;发现用了很长时间的IniSecurityManagerFactory工厂失效了。 从下图中可以看出&#xff0c;在新版本中IniSecurityManagerFactory被打上了过期线了。 那么问题来了&#xff0c;新版本如何使用呢…...

阿里后端实习二面

阿里后端实习二面 记录面试题目&#xff0c;希望可以帮助到大家 类加载的流程&#xff1f; 类加载分为三个部分&#xff1a;加载、连接、初始化 加载 类的加载主要的职责为将.class文件的二进制字节流读入内存(JDK1.7及之前为JVM内存&#xff0c;JDK1.8及之后为本地内存)&…...

「Kafka」生产者篇

「Kafka」生产者篇 生产者发送消息流程 在消息发送的过程中&#xff0c;涉及到了 两个线程 ——main 线程和Sender 线程。 在 main 线程中创建了 一个 双端队列 RecordAccumulator。 main线程将消息发送给RecordAccumulator&#xff0c;Sender线程不断从 RecordAccumulator…...

C语言实现RSA算法加解密

使用c语言实现了RSA加解密算法&#xff0c;可以加解密文件和字符串。 rsa算法原理 选择两个大素数p和q&#xff1b;计算n p * q;计算φ(n)(p-1)(q-1)&#xff1b;选择与φ(n)互素的整数d&#xff1b;由de1 mod φ(n)计算得到e&#xff1b;公钥是(e, n), 私钥是(d, n);假设明…...

如何设计前后端分离的系统架构?

如何将前端页面和后端Java代码进行集成&#xff1f; 将前端页面和后端Java代码进行集成通常需要使用一些特定的工具和技术。以下是一些常见的方法&#xff1a; 使用RESTful API&#xff1a;REST&#xff08;Representational State Transfer&#xff09;是一种基于HTTP协议构…...

【强化学习】SARAS代码实现

前言 SARAS&#xff0c;假设环境状态和动作状态都是离散的。利用动作价值矩阵来进行行为的预测。其主要就是利用时序差分的思想&#xff0c;对动作价值矩阵进行更新。 代码实现 import gymnasium as gym import numpy as npclass sarsa():def __init__(self, states_n, acti…...

P1019 [NOIP2000 提高组] 单词接龙 刷题笔记

P1019 [NOIP2000 提高组] 单词接龙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路来自 大佬 Chardo 的个人中心 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 匹配 &#xff1a; 将 第一个字符串末尾 和第二个字符串第一个开始匹配 如果 j<i这段走完了 flag还没…...

如何实现WinApp的UI自动化测试?

WinApp&#xff08;WindowsAPP&#xff09;是运行在Windows操作系统上的应用程序&#xff0c;通常会提供一个可视的界面&#xff0c;用于和用户交互。例如运行在Windows系统上的Microsoft Office、PyCharm、Visual Studio Code、Chrome&#xff0c;都属于WinApp。常见的WinApp&…...

chrome扩展程序开发之在目标页面运行自己的JS

原文地址&#xff1a;https://qdgithub.com/home/index/article/aid/247.html chrome 插件开发的入门介绍&#xff0c;实现利用 chrome 扩展实现在目标网页运行我们的 js 的功能。关于 chrome 扩展的详细内容&#xff0c;可以通过官网了解。 开发工具很简单&#xff0c;记事本…...

NLP项目之语种识别

目录 1. 代码及解读2. 知识点n-grams仅保留最常见的1000个n-grams。意思是n1000 ? 1. 代码及解读 in_f open(data.csv) lines in_f.readlines() in_f.close() dataset [(line.strip()[:-3], line.strip()[-2:]) for line in lines] print(dataset[:5])[(1 december wereld…...

Linux lpr命令教程:如何使用lpr命令打印文件(附案例详解和注意事项)

Linux lpr命令介绍 lpr命令在Unix-like操作系统中用于提交打印任务。如果在命令行中指定了文件名&#xff0c;那么这些文件将被发送到指定的打印机&#xff08;如果没有指定目的地&#xff0c;则发送到默认目的地&#xff09;。如果命令行中没有列出文件&#xff0c;lpr将从标…...

浅谈C语言inline关键字

对于C开发者来说&#xff0c;inline是个再熟悉不过的关键字&#xff0c;因为默认的成员函数都是inline&#xff0c;也是常规高校教材中宣扬C的“优势”之一。 但是C语言其实也是支持inline关键字的&#xff0c;而且是很早期的gcc就支持了该关键字。在Linux0.12版本内核代码中也…...