kind:Kubernetes in Docker,单机测试 Kubernetes 群集的最佳方案
请访问原文发布链接:https://sysin.org/article/kind/,查看最新版。
作者:gc(at)sysin.org,主页:www.sysin.org
2021.04.28 更新,kind 更新到 v0.10.0,主要是新增对 Kubernetes
v1.20的支持,详见 Github Release。
是否没有足够的机器运行 Kubernetes 测试环境,个人电脑配置不高的话,运行多个节点的虚拟化有点力不从心,国内公有云主机一般不支持嵌套虚拟化,一套 3M+3N 的群集环境成本太高。VMware Fusion 12.0 发布,将 Kind 带入了我们的视野,这是 Google 官方的一个工具,可能是在单机运行 Kubernetes 群集的最佳方案。笔者在一台 1C 2G 的公有云虚机上运行 Kind,虽然计算资源有限,也可以完成一般的测试。
在阿里云或者腾讯云购买一台不到 100 元一年的入门云主机来运行 Kubernetes 群集,还可以将应用直接发布到互联网,开发测试非常方便。
1. 简介
kind 是 Kubernetes in Docker 的简写,是一个使用 Docker 容器作为 Nodes,在本地创建和运行 Kubernetes 群集的工具。适用于在本机创建 Kubernetes 群集环境进行开发和测试。
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.
- kubetestintegration also built on these packages (WIP)
kind 使用 kubeadm 创建和启动群集节点。
kind 使用 containerd 作为容器运行时,所以弃用 Dockershim 对 kind 没有影响。
2. kind 架构
kind 官方架构图如下,它将 docker 容器作为 kubernetes 的 "node",并在该 "node" 中安装 kubernetes 组件,包括一个或者多个 Control Plane 和 一个或者多个 Work nodes。这就解决了在本机运行多个 node 的问题,而不需要虚拟化。

3. 安装 Kind
(1)、安装 Docker,这是前提条件。
快速安装:sudo sh -c "$(curl -fsSL https://get.docker.com)"
(2)、安装 kubectl:Kind 本身不需要 kubectl,安装 kubectl 可以在本机直接管理 Kubernetes 群集。
- Linux: - 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
 
- macOS: - brew install kubectl
 #验证版本
 kubectl version --client
 
(3)、安装 kind:
查看版本:Github releases page
- Linux: - curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.10.0/kind-linux-amd64
 chmod +x ./kind
 mv ./kind /usr/local/bin/kind
 #验证版本
 kind version
 
- macOS (homebrew): - brew install kind
 #验证版本
 kind version
 - 或者 - curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.10.0/kind-darwin-amd64
 chmod +x ./kind
 mv ./kind /usr/local/bin/kind
 #验证版本
 kind version
 - 如果安装了 VMware Fusion 12,在启动 vctl( - vctl system start)之后,直接运行- vctl kind。
- Windows:可以支持,不推荐。 
4. 操作入门
注意:以下命令基本上都需要 root 权限,非 root 用户请使用 sudo。
创建群集
创建一个默认群集:
kind create cluster
输出如下:
$ sudo kind create cluster
Creating cluster "kind" ...
 ✓ Ensuring node image (kindest/node:v1.20.2)
 ✓ Preparing nodes
 ✓ Writing configuration
 ✓ Starting control-plane ️
 ✓ Installing CNI
 ✓ Installing StorageClass
Set kubectl context to "kind-kind"
You can now use your cluster with:
kubectl cluster-info --context kind-kind
Not sure what to do next?   Check out https://kind.sigs.k8s.io/docs/user/quick-start/
默认的群集名称为kind,可以使用参数--name指定创建的群集的名称,可以创建多个群集:
kind create cluster --name kind-2
指定 node 镜像版本创建群集:
# default
kind create cluster --image kindest/node:latest
# 1.20.0
kind create cluster --image kindest/node:v1.20.0
多群集切换
获取群集名称,可以看到下面有两个群集:
kind get clusters
kind
kind2
切换群集:
# 切换到群集`kind`
kubectl cluster-info --context kind-kind
# 切换到群集`kind-2`
kubectl cluster-info --context kind-kind-2
可以通过 Kubernetes kubeconfig 配置文件来配置默认群集.
查看节点(默认只有一个 control-plane):
kubectl get nodes
NAME                 STATUS   ROLES    AGE     VERSION
kind-control-plane   Ready    master   7m51s   v1.20.2
删除群集
删除群集kind-2
kind delete cluster --name kind-2
将镜像加载到 kind 群集中
Kind 群集中的 Docker 镜像可以从互联网直接拉取,如果需要将本机镜像加载到 Kind 群集中,使用如下命令
kind load docker-image my-custom-image
kind load docker-image my-custom-image --name kind-2 (指定群集名称)
kind load image-archive /my-image-archive.tar (加载导出的镜像压缩包)
5. 配置 kind 群集
可以查看示例配置文件 kind-example-config,创建群集时使用 --config 参数:
kind create cluster --config kind-example-config.yaml
示例配置文件如下:
# this config file contains all config fields with comments
# NOTE: this is not a particularly useful config file
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
# patch the generated kubeadm config with some extra settings
kubeadmConfigPatches:
- |
  apiVersion: kubelet.config.k8s.io/v1beta1
  kind: KubeletConfiguration
  evictionHard:
    nodefs.available: "0%"
# patch it further using a JSON 6902 patch
kubeadmConfigPatchesJSON6902:
- group: kubeadm.k8s.io
  version: v1beta2
  kind: ClusterConfiguration
  patch: |
    - op: add
      path: /apiServer/certSANs/-
      value: my-hostname
# 1 control plane node and 3 workers
nodes:
# the control plane node config
- role: control-plane
# the three workers
- role: worker
- role: worker
- role: worker
Multi-node clusters
示例如下:
# three node (two workers) cluster config
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
Control-plane HA
示例如下:
# a cluster with 3 control-plane nodes and 3 workers
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: control-plane
- role: control-plane
- role: worker
- role: worker
- role: worker
将 node 的端口映射到主机
可以通过extraPortMappings将 node 的端口映射到主机
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    listenAddress: "0.0.0.0" # Optional, defaults to "0.0.0.0"
    protocol: udp # Optional, defaults to tcp
指定 Kubernetes 的版本
可以通过设置 node 的容器镜像版本运行指定版本的 kubernetes 群集。可以在官方 release 页面中中查找需要镜像 tag,带上 sha256 shasum(非必须),例如:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
- role: worker
  image: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
kind 0.10 支持的版本如下:
    1.20: kindest/node:v1.20.2@sha256:8f7ea6e7642c0da54f04a7ee10431549c0257315b3a634f6ef2fecaaedb19bab
    1.19: kindest/node:v1.19.7@sha256:a70639454e97a4b733f9d9b67e12c01f6b0297449d5b9cbbef87473458e26dca
    1.18: kindest/node:v1.18.15@sha256:5c1b980c4d0e0e8e7eb9f36f7df525d079a96169c8a8f20d8bd108c0d0889cc4
    1.17: kindest/node:v1.17.17@sha256:7b6369d27eee99c7a85c48ffd60e11412dc3f373658bc59b7f4d530b7056823e
    1.16: kindest/node:v1.16.15@sha256:c10a63a5bda231c0a379bf91aebf8ad3c79146daca59db816fb963f731852a99
    1.15: kindest/node:v1.15.12@sha256:67181f94f0b3072fb56509107b380e38c55e23bf60e6f052fbd8052d26052fb5
    1.14: kindest/node:v1.14.10@sha256:3fbed72bcac108055e46e7b4091eb6858ad628ec51bf693c21f5ec34578f6180
IPv6 clusters
kind目前支持 IPv6 单栈群集,前提是运行 Docker 的主机支持 IPv6,双栈支持即将到来, 大多数操作系统/发行版支持 IPv6,Linux 上通过以下命令查看:
sudo sysctl net.ipv6.conf.all.disable_ipv6
显示如下,表明主机启用了 IPv6:
net.ipv6.conf.all.disable_ipv6 = 0
如果 Docker 运行在 Windows 或者 Mac 上,IPv6 端口转发不起作用,需要指定 API Server 使用 IPv4 端口转发:
# an ipv6 cluster
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: ipv6
  apiServerAddress: 127.0.0.1
在 Linux 上只需要这样:
# an ipv6 cluster
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: ipv6
导出 Cluster 日志
从默认 cluster (名称为 kind)导出日志:
kind export logs
Exported logs to: /tmp/396758314
切换群集加上 --name 参数。
默认日志导出到 /tmp 目录下,可以指定导出的目录,例如:
kind export logs ./somedir
Exported logs to: ./somedir
日志文件结构如下:
.
├── docker-info.txt
└── kind-control-plane/
    ├── containers
    ├── docker.log
    ├── inspect.json
    ├── journal.log
    ├── kubelet.log
    ├── kubernetes-version.txt
    └── pods/
6. 配置概述
6.1 入门
在创建 Kind 群集时,需要通过一个 YAML 配置文件来自定义群集配置。
一个最小化的配置如下:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
将配置文件保存为 config.yaml,通过运行命令 kind create cluster --config=config.yaml 来创建群集。
6.2 Cluster-Wide 选项
以下全局选项可用,并非所有的选项列入文档,可以关注官网文档的更新。
Networking
关于网络的配置选项。
IP Family
IPv6 (and soon dual-stack!) clusters:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  ipFamily: ipv6
上节 “IPv6 Clusters” 中有更详细的描述。
API Server
自定义 API Server 侦听地址和端口:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  # WARNING: It is _strongly_ recommended that you keep this the default
  # (127.0.0.1) for security reasons. However it is possible to change this.
  apiServerAddress: "127.0.0.1"
  # By default the API server listens on a random open port.
  # You may choose a specific port but probably don't need to in most cases.
  # Using a random port makes it easier to spin up multiple clusters.
  apiServerPort: 6443
Pod Subnet
自定义 pod IP 地址范围:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  podSubnet: "10.244.0.0/16"
Service Subnet
自定义 service IP 地址范围:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  serviceSubnet: "10.96.0.0/12"
禁用默认 CNI
KIND 附带了一个简单的网络实现(“kindnetd”),它基于标准 CNI 插件(ptp,host local,…)和简单的 netlink 路由。
这个 CNI 也处理 IP 伪装。
您可以禁用默认值以安装其他 CNI。这是一个高级用户功能,支持有限,但已知许多常见的 CNI 清单可以工作,例如 Calico。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  # the default CNI will not be installed
  disableDefaultCNI: true
kube-proxy mode
kube-proxy mode 可选 iptables 和 ipvs,默认使用的 iptables。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
networking:
  kubeProxyMode: "ipvs"
Nodes
kind: Cluster 的 nodes 字段如果不设置,默认时这样的(即仅有一个 control plane):
nodes:
# one node hosting a control plane
- role: control-plane
多节点群集示例如下:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
# One control plane node and three "workers".
#
# While these will not add more real compute capacity and
# have limited isolation, this can be useful for testing
# rolling updates etc.
#
# The API-server and other control plane components will be
# on the control-plane node.
#
# You probably don't need this unless you are testing Kubernetes itself.
nodes:
- role: control-plane
- role: worker
- role: worker
- role: worker
可以通过设置 node 的容器镜像版本运行指定版本的 kubernetes 群集。可以在官方 release 页面中中查找需要镜像 tag,带上 sha256 shasum,例如:
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
  image: kindest/node:v1.16.4@sha256:b91a2c2317a000f3a783489dfb755064177dbc3a0b2f4147d50f04825d016f55
6.3 Per-Node 选项
以下选项适用于 nodes,并非所有的选项列入文档,可以关注官网文档的更新。
Extra Mounts
附加挂载可以用来将主机上的存储挂载到 Node 上,用于持久保存数据。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  # add a mount from /path/to/my/files on the host to /files on the node
  extraMounts:
  - hostPath: /path/to/my/files/
    containerPath: /files
Extra Port Mappings
附加端口映射可以将端口转发到 Kind 节点。这是一个跨平台的选项,可以将流量引入 Kind 群集。
使用 Linux 上的 docker,您可以简单地将流量从主机发送到节点 IP,但要在 macOS 和 Windows,您需要使用这些设置才能实现。
另外也可以使用 ingress 转发流量。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  # port forward 80 on the host to 80 on this node
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    # optional: set the bind address on the host
    # 0.0.0.0 is the current default
    listenAddress: "127.0.0.1"
    # optional: set the protocol to one of TCP, UDP, SCTP.
    # TCP is the default
    protocol: TCP
Kubeadm Config Patches
KIND 使用 kubeadm 配置群集节点。
KIND 在第一个控制平面节点上运行“kubeadm init”,该节点可以使用 kubeadm InitConfiguration (spec) 进行自定义配置。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "my-label=true"
在 KIND 群集其他节点配置中,包括 worker 或者 control-plane (in HA mode), KIND 运行 kubeadm join 命令参数,可以通过 JoinConfiguration (spec) 进行自定义配置。
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
- role: worker
- role: worker
  kubeadmConfigPatches:
  - |
    kind: JoinConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "my-label2=true"
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: JoinConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "my-label3=true"
7. 部署 Dashboard
直接部署 Dashboard,运行命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
验证:
kubectl get po,svc -n kubernetes-dashboard
NAME                                             READY   STATUS    RESTARTS   AGE
pod/dashboard-metrics-scraper-7b59f7d4df-f7j7h   1/1     Running   0          90s
pod/kubernetes-dashboard-74d688b6bc-s9wts        1/1     Running   0          89s
NAME                                TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
service/dashboard-metrics-scraper   ClusterIP   10.96.228.22   <none>        8000/TCP   90s
service/kubernetes-dashboard        ClusterIP   10.96.160.22   <none>        443/TCP    91s
创建 ClusterRoleBinding 获得群集 admin 访问权限:
kubectl create clusterrolebinding default-admin --clusterrole cluster-admin --serviceaccount=default:default
#提示:
clusterrolebinding.rbac.authorization.k8s.io/default-admin created
创建登录 Dashboard 的 token:
token=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)
使用 echo 显示 token:
echo $token
记得保存一下 token
echo $token > dashboard-token.txt
cat dashboard-token.txt
使用 kubectl 命令访问 Dashboard,命令如下:
kubectl proxy
Starting to serve on 127.0.0.1:8001
点击 Kubernetes Dashboard 使用上述 token 登录 Dashboard
也可以通过 ingress 来访问 Dashboard。
8. 部署 ingress
在创建群集时,需要使用 KIND 的 extraPortMapping 配置选项将端口从主机转发到运行在节点上的入口控制器。
然后部署一个 Ingress controller,已知以下几个 ingress controllers 可以支持 kind:
这里以 ingress-nginx 为例:
创建一个群集
使用 extraPortMappings 和 node-labels 配置选项创建一个群集。
- extraPortMappings 允许本地主机转发请求到 Ingress controller 的 80/443 端口
- node-labels 允许 ingress controller 运行在指定的 node 上
cat <<EOF | kind create cluster --config=-
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
- role: control-plane
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 80
    hostPort: 80
    protocol: TCP
  - containerPort: 443
    hostPort: 443
    protocol: TCP
- role: worker
- role: worker
EOF
Ingress NGINX
wget -O kind-ingress-nginx.yaml https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/kind/deploy.yaml
kubectl apply -f kind-ingress-nginx.yaml
注意:image 来自 k8s.gcr.io,需要文明访问。
          #image: k8s.gcr.io/ingress-nginx/controller:v0.35.0@sha256:fc4979d8b8443a831c9789b5155cded454cb7de737a8b727bc2ba0106d2eae8b
          image: scofield/ingress-nginx-controller:v0.35.0
执行如下命令等待部署完成:
kubectl wait --namespace ingress-nginx \
  --for=condition=ready pod \
  --selector=app.kubernetes.io/component=controller \
  --timeout=90s
或者执行命令验证部署:
kubectl get po,svc -n ingress-nginx
kubectl get po,svc -n ingress-nginx -o wide
测试 Ingress
使用官方提供的 http-echo 应用来测试,内容如下:
kind: Pod
apiVersion: v1
metadata:
  name: foo-app
  labels:
    app: foo
spec:
  containers:
  - name: foo-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=foo"
---
kind: Service
apiVersion: v1
metadata:
  name: foo-service
spec:
  selector:
    app: foo
  ports:
  # Default port used by the image
  - port: 5678
---
kind: Pod
apiVersion: v1
metadata:
  name: bar-app
  labels:
    app: bar
spec:
  containers:
  - name: bar-app
    image: hashicorp/http-echo:0.2.3
    args:
    - "-text=bar"
---
kind: Service
apiVersion: v1
metadata:
  name: bar-service
spec:
  selector:
    app: bar
  ports:
  # Default port used by the image
  - port: 5678
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: example-ingress
spec:
  rules:
  - http:
      paths:
      - path: /foo
        backend:
          serviceName: foo-service
          servicePort: 5678
      - path: /bar
        backend:
          serviceName: bar-service
          servicePort: 5678
---
直接应用:
kubectl apply -f https://kind.sigs.k8s.io/examples/ingress/usage.yaml
测试效果如下:
# should output "foo"
curl localhost/foo
# should output "bar"
curl localhost/bar
ingress dashboard
本例使用受信任的 SSL 证书,通过 ingress 以 https 发布 Dashboard。
部署受信任的 SSL 证书
# 创建 secret,在 ingress 不能直接使用证书需要转换为 secret 才能使用
# key 和 cert 都为 PEM 格式,cert 包含证书文件和证书链部分
kubectl create secret tls dashboard-ingress-tls --key dashboard-ingress.key --cert dashboard-ingress.crt -n kubernetes-dashboard
# 查看 secret 内容
kubectl get secret dashboard-ingress-tls -n kubernetes-dashboard -o yaml
# 删除命令
kubectl delete secret dashboard-ingress-tls -n kubernetes-dashboard
配置 ingress 转发文件
# vi dashboard-ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
  name: kubernetes-dashboard-ingress
  namespace: kubernetes-dashboard
spec:
  tls:
  - secretName: dashboard-ingress-tls #上述创建的secret
  rules:
    - host: k8s.sysin.cn #域名
      http:
        paths:
        - path: /
          backend:
            serviceName: kubernetes-dashboard
            servicePort: 443
host: 对应的域名
path: url上下文
backend: 后向转发到对应的 serviceName: 和 servicePort:
注意,dashboard 默认使用 https 提供服务,ingress 默认 backend-protocol 使用 http,这里发布成功的关键是要添加 annotations 参数:
  annotations:
    nginx.ingress.kubernetes.io/ingress.class: "nginx"
    nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
部署:
kubectl apply -f dashboard-ingress.yaml
部署成功后可以通过域名访问:https://k8s.sysin.cn
9. Istio
准备群集:
cat <<EOF | kind create cluster --config=-
apiVersion: kind.x-k8s.io/v1alpha4
kind: Cluster
networking:
  apiServerAddress: "127.0.0.1"
  apiServerPort: 6443
  podSubnet: "10.218.0.0/16" #default: "10.244.0.0/16"
  serviceSubnet: "10.1.0.0/16" #default: "10.96.0.0/12"
  #disableDefaultCNI: true
nodes:
- role: control-plane
  image: kindest/node:latest
  kubeadmConfigPatches:
  - |
    kind: InitConfiguration
    nodeRegistration:
      kubeletExtraArgs:
        node-labels: "ingress-ready=true"
  extraPortMappings:
  - containerPort: 30000
    hostPort: 80
    listenAddress: "127.0.0.1"
    protocol: TCP
  - containerPort: 30001
    hostPort: 443
    listenAddress: "127.0.0.1"
    protocol: TCP
  - containerPort: 30002
    hostPort: 15021
    listenAddress: "127.0.0.1"
    protocol: TCP
EOF
继续
# Calico
curl https://docs.projectcalico.org/manifests/calico.yaml | kubectl apply -f -
# CoreDNS
kubectl scale deployment --replicas 1 coredns --namespace kube-system
# Metrics Server
helm repo add stable https://kubernetes-charts.storage.googleapis.com
helm repo update
helm upgrade metrics-server --install --set "args={--kubelet-insecure-tls, --kubelet-preferred-address-types=InternalIP}" stable/metrics-server --namespace kube-system
下载当前版本 istio:
curl -L https://istio.io/downloadIstio | sh -
下载指定版本 istio:
curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.8.0 TARGET_ARCH=x86_64 sh -
切换到 istio 目录,这里是 `istio-1.8.0:
cd istio-1.8.0
添加 istioctl 到环境变量 (Linux or macOS):
export PATH=$PWD/bin:$PATH
默认安装:
例如使用 demo configuration profile 安装
istioctl install --set profile=demo
 Istio core installed
 Istiod installed
 Egress gateways installed
 Ingress gateways installed
 Installation complete
由于 kind 的特殊性,需要特定的配置文件来运行 Istio。
定制安装:
创建配置文件:istio-demo-kind.yaml
对于 istiod 组件,将 HPA maxReplicas 设置为 1,以保证有足够的备用容量来处理工作负载。
然后需要使用 overlay 覆盖 PodDisruptionBudget 并将其设置为 0。否则,由于不满足 PodDisruptionBudget,Istio 升级将不会成功。
此外,指定一个 nodeSelector,以确保在 Kind 多节点群集的情况下,Istio 入口网关始终在特定节点上运行。
默认情况下,入口网关使用服务类型 LoadBalancer,该服务类型在 Kind 上不起作用,因为缺少 SLB(软件负载平衡器)实现。
因此,我们必须切换到 NodePort 类型,以在 localhost / 主机接口上暴露 ingress gateway。
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
spec:
  addonComponents:
    grafana:
      enabled: true
    kiali:
      enabled: true
    prometheus:
      enabled: true
  components:
    base:
      enabled: true
    cni:
      enabled: true
    ingressGateways:
    - enabled: true
      k8s:
        hpaSpec:
          maxReplicas: 1
        nodeSelector:
          ingress-ready: "true"
        service:
          type: NodePort
        overlays:
        - apiVersion: v1
          kind: Service
          name: istio-ingressgateway
          patches:
          - path: spec.ports
            value:
            - name: status-port
              port: 15021
              targetPort: 15021
              nodePort: 30002
            - name: http2
              port: 80
              targetPort: 8080
              nodePort: 30000
            - name: https
              port: 443
              targetPort: 8443
              nodePort: 30001
        - apiVersion: policy/v1beta1
          kind: PodDisruptionBudget
          name: istio-ingressgateway
          patches:
          - path: spec.minAvailable
            value: 0
    pilot:
      enabled: true
      k8s:
        hpaSpec:
          maxReplicas: 1
        overlays:
        - apiVersion: policy/v1beta1
          kind: PodDisruptionBudget
          name: istiod
          patches:
          - path: spec.minAvailable
            value: 0
  meshConfig:
    accessLogFile: "/dev/stdout"
    accessLogEncoding: "JSON"
  values:
    global:
      controlPlaneSecurityEnabled: true
    cni:
      excludeNamespaces:
       - istio-system
       - kube-system
    gateways:
      istio-ingressgateway:
        sds:
          enabled: true
    sidecarInjectorWebhook:
      rewriteAppHTTPProbe: true
安装:
istioctl install -f istio-demo-kind.yaml
限于篇幅和 Istio 的复杂度,后续考虑用单独文章描述该内容。
10. 限制
kind 部署 kubernetes 群集相当方便,可以快速部署多个群集。但在群集的配置和更新上有明显弊端,只能通过重新创建群集来配置和更新群集。所以在初始化群集的时候需要考虑好配置选项。当然我们只是用于测试环境,也无大碍。
11. 云主机推荐
阿里云 云服务器新用户专享 1核2G ¥96.90/年起(具体活动可能有所变动,官网显示为准)

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元(具体活动可能有所变动,官网显示为准)

使用体验:
- 在 CPU、内存和磁盘性能上两家并无明显体验差别。
- 在带宽上,最低都是 1Mbps,根据官方说明不足 10Mbps 的带宽,入站带宽都是10Mbps,出站带宽是实际购买带宽(个人使用一台腾讯云,下载带宽可大 100Mbps)。
两家有什么区别?
- 阿里云详细规则页面有提示不支持退订,但可以特殊申请退订。腾讯云上述产品不满意可以直接退款。 
- 阿里云基于个人身份识别(比如身份证),一个身份限购一台,新注册账号无效,腾讯云基于账号识别,一个身份可以新注册账号另外在购买一台。 
kind:Kubernetes in Docker,单机测试 Kubernetes 群集的最佳方案的更多相关文章
- 使用minikube在本机测试kubernetes
		目录 简介 安装 Docker CE 安装 kubectl 安装 minikube 启动 minikube 启动 dashboard 启动一个服务 删除服务 参考 本文主要讲解 minikube(ku ... 
- Minikube之Win10单机部署Kubernetes(k8s)自动化容器操作的开源平台
		Minikube之Win10单机部署 Kubernetes(k8s)是自动化容器操作的开源平台,基于这个平台,你可以进行容器部署,资源调度和集群扩容等操作.如果你曾经用过Docker部署容器,那么可以 ... 
- 基于Docker本地运行Kubernetes
		基于Docker本地运行Kubernetes 概览 下面的指引将高速你如何通过Docker创建一个单机.单节点的Kubernetes集群. 下图是最终的结果: 先决条件 \1. 你必须拥有一台安装有D ... 
- Docker Swarm和Kubernetes在大规模集群中的性能比较
		Contents 这篇文章主要针对Docker Swarm和Kubernetes在大规模部署的条件下的3个问题展开讨论.在大规模部署下,它们的性能如何?它们是否可以被批量操作?需要采取何种措施来支持他 ... 
- 基于kubernetes构建Docker集群管理详解-转
		http://blog.liuts.com/post/247/ 一.前言 Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度 ... 
- Docker应用:Kubernetes(容器集群)
		阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ... 
- Kubernetes(k8s) docker集群搭建
		原文地址:https://blog.csdn.net/real_myth/article/details/78719244 一.Kubernetes系列之介绍篇 •Kubernetes介绍 1.背 ... 
- kubernetes,Docker网络相关资料链接
		1.Why kubernetes not doesn't use libnetwork http://blog.kubernetes.io/2016/01/why-Kubernetes-doesnt- ... 
- Win10上的Docker应用:Kubernetes(容器集群)
		阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) Docker应用:Kubernetes(容器集群) 前言: 终于出第三篇了,上个月就已 ... 
随机推荐
- js时间对象Date()
			Date ()是一个专门用来创建时间对象的,是一个复杂数据类型,具有读写属性 语法: var time = new Date() 返回值:当前终端的时间 // 1.创建当前时间对象 var time ... 
- JMeter 实战案例
			案例1:博客网站后端测试 案例2:JPetStore 应用 案例1:博客网站后端测试 测试目标 测试博客网站后端的常用 HTTP 接口的访问方法. 展示 HTTP 请求的各类使用方法. 展示提取 JS ... 
- kafka管理工具-kafka manager安装
			kafka-manager 简介 # 项目信息 https://github.com/yahoo/kafka-manager 安装 环境要求: Kafka 0.8.. or 0.9.. or 0.10 ... 
- hdu4503 概率
			题意: 湫湫系列故事--植树节 Time Limit: 1000/500 MS (Java/Others) Memory ... 
- poj2175费用流消圈算法
			题意: 有n个建筑,每个建筑有ai个人,有m个避难所,每个避难所的容量是bi,ai到bi的费用是|x1-x2|+|y1-y2|+1,然后给你一个n*m的矩阵,表示当前方案,问当前避难方案是否 ... 
- 写复杂的json方法
			<?php for($j=0; $j< 30; $j++) { $Axis[$j] = "a"; } $data['xAxis']= $Axis; for($i=0; ... 
- 修改linux默认文件创建权限-umask命令解析
			umask值用于设置用户在创建文件时的默认权限,当我们在系统中创建目录或文件时,目录或文件所具有的默认权限就是由umask值决定的. 对于root用户,系统默认的umask值是0022:对于普通用户, ... 
- thinkphp 连接多个数据库(tp5.1为例)
			1.config目录下添加数据库配置,内容跟原数据库配置一样就可以(数据库名改成连接的第二个数据库名) 2.连接部分代码: $db = Db::connect(config('database2.') ... 
- python模块一之faker模块
			faker模块主要是用来创建伪数据,无需手动生成或者手写随机数来生成数据,可以利用faker完成伪造大量测试数据的工作 一.安装 pip install faker 二.使用 from faker i ... 
- 第一章 FreeBSD之系统安装
			一.默认选择 >>[Boot Multi User],按回车键 二.默认选择 >> [Install] 三.选择默认的键盘设置 >>[Select] 四.配置主机名 ... 
