K3s万字基础详解,轻量级Kubernetes搭建使用、应用部署

✍️Auth:运维笔记       Date:2024/12/4       Cat:Linux服务器       👁️:11 次浏览

一,k3s简介

K3s 是一个轻量级的 Kubernetes(K8s)发行版,由 Rancher 开发,专为资源受限环境设计,例如物联网 (IoT) 设备、边缘计算和小型开发环境。K3s 提供了简化的安装和操作体验,同时保持 Kubernetes 的核心功能。

K3s 的主要特点:

  • 1, 轻量化: 二进制文件仅约 100 MB,比标准 Kubernetes 更加轻量。
    精简了许多不常用的 Kubernetes 组件,例如 Ingress controllers 和存储插件,同时提供选配的插件包。
  • 2,易于安装:
    单一命令即可启动完整的 Kubernetes 集群:
    bash curl -sfL https://get.k3s.io | sh -
    内置了许多功能,如容器运行时 (Containerd)、网络插件和存储插件,减少了额外的配置需求。
  • 3,优化的资源使用: 适用于低性能设备,最低需求仅 512MB 内存和 1 核 CPU。
    默认使用 SQLite 作为嵌入式数据库,而非 etcd,可以在小规模环境下显著减少资源消耗。
  • 4,内置组件: 包括 CoreDNS、Flannel(网络插件)和 Traefik(Ingress Controller)。
    集成了常用的 Helm 和 CRI 工具,简化了扩展功能的使用。
  • 5,跨平台支持: 支持 x86_64、ARM64 和 ARMv7 等架构,适配树莓派等 IoT 设备。
  • 6,高可用性: 支持高可用集群模式,通过外部数据库(如 MySQL、PostgreSQL)实现多主节点集群。

K3s 的典型使用场景:

  • 边缘计算: 在分布式环境中运行,支持边缘设备的工作负载管理。
  • IoT 部署: 在低功耗硬件设备上运行微服务或容器化应用。
  • 开发和测试环境: 提供简化的 Kubernetes 体验,适合本地开发和轻量测试。
  • 小规模生产集群: 可以用作中小企业的 Kubernetes 解决方案,减少运维复杂度。

与 Kubernetes 的主要区别:

特性K3sKubernetes
安装复杂度简单,单命令安装相对复杂,需要配置多个组件
资源占用较低,适合低性能环境较高,适合高性能集群
数据存储默认 SQLite,可扩展其他数据库默认 etcd
定位场景资源受限环境、小型集群数据中心、大规模集群

K3s 的轻量化特性使其成为在资源有限环境中使用 Kubernetes 的首选工具,同时也为需要快速原型和开发的用户提供了便捷的选择。

二,k3s搭建使用

这里搭建测试两台服务器作为集群:

192.168.203.133(master)ubuntu
192.168.203.134(worker)ubuntu

确保防火墙允许主节点和 Agent 节点之间的通信,特别是以下端口:
6443/TCP(Kubernetes API)
10250/TCP(Kubelet API)
8472/UDP(Flannel VXLAN 网络)

k3s搭建非常检查,一条命令即可。

1,安装与卸载 K3s

Master 节点
192.168.203.133服务器执行命令

sudo curl -sfL https://get.k3s.io | sh -

此命令安装的默认为master(主节点),如果只有一台服务器,作为单节点模式,就搭建完了。

但作为集群,还需要搭建worker节点,所以需要查看node-token给worker节点使用,运行结果如下:

ubuntu@ubuntu:~$ sudo cat /var/lib/rancher/k3s/server/node-token
K10758faf09a207eae4ed4eb9f5489263ffad333543f61a34eedd4df9971bf7bcb...

Worker 节点

根据在master得到的token在worker节点服务器运行。

sudo curl -sfL https://get.k3s.io | K3S_URL=https://<master-node-ip>:6443 K3S_TOKEN=<token> sh -

这里测试为192.168.203.134上运行,所以命令为:

sudo curl -sfL https://get.k3s.io | K3S_URL=https://192.168.203.133:6443 K3S_TOKEN=K10758faf09a207eae4ed4eb9f5489263ffad333543f61a34eedd4df9971bf7bc... sh -

注意:
服务器主机名不能相同,如果服务器名相同,需要加参数 INSTALL_K3S_EXEC=”–with-node-id”标记主机唯一标识,示例:

sudo curl -sfL https://get.k3s.io | K3S_URL=https://192.168.203.133:6443 K3S_TOKEN=K10758faf09a207eae4ed4eb9f5489263ffad333543f61a34eedd4df9971bf7bc... INSTALL_K3S_EXEC="--with-node-id" sh -

对于中国用户,可以用以下镜像加速安装:

curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

以上就安装完成了,可以用以下命令查看集群是否全部启动:

ubuntu@ubuntu:~$ sudo kubectl get nodes
NAME              STATUS   ROLES                  AGE     VERSION
ubuntu            Ready    control-plane,master   3h53m   v1.30.6+k3s1
ubuntu-d41c5ee6   Ready    <none>                 106m    v1.30.6+k3s1

卸载 K3s
如果需要卸载,卸载命令:

#master节点:
/usr/local/bin/k3s-uninstall.sh
#worker节点:
/usr/local/bin/k3s-agent-uninstall.sh

2,基本命令操作

查看服务命令
安装完成可以查看k3s服务状态

#master节点:
sudo systemctl status k3s.service
#worker节点:
sudo systemctl status k3s-agent.service

日志查看命令,如果安装有问题,可以查看实时输出日志

#master节点
sudo journalctl -u k3s.service -f
#worker节点
sudo journalctl -u k3s-agent.service -f

Kubernetes 命令(与 kubectl 一致)
K3s 内置了 kubectl,直接使用 kubectl 命令管理集群资源。

检查集群状态
kubectl get nodes
kubectl get pods -A
kubectl get svc -A
查看集群的详细信息
kubectl cluster-info
部署应用
kubectl apply -f <yaml-file>
删除资源
kubectl delete -f <yaml-file>
kubectl delete pod <pod-name>
进入 Pod 调试
kubectl exec -it <pod-name> -- /bin/bash
查看资源详情
kubectl describe pod <pod-name>
kubectl describe svc <svc-name>

三,k3s部署wordpress网站

实践出真知,部署应用才更能熟悉k3s的用法,现在用k3s集群部署一个wordpress网站。
wordpress官方提供直接用的docker 镜像,所以比较简单。

创建一个项目文件夹,所有文件在此文件夹操作

mkdir wordpress
cd wordpress

k3s和docker compose一样都是根据yaml文件来部署应用。

1,部署 MetalLB

MetalLB 是 Kubernetes 的负载均衡器插件,用于为服务分配外部 IP。这里两台,所以用负载均衡处理。

在主服务器上安装 MetalLB:

kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/main/config/manifests/metallb-native.yaml

配置 MetalLB 的 IP 地址池: 创建 metallb-config.yaml 文件:

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: pool1
  namespace: metallb-system
spec:
  addresses:
  - 192.168.203.133-192.168.203.134
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: adv1
  namespace: metallb-system

配置完运行

sudo kubectl apply -f metallb-config.yaml

2,部署 WordPress 和 MySQL

创建 WordPress 和 MySQL 的配置文件 wordpress-deployment.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: wp-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-pv-claim
  labels:
    app: wordpress
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: wordpress
spec:
  replicas: 2
  selector:
    matchLabels:
      app: wordpress
  template:
    metadata:
      labels:
        app: wordpress
    spec:
      containers:
      - image: wordpress:latest
        name: wordpress
        env:
        - name: WORDPRESS_DB_HOST
          value: mysql
        - name: WORDPRESS_DB_USER
          value: wordpress_user
        - name: WORDPRESS_DB_PASSWORD
          value: wordpress_pass
        ports:
        - containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: mysql:5.7
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: yourpassword
        - name: MYSQL_DATABASE
          value: wordpress
        - name: MYSQL_USER
          value: wordpress_user
        - name: MYSQL_PASSWORD
          value: wordpress_pass
        ports:
        - containerPort: 3306
        volumeMounts:
        - name: mysql-persistent-storage
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql-persistent-storage
        persistentVolumeClaim:
          claimName: mysql-pv-claim
---
apiVersion: v1
kind: Service
metadata:
  name: wordpress
spec:
  selector:
    app: wordpress
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
---
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  selector:
    app: mysql
  ports:
  - protocol: TCP
    port: 3306
    targetPort: 3306
  clusterIP: None

mysql只需要一个,wordpress两台服务器所以replicas: 2,最后应用配置

sudo kubectl apply -f wordpress-deployment.yaml

3,验证和命令说明

查看 WordPress 的外部 IP( EXTERNAL-IP):

ubuntu@ubuntu:~/wordpress$ sudo kubectl get svc wordpress
NAME        TYPE           CLUSTER-IP    EXTERNAL-IP       PORT(S)        AGE
wordpress   LoadBalancer   10.43.1.225   192.168.203.134   80:31453/TCP   81m

kubectl get svc 是用于查看 Kubernetes 集群中 Service 信息的命令。它可以显示每个服务的名称、类型、集群内 IP 地址、暴露的端口等关键信息。以下是 kubectl get svc 的输出示例及详解:
在浏览器中访问该 IP 地址,即可看到 WordPress 的安装页面。

示例:

NAME             TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
kubernetes       ClusterIP      10.96.0.1        <none>        443/TCP           5d
my-service       NodePort       10.96.58.137     <none>        8080:30001/TCP    2h
loadbalancer-svc LoadBalancer   10.96.32.53      34.123.45.67  80:31001/TCP      1h

其他字段很好理解,这里讲下 TYPE 字段类型:
TYPE服务的类型,定义了服务的访问方式:

  • ClusterIP:仅集群内部访问(默认类型)。
  • NodePort:在每个节点的特定端口上暴露服务。
  • LoadBalancer:创建外部负载均衡器(仅适用于支持 LoadBalancer 的环境,如云平台)。
  • ExternalName:通过 DNS 名称暴露服务。
  • Headless Service:没有 Cluster IP 的特殊服务,适用于直接访问 Pod。

其它参数

#1,列出更多信息,增加更多字段,例如服务选择器、标签等。
kubectl get svc -o wide

#2,查看特定命名空间的服务,默认命令只查看当前命名空间的服务,加 -n 可指定特定命名空间。
kubectl get svc -n <namespace>

#3,查看所有命名空间的服务
kubectl get svc --all-namespaces

#4,输出为 YAML/JSON 格式,用于详细分析服务配置或作为模板。
kubectl get svc my-service -o yaml
kubectl get svc my-service -o json

负载均衡效果验证:
通过刷新页面多次请求,WordPress 的两个副本将轮流处理请求,实现负载均衡。可以使用以下命令查看 Pod 的运行情况:

ubuntu@ubuntu:~/wordpress$ sudo kubectl get pods -o wide
NAME                         READY   STATUS    RESTARTS   AGE   IP           NODE              NOMINATED NODE   READINESS GATES
mysql-c59dbc976-sskvl        1/1     Running   0          39s   10.42.1.52   ubuntu-d41c5ee6   <none>           <none>
wordpress-66d68f4cd8-dw776   1/1     Running   0          39s   10.42.1.50   ubuntu-d41c5ee6   <none>           <none>
wordpress-66d68f4cd8-g59bc   1/1     Running   0          39s   10.42.0.50   ubuntu            <none>           <none>

kubectl get pods 是用于查看 Kubernetes 集群中 Pod 信息的命令。Pod 是 Kubernetes 中最小的部署单元,kubectl get pods 命令提供了每个 Pod 的状态、节点位置、重启次数等信息。

常用参数选项:

# 1,列出所有命名空间的 Pod,输出中会包含命名空间信息。
kubectl get pods --all-namespaces

# 2,列出某一命名空间的 Pod
kubectl get pods -n <namespace>

# 3,查看详细信息,包括 Pod 的事件、节点信息、IP、容器状态等。
kubectl describe pod <pod-name>

# 4,查看带标签的 Pod,例如,kubectl get pods -l app=nginx 列出带有标签 app=nginx 的 Pod。
kubectl get pods -l <label-key>=<label-value>

# 5,输出为 YAML/JSON,用于分析配置或备份。
kubectl get pod <pod-name> -o yaml
kubectl get pod <pod-name> -o json

# 6,附加更多列,显示额外信息,例如节点名称、Pod IP、所属节点。
kubectl get pods -o wide

4,NodePort 模式(扩展)

以上虽然实现了负载均衡,但有个问题。

如果分配给外部访问的 IP 地址绑定在某台服务器上,而该服务器宕机,则整个负载均衡服务将失效。这是因为外部 IP 通常是通过负载均衡器(如 MetalLB)绑定到一个节点的,如果该节点不可用,流量无法路由到其他节点上的 Pod。

为了确保外部 IP 地址仍然可用,即使某台服务器宕机,也能访问服务,可以考虑以下方法:

1,配置 MetalLB 的高可用模式(推荐 BGP 模式)。
需要设置至少两台支持 BGP 的路由器(或其他 BGP 设备)来提供高可用性。
2,在集群外使用双负载均衡器。
3,改用 NodePort 模式,通过多个节点直接访问服务。

这里主要演示NodePort模式:

编写配置服务wordpress-nodeport-service.yaml

apiVersion: v1
kind: Service
metadata:
  name: wordpress
  labels:
    app: wordpress
spec:
  type: NodePort
  selector:
    app: wordpress
  ports:
  - port: 80             # 服务暴露的端口(集群内访问的端口)
    targetPort: 80       # Pod 内服务的端口
    nodePort: 30080      # 集群节点上暴露的端口(指定范围为 30000-32767),如果去掉这行,则自动分配端口。

应用配置

sudo kubectl apply -f wordpress-nodeport-service.yaml

验证服务状态。

ubuntu@ubuntu:~/wordpress$ sudo kubectl get svc wordpress
NAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
wordpress   NodePort   10.43.134.23   <none>        80:30080/TCP   20m

访问服务,浏览器分别访问,都正常:
http://192.168.203.133:30080
http://192.168.203.134:30080


完整的架构,可以在外部用一个nginx配置域名,用负载均衡分别访问两台服务器即可。

5,Ingress 模式(扩展)

5.1,简介
Ingress: 是 Kubernetes 中的一种资源类型,本身不是一个工具,而是 Kubernetes 中的一个抽象概念,定义了 HTTP(S) 路由规则,用于将外部流量路由到 Kubernetes 集群内的服务。通过Ingress 控制器(Ingress Controller)负责实现这些路由规则并处理流量。

简单来说,Ingress就是通过域名访问,不能简单的通过IP或者端口访问。

Ingress Controller:控制组件,有nginx和Traefik 两种,k3s默认安装有Traefik,可更加命令查看是否安装,如下:traefik-d7c9c5778-4dfmf 默认已经安装完成。

ubuntu@ubuntu:~/wordpress$ sudo kubectl get pods -n kube-system
NAME                                      READY   STATUS      RESTARTS        AGE
coredns-7b98449c4-nnzf6                   1/1     Running     2 (3h27m ago)   5d4h
helm-install-traefik-68kb8                0/1     Completed   2               5d4h
helm-install-traefik-crd-g9gmw            0/1     Completed   0               5d4h
local-path-provisioner-595dcfc56f-hkrqk   1/1     Running     2 (3h27m ago)   5d4h
metrics-server-7d794db65c-8jrd4           1/1     Running     0               3h42m
svclb-traefik-0b4e3b70-4f4tv              2/2     Running     2 (22h ago)     5d2h
svclb-traefik-0b4e3b70-rdhlw              2/2     Running     4 (3h27m ago)   5d4h
traefik-d7c9c5778-4dfmf                   1/1     Running     2 (3h27m ago)   5d4h

5.2,部署

默认有Traefik,现在只需要用Traefik定义一个基础的 Ingress,让 Traefik 路由 HTTP 流量到我们的服务。

创建一个名为 wordpress-ingress.yaml 的文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wordpress-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: web
spec:
  rules:
  - host: wordpress.example.com  # 替换为你的域名或裸 IP
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wordpress
            port:
              number: 80

traefik.ingress.kubernetes.io/router.entrypoints: web:指定使用 web 入口点(默认监听 HTTP 流量)。
应用配置:

sudo kubectl apply -f wordpress-ingress.yaml

原来的wordpress-deployment.yaml配置也需要改, type: LoadBalancer
改成 type: ClusterIP 即可。

apiVersion: v1
kind: Service
metadata:
  name: wordpress
spec:
  selector:
    app: wordpress
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  #type: LoadBalancer
  type: ClusterIP

应用配置:

sudo kubectl apply -f wordpress-deployment.yaml

验证配置,查看 Ingress 路由是否配置成功:

ubuntu@ubuntu:~/wordpress$ sudo kubectl get ingress
NAME                CLASS     HOSTS                   ADDRESS           PORTS   AGE
wordpress-ingress   traefik   wordpress.example.com   192.168.203.133   80      56s

由于在本地测试,没有域名,所以在hosts配置好模拟域名配置。

192.168.203.133   wordpress.example.com

然后在浏览器中访问 http://wordpress.example.com,可正常访问。直接IP是不可访问的。

5.3,让 Traefik 自动申请 TLS 证书(扩展)

Traefik 支持自动通过 Let’s Encrypt 申请 TLS 证书,并配置 HTTPS。你需要更新 Traefik 的配置以启用 ACME(Automatic Certificate Management Environment)。

此方式仅支持实际域名的证书申请。

配置 Traefik 动态文件
创建一个名为 traefik-values.yaml 的文件,用于 Helm 安装或更新 Traefik。

certificatesResolvers:
  letsencrypt:
    acme:
      email: [email protected]    # 替换为你的电子邮件
      storage: /data/acme.json         # 用于存储证书的路径
      httpChallenge:
        entryPoint: web                # 使用 HTTP-01 挑战验证域名
  • email:用于注册 Let’s Encrypt 账号。
  • storage:证书将存储在 Traefik Pod 的 /data/acme.json 文件中。
  • httpChallenge:使用 HTTP-01 验证域名的所有权。

将这个文件应用到 Traefik:

helm upgrade --namespace kube-system traefik traefik/traefik -f traefik-values.yaml

更新 Ingress 配置
修改 Ingress 文件以启用 HTTPS:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: wordpress-ingress
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls.certresolver: letsencrypt
spec:
  rules:
  - host: wordpress.example.com  # 替换为你的域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: wordpress
            port:
              number: 80
  tls:
  - hosts:
    - wordpress.example.com

traefik.ingress.kubernetes.io/router.tls.certresolver:指定使用 letsencrypt 解决器申请证书。
tls 部分:声明为域名启用 TLS。

验证 TLS 配置:

#部署更新后的 Ingress:
kubectl apply -f wordpress-ingress.yaml

#确认证书生成:会看到 Traefik 自动通过 Let's Encrypt 申请证书的日志。
kubectl logs -n kube-system <traefik-pod-name>

测试 HTTPS 访问: 打开浏览器,访问 https://wordpress.example.com,应看到 WordPress 的页面。

四,配置文件说明及其他工具

1,yaml文件简要说明:

以上k3s的yaml文件说明,文件主要分3部分,及kind申明部分。
1:PVC(PersistentVolumeClaim): 申请和绑定存储卷。
2:Deployment: 定义 MySQL 容器、环境变量及持久化配置。
3:Service: 提供 MySQL 的网络访问。
Namespace: 资源隔离,确保所有资源都在单独的命名空间中。

yaml 申明部分根据需要来决定是否需要:
PersistentVolumeClaim: 需要持久化存储时才必需。
Deployment: 推荐用于管理应用副本、滚动更新,但不绝对必须。
Service: 推荐用于暴露网络服务,但如果无需网络访问可以省略。

如其他部署常见场景:
无状态服务,如前端服务或简单的 API 服务:
通常需要 Deployment 管理 Pod 副本,Service 用于网络访问。
不需要 PVC,因为无状态服务不存储数据,示例nginx部署:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80

单 Pod 测试,只需临时运行一个应用进行调试:
仅需要 Pod,不需要 Deployment 和 Service。
持久化存储是否需要视具体情况,nginx部署示例:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-test
spec:
  containers:
    - name: nginx
      image: nginx:latest
      ports:
        - containerPort: 80

2,Kubernetes Dashboard

在 Kubernetes 中使用 Dashboard 和 Traefik 来管理和配置服务,结合 Ingress 和负载均衡功能,可以实现通过 Web 界面轻松管理资源。

部署 Kubernetes Dashboard

使用官方提供的 YAML 文件部署 Dashboard:

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

安装完可以查看插件是否安装完成:

ubuntu@ubuntu:~/wordpress$ sudo kubectl get pods -n kubernetes-dashboard
NAME                                         READY   STATUS    RESTARTS   AGE
dashboard-metrics-scraper-795895d745-t9lz9   1/1     Running   0          3m49s
kubernetes-dashboard-56cf4b97c5-hwlpg        1/1     Running   0          3m49s

Dashboard 默认使用严格的 RBAC 权限,需要为用户分配访问权限。

创建一个admin-user.yaml 和绑定 cluster-admin 角色:

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

应用配置:

sudo kubectl apply -f admin-user.yaml

获取访问 Token
生成并查看 admin-user 的访问 Token:

sudo kubectl -n kubernetes-dashboard create token admin-user

访问配置
1:通过节点 IP 和端口访问 Dashboard
如果希望通过节点 IP 和端口访问 Dashboard,可以将 Service 类型改为 NodePort。

#编辑 kubernetes-dashboard 服务:将 type: ClusterIP 修改为:type: NodePort
sudo kubectl -n kubernetes-dashboard edit svc kubernetes-dashboard

#保存退出后,获取 NodePort:
ubuntu@ubuntu:~/wordpress$ sudo kubectl -n kubernetes-dashboard get svc
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.43.89.95     <none>        8000/TCP        61m
kubernetes-dashboard        NodePort    10.43.115.108   <none>        443:32250/TCP   61m

通过服务器加端口32250即可访问,注必须是https才能访问。

2,配置 Traefik 以暴露 Dashboard

配置 Dashboard 的 Ingress
默认情况下,Dashboard 暴露为 ClusterIP 服务,仅在集群内部访问。你可以通过 Traefik 的 Ingress 将其暴露到外部。

创建 dashboard-ingress.yaml 文件:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: kubernetes-dashboard-ingress
  namespace: kubernetes-dashboard
  annotations:
    traefik.ingress.kubernetes.io/router.entrypoints: websecure
    traefik.ingress.kubernetes.io/router.tls.certresolver: letsencrypt
spec:
  rules:
  - host: dashboard.example.com  # 替换为你的域名
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: kubernetes-dashboard
            port:
              number: 443
  tls:
  - hosts:
    - dashboard.example.com

namespace: kubernetes-dashboard:确保 Ingress 和 Dashboard 服务在同一命名空间中。

应用配置:

sudo kubectl apply -f dashboard-ingress.yaml

验证查看ingress配置。

ubuntu@ubuntu:~/wordpress$ sudo kubectl get ingress -n kubernetes-dashboard
NAME                           CLASS     HOSTS                   ADDRESS           PORTS     AGE
kubernetes-dashboard-ingress   traefik   dashboard.example.com   192.168.203.133   80, 443   8s

配置hosts

192.168.203.133   dashboard.example.com

注:dashboard 默认必须使用https,所以如果有域名,申请ssl签证,才可以访问。
如果不使用ssl,需要更改默认的traefik.yaml 配置跳过ssl认证,此配置为全局配置,意味着所有使用Ingress服务的都跳过了ssl认证。所以仅测试使用,测试完成在改回来。或者确实不需要自签证书使用。

配置文件位置:

vim /var/lib/rancher/k3s/server/manifests/traefik.yaml

加上字段,globalArguments: – “–serversTransport.insecureSkipVerify=true”

apiVersion: helm.cattle.io/v1
kind: HelmChart
metadata:
  name: traefik
  namespace: kube-system
spec:
  chart: https://%{KUBERNETES_API}%/static/charts/traefik-27.0.201+up27.0.2.tgz
  set:
    global.systemDefaultRegistry: ""
  valuesContent: |-
    globalArguments:
      - "--serversTransport.insecureSkipVerify=true"

重启traefik服务配置

sudo kubectl rollout restart deployment traefik -n kube-system

最后域名访问输入上面生成的token即可。

3,Helm命令

Helm 是 Kubernetes 中非常强大的工具,能够大幅简化应用程序的安装和管理。通过 Helm,您可以轻松安装和升级应用,管理应用的多个版本,甚至创建自己的 Helm Charts 以便重用和共享。常用的 Helm 命令包括 install、upgrade、uninstall、list 等。

helm和 Linux 的 apt、yum 或 dnf 等包管理工具,但它专注于 Kubernetes 环境下的应用程序和服务的部署与管理。如果你熟悉 Linux 包管理工具,那么学习 Helm 的操作会非常直观。

  • Chart 仓库(Repo)
    Helm 的 Chart 仓库可以类比 Linux 的软件源,比如 Ubuntu 的 APT 源或 CentOS 的 Yum 仓库。
  • Chart(软件包)
    Chart 是 Helm 中的应用定义包,类似于 Linux 中的 .deb 或 .rpm 文件。
  • Release(已安装的软件实例)
    Helm 的 Release 可以类比于 Linux 中安装后的软件实例。例如,你用 helm install 部署了一个 Nginx Chart,它对应的是 Nginx 软件在系统中的实际安装。
  • 模板化和参数化
    Helm 支持使用模板和参数文件动态配置 Chart,这一点比 Linux 的包管理工具更强大,因为 Linux 的包通常是静态的二进制文件。

基础命令:

#安装和初始化,查看 Helm 的客户端和服务端版本。
helm version

#添加 Chart 仓库,例如:
helm repo add <repo_name> <repo_url>
helm repo add stable https://charts.helm.sh/stable

#更新本地的 Chart 仓库索引文件。
helm repo update

#搜索 Chart 仓库中的应用。例如:
helm search repo <keyword>
helm search repo mysql

#安装和卸载
helm install <release_name> <chart_name>
#安装 Chart 并创建一个 Release,例如:
helm install my-nginx bitnami/nginx
helm uninstall <release_name>

#卸载 Release,例如:
helm uninstall my-nginx

Release 管理命令

#查看 Release,列出当前命名空间的所有 Release。
helm list

#列出所有命名空间中的 Release。
helm list --all-namespaces

#升级和回滚
helm upgrade <release_name> <chart_name>

#升级 Release,例如:
helm upgrade my-nginx bitnami/nginx
helm rollback <release_name> <revision>
#回滚到指定版本,例如:
helm rollback my-nginx 1

#查看 Release 的版本历史
helm history <release_name>

#调试
#查看指定 Release 的状态信息。
helm status <release_name>

#获取 Release 的所有资源信息,包括配置和模板。
helm get all <release_name>

#运行与 Release 关联的测试。
helm test <release_name>

helm命令很多,不需要全部知道,只需要有herm命令后,无需我们自己编写yaml文件,很多支持k8s的软件,都提供这种直接的安装方式。

如:RabbitMQ高级消息队列协议,chatwoot聊天软件都支持在k8s一键安装。

打赏作者

发表评论