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服务,有两种方式:
-
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来访问 -
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常见操作
- 容器镜像管理
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 包 - 容器管理
ctr containers list 列出所有容器 ctr containers info <container> 查看容器信息 ctr containers create <image> <name> 创建容器(不启动) ctr containers delete <container> 删除容器 ctr containers update <container> 更新容器(如资源限制) - 任务/执行(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 的控制台 - Namespace 管理。containerd 支持命名空间(隔离镜像和容器)。
ctr namespaces list 查看所有 namespace ctr namespaces set <namespace> 切换命名空间(后续命令生效)默认命名空间是 default
- 快照(Snapshot)管理.containerd 使用 snapshot 存储文件系统层。
ctr snapshots list 列出所有 snapshot ctr snapshots info <snapshot> 查看 snapshot 信息 ctr snapshots rm <snapshot> 删除 snapshot - 插件和调试
ctr plugins list 列出 containerd 的插件 ctr version 查看 containerd 和 CLI 版本 ctr events 订阅 containerd 事件(调试用) - 其他常用技巧:直接进入容器交互式 shell(假设 bash 存在):
ctr tasks exec --tty <container> /bin/bash - 查看镜像层:
ctr images manifest <image> - 查看容器日志(通过 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