k8s开发工具Kind

kind是什么

Kubernetes In Docker,将k8s所需要的所有组件,以docker容器的方式部署

为什么用kind

学习、开发k8s应用,本地跑一个k8s更方便,但是直接装一个k8s太重,代码还没敲几行电脑先卡死了,本机需要一个轻量级的k8s用于学习、开发、测试

为什么不用minikube

一、 相同点

  1. Kind、minikube都是Kubernetes官方出品
  2. 都提供了基本的 Kubernetes 功能,如部署应用、管理容器、服务发现等

二、 不同点

  1. Kind基于Docker,所有组件可与线上环境保持一致,易于移植
  2. minikube基于虚拟化,启动时间长,资源消耗大

三、 性能

在基准测试中,Kind比minikube用时少很多
在这里插入图片描述

k3d不是用时更少吗,为什么不用k3d?

k3d是基于k3s的构建工具,k3s用于性能有限的平台,功能比k8s少,倘若用k3s测试、k8s部署,会有一些的差异,容器就是为了提供一致性保障,所以确定上线使用k8s,开发测试时Kind最合适

Linux安装Kind

  • 需要Docker环境:docker version
  1. 安装kubectl

其他系统

下载

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

安装

sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl

验证

kubectl version --client
  1. 安装Kind

下载

# For AMD64 / x86_64
[ $(uname -m) = x86_64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-amd64

# For ARM64
[ $(uname -m) = aarch64 ] && curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.24.0/kind-linux-arm64

授权

chmod +x ./kind

sudo mv ./kind /usr/local/bin/kind

验证

kind --version

kind创建集群

创建默认集群

kind create cluster --name kind

默认集群名kind

出现以下内容就是成功了

Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.31.0) 🖼
 ✓ Preparing nodes 📦
 ✓ Writing configuration 📜
 ✓ Starting control-plane 🕹️
 ✓ Installing CNI 🔌
 ✓ Installing StorageClass 💾
Set kubectl context to "kind-kind"

获取所有命名空间下的 Pod(容器组)列表信息

kubectl get po -A

查看已创建的集群

kind get clusters

删除指定集群

kind delete cluster --name kind

配置kind

kind最小配置

  • kind资源类型,ClusterPodService
  • apiVersionkind-k8s版本
    kind-example-config.yml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4

部署集群

指定目录--config=/foo/bar/config.yaml

通过命令行指定的参数优先级大于配置文件

kind create cluster --config kind-example-config.yml

验证

# 查看集群信息
kubectl cluster-info
# 查看集群节点
kubectl get nodes

删除集群

kind delete cluster

kind集群配置

  • name命名集群
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
name: app-cluster

kind网络配置

kind支持ipv4、ipv6、双栈协议(两种协议同时支持)

查看是否支持ipv6

# 执行
sudo sysctl net.ipv6.conf.all.disable_ipv6
# 输出
net.ipv6.conf.all.disable_ipv6 = 0
  • networking.ipFamily指定ipv4ipv6dual(双栈)
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: ipv6

指定其他网络配置

  • podSubnetpod子网ip,默认10.244.0.0/16fd00:10:244::/56
  • serviceSubnet服务子网ip,默认10.96.0.0/16fd00:10:96::/112
  • disableDefaultCNI禁用默认CNI,默认false,你可以禁用后安装Flannel、Calico
  • kubeProxyMode代理模式,默认使用iptables,可以使用iptablesnftables(v1.31+)、ipvsnone
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  # WARNING: 出于安全考虑,强烈建议您将其保留为默认值
  # (127.0.0.1) 
  apiServerAddress: "127.0.0.1"
  # 默认情况下,API服务器监听一个随机打开的端口
  # 你可以选择一个特定的端口,但在大多数情况下可能不需要
  # 使用随机端口可以更容易地启动多个集群。
  apiServerPort: 6443
  podSubnet: "10.244.0.0/16"
  serviceSubnet: "10.96.0.0/12"
  disableDefaultCNI: false
  kubeProxyMode: "nftables"

kind节点配置

  • role设置节点角色,默认为控制平面,control-planeworker
  • labels.tier指定节点标签
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  labels:
    tier: backend

kind挂载配置

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  # 将容器的/files挂载到宿主机/path/to/my/files
  extraMounts:
  - hostPath: /path/to/my/files
    containerPath: /files
  - hostPath: /path/to/my/other-files/
    containerPath: /other-files
    # 可选: 设置为只读
    # 默认 false
    readOnly: true
    # 可选: if set, the mount needs SELinux relabeling.
    # default false
    selinuxRelabel: false
    # 可选: 设置传播模式 (None, HostToContainer or Bidirectional)
    # 详见 https://kubernetes.io/docs/concepts/storage/volumes/#mount-propagation
    # 默认 None
    #
    # WARNING: 您很可能不需要此字段
    #
    #
    # 在使用Docker Desktop的MacOS上, 如果挂载到macOS而不是docker desktop VM,不能使用该字段,应该使用linux VM
    propagation: None

kind多节点集群

创建配置文件,三个控制平面三个工作节点

kind-example-config.yml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker

部署集群

kind create cluster --config kind-example-config.yml

验证

# 查看集群信息
kubectl cluster-info
# 查看集群节点
kubectl get nodes

删除集群

kind delete cluster

kind端口映射

  • extraPortMappings 指定端口映射
  • containerPort容器端口,和NodePort端口必须一致
  • hostPort宿主机端口

vim kind-example-config.yml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 30950
    hostPort: 80
    listenAddress: "0.0.0.0" # 可选, 默认"0.0.0.0"
    protocol: udp # 可选, 默认tcp

vim kind-pod-config.yml

kind: Pod # Pod
apiVersion: v1
metadata:
  name: foo
  labels:
    app: foo
spec:
  containers:
  - name: foo
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=foo"
    ports:
    - containerPort: 5678
---
apiVersion: v1
kind: Service
metadata:
  name: foo
spec:
  type: NodePort
  ports:
  - name: http
    nodePort: 30950 # nodePort和集群中containerPort必须一致
    port: 5678
  selector:
    app: foo

kind配置Kubernetes

https://github.com/kubernetes-sigs/kind/releases可以找到指定哈希码的镜像,这里使用v1.31.0和v1.29.8部署集群

vim kind-example-config.yml

kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.31.0@sha256:53df588e04085fd41ae12de0c3fe4c72f7013bba32a20e7325357a1ac94ba865
- role: worker
  image: kindest/node:v1.29.8@sha256:d46b7aa29567e93b27f7531d258c372e829d7224b25e3fc6ffdefed12476d3aa

部署集群

kind create cluster --config kind-example-config.yml

验证

# 查看集群信息
kubectl cluster-info
# 查看集群节点
kubectl get nodes

删除集群

kind delete cluster

kind导出日志

导出kind集群的日志,日志生成在/tmp目录下,重启会删除

kind export logs

指定日志导出目录

kind export logs ./somedir

kind部署Ingress

Ingress 允许你通过 Kubernetes API 定义的规则将流量映射到不同后端,相当于Nginx

目前已停止更新,新功能将集成到Gateway API

  • Ingress必须指定apiVersionkindmetadataspec
  • spec资源对象的期望状态
  • path相当于路由,路由到此路径,转发到后端服务
  • backend后端指定Serviceport

最小Ingress配置
vim minimal-ingress.yml

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: minimal-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  ingressClassName: nginx-example
  rules:
  - http:
      paths:
      - path: /testpath
        pathType: Prefix
        backend:
          service:
            name: test
            port:
              number: 80

部署

kubectl apply -f minimal-ingress.yml

查看状态

kubectl get ingress

显示资源细节

kubectl describe ingress minimal-ingress

常用命令

Kind命令

  1. kind get clusters:查看所有集群
  2. kind create cluster --name kind-2:指定名称创建集群
  3. kind delete cluster:删除集群
  4. kind load image-archive /my-image-archive.tar:加载压缩包镜像
  5. kind load docker-image my-custom-image-0 my-custom-image-1 --name kind-2:加载两个镜像到指定kind-2集群
  6. kind build node-image /path/to/kubernetes/source:构建镜像
    一、Pod 相关
  7. kubectl get pods:查看当前命名空间下的 Pod 列表
  8. kubectl describe pod <pod-name>:查看指定 Pod 的详细信息,包括容器状态、事件等
  9. kubectl delete pod <pod-name>:删除指定的 Pod

二、Namespace(命名空间)相关

  1. kubectl get namespaces:查看所有命名空间列表
  2. kubectl create namespace <namespace-name>:创建一个新的命名空间
  3. kubectl delete namespace <namespace-name>:删除指定的命名空间

三、Deployment(部署)相关

  1. kubectl get deployments:查看当前命名空间下的部署列表
  2. kubectl describe deployment <deployment-name>:查看指定部署的详细信息
  3. kubectl create deployment <deployment-name> --image=<image-name>:创建一个新的部署,指定镜像名称
  4. kubectl scale deployment <deployment-name> --replicas=<num>:调整部署的副本数量
  5. kubectl delete deployment <deployment-name>:删除指定的部署

四、Service(服务)相关

  1. kubectl get services:查看当前命名空间下的服务列表
  2. kubectl describe service <service-name>:查看指定服务的详细信息
  3. kubectl create service <service-type> <service-name> --tcp=<port>:<target-port>:创建一个新的服务,指定服务类型、服务名称和端口映射
  4. kubectl delete service <service-name>:删除指定的服务

五、Node(节点)相关

  1. kubectl get nodes:查看集群中的节点列表
  2. kubectl describe node <node-name>:查看指定节点的详细信息

六、ConfigMap 和 Secret 相关

  1. kubectl get configmaps:查看当前命名空间下的 ConfigMap 列表
  2. kubectl create configmap <configmap-name> --from-literal=<key>=<value>:创建一个新的 ConfigMap,指定键值对
  3. kubectl get secrets:查看当前命名空间下的 Secret 列表
  4. kubectl create secret generic <secret-name> --from-literal=<key>=<value>:创建一个新的 Secret,指定键值对

七、Ingress 相关

  1. kubectl get ingress:查看当前命名空间下的 Ingress 列表。
  2. kubectl describe ingress <ingress-name>:查看指定 Ingress 的详细信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cci497

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值