k3s 入门
k8s 是一个容器编排引擎,可以在上万容器的工况下自动扩缩容,在 docker 之上多了编排功能。
k3s 是 k8s 的轻量级实现,目标是减半 k8s 的内存开销。
k8s 集群包含控制平面 control plane 节点和 worker nodes。控制平面通过冗余部署应用和服务的容器,实现分布式高可用集群。在1.20 版本之前,容器由 docker 提供;在这之后,k8s 直接调用更底层的 container runtime (如 containerd)实现容器调度。
参考 GeekHour 教程
https://www.yuque.com/xiaoguai-pbjfj/cxxcrs/ocefqltbmbgl5eqg?singleDoc#AoKFh
环境配置
k3s 感觉文档很简陋,配环境就踩了很多坑……
安装 k3s, kubectl
安装脚本需要通过额外参数配置内部镜像源
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh -o k3s-install.sh
INSTALL_K3S_MIRROR=cn sh k3s-install.sh --system-default-registry "registry.cn-hangzhou.aliyuncs.com"
kubectl 是 k8s, k3s 通用的节点管理工具,以后都需要用它和 server 上运行的 kubeapi 通信。
安装 k3s 后,有时候系统执行所有指令都会变慢不能立刻返回。很奇怪,可能和 mem/io 有关,卸了就好。遇到这种情况卸了换个 mem/disk 更大的机器比较好。
kubectl 命令
kubernetes 组件
总体上,kubernetes 是一个主从集群。通过 k3s server 会创建一个 master 节点,运行 controlplane

Contolplane 功能也由多个容器化组件支持:
- etcd 是一个全局可访问的分布式键值存储系统,各个组件通过它进行通信;
- sched 是调度器;
- Control Manager 管理集群的各种资源对象的状态,负责重启 Pod, 替换 Pod。
- Cloud Control Manager 和云服务商接口通信。
集群的所有操作都需要访问控制平面的 server api (http)。该 api 默认架设在 server 的 localhost:6443。
agent 默认在 6444,但 server 似乎会顺便在 6444 搭一个分布式服务 sge_qmaster,不让跑在一个 node 上吧大概)
在从节点这边,每个节点需要 container runtime 和 kubernetes api 两个组件,例如 containerd 和 kubelet。
和 nodes 实体资源相对的一套体系是 pods, service, Ingress, ; deplotment, replicaSet, statefulSet。pod 是调度的最小单位,包含一个容器或多个耦合的容器,一个节点可以运行一个或多个 pod。由于 pod 的 ip 是动态的不方便外部访问,k8s 提供了 service 组件,通过反向代理将一组 pod 封装成一个服务,提供统一的静态 ip 访问入口;Ingress 组件提供了从外部(外网)访问集群的方式,支持根据域名转发到不同 service。此外还有保存配置用的 ConfigMap, 加密敏感信息的 Secret 等。
Deployment 组件主要用来保障正确节点数量稳定,支持配置自动扩容、滚顶更新等功能。可以在配置中定义程序的 pods 数量、滚动更新策略,组件会根据 pods 状态自动扩缩容。
但如果容器是有状态的服务,例如数据库, Deployment 组件就不再合适了,因为新节点不会继承旧节点硬盘的数据。Kubernetes 提供了 Stateful 组件来管理有状态的服务,Stateful 也提供了动态扩缩容的功能,此外它给每个副本提供了稳定的网络标识符和持久化存储。数据库、缓存、消息队列等这些有状态的应用以及保留了会话状态的应用一般都需要使用 StatefulSet 而不是 Deployment。但 Redis 是例外,由于数据在内存中,重启会导致数据丢失,不适合 Stateful。此外 Stateful 配置很麻烦,所以一个简单的方式是把有状态的应用程序从 Kubernetes 中剥离出来,在集群外单独部署。
kubectl 命令
kubectl 是封装了 api 通信的 cli 工具。可以快速创建、编辑 pods 的配置。
k3s 配置多节点暂时没有遇到,后面遇到了再查吧。
创建组件
kubectl create -n <namespace> -f <configFile> # config 替换了命令行的参数
kubectl create deployment name --image=nginx
一般不会直接创建 pods,而是创建 deployment, service 这些上层对象。可以创建的类型如下图,比如说 namespace, service, deployment… 如果安装了 kubevirt,还可以创建 VirtualMachine 类型的资源。
查询
kubectl get pods -n <namespace>
kubectl get nodes
kubectl get replicaset
查看资源详细信息 sudo kubectl describe [资源类型] [资源名称]
编辑配置
kubectl edit deployment nginx-deployment
kubectl apply # apply config update

也可以通过配置文件删除资源对象 sudo kubectl delete -f nginx-deployment.yaml,通过这个文件创建的所有资源对象都会被删除。
配置文件
可以通过 dry-run 生成一个配置文件模板。在配置文件中通过 label 和 matchlabel 来定义标签,或者根据标签匹配资源。
apiVersion: apps/v1 # 定义使用的API版本,这里是apps/v1,表示使用应用的v1版本API。
kind: Deployment # 定义资源类型为Deployment,表示部署一个应用。
metadata: # 元数据部分,用于描述Deployment的基本信息。
name: nginx-deployment # Deployment的名称为nginx-deployment。
spec: # 规格部分,定义Deployment的规格。
selector: # 选择器部分,用于选择要管理的Pod。
matchLabels: # 匹配标签部分。
app: nginx # 匹配标签为app=nginx的Pod。
replicas: 3 # 指定副本数为3,意味着会运行3个相同的Pod实例。
template: # 模板部分,定义创建新Pod时使用的模板。
metadata: # 模板的元数据部分。
labels: # 标签部分,为新创建的Pod定义标签。
app: nginx # 新创建的Pod的标签为app=nginx。
spec: # 新创建的Pod的规格。
containers: # 容器列表,定义在Pod中运行的容器。
- name: nginx # 容器的名称为nginx。
image: nginx:1.25 # 使用的容器镜像是nginx:1.25。
ports: # 容器的端口配置。
- containerPort: 80 # 容器监听的端口号为80。
题解
题目环境:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh -o k3s-install.sh
INSTALL_K3S_MIRROR=cn sh k3s-install.sh --system-default-registry "registry.cn-hangzhou.aliyuncs.com"
sed -i 's#muslcc#dockerpull.org/muslcc#g' compile-readflag.yaml
kubectl create -f compile-readflag.yaml
kubectl create -f rbac.yaml
kubectl create -f calico-operator-cn.yaml
kubectl create -f kubevirt-operator-v1.3.1-cn.yaml
kubectl create -f kubevirt-cr.yaml
# check status
kubectl get kubevirt.kubevirt.io/kubevirt -n kubevirt -o=jsonpath="{.status.phase}"
kubectl create -f https://kubevirt.io/labs/manifests/vm.yaml
./virtctl-v1.3.1-linux-amd64 start testvm
# China
kubectl create -f vm-cn.yaml
# run challenge
cp virtctl-v1.3.1-linux-amd64 challenge/
./create-kubeconfig.sh
cd challenge
# Edit docker-compose QUAY_HOST if you're living in China!
docker-compose up -d
You can check the status of the VM by kubectl get vms.
Run the chall
首先配环境就搞了我很久,命令不会用,资源不足又总是会报错。
- aliyun 的 2g 内存不够用,可能会导致 io 太多爆掉。(但是从 htop 里看 swap 其实没事,有可能是 ui 刷新前就挂了)
- 磁盘剩余空间过低的情况,k8s 会成功 create 资源,但新的 pod 会 error,原因是 storage 不足。
- kvm 和 nested virtualization 需要启动。在 kubevirt 的一个 issue 和官方文章中 minikube-install 一节查到的这个。vmware workstation 可以在虚拟机设置里启动 CPU 虚拟化支持。
- virtctl 没有找到 k3s 的 config file,导致去 8080 而非 6443 访问 api。在环境导出变量 export KUBECONFIG=/etc/rancher/k3s/k3s.yaml 解决(/root/.bashrc)。issue
- docker 的环境变量问题:docker-compose.yml 下,environment 键设置的环境变量是在 Dockerfile 的 RUN 之后,CMD 之前生效。因此在多数场景 environment 不能替代
RUN go env -w GOPROXY=https://goproxy.cn,direct - the server could not find the requested resource. Can’t connect to websocket (404): websocket: bad handshake 由于不知道这个是在链接哪个端口废了很大劲。解决方法是 sudo:因为 root 账户导出过环境变量
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml,并且访问这个文件本身一般也需要 sudo。 - 默认密码:gocubsgo. 在 sudo virtctl console 里输错多次好像就会提示
选手 wp: by zsxsoft
网络结构。
- 在主机上运行 k3s server 节点
- 主机上运行一个 docker,docker 与主机共享网段,并利用 tini 进程管理器运行 k3s agent 节点。
首先,检查 kubevirt-cr.yaml。这个文件定义了 custom sources,可以选择 kubevirt 的 feature。
看不懂了先这样吧
2314

被折叠的 条评论
为什么被折叠?



