agile日知其所亡,月无忘其所能.

Kind 安装 K8S

2021-07-19
2023-06-17

k8s是一个管理容器平台的系统,将代码,配置,依赖都捆绑在一起整合,用于自动部署、扩缩和管理容器化应用程序的系统,将应用所组成的容器组合成逻辑单元,方便管理和服务发现。而且支持夸主机集群自动部署和扩展,提供高可用,容错,自动化管理等强大功能,基本上成为了现代(2021年)云原生架构的基石。

对于完全不了解k8s的人来说,第一次安装k8s是不太容易的事情。学习安装k8s之前,一定要先了解k8s各组件的功能作用,以及整体架构。新手学习k8s,最好是使用kubeadm方式安装k8s(半自动化,或者kubespray),如果有耐心,可以挑战使用二进制的方式来安装k8s(完全需要自己去生成各种签名)。

如果是生产环境下安装k8s,最好是使用管理k8s集群的平台,比如Rancher提供了简化的用户界面统一的集群管理,身份认证和应用商店。对于已经非常熟悉k8s的高手来说,就没必要在安装k8s上浪费时间。

但是如果是在本地进行开发测试,那么上述的安装方式都不太合适。上述的安装方式区别在于安装k8s的复杂程度,但是完整的k8s需要至少3台机器,而且是功能完备,这对于只是想在本地进行开发测试来说,大可不必这么复杂地在本地电脑安装一个k8s集群(虽然可以先使用kvm或者vmware安装虚拟机,然后在虚拟机中搭建集群)。

安装简易k8s的方式

轻量级和本地开发测试,有几种安装方式:

  • K3s:完整 K8s 的轻量版,可在单台或多台 Linux 机器上运行。优点:启动快,占用资源少,内置 Traefik Ingress。适用:轻量生产、测试、边缘环境。
  • microK8s:占用资源少,单机即可运行完整 K8s。默认启用最少组件,按需开启插件(Dashboard、Ingress、DNS、Storage 等)。内置高可用 HA 支持。内置 kubectl,不需要单独安装。本地开发、测试环境。边缘计算或轻量级生产环境。
  • Minikube:单节点 K8s,支持 Docker 或 VM 驱动。适用:本地开发、学习和演示。优点:支持 Dashboard、Ingress、Helm
  • Kind(Kubernetes in Docker):在本地 Docker 容器里运行完整 K8s 集群,支持多节点。适用:CI/CD 测试、开发环境、快速验证 Helm Chart。优点:启动快,不依赖虚拟机。
特性 K3s MicroK8s Minikube Kind
开发商 Rancher Canonical (Ubuntu) Kubernetes 官方 Kubernetes 官方
安装方式 单二进制 + 脚本 Snap 安装 二进制/包管理器 + VM/Docker Docker 容器
默认集群类型 单节点可多节点 HA 单节点可扩展多节点 HA 单节点 多节点容器集群
节点资源占用 轻量(<500MB) 轻量(<500MB) 中等(需要 VM 或 Docker) 轻量(容器占用)
支持多节点 是(加入节点命令) 是(add-node) 不推荐,多为单节点 是(多节点容器)
默认网络插件 内置 Flannel 内置 Flannel 默认 docker0 或 CNI Docker 网络
安装复杂度 简单(curl 命令即可) 极简(snap install) 简单(minikube start) 简单(kind create cluster)
扩展插件 需手动安装(Ingress、Metrics 等) 内置 Dashboard、Ingress、DNS 等 Dashboard、Ingress 可选 无内置插件,需要手动部署
用途 边缘/轻量生产、测试、开发 开发、测试、轻量生产 本地开发、学习 CI/CD 测试、开发
对外访问 内置 LB,可配置 NodePort/Ingress 内置 LB,可配置 NodePort/Ingress 内置 tunnel 可访问 通过 Docker port 映射访问
集群恢复/HA 支持多节点 HA 支持多节点 HA 不支持 不支持

K3s

  • 适合轻量级生产、边缘环境、私有云
  • 支持 HA,多节点扩展
  • 安装简单,资源占用低。

MicroK8s

  • 本地开发、测试环境最佳。
  • 单机即可运行完整 K8s,带 Dashboard、Ingress、DNS、Storage。
  • 支持扩展到多节点。

Minikube

  • 学习 Kubernetes、开发测试最常用。
  • 单节点,易用,支持 VM 或 Docker 驱动。
  • 插件少,主要是本地体验。

Kind

  • CI/CD 自动化测试、开发环境最佳。
  • 多节点容器集群,可快速启动和销毁。
  • 不适合生产环境。

总结

  • 开发/测试:Minikube/Kind/MicroK8s
  • 轻量生产/边缘:K3s/MicroK8s
  • CI/CD 测试:Kind
  • 可视化和插件方便:MicroK8s

安装 Kind

安装docker

#1.卸载旧版本(如果有)
sudo apt remove docker docker-engine docker.io containerd runc

#2.更新 apt 包索引并安装依赖
sudo apt update
sudo apt install -y \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

#3.添加 Docker 官方 GPG key
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

#4.添加 Docker 仓库
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

#5.安装 Docker 引擎
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

#6.启动并检查 Docker 服务
sudo systemctl enable docker
sudo systemctl start docker
sudo systemctl status docker

#测试:
docker version
docker run hello-world

#7.(可选)非 root 用户使用 Docker
sudo usermod -aG docker $USER
newgrp docker
docker run hello-world

安装 Kind 工具

# Linux
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.23.0/kind-linux-amd64
chmod +x ./kind
sudo mv ./kind /usr/local/bin/

使用 Kind 创建集群

安装之前要设置代理

  • 在执行下面命令之前,因为后面的各种应用部署,都需要拉取容器,而有可能需要设置代理(有些容器镜像无法访问),请在此步骤就在本宿主机器设置好代理,因为下面启动的三个容器control-plane,worker1,worker2你可以理解成k8s集群的宿主机器,只不过它是容器模拟的

  • 注意真正的宿主机器上设置的代理一定要使用容器内部能够访问的ip,不能使用127.0.0.1,因为这个在真正的宿主机器是对的,但是在容器内就是指定容器了,那就错误了,最好设置成宿主机器的局域网ip比如192.168.a.b等ip

  • 在此处就要设置好,因为一旦下面的容器创建好了,本机的三个容器control-plane,worker会继承真正宿主机器的代理设置

  • kind创建k8s集群,就是在宿主机器上创建如下三个容器,把容器当成k8s集群机器,所以k8s拉取镜像,使用的就是容器内置的容器管理工具,这三个容器内部各自都有内置的docker(其实不是docker,是containerd),这就是为啥kind安装的k8s,安装部署应用的时候,如果拉取不了镜像,在宿主机器上不管怎么设置docker代理和加速器都没有用,因为根本没有使用宿主机器的docker

先设置宿主机器的代理(后续k8s集群的三个容器会继承这个配置,方便让k8s的集群机器[容器]走代理):

export http_proxy=http://192.168.1.66:8888
export https_proxy=http://192.168.1.66:8888

下面是kind启动k8s的最简单配置文件

# kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  #创建多节点(1 个控制平面 + 2 个工作节点):
  - role: control-plane
  - role: worker
  - role: worker

执行:

kind create cluster --name mycluster --config kind-config.yaml

查看kind安装的集群(kind可以安装多个集群):

kind get clusters

安装 kubectl 工具

curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl
sudo mv kubectl /usr/local/bin/

可以查看刚刚安装的集群

kubectl get nodes

安装 ingress-nginx

# 安装 ingress-nginx
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/kind/deploy.yaml

# 获取信息
kubectl get pods -n ingress-nginx

部署一个测试应用 + Ingress

测试 Nginx 服务:

kubectl create deployment web --image=nginx
kubectl expose deployment web --port=80

创建 Ingress 规则 web-ingress.yaml:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-ingress
spec:
  rules:
  - host: web.local
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web
            port:
              number: 80

部署应用:

kubectl apply -f web-ingress.yaml

访问这个web服务,有两种方式:

  1. port-forward方式:
    kubectl -n ingress-nginx port-forward svc/ingress-nginx-controller 8080:80
    

    此时就可以在宿主机器的浏览器上使用地址http://localhost:8080访问?别忘了web-ingress设置了规则host:web.local,也就是说只转发请求host=web.local的才能访问到web 所以此时配置宿主机器/etc/hosts解析,添加一条解析记录127.0.0.1 web.local,最后使用地址http://web.local:8080来访问

  2. kubectl proxy 方式,在宿主机器上执行kubectl proxy,则通过地址http://localhost:8001/api/v1/namespaces/default/services/http:web:80/proxy/来访问

这个访问格式就是/namespaces/{namespaces_name}/services/{services_name}/{protocol}:{service_name}:{port}/proxy/

# 列出所有的namespaces
kubectl get ns

# 查看service名字
# kubectl get svc -n {namespaces_name}
kubectl get svc -n default

# 查看指定ns内的ingress
kubectl get ingress -n default

这里再次强调一下,为什么不能像正常安装k8s集群一样,配置集群ip的域名web.local,然后使用http://web.local:80 来访问,这个k8s集群其实在宿主机器的容器内,没有办法访问的,这个80端口也是容器内部的containerd容器的80端口,要想访问,要暴露好几层端口或者代理,那就没有必要了,直接使用上述两种方式访问即可

安装 Kubernetes Dashboard

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

创建 admin 用户(admin-user.yaml):

apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kubernetes-dashboard

应用:

kubectl apply -f admin-user.yaml

获取进入dashboard web ui 的 Token:

#默认1小时
kubectl -n kubernetes-dashboard create token admin-user

# 或者设置token时长
kubectl -n kubernetes-dashboard create token admin-user --duration=24h

访问 Dashboard

方法 1:使用 kubectl proxy

kubectl proxy

访问 http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/

方法 2:Ingress

给 Dashboard 配置 Ingress 规则,比如 k8s.local,就能直接用浏览器访问。

新建 Dashboard Ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: dashboard-ingress
  namespace: kubernetes-dashboard
spec:
  rules:
  - host: k8s.local   # 新的 Host
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443  # Dashboard 默认 HTTPS

保存为 dashboard-ingress.yaml,然后应用:

# 应用ingress
kubectl apply -f dashboard-ingress.yaml
# 代理端口
kubectl -n ingress-nginx port-forward svc/ingress-nginx-controller 8443:443

给本地host文件添加一条解析记录127.0.0.1 k8s.local,访问地址https://k8s.local:8443/

kubectl一些命令

# 关闭集群
docker stop $(docker ps -q --filter "name={cluster_name}-")

# 启动集群
docker start $(docker ps -a -q --filter "name={cluster_name}-")

kubectl describe ingress web-ingress
kubectl describe ingress dashboard-ingress -n kubernetes-dashboard

# 获取所有的ingress
kubectl get ingress -A

# 如果通过kind建立了多个集群
kind get clusters
# 获取集群的配置文件列表
kubectl config get-contexts
# 切换配置文件
kubectl config use-context {kind-k8s-cluster-name}

kind delete cluster --name {kind-k8s-cluster-name}
kubectl delete namespace {ns}

kubectl get pods -n {ns}
kubectl get svc -n {ns}

# 在宿主机器上执行,进入docker容器
docker exec -it kind-control-plane /bin/bash
# 进入到容器内部之后,就可以通过命令查看k8s的容器了

# 查看containerd 的 k8s.io 命名空间 来查看容器的状态,命名空间用来隔离不同的容器和镜像的
# 列出当前ns下的所有容器,包括未运行
ctr -n k8s.io containers list

# 查看正在运行的容器
ctr -n k8s.io tasks list

ctr常见操作

  1. 容器镜像管理
    ctr images list	列出本地所有镜像
    ctr images pull <image>	拉取镜像(支持 registry)
    ctr images push <image>	推送镜像到 registry
    ctr images remove <image>	删除本地镜像
    ctr images info <image>	查看镜像详细信息
    ctr images tag <source> <target>	给镜像打标签
    ctr images import <tar-file>	导入镜像 tar 包
    ctr images export <tar-file> <image>	导出镜像为 tar 
  2. 容器管理
    ctr containers list	列出所有容器
    ctr containers info <container>	查看容器信息
    ctr containers create <image> <name>	创建容器(不启动)
    ctr containers delete <container>	删除容器
    ctr containers update <container>	更新容器(如资源限制)
    
  3. 任务/执行(Task)管理.containerd 将运行中的容器叫作 task。
    ctr tasks list	列出所有运行中的 task
    ctr tasks start <container>	启动容器
    ctr tasks kill <container>	杀死容器
    ctr tasks pause <container>	暂停容器
    ctr tasks resume <container>	恢复容器
    ctr tasks delete <container>	删除 task(通常先停止)
    ctr tasks exec --tty <container> <command>	在运行的容器中执行命令(交互式)
    ctr tasks attach <container>	连接到正在运行的 task 的控制台
    
  4. Namespace 管理。containerd 支持命名空间(隔离镜像和容器)。
    ctr namespaces list	查看所有 namespace
    ctr namespaces set <namespace>	切换命名空间(后续命令生效)
    

    默认命名空间是 default

  5. 快照(Snapshot)管理.containerd 使用 snapshot 存储文件系统层。
    ctr snapshots list	列出所有 snapshot
    ctr snapshots info <snapshot>	查看 snapshot 信息
    ctr snapshots rm <snapshot>	删除 snapshot
    
  6. 插件和调试
    ctr plugins list	列出 containerd 的插件
    ctr version	查看 containerd 和 CLI 版本
    ctr events	订阅 containerd 事件(调试用)
    
  7. 其他常用技巧:直接进入容器交互式 shell(假设 bash 存在):
    ctr tasks exec --tty <container> /bin/bash
    
  8. 查看镜像层:
    ctr images manifest <image>
    
  9. 查看容器日志(通过 task attach):
    ctr tasks attach --tty <container>
    

后续

  • Kind是单个本地电脑安装k8s集群,集群安装在本地电脑的docker容器里面
  • Minikube则是单机器本地电脑安装(本地docker也可以)
  • 而k3s和microk8s是安装在本地,支持多节点,接近生产中的实际环境。当然也可以单机器使用多个进程模拟多worker

k3s 更轻量,适合快速实验;microk8s 功能更完整,更贴近生产体验。后面将使用这2种方式来安装k8s。

microk8s 不支持使用命令脚本或者apt/rpm 来安装,只能使用snap安装

如果系统是centos或者ubuntu server则无法安装,不考虑microk8s安装测试环境的k8s