k3s搭建本地kubernetes环境及dashboard部署

2,329 阅读5分钟

使用k3s快速搭建集群

官网https://docs.k3s.io/zh/

参考教程https://www.yuque.com/wukong-zorrm/qdoy5p

K3s是轻量级的Kubernetes,完全兼容Kubernetes发行版。K3s易于安装,仅需要 Kubernetes内存的一半,所有组件都在一个小于100MB的二进制文件中。

K3s集群分为k3s Server(控制节点)和k3s Agent(工作节点)。所有的组件都打包在单个二进制文件中。

K3s提供了离线安装包,安装起来非常方便,可以避免安装过程中遇到各种网络资源访问问题。

image.png

安装k3s前的虚拟机配置

k3s版本:v1.25.0+k3s1

hostnameipsystem-confignetwork
k8s-master192.168.218.137centos7, 内存:2g, cpu:4核, 硬盘:40gnat模式
k8s-worker1192.168.218.138centos7, 内存:2g, cpu:4核, 硬盘:40gnat模式
k8s-worker2192.168.218.139centos7, 内存:2g, cpu:4核, 硬盘:40gnat模式
  • 配置开机分配ip
vi /etc/sysconfig/network-scripts/ifcfg-ens33
将ONBOOT=no改成yes
重启服务器:service network restart
  • 更换镜像源
  • 关闭防火墙,设置selinux
systemctl disable firewalld --now
​
yum install -y container-selinux selinux-policy-base
​
yum install -y https://rpm.rancher.io/k3s/latest/common/centos/7/noarch/k3s-selinux-0.2-1.el7_8.noarch.rpm
  • 下载安装包

    • k3s版本:v1.25.0+k3s
    • 安装脚本install.sh,https://get.k3s.io/
    • k3s二进制文件,https://github.com/k3s-io/k3s/releases/download/v1.25.0%2Bk3s1/k3s
    • image,https://github.com/k3s-io/k3s/releases/download/v1.25.0%2Bk3s1/k3s-airgap-images-amd64.tar.gz
  • 克隆k8s-worker1和k8s-worker2,修改ip,修改hostname,hostnamectl set-hostname k8s-master

k3s搭建集群

  • k3s二进制文件移动到/usr/local/bin目录,并添加执行权限
mv k3s /usr/local/bin
chmod +x /usr/local/bin/k3s
  • 将镜像移动到/var/lib/rancher/k3s/agent/images/目录(无需解压),k3s中都是将镜像放在这个目录
mkdir -p /var/lib/rancher/k3s/agent/images/
cp ./k3s-airgap-images-amd64.tar.gz /var/lib/rancher/k3s/agent/images/
  • k8s-master节点执行:
chmod +x install.sh
#离线安装
INSTALL_K3S_SKIP_DOWNLOAD=true ./install.sh
#安装完成后,查看节点状态
kubectl get node
#查看token
cat /var/lib/rancher/k3s/server/node-token

image.png

  • k8s-worker1k8s-worker2节点执行
INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_URL=https://192.168.217.129:6443 \
K3S_TOKEN=K10649f8d4f0f3c923041813c40c6c94fc7aadf4df1932d222e8bcfbb66336a1e04::server:6d5671021aef9a0852cf0f63c2b6d223 \
./install.sh

image.png

在此环境下,启动master、worker三个节点后,关机再重启依然存在。不需要重新运行这三个节点。

镜像加速

由于kubernetes从V1.24版本开始默认使用containerd,需要修改containerd的配置文件,才能让Pod的镜像使用镜像加速器。配置文件路径一般为/etc/containerd/config.toml

在k3s中配置镜像仓库

K3s会自动生成containerd的配置文件/var/lib/rancher/k3s/agent/etc/containerd/config.toml,不要直接修改这个文件,k3s重启后修改会丢失。

为了简化配置,K3s 通过/etc/rancher/k3s/registries.yaml文件来配置镜像仓库,K3s会在启动时检查这个文件是否存在。

mirrors:
  docker.io:
    endpoint:
      - "https://03qnwci9.mirror.aliyuncs.com"
  • 重启每个节点
master节点: systemctl restart k3s
worker节点: systemctl restart k3s-agent
  • 查看配置是否生效
cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml

image.png

其实k3s就是提供了一个集群环境,将几台节点主机连接成一个结群,包括一个master节点和多个worker节点。具体操作节点和部署服务还是需要通过kubectl来完成。

持久化存储插件

Ceph、GlusterFS、NFS等都可以为Kubernetes提供持久化存储能力。在这选择部署Rook。

Rook项目是一个基于Ceph的Kubernetes存储插件

安装逻辑卷管理器

yum install lvm2
git clone --single-branch --branch v1.3.3 https://github.com/rook/rook.git
​
kubectl apply -f common.yaml
​
kubectl apply -f operator.yaml
​
kubectl apply -f cluster.yaml

一个基于Rook持久化存储集群就以容器的方式运行起来了,而接下来在Kubernetes项目上创建的所有Pod就能够通过Persistent Volume(PV)和Persistent Volume Claim(PVC)的方式,在容器里挂载由Ceph提供的数据卷了。

部署Dashboard可视化

下载配置文件

wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml

默认dashboard只能在集群内部访问,通过端口转发或者修改配置文件的service方式为NodePort之后可以访问网页

这里修改配置文件,修改service为nodeport的方式来实现集群外访问

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 443
      targetPort: 8443
  selector:
    k8s-app: kubernetes-dashboard
  type: NodePort
kubectl apply -f recommended.yaml
​
kubectl get pods -n kubernetes-dashboard

查看service暴露端口,使用这个端口进行访问

root@k8s-master:~# kubectl get service -n kubernetes-dashboard
NAME                        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)         AGE
dashboard-metrics-scraper   ClusterIP   10.105.55.123   <none>        8000/TCP        4m7s
kubernetes-dashboard        NodePort    10.102.140.3    <none>        443:32362/TCP   4m8s

如上,应该访问https://master或其他节点ip:32362

image.png

通过token方式登录

dashboard默认会在kubernetes-dashboard名字空间创建kubernetes-dashboard的ServiceAccount,我们给这个服务账户赋予cluster-admin这个ClustrRole角色的权限

kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard

kubernetes1.24版本及以上创建ServiceAccount默认不会创建secret-token了,这里需要手动创建

除了create token方式创建,也可以通过配置文件创建

apiVersion: v1
kind: Secret
metadata:
name: sec-for-dashboard
namespace: kubernetes-dashboard
annotations:
 kubernetes.io/service-account.name: "kubernetes-dashboard"
type: kubernetes.io/service-account-token

参考链接

https://kubernetes.io/zh-cn/docs/tasks/configure-pod-container/configure-service-account/#manually-create-a-long-lived-api-token-for-a-serviceaccount

kubectl create token kubernetes-dashboard(要绑定的serviceaccount) -n kubernetes-dashboard
​
root@k8s-master:~# kubectl create token kubernetes-dashboard -n kubernetes-dashboard
eyJhbGciOiJSUzI1NiIsImtpZCI6Il9FcjNuaWtyODhzOW1zLVFjUldndExqU1MzUnlCeUkzVG92dVA0NUZqUmcifQ.eyJhdWQiOlsi...

把这个token复制到网页里就可以登录,但是这个token好像是一次性的,因为后面执行命令kubectl describe secret -n kubernetes-dashboard获取不到token了

image.png

跳过验证

修改yaml配置文件,添加enable-skip-login,出现跳过选项,但是登录后没有权限操作

image.png

image.png

dashboard默认会在kubernetes-dashboard名字空间创建kubernetes-dashboard的ServiceAccount,我们给这个服务账户赋予cluster-admin这个ClustrRole角色的权限

kubectl create clusterrolebinding dashboard-cluster-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:kubernetes-dashboard

这样就有权限了

kubeconfig方式登录