centos k3s部署

centos k3s部署

目录

一、k3s介绍

1、k3s是一个轻量级的 Kubernetes 发行版,它针对边缘计算、物联网等场景进行了高度优化。我们希望安装的 Kubernetes 在内存占用方面只是一半的大小。Kubernetes 是一个 10 个字母的单词,简写为 k8s。所以,有 Kubernetes 一半大的东西就是一个 5 个字母的单词,简写为 k3s。k3s 没有全称,也没有官方的发音。

2、文档/下载地址

  • 官网下载地址:https://github.com/k3s-io/k3s/releases
  • 国内下载地址:http://mirror.cnrancher.com
  • k3s文档:http://docs.rancher.cn/docs/k3s/_index
  • k8s文档:https://www.kubernetes.org.cn/docs

3、环境规划

  • 本例使用的是指定版本和docker容器方式安装
  • docker的安装及使用:https://www.cnblogs.com/lvlinguang/p/15183571.html
  • 服务器列表如下
集群角色ip地址server节点192.168.3.17agent节点192.168.3.18
# 关闭防火墙systemctl stop firewalld# 开机禁用systemctl disable firewalld# 检查状态firewall-cmd --state

4、注意:每台计算机必须具有唯一的主机名。如果您的计算机没有唯一的主机名,请传递K3S_NODE_NAME环境变量,并为每个节点提供一个有效且唯一的主机名。

二、在线安装

1、server节点安装

export INSTALL_K3S_VERSION=v1.21.5+k3s2export K3S_NODE_NAME=k3s-masterexport INSTALL_K3S_EXEC="--docker --write-kubeconfig ~/.kube/config --cluster-cidr 10.72.0.0/16 --service-cidr 10.73.0.0/16 --write-kubeconfig-mode 666"# 高可用(配置外部sql,第二个server节点需要配置K3S_TOKEN)# export K3S_TOKEN=server1的token# export INSTALL_K3S_EXEC="--docker --datastore-endpoint=mysql://root:123456@tcp(192.168.3.13:6008)/k3s --write-kubeconfig ~/.kube/config --cluster-cidr 10.72.0.0/16 --service-cidr 10.73.0.0/16 --write-kubeconfig-mode 666"curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
  • server参数说明:
    • --docker:k3s server组件以containerd作为容器运行时。可以顺便在k3s server节点上启动一个Agent节点,Agent节点可以使用Docker作为容器运行时,这样k3s server节点也可以当做工作节点用。当然也可以不在server节点上启动Agent节点(添加参数--disable-agent即可)。
    • --bind-address:k3s监听的IP地址,非必选,默认是localhost。
    • --cluster-cidr:与Kubernetes一样,也就是Pod所在网络平面,非必选,默认是10.42.0.0/16。
    • --service-cidr:与Kubernetes一样,服务所在的网络平面,非必选,默认是10.43.0.0/16。
    • --kube-apiserver-arg:额外的API Server配置参数,具体可以参考Kuberntes官方网站了解支持的配置选项,非必选。
    • --write-kubeconfig:安装时顺便写一个Kubeconfig文件,方便使用kubectl工具直接访问。如果不加此参数,则默认的配置文件路径为/etc/rancher/k3s/k3s.yaml,默认只有root用户能读。
    • --write-kubeconfig-mode:与--write-kubeconfig一起使用,指定Kubeconfig文件的权限
    • --node-label:顺便给节点打上一个asrole=worker的label,非必选。

2、agent节点安装

  • 从server节点获取token
cat /var/lib/rancher/k3s/server/node-token
export INSTALL_K3S_VERSION=v1.21.5+k3s2export K3S_NODE_NAME=k3s-node1export INSTALL_K3S_EXEC="--docker --write-kubeconfig ~/.kube/config --cluster-cidr 10.72.0.0/16 --service-cidr 10.73.0.0/16 --write-kubeconfig-mode 666"curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.3.17:6443 K3S_TOKEN=server1的token sh -

三、离线安装

  • 本例以安装v1.21.5-k3s2版本
  • 百度网盘离线包:https://pan.baidu.com/s/1V7CvTRuaxuchI3zIEeX2Bw 提取码:zp9r

1、server节点安装

  • 下载文件
cd /usr/local/bin# 下载k3s-airgap-images-amd64.tarwget http://rancher-mirror.cnrancher.com/k3s/v1.21.5-k3s2/k3s-airgap-images-amd64.tar# 下载k3s可执行文件wget http://rancher-mirror.cnrancher.com/k3s/v1.21.5-k3s2/k3s# 下载安装脚本wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh# 设置权限chmod +x k3s-install.sh k3s
  • 设置环境变量并安装
# 跳过二进制文件下载export INSTALL_K3S_SKIP_DOWNLOAD=true# 修改节点名称export K3S_NODE_NAME=k3s-master# 配置额外参数export INSTALL_K3S_EXEC="--docker --write-kubeconfig ~/.kube/config --cluster-cidr 10.72.0.0/16 --service-cidr 10.73.0.0/16 --write-kubeconfig-mode 666"# 高可用(配置外部sql,第二个server节点需要配置K3S_TOKEN)# export K3S_TOKEN=server1的token# export INSTALL_K3S_EXEC="--docker --datastore-endpoint=mysql://root:123456@tcp(192.168.3.13:6008)/k3s --write-kubeconfig ~/.kube/config --cluster-cidr 10.72.0.0/16 --service-cidr 10.73.0.0/16 --write-kubeconfig-mode 666"# 执行安装脚本./k3s-install.sh

2、agent节点安装

  • 从server节点获取token
cat /var/lib/rancher/k3s/server/node-token
  • 下载文件
cd /usr/local/bin# 下载k3s-airgap-images-amd64.tarwget http://rancher-mirror.cnrancher.com/k3s/v1.21.5-k3s2/k3s-airgap-images-amd64.tar# 下载k3s可执行文件wget http://rancher-mirror.cnrancher.com/k3s/v1.21.5-k3s2/k3s# 下载安装脚本wget http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh# 设置权限chmod +x k3s-install.sh k3s
  • 设置环境变量并安装
# 跳过二进制文件下载export INSTALL_K3S_SKIP_DOWNLOAD=true# 修改节点名称export K3S_NODE_NAME=k3s-node1# 配置server节点信息,token来自server节点export K3S_URL=https://192.168.3.17:6443export K3S_TOKEN=server1的token# 配置额外参数export INSTALL_K3S_EXEC="--docker --write-kubeconfig ~/.kube/config --cluster-cidr 10.72.0.0/16 --service-cidr 10.73.0.0/16 --write-kubeconfig-mode 666"# 执行安装脚本./k3s-install.sh

四、高可用安装

1、一个 K3s HA 集群由以下几个部分组成:

  • 两个或多个server 节点,将为 Kubernetes API 提供服务并运行其他 control-plane 服务
  • 零个或多个agent 节点,用于运行您的应用和服务
  • 外部数据存储 (与单个 k3s server 设置中使用的嵌入式 SQLite 数据存储相反)
  • 固定的注册地址,位于 server 节点的前面,以允许 agent 节点向集群注册

2、指定mysql数据库

  • 格式:mysql://username:password@tcp(hostname:3306)/database-name
  • 如果指定的数据库名称不存在,k3s server 将尝试创建

3、server节点修改

  • 增加参数:--datastore-endpoint
# 配置数据库信息export INSTALL_K3S_EXEC="--docker --datastore-endpoint=mysql://root:123456@tcp(192.168.3.13:6008)/k3s --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666"
  • 第二个server节点需要指定K3S_TOKEN
export K3S_TOKEN=server1的token

4、agent节点不做任何修改

五、配置k3s镜像仓库

在Docker中可以通过配置registry-mirrors来实现从其他镜像仓库中获取K3s镜像。这样配置之后,会先从registry-mirrors配置的地址拉取镜像,如果获取不到才会从默认的docker.io获取镜像,从而满足了我们的需求

  • 修改daemon.json
vim /etc/docker/daemon.json
  • 添加以下配置
{    "insecure-registries":["192.168.3.12:6007"]}
systemctl daemon-reloadsystemctl restart docker

六、Kubernetes 仪表盘

1、kuboard仪表盘(推荐

  • 官网地址:https://www.kuboard.cn/

  • 安装

kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
  • 获取token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')
kubectl delete -f https://kuboard.cn/install-script/kuboard.yaml
  • 访问:ip:32567

2、Kubernetes Dashboard仪表盘

  • 新建 kubernetes-dashboard.yaml
apiVersion: v1kind: Namespacemetadata:  name: kubernetes-dashboard---apiVersion: v1kind: ServiceAccountmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboard---apiVersion: v1kind: ServiceAccountmetadata:  name: dashboard-admin  namespace: kubernetes-dashboard---kind: ServiceapiVersion: v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboardspec:  type: NodePort  ports:    - port: 443      targetPort: 8443      nodePort: 30002  selector:    k8s-app: kubernetes-dashboard---apiVersion: v1kind: Secretmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard-certs  namespace: kubernetes-dashboardtype: Opaque---apiVersion: v1kind: Secretmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard-csrf  namespace: kubernetes-dashboardtype: Opaquedata:  csrf: ""---apiVersion: v1kind: Secretmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard-key-holder  namespace: kubernetes-dashboardtype: Opaque---kind: ConfigMapapiVersion: v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard-settings  namespace: kubernetes-dashboard---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboardrules:  - apiGroups: [""]    resources: ["secrets"]    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]    verbs: ["get", "update", "delete"]  - apiGroups: [""]    resources: ["configmaps"]    resourceNames: ["kubernetes-dashboard-settings"]    verbs: ["get", "update"]  - apiGroups: [""]    resources: ["services"]    resourceNames: ["heapster", "dashboard-metrics-scraper"]    verbs: ["proxy"]  - apiGroups: [""]    resources: ["services/proxy"]    resourceNames: ["heapster", "http:heapster:", "https:heapster:", "dashboard-metrics-scraper", "http:dashboard-metrics-scraper"]    verbs: ["get"]---kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboardrules:  - apiGroups: ["metrics.k8s.io"]    resources: ["pods", "nodes"]    verbs: ["get", "list", "watch"]---apiVersion: rbac.authorization.k8s.io/v1kind: RoleBindingmetadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboardroleRef:  apiGroup: rbac.authorization.k8s.io  kind: Role  name: kubernetes-dashboardsubjects:  - kind: ServiceAccount    name: kubernetes-dashboard    namespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: kubernetes-dashboardroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: kubernetes-dashboardsubjects:  - kind: ServiceAccount    name: kubernetes-dashboard    namespace: kubernetes-dashboard---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRoleBindingmetadata:  name: dashboard-adminroleRef:  apiGroup: rbac.authorization.k8s.io  kind: ClusterRole  name: cluster-adminsubjects:  - kind: ServiceAccount    name: dashboard-admin    namespace: kubernetes-dashboard---kind: DeploymentapiVersion: apps/v1metadata:  labels:    k8s-app: kubernetes-dashboard  name: kubernetes-dashboard  namespace: kubernetes-dashboardspec:  replicas: 1  revisionHistoryLimit: 10  selector:    matchLabels:      k8s-app: kubernetes-dashboard  template:    metadata:      labels:        k8s-app: kubernetes-dashboard    spec:      containers:        - name: kubernetes-dashboard          image: kubernetesui/dashboard:v2.4.0          imagePullPolicy: Always          ports:            - containerPort: 8443              protocol: TCP          args:            - --auto-generate-certificates            - --namespace=kubernetes-dashboard          volumeMounts:            - name: kubernetes-dashboard-certs              mountPath: /certs            - mountPath: /tmp              name: tmp-volume          livenessProbe:            httpGet:              scheme: HTTPS              path: /              port: 8443            initialDelaySeconds: 30            timeoutSeconds: 30          securityContext:            allowPrivilegeEscalation: false            readOnlyRootFilesystem: true            runAsUser: 1001            runAsGroup: 2001      volumes:        - name: kubernetes-dashboard-certs          secret:            secretName: kubernetes-dashboard-certs        - name: tmp-volume          emptyDir: {}      serviceAccountName: kubernetes-dashboard      nodeSelector:        "kubernetes.io/os": linux      tolerations:        - key: node-role.kubernetes.io/master          effect: NoSchedule---kind: ServiceapiVersion: v1metadata:  labels:    k8s-app: dashboard-metrics-scraper  name: dashboard-metrics-scraper  namespace: kubernetes-dashboardspec:  ports:    - port: 8000      targetPort: 8000  selector:    k8s-app: dashboard-metrics-scraper---kind: DeploymentapiVersion: apps/v1metadata:  labels:    k8s-app: dashboard-metrics-scraper  name: dashboard-metrics-scraper  namespace: kubernetes-dashboardspec:  replicas: 1  revisionHistoryLimit: 10  selector:    matchLabels:      k8s-app: dashboard-metrics-scraper  template:    metadata:      labels:        k8s-app: dashboard-metrics-scraper    spec:      securityContext:        seccompProfile:          type: RuntimeDefault      containers:        - name: dashboard-metrics-scraper          image: kubernetesui/metrics-scraper:v1.0.7          ports:            - containerPort: 8000              protocol: TCP          livenessProbe:            httpGet:              scheme: HTTP              path: /              port: 8000            initialDelaySeconds: 30            timeoutSeconds: 30          volumeMounts:          - mountPath: /tmp            name: tmp-volume          securityContext:            allowPrivilegeEscalation: false            readOnlyRootFilesystem: true            runAsUser: 1001            runAsGroup: 2001      serviceAccountName: kubernetes-dashboard      nodeSelector:        "kubernetes.io/os": linux      tolerations:        - key: node-role.kubernetes.io/master          effect: NoSchedule      volumes:        - name: tmp-volume          emptyDir: {}
  • 安装
kubectl apply -f kubernetes-dashboard.yaml
  • 获取token
kubectl -n kubernetes-dashboard describe secret dashboard-admin-token | grep '^token'
  • 卸载
kubectl delete -f kubernetes-dashboard.yaml
  • 访问:ip:30002

七、常用命令

1、node节点操作

  • 得到节点信息
kubectl get node或kubectl get node -o wide
kubectl delete node node1
  • 修改节点ROLES
kubectl label node ${node} node-role.kubernetes.io/worker=worker

2、命名空间操作

  • 查看所有命名空间
kubectl get namespace或kubectl get ns
  • 创建命名空间
kubectl create namespace test
  • 删除命名空间
kubectl delete namespaces test

3、pod/deployment/service共有(get)

  • 不加参数默认default命名空间下的内容
  • 指定命名空间:--namespace default / -n default
  • 所有命名空间下的:--all-namespaces
  • 详细信息:-o wide

4、pod操作

  • 查看pod
kubectl get pod或kubectl get pods
kubectl describe pod springboot-demo-dept-6568749656-cztl4 --namespace default
  • 删除pod
kubectl delete pod pod1

5、controller操作

kubectl get deployment或kubectl get deployment.apps或kubectl get deploy
  • 查看ReplicaSet控制器类型
kubectl get replicaset或kubectl get replicaset.apps
  • 详情
kubectl describe deployment springboot-demo-dept --namespace default
  • 删除Deployment控制器类型
kubectl delete deployment nginx-app

6、service操作

  • 查看service
kubectl get service或kubectl get svc
  • 详情
kubectl describe service springboot-demo-svc --namespace default
  • 删除service
kubectl delete service nginx-app1

7、显示top资源

  • 查看节点top资源
kubectl top node
  • 查看pod top资源
kubectl top pod --all-namespaces

8、查看pod日志

# 实时日志kubectl logs -f pod-name -n pod-namespacekubectl logs --tail 200 -f pod-name -n pod-namespace# 前200条日志kubectl logs --tail 200 pod-name -n pod-namespace

9、其它操作

  • 查看k3s信息或版本号
k3s
  • 查看kubectl帮助文档
kubectl --help
  • 部署资源清单
kubectl apply -f xxx.yaml
  • 删除部署清单
kubectl delete -f xxx.yaml
  • 查看k3s服务状态
systemctl status k3s
  • 重启k3s服务
systemctl restart k3s
  • 卸载 K3s
# server节点卸载/usr/local/bin/k3s-uninstall.sh# agent节点卸载/usr/local/bin/k3s-agent-uninstall.sh

八、入门教程学习

1、k3s/k83学习有一定门槛,通过入门教程能够快速掌握基础知识,推荐大家学习

  • 博客园文章:https://www.cnblogs.com/lvlinguang/p/15682696.html

  • 视频教程,百度网盘

链接:https://pan.baidu.com/s/101YH_l0DthYLvMX-5a69qA 提取码:3faf

九、参考

  • https://blog.csdn.net/weixin_39628864/article/details/110666080
  • https://www.cnblogs.com/k3s2019/p/14339547.html
  • kuboard仪表盘:https://cloud.tencent.com/developer/article/1580358
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部