使用 Minikube 搭建 Kubeernetes 集群
1. 搭建 Minikube
minikube start | minikube (k8s.io)
2. 基本操作
2.1 集群相关
minikube start
命令可以启动一台单节点 ( node ) 的 Kubernetes 集群
# 启动集群
# minikube start --image-mirror-country='cn'
minikube start
# 停止集群
minikube stop
# 清空集群
minikube delete --all
# 查看集群状态
minikube status
# 连接到这个集群
sakura@SakurasDebian12:~$ minikube ssh
docker@minikube:~$ ls
docker@minikube:~$ exit
logout
2.2 node相关
# 新增node
minikube node add
# 删除node
minikube node delete [nodename]
# 查询node列表
minikube node list
# 启动/停止指定的集群node
minikube node start/stop [nodename]
2.3 开启 DashBoard
# 1.首先启动组件metrics-server
minikube addons enable metrics-server
# 2.开启DashBord
minikube dashboard # 直接打开默认浏览器
minikube dashboard --url # 返回url
# 如果卡住或者报错,查看kube-system的pod是否ready
kubectl get pods --all-namespaces
sakura@SakurasDebian12:~$ minikube dashboard
🔌 正在开启 dashboard ...
▪ 正在使用镜像 docker.io/kubernetesui/dashboard:v2.7.0
▪ 正在使用镜像 docker.io/kubernetesui/metrics-scraper:v1.0.8
💡 某些 dashboard 功能需要启用 metrics-server 插件。为了启用所有功能,请运行以下命令:
minikube addons enable metrics-server
🤔 正在验证 dashboard 运行情况 ...
🚀 正在启动代理...
🤔 正在验证 proxy 运行状况 ...
🎉 正在使用默认浏览器打开 http://127.0.0.1:44061/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/ ...
CTRL + C 退出之后就不能访问了
2.4 组件相关
# 查看所有可安装的组件
# 列出所有可用的 minikube 插件及其当前状态(启用/禁用)
minikube addons list
# 开启组件
minikube addons enable ADDON_NAME [flags]
2.5 Kubectl
Pod
# 查看pod
kubectl get pod -o wide
# 查看pod日志
kubectl logs/pod名字
# 根据配置文件进行部署
kubectl apply -f 文件名
# 删除
kubectl delete -f 文件名
# 进入指定pod容器
kubectl exec -it pod名字 -- bash
kubectl get namespaces
kubectl get pods -A
# 查看kube-system的pod
kubectl get pods --all-namespaces
# 查看指定命名空间下的pod
kubectl describe pod metrics-server-7c66d45ddc-gmqhx -n kube-system
Deployment
# 查看部署情况
kubectl get deployment
Service
# 查看服务
kubectl get service
# 删除服务
kubuctl delete service <...>
# 查看服务详情
kubectl describe service 服务详情
3. Kubernetes 基本架构
Kubernetes 采用了现今流行的“控制面 / 数据面”(Control Plane / Data Plane)架构, 集群里的计算机被称为“节点”(Node),可以是实机也可以是虚机,少量的节点用作控制 面来执行集群的管理维护工作,其他的大部分节点都被划归数据面,用来跑业务应用。
控制面的节点在 Kubernetes 里叫做 Master Node,一般简称为 Master,它是整个集群里 最重要的部分,可以说是 Kubernetes 的大脑和心脏。
数据面的节点叫做 Worker Node,一般就简称为 Worker 或者 Node,相当于 Kubernetes 的手和脚,在 Master 的指挥下干活。
sakura@SakurasDebian12:~$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
minikube Ready control-plane 89m v1.28.3
minikube-m02 Ready <none> 16m v1.28.3
minikube-m03 Ready <none> 15m v1.28.3
另外如果集群只有一个 Node,那么这个 Node 既承担 Master 的工作也承担 Worker 的工作
Master
apiserver 是 Master 节点——同时也是整个 Kubernetes 系统的唯一入口,它对外公开了一 系列的 RESTful API,并且加上了验证、授权等功能,所有其他组件都只能和它直接通信。
etcd 是一个高可用的分布式 Key-Value 数据库,用来持久化存储系统里的各种资源对象和状 态,相当于 Kubernetes 里的配置管理员。注意它只与 apiserver 有直接联系,也就是说任何 其他组件想要读写 etcd 里的数据都必须经过 apiserver。
scheduler 负责容器的编排工作,检查节点的资源状态,把 Pod 调度到最适合的节点上运 行,相当于部署人员。因为节点状态和 Pod 信息都存储在 etcd 里,所以 scheduler 必须通 过 apiserver 才能获得。
controller-manager 负责维护容器和节点等资源的状态,实现故障检测、服务迁移、应用伸 缩等功能,相当于监控运维人员。同样地,它也必须通过 apiserver 获得存储在 etcd 里的信 息,才能够实现对资源的各种操作
# 查看这几个组件的状态
kubectl get pod -n kube-system
Node
Master 里的 apiserver、scheduler 等组件需要获取节点的各种信息才能够作出管理决策,需要 Node 里的 3 个组件了,分别是 kubelet、kube-proxy、container-runtime。
kubelet 是 Node 的代理,负责管理 Node 相关的绝大部分操作,Node 上只有它能够与 apiserver 通信,实现状态报告、命令下发、启停容器等功能。
kube-proxy 的作用有点特别,它是 Node 的网络代理,只负责管理容器的网络通信,简单来说就是为 Pod 转发 TCP/UDP 数据包。
container-runtime 是容器和镜像的实际使用者,在 kubelet 的指挥下创建容器,管理 Pod 的生命周期。
3.3 工作流程
每个 Node 上的 kubelet 会定期向 apiserver 上报节点状态,apiserver 再存到 etcd 里。
每个 Node 上的 kube-proxy 实现了 TCP/UDP 反向代理,让容器对外提供稳定的服务。
scheduler 通过 apiserver 得到当前的节点状态,调度 Pod,然后 apiserver 下发命令给 某个 Node 的 kubelet,kubelet 调用 container-runtime 启动容器。
controller-manager 也通过 apiserver 得到实时的节点状态,监控可能的异常情况,再使 用相应的手段去调节恢复
插件中比较重要的两个:DNS 和 Dashboard。
4. API 对象
# 查看当前 Kubernetes 版本支持的所有对象
kubectl api-resources
# 可以看到命令呃呃执行过程,以及发出的请求
kubectl get pod --v=9
4.1 编写 Yaml 声明式文件
通过查看kubectl api-resources
来查看 ApiVersion
kubectl explain
是 Kubernetes 自带的 API 文档,会给出对象字段的详细说明
kubectl explain pod
kubectl explain pod.metadata
kubectl explain pod.spec
kubectl explain pod.spec.containers
# 生成一份模版文件
kubectl run ngx --image=nginx:alpine --dry-run=client -o yaml
# 也可以将这段 --dry-run=client -o yaml 定义为shell变量
export out="--dry-run=client -o yaml"
kubectl run ngx --image=nginx:alpine $out
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: ngx
name: ngx
spec:
containers:
- image: nginx:alpine
name: ngx
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
评论区