Kind 介绍

Kind是Kubernetes In Docker的缩写,顾名思义是使用Docker容器作为Node并将Kubernetes部署至其中的一个工具。官方文档中也把Kind作为一种本地集群搭建的工具进行推荐。默认情况下,Kind会先下载kindest/node镜像,该镜像包含kubernetes的主要组件,当镜像节点准备好时,Kind使用kubeadm进行集群的创建,内部使用containerd跑组件容器。最终,Kind只是为了方便测试kubernetes集群的,且不可用于生产环境。

部署Kind

Kind使用Golang进行开发,在仓库的Release页面,已经上传了构建好的二进制,支持多种操作系统,可直接按需下载进行使用。

wget -O /usr/local/bin/kind https://github.com/kubernetes-sigs/kind/releases/download/v0.8.1/kind-linux-amd64 && chmod +x /usr/local/bin/kind

# kind v0.8.1版本支持最新kubernetes v1.18.2集群

安装docker

yum-config-manager --add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
sed -i 's#download.docker.com#mirrors.ustc.edu.cn/docker-ce#g' /etc/yum.repos.d/docker-ce.repo
yum install -y docker-ce

部署kubectl

wget -O /usr/local/bin/kubctl https://storage.googleapis.com/kubernetes-release/release/v1.18.5/bin/linux/amd64/kubectl
chmod +x /usr/local/bin/kubectl

创建kind单集群

使用kind命令创建

使用kind create 创建集群,默认是单节点集群。

# kind create cluster --name test
Creating cluster "test" ...
✓ Ensuring node image (kindest/node:v1.18.2)
✓ Preparing nodes
✓ Creating kubeadm config
✓ Starting control-plane ️
✓ Installing CNI
✓ Installing StorageClass Cluster creation complete. You can now use the cluster with: export KUBECONFIG="$(kind get kubeconfig-path --name="test")"
kubectl cluster-info

在docker环境下,会启动一个镜像

CONTAINER ID        IMAGE                              COMMAND                  CREATED             STATUS              PORTS                                                                      NAMES
2e0a5e15a4a0 kindest/node:v1.18.2 "/usr/local/bin/entr…" 14 minutes ago Up 14 minutes 45319/tcp, 127.0.0.1:45319->6443/tcp test-control-plane

查看集群信息

export KUBECONFIG="$(kind get kubeconfig-path --name="test")"
echo 'export KUBECONFIG="$(kind get kubeconfig-path --name=test)"' >> /root/.bashrc kubectl cluster-info
Kubernetes master is running at https://localhost:45319
KubeDNS is running at https://localhost:45319/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'. kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
test-control-plane Ready master 16m v1.18.2 172.17.0.2 <none> Ubuntu Disco Dingo (development branch) 3.10.0-693.el7.x86_64 containerd://1.2.6-0ubuntu1 kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-fb8b8dccf-6r58d 1/1 Running 0 17m
kube-system coredns-fb8b8dccf-bntk8 1/1 Running 0 17m
kube-system etcd-test-control-plane 1/1 Running 0 17m
kube-system ip-masq-agent-qww8n 1/1 Running 0 17m
kube-system kindnet-vbz6w 1/1 Running 0 17m
kube-system kube-apiserver-test-control-plane 1/1 Running 0 16m
kube-system kube-controller-manager-test-control-plane 1/1 Running 0 17m
kube-system kube-proxy-wf7dq 1/1 Running 0 17m
kube-system kube-scheduler-test-control-plane 1/1 Running 0 16m

启动nginx app

kubectl run nginx --image nginx:1.17.0-alpine --restart=Never --port 80 --labels="app=nginx-test"

kubectl port-forward --address 0.0.0.0 pod/nginx 8080:80
curl localhost:8080

指定配置文件创建

# cat kube-config.yaml
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodes: # 指定节点,默认是一个节点
- role: control-plane # kind create cluster --name test2 --config kube-config.yaml
Creating cluster "test2" ...
✓ Ensuring node image (kindest/node:v1.18.2)
✓ Preparing nodes
✓ Creating kubeadm config
✓ Starting control-plane ️
✓ Installing CNI
✓ Installing StorageClass
Cluster creation complete. You can now use the cluster with: export KUBECONFIG="$(kind get kubeconfig-path --name="test2")"
kubectl cluster-info

创建kind-ha集群

只能通过配置文件来声明ha集群配置

# cat kind-ha-config.yaml
kind: Cluster
apiVersion: kind.sigs.k8s.io/v1alpha3
kubeadmConfigPatches:
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodeRegistration:
kubeletExtraArgs:
pod-infra-container-image: registry.aliyuncs.com/google_containers/pause:3.1
- |
apiVersion: kubeadm.k8s.io/v1beta2
kind: InitConfiguration
metadata:
name: config
networking:
serviceSubnet: 10.0.0.0/16
imageRepository: registry.aliyuncs.com/google_containers
nodes: #主要修改这个位置,增加role,指定node节点,工作节点名称必须为worker,master节点必须为control-plane
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker # kind create cluster --name test-ha --config kind-ha-config.yaml
Creating cluster "test-ha" ...
✓ Ensuring node image (kindest/node:v1.18.2)
✓ Preparing nodes
✓ Configuring the external load balancer ⚖️
✓ Creating kubeadm config
✓ Starting control-plane ️
✓ Installing CNI
✓ Installing StorageClass
✓ Joining more control-plane nodes
✓ Joining worker nodes Cluster creation complete. You can now use the cluster with: export KUBECONFIG="$(kind get kubeconfig-path --name="test3")"
kubectl cluster-info # kubectl get nodes
NAME STATUS ROLES AGE VERSION
test3-control-plane Ready master 7m44s v1.18.2
test3-control-plane2 Ready master 4m59s v1.18.2
test3-control-plane3 Ready master 2m18s v1.15.0
test3-worker Ready <none> 110s v1.15.0
test3-worker2 Ready <none> 109s v1.15.0
test3-worker3 Ready <none> 105s v1.15.0

常用操作

kind 是基于 docker 的,那么我们再来看下 docker 资源,来验证一下是否真的是基于 docker 的?

# 本机执行,就会提示有个docker容器正在运行,可以看到 docker 里有一个 container,而 kind 创建的集群就是基于这个 container 的,如果你直接删掉了这个 container,通过 kind 创建的 k8s 集群也会有问题

docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2e0a5e15a4a0 kindest/node:v1.18.2 "/usr/local/bin/entr…" 14 minutes ago Up 14 minutes 45319/tcp, 127.0.0.1:45319->6443/tcp test-control-plane

再来看一下 network,运行 docker network ls,可以看到有一个名称为 kind 的 network。

docker network ls
NETWORK ID NAME DRIVER SCOPE
94de31154cb7 bridge bridge local
0c31de104d44 host host local
a667b873436d kind bridge local
6083dbc308a4 none null local

我们可以进一步探究 kind-control-plane(就是上面的 docker container)

通过 docker exec kind-control-plane crictl ps 获取这个容器内部的运行容器列表,这个容器内部通过 crictl 来操作容器,可以参考 https://github.com/kubernetes-sigs/cri-tools,crtctl 主要用来管理容器,命令使用和docker命令是一样,可以通过 docker exec kind-control-plane crictl help 帮助查看命令使用方法。

# master 节点
docker exec kind-ha-control-plane crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
4b62cd954c86a ace0a8c17ba90 18 minutes ago Running kube-controller-manager 3 8f000bb1c20f3
90552a29c50d9 db10073a6f829 19 minutes ago Running local-path-provisioner 8 7e648bc7297b1
268f41443c426 a3099161e1375 19 minutes ago Running kube-scheduler 4 a64377f98d627
aa3fea2edc80d 67da37a9a360e 3 hours ago Running coredns 0 719884414c5f4
04c58978f5395 67da37a9a360e 3 hours ago Running coredns 0 da6e08629ac71
110429a5a873b 2186a1a396deb 3 hours ago Running kindnet-cni 0 5359903320ef9
1c125b02f6300 0d40868643c69 3 hours ago Running kube-proxy 0 9ba4d0a1fdd3d
0301cd4d26d9c 6ed75ad404bdd 3 hours ago Running kube-apiserver 0 4905e2b2a8a1a
435ee12a45bff 303ce5db0e90d 3 hours ago Running etcd 0 96f4e9190bede # worker节点
docker exec kind-ha-worker crictl ps
CONTAINER IMAGE CREATED STATE NAME ATTEMPT POD ID
5e82bf4756b6f bfba26ca350c1 21 minutes ago Running nginx 0 78d1324b8b1a1
ea02b20040341 0d40868643c69 3 hours ago Running kube-proxy 0 de6a57d0b7381
c2aa986df532f 2186a1a396deb 3 hours ago Running kindnet-cni 1 ebea7a329cfe0

获取 k8s 集群所有资源示例

kubectl get all --all-namespaces

获取集群外部的config配置配置文件

kind  get kubeconfig --name kind-ha

获取集群内部的config配置配置文件(一般获取外部就够用了)

kind  get kubeconfig --internal --name kind-ha

删除集群(清理很方便)

kind delete cluster --name test

挂载文件

nodes:
- role: control-plane
extraMounts:
- containerPath: /etc/docker/daemon.json
hostPath: /etc/docker/daemon.json
readOnly: true

暴露端口方法1

nodes:
- role: control-plane
extraPortMappings:
- containerPort: 30080
hostPort: 30080

有时候我们想暴露svc的端口给外部访问,因为kubernetes的节点是在docker容器中,所以还需要容器暴露svc的端口,外部才能通过宿主机访问。

暴露端口方法2

# 使用端口转发的方式

kubectl port-forward --address 0.0.0.0 pod/nginx 8080:80

从私有仓库下载镜像

docker exec test-drone-control-plane bash -c "sed -i '56a\        [plugins.cri.registry.mirrors.\"192.168.77.134:5000\"]' /etc/containerd/config.toml"
docker exec test-drone-control-plane bash -c "sed -i '57a\ endpoint = [\"http://192.168.77.134:5000\"]' /etc/containerd/config.toml"
docker exec test-drone-control-plane bash -c "cat /etc/containerd/config.toml"
docker exec test-drone-control-plane bash -c 'kill -s SIGHUP $(pgrep containerd)'
COPY

还可以通过挂载文件的方式,挂载containerd的配置文件

重启集群

docker stop test-drone-control-plane
docker start test-drone-control-plane
COPY

总之,kind可以很方便的在docker环境下创建测试集群,而不污染我们的宿主机,给我们测试提供了很大的便利。

示例:使用持久卷部署WordPress和MySQL

本教程向您展示如何使用Kind部署WordPress网站和MySQL数据库。这两个应用程序都使用PersistentVolumes和PersistentVolumeClaims来存储数据。

PersistentVolume(PV)是已经由管理员手动供应,或动态地使用由Kubernetes置备集群中的一块存储的StorageClassPersistentVolumeClaim(PVC)是由能够由PV满足用户对于存储的请求。PersistentVolumes和PersistentVolumeClaims与Pod生命周期无关,并通过重新启动,重新计划甚至删除Pod来保留数据。

警告:此部署不适合生产用例,因为它使用单实例WordPress和MySQL Pods。考虑使用WordPress Helm Chart在生产中部署WordPress。

注意:本教程中提供的文件使用的是GA Deployment API,并且特定于kubernetes 1.9和更高版本。如果您希望将本教程与Kubernetes的早期版本一起使用,请相应地更新API版本,或参考本教程的早期版本。

目标

  • 创建PersistentVolumeClaims和PersistentVolumes
  • 创建一个kustomization.yaml
    • Secret密码配置
    • MySQL资源配置
    • WordPress资源配置
  • 通过以下方式应用Kustomization目录 kubectl apply -k ./
  • 清理

在你开始之前

您需要具有Kubernetes集群,并且必须将kubectl命令行工具配置为与集群通信。如果还没有集群,则可以使用Minikube或者是Kind创建一个集群,也 可以使用以下Kubernetes游乐场之一:

要检查版本,请输入kubectl version。此页面上显示的示例适用于kubectl1.14及更高版本,上面我们已经创建了kind-ha集群,直接执行后面的步骤既可。

kubectl version
Client Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.5", GitCommit:"e6503f8d8f769ace2f338794c914a96fc335df0f", GitTreeState:"clean", BuildDate:"2020-06-26T03:47:41Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"18", GitVersion:"v1.18.2", GitCommit:"52c56ce7a8272c798dbc29846288d7cd9fbae032", GitTreeState:"clean", BuildDate:"2020-04-16T11:48:36Z", GoVersion:"go1.13.9", Compiler:"gc", Platform:"linux/amd64"}

下载以下配置文件:

  1. mysql-deployment.yaml
  2. wordpress-deployment.yaml

创建PersistentVolumeClaims和PersistentVolumes

MySQL和Wordpress都需要一个PersistentVolume来存储数据。他们的PersistentVolumeClaims将在部署步骤中创建。

许多集群环境都安装了默认的StorageClass。如果在PersistentVolumeClaim中未指定StorageClass,则使用群集的默认StorageClass。

创建PersistentVolumeClaim后,将根据StorageClass配置动态设置PersistentVolume。

# 查看StorageClass
kubectl get sc kubectl describe sc $(kubectl get sc |grep default|awk 'NR==2{print $1}')

警告:在本地集群中,默认的StorageClass使用hostPath配置程序。hostPath该卷仅适用于开发和测试。有了hostPath卷,您的数据/tmp将驻留在Pod调度到的节点上,并且不会在节点之间移动。如果Pod死亡并被调度到群集中的另一个节点,或者该节点被重新引导,则数据将丢失。

注意:如果要启动需要使用hostPath配置程序的群集,则--enable-hostpath-provisioner必须在controller-manager组件中设置该标志。

注意:如果您有一个在Kubernetes Engine上运行的Kubernetes集群,请遵循本指南

创建一个Secret密码文件kustomization.yaml

secret是一个对象,其存储了一块如密码或密钥的敏感数据。从1.14开始,kubectl支持使用kustomization文件管理Kubernetes对象。您可以通过中的生成器创建Secret kustomization.yaml

kustomization.yaml从以下命令中添加一个Secret生成器。您将需要替换YOUR_PASSWORD为您要使用的密码。

cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=YOUR_PASSWORD
EOF

为MySQL和WordPress添加资源配置

以下清单描述了单实例MySQL部署。MySQL容器将PersistentVolume挂载在/ var / lib / mysql。在MYSQL_ROOT_PASSWORD环境变量设置从secret数据库密码。

application/wordpress/mysql-deployment.yaml

apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim

以下清单描述了单实例WordPress部署。WordPress容器将PersistentVolume安装在/var/www/html用于网站数据文件的位置。在WORDPRESS_DB_HOST环境变量设置上面定义的MySQL服务的名称,WordPress会由服务访问数据库。在 WORDPRESS_DB_PASSWORD环境变量设置从生成的秘密kustomize数据库密码。

application/wordpress/wordpress-deployment.yaml

application/wordpress/wordpress-deployment.yaml 

apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim

使用curl 命令直接下载配置文件

  1. 下载MySQL部署配置文件。

    curl -LO https://k8s.io/examples/application/wordpress/mysql-deployment.yaml
  2. 下载WordPress配置文件。

    curl -LO https://k8s.io/examples/application/wordpress/wordpress-deployment.yaml
  3. 将它们添加到kustomization.yaml文件。

    cat <<EOF >>./kustomization.yaml
    resources:
    - mysql-deployment.yaml
    - wordpress-deployment.yaml
    EOF

执行并验证

kustomization.yaml包含用于部署WordPress网站和MySQL数据库的所有资源。您可以通过以下方式启动应用

kubectl apply -k ./

现在,您可以验证所有对象是否存在。

  1. 通过运行以下命令来验证机密是否存在:

    kubectl get secrets

    响应应如下所示:

    NAME                    TYPE                                  DATA   AGE
    mysql-pass-c57bb4t7mf Opaque 1 9s
  2. 验证是否已动态配置PersistentVolume。

    kubectl get pvc

    注意:设置和绑定PV可能要花费几分钟。

    响应应如下所示:

    NAME             STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS       AGE
    mysql-pv-claim Bound pvc-8cbd7b2e-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s
    wp-pv-claim Bound pvc-8cd0df54-4044-11e9-b2bb-42010a800002 20Gi RWO standard 77s
  3. 通过运行以下命令来验证Pod是否正在运行:

    kubectl get pods

    注意: Pod的状态最多可能需要几分钟的时间RUNNING

    响应应如下所示:

    NAME                               READY     STATUS    RESTARTS   AGE
    wordpress-mysql-1894417608-x5dzt 1/1 Running 0 40s
  4. 通过运行以下命令来验证服务是否正在运行:

    kubectl get services wordpress

    响应应如下所示:

    NAME        TYPE            CLUSTER-IP   EXTERNAL-IP   PORT(S)        AGE
    wordpress LoadBalancer 10.0.0.89 <pending> 80:32406/TCP 4m

    注意: Minikube只能通过公开服务NodePort。EXTERNAL-IP始终处于挂起状态。

    ​ 当前我使用的是kind创建集群,可以直接通过端口转发方式,进行访问WordPress页面

  5. 运行以下命令以获取WordPress服务的IP地址:

    kubectl port-forword --address 0.0.0.0 svc/wordpress 8000:80
  6. 复制IP地址,然后将页面加载到浏览器中以查看您的站点。

    您应该看到类似于以下屏幕截图的WordPress设置页面。

警告:请勿在此页面上保留WordPress安装。如果其他用户找到了它,他们可以在您的实例上建立一个网站并使用它来提供恶意内容。

通过创建用户名和密码来安装WordPress或删除您的实例。

删除WordPress

  1. 运行以下命令以删除您的密钥,部署,服务和PersistentVolumeClaims:

    kubectl delete -k ./

Kubernetes容器化工具Kind实践部署Kubernetes v1.18.x 版本, 发布WordPress和MySQL的更多相关文章

  1. 【k8s学习笔记】使用 kubeadm 部署 v1.18.5 版本 Kubernetes集群

    说明 本文系搭建kubernetes v1.18.5 集群笔记,使用三台虚拟机作为 CentOS 测试机,安装kubeadm.kubelet.kubectl均使用yum安装,网络组件选用的是 flan ...

  2. 利用Google开源Java容器化工具Jib构建镜像

    转载:https://blog.csdn.net/u012562943/article/details/80995373 一.前言 容器的出现让Java开发人员比以往任何时候都更接近“编写一次,到处运 ...

  3. ASP.NET Core应用程序容器化、持续集成与Kubernetes集群部署(一)(转载)

    本文结构 ASP.NET Core应用程序的构建 ASP.NET Core应用程序容器化所需注意的问题 应用程序的配置信息 端口侦听 ASP.NET Core的容器版本 docker镜像构建上下文(B ...

  4. 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践

    [点击 关注「 WeiyiGeek」公众号 ] 设为「️ 星标」每天带你玩转网络安全运维.应用开发.物联网IOT学习! 希望各位看友[关注.点赞.评论.收藏.投币],助力每一个梦想. 本章目录 目录 ...

  5. Kubernetes容器编排探索与实践v1.22.1-上半部分

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  6. 云原生时代之Kubernetes容器编排初步探索及部署、使用实战-v1.22

    概述 **本人博客网站 **IT小神 www.itxiaoshen.com Kubernetes官网地址 https://kubernetes.io Kubernetes GitHub源码地址 htt ...

  7. Kubernetes容器云平台建设实践

    [51CTO.com原创稿件]Kubernetes是Google开源的一个容器编排引擎,它支持自动化部署.大规模可伸缩.应用容器化管理.伴随着云原生技术的迅速崛起,如今Kubernetes 事实上已经 ...

  8. 容器化时代我们应当选择Kubernetes

    前天发的文章<基于Kubernetes 构建.NET Core 的技术体系>,有同学问.NET Core上有Spring Cloud类似的平台吗? .NET Core出现这么久了,这个为云 ...

  9. 部署一套完整的Kubernetes高可用集群(二进制,v1.18版)

    一.前置知识点 1.1 生产环境可部署Kubernetes集群的两种方式 目前生产部署Kubernetes集群主要有两种方式: kubeadm Kubeadm是一个K8s部署工具,提供kubeadm ...

随机推荐

  1. (二)JavaMail创建包含内嵌图片的邮件

    链接:https://blog.csdn.net/qq_41151659/article/details/96475739 代码如下: import com.sun.mail.util.MailSSL ...

  2. selenium(3)-针对鼠标的操作

    背景 用selenium做自动化,有时候会遇到需要模拟鼠标操作才能进行的情况,比如单击.双击.点击鼠标右键.拖拽等等. 而selenium给我们提供了一个类来处理这类事件-----------Acti ...

  3. Flask框架基础功能

    引言 本文简单汇总Flask框架几大基础功能,包括: 路由系统 模板 数据库 几种常用Flask库 一个简单的Flask事例 Flask是一个基于Python,依赖Jinja2模板和WSGI服务的框架 ...

  4. 多语言工作者の十日冲刺<5/10>

    这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 团队作业第五次--Alpha冲刺 这个作业的目标 团队进行Alpha冲刺--第五天(05.04) 作业正文 ...

  5. vscode启动vue项目出错,给了管理员权限没用

    今天在安装vue环境测试项目的时候, 发现vscode调用终端异常,语句无法运行,百度上给的解决方法是给管理员权限 给了以后发现没用,怎么试都没用,然后想到了,重启大法,然后问题就完美解决了

  6. @PathVariable @RequestParam@RequestBody

    @PathVariable 当使用@RequestMapping URI template 样式映射时, 即 someUrl/{paramId}, 这时的paramId可通过 @Pathvariabl ...

  7. SDL软件安全读书笔记(一)

    # 如何应对当前的全球网络安全威胁? 开发安全漏洞尽可能少的软件,应该着眼于源头安全. 边界安全盒深度防御是重要的安全手段,但软件自身的安全是安全防护的第一关. 即使软件源头存在较少的漏洞,这些漏洞也 ...

  8. 【neo4j】文件管理路径、数据备份、创建新数据库、导入数据等操作记录

    neo4j一般的配置路径如下 一.备份数据 使用neo4j-admin命令. 首先,先找到数据的存储路径,然后关闭数据库. 关闭数据库的语句如下: #切换到/bin目录下 ./neo4j stop 然 ...

  9. 【树形dp】Farmcraft

    题目 In a village called Byteville, there are houses connected with N-1 roads. For each pair of houses ...

  10. Spring FactoryBean 缓存

    相关文章 Spring 整体架构 编译Spring5.2.0源码 Spring-资源加载 Spring 容器的初始化 Spring-AliasRegistry Spring 获取单例流程(一) Spr ...