kind是什么
Kubernetes In Docker,将k8s所需要的所有组件,以docker容器的方式部署
为什么用kind
学习、开发k8s应用,本地跑一个k8s更方便,但是直接装一个k8s太重,代码还没敲几行电脑先卡死了,本机需要一个轻量级的k8s用于学习、开发、测试
为什么不用minikube
一、 相同点
- Kind、minikube都是Kubernetes官方出品
- 都提供了基本的 Kubernetes 功能,如部署应用、管理容器、服务发现等
二、 不同点
- Kind基于Docker,所有组件可与线上环境保持一致,易于移植
- minikube基于虚拟化,启动时间长,资源消耗大
三、 性能
在基准测试中,Kind比minikube用时少很多
k3d不是用时更少吗,为什么不用k3d?
k3d是基于k3s的构建工具,k3s用于性能有限的平台,功能比k8s少,倘若用k3s测试、k8s部署,会有一些的差异,容器就是为了提供一致性保障,所以确定上线使用k8s,开发测试时Kind最合适
Linux安装Kind
- 需要Docker环境:
docker version
- 安装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
- 安装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
资源类型,Cluster
、Pod
、Service
…apiVersion
kind-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
指定ipv4
、ipv6
、dual
(双栈)
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
ipFamily: ipv6
指定其他网络配置
podSubnet
pod子网ip,默认10.244.0.0/16
、fd00:10:244::/56
serviceSubnet
服务子网ip,默认10.96.0.0/16
、fd00:10:96::/112
disableDefaultCNI
禁用默认CNI,默认false,你可以禁用后安装Flannel、CalicokubeProxyMode
代理模式,默认使用iptables
,可以使用iptables
、nftables
(v1.31+)、ipvs
、none
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-plane
、worker
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
必须指定apiVersion
、kind
、metadata
、spec
spec
资源对象的期望状态path
相当于路由,路由到此路径,转发到后端服务backend
后端指定Service
、port
最小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命令
kind get clusters
:查看所有集群kind create cluster --name kind-2
:指定名称创建集群kind delete cluster
:删除集群kind load image-archive /my-image-archive.tar
:加载压缩包镜像kind load docker-image my-custom-image-0 my-custom-image-1 --name kind-2
:加载两个镜像到指定kind-2
集群kind build node-image /path/to/kubernetes/source
:构建镜像
一、Pod 相关kubectl get pods
:查看当前命名空间下的 Pod 列表kubectl describe pod <pod-name>
:查看指定 Pod 的详细信息,包括容器状态、事件等kubectl delete pod <pod-name>
:删除指定的 Pod
二、Namespace(命名空间)相关
kubectl get namespaces
:查看所有命名空间列表kubectl create namespace <namespace-name>
:创建一个新的命名空间kubectl delete namespace <namespace-name>
:删除指定的命名空间
三、Deployment(部署)相关
kubectl get deployments
:查看当前命名空间下的部署列表kubectl describe deployment <deployment-name>
:查看指定部署的详细信息kubectl create deployment <deployment-name> --image=<image-name>
:创建一个新的部署,指定镜像名称kubectl scale deployment <deployment-name> --replicas=<num>
:调整部署的副本数量kubectl delete deployment <deployment-name>
:删除指定的部署
四、Service(服务)相关
kubectl get services
:查看当前命名空间下的服务列表kubectl describe service <service-name>
:查看指定服务的详细信息kubectl create service <service-type> <service-name> --tcp=<port>:<target-port>
:创建一个新的服务,指定服务类型、服务名称和端口映射kubectl delete service <service-name>
:删除指定的服务
五、Node(节点)相关
kubectl get nodes
:查看集群中的节点列表kubectl describe node <node-name>
:查看指定节点的详细信息
六、ConfigMap 和 Secret 相关
kubectl get configmaps
:查看当前命名空间下的 ConfigMap 列表kubectl create configmap <configmap-name> --from-literal=<key>=<value>
:创建一个新的 ConfigMap,指定键值对kubectl get secrets
:查看当前命名空间下的 Secret 列表kubectl create secret generic <secret-name> --from-literal=<key>=<value>
:创建一个新的 Secret,指定键值对
七、Ingress 相关
kubectl get ingress
:查看当前命名空间下的 Ingress 列表。kubectl describe ingress <ingress-name>
:查看指定 Ingress 的详细信息