Ubuntu22.04部署K3s
K3s 是一个轻量级的 Kubernetes 发行版,旨在简化和优化 Kubernetes 的安装和运行。K3s 使用了简化的架构,使其更适合在资源受限的环境中运行,如边缘设备、物联网(IoT)设备和低功耗硬件。K3s 的架构基于标准的 Kubernetes 组件,但对其进行了精简和优化。
官方文档:https://docs.k3s.io/zh/
https://docs.rancher.cn/docs/k3s/_index
K3s 集群的典型拓扑
- Server 节点指的是运行
k3s server
命令的主机,control plane 和数据存储组件由 K3s 管理。
- Agent 节点指的是运行
k3s agent
命令的主机,不具有任何数据存储或 control plane 组件。
- Server 和 Agent 都运行 kubelet、容器运行时和 CNI。
1. 单节点模式
在单节点模式下,k3s server
和 k3s agent
运行在同一台机器上。适用于测试环境或资源非常有限的环境。
1 2 3 4 5 6
| [Master Node] (K3s server + agent) └── K3s API Server └── K3s Controller Manager └── K3s Scheduler └── etcd (默认使用 SQLite) └── K3s agent (用于运行容器和 Pod)
|
2. 多节点模式
在多节点模式下,k3s server
可以部署多个实例以提供高可用性,而 k3s agent
部署在多个工作节点上。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [Master Node 1] (K3s server) └── K3s API Server └── K3s Controller Manager └── K3s Scheduler └── etcd (或外部 etcd)
[Master Node 2] (K3s server) <- 高可用配置 └── K3s API Server └── K3s Controller Manager └── K3s Scheduler
[Worker Node 1] (K3s agent) └── K3s agent └── 容器运行时
[Worker Node 2] (K3s agent) └── K3s agent └── 容器运行时
|
在 Ubuntu 22.04 上部署 K3s 单节点模式是非常简单的。以下是安装步骤,涵盖了从安装 K3s 到验证集群是否正常运行的完整过程。
步骤 1:准备环境
确保你的 Ubuntu 22.04 机器有互联网连接,并且已经更新了系统。
- 更新系统 :
在安装 K3s 之前,先确保系统是最新的:
1 2
| sudo apt update sudo apt upgrade -y
|
2.安装Docker
步骤 2:安装 K3s
1.使用官方安装脚本安装 K3s
1 2 3 4
| curl –sfL \ https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \ INSTALL_K3S_MIRROR=cn sh -s - \ --system-default-registry "registry.cn-hangzhou.aliyuncs.com"
|
列出 所有命名空间 下的所有 服务(services)
列出 所有命名空间 下的所有 Pod
查看名为 kuboard-etcd-gvx6q 的 Pod 在 kuboard 命名空间中的详细信息
1
| kubectl describe pod kuboard-etcd-gvx6q -n kuboard
|
2.配置镜像
Docker
1 2 3
| echo '{"registry-mirrors": ["https://docker.1ms.run"]}' | sudo tee /etc/docker/daemon.json > /dev/null systemctl daemon-reload systemctl restart docker
|
K3s
1 2 3 4 5 6 7
| cat >> /etc/rancher/k3s/registries.yaml <<EOF mirrors: "docker.io": endpoint: - "https://docker.1ms.run" EOF systemctl restart k3s
|
安装完成后,K3s 会自动启动, 检查K3s服务的状态:
1 2
| sudo systemctl status k3s
|
安装完成后通过以下指令获取k3s节点的工作状态
将会输出存在的节点的工作状态
1 2
| NAME STATUS ROLES AGE VERSION ubuntu Ready control-plane,master 134m v1.29.5+k3s1
|
查看 K3S_TOKEN
1
| sudo cat /var/lib/rancher/k3s/server/node-token
|
工作节点的安装(可选)
1
| curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.113.57:6443 K3S_TOKEN={K3S_TOKEN} sh -
|
根据需求把上面的 https://192.168.113.57:6443
和 K3S_TOKEN
更换成你的即可
K3s worker 节点的角色默认为none
,如何修改?
可以通过kubectl label node 节点名称 node-role.kubernetes.io/worker=worker
为节点增加 worker 角色。
配套工具
helm
Helm 是一个 Kubernetes 包管理工具,类似于 Linux 下的 apt
或 yum
,它帮助用户管理 Kubernetes 应用的安装、升级和配置。
helm官网地址:https://helm.sh/docs/intro/install/
在上面的文档中找到你的服务器对应系统的安装流程,下面是Ubuntu的安装流程
1 2 3 4
| curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
|
也可以Apt安装
1 2 3 4 5
| curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null sudo apt-get install apt-transport-https --yes echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list sudo apt-get update sudo apt-get install helm
|
然后复制k3s.yml到~/.kube/文件夹下即可
1
| cp /etc/rancher/k3s/k3s.yaml ~/.kube/
|
测试helm命令:
kuboard
接着去安装kuboard这个面板来可视化管理集群。
1
| kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
|
使用 watch kubectl get pods -n kuboard
命令监控所有的Pod就绪
访问Kuboard
- 在浏览器中打开链接
http://your-node-ip-address:30080
kube-explorer
Kube-Explorer 是一个用来探索和管理 Kubernetes 集群资源的工具。它的目的是简化与 Kubernetes 集群的交互,帮助用户更容易地查看、分析和管理 Kubernetes 中的各种资源,如 Pod、服务、部署、命名空间等。
https://github.com/cnrancher/kube-explorer
cert-manager
启用HTTPS访问你的服务
https://cert-manager.io/docs/installation/kubectl/
部署服务
这里以部署nginx为例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| apiVersion: apps/v1 kind: Deployment metadata: name: wx-mp-nginx-deployment labels: app: wx-mp-nginx spec: replicas: 1 selector: matchLabels: app: wx-mp-nginx template: metadata: labels: app: wx-mp-nginx spec: containers: - name: wx-mp-nginx image: nginx:1.23.1 ports: - containerPort: 80 volumeMounts: - name: nginx-data mountPath: /usr/share/nginx/html/ volumes: - name: nginx-data hostPath: path: /root/data/wx-mp-nginx type: Directory
|
说明
此时,无法通过外网和服务间无法调用,需要部署service来实现,部署yaml如下
1 2 3 4 5 6 7 8 9 10 11 12 13
| apiVersion: v1 kind: Service metadata: name: wx-mp-nginx-service spec: type: NodePort selector: app: wx-mp-nginx ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 31432
|
过NodePort方式,将服务开启在了31432端口
此时,在服务器安全组里添加【31432】端口,即可外网正常访问此时部署的Nginx服务了
如果有域名可以这样
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| --- apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: app: nginx replicas: 2 template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx-svc spec: ports: - port: 80 name: nginx targetPort: 80 type: ClusterIP selector: app: nginx --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx-ingress-1 annotations: spec.ingressClassName: traefik spec: rules: - host: nginx.abc.com http: paths: - path: / pathType: Prefix backend: service: name: nginx-svc port: number: 80
|
这个yml包含Deployment、Service和traefik Ingress
如果没有域名,在本地的hosts添加代理