K3s安装部署

相关参考文档:https://docs.rancher.cn/k3s/

1 安装要求

1.1 先决条件

  • 两个节点不能有相同的主机名
    ps.:可通过以下命令查看主机名:
hostname
  • 如果您的所有节点都有相同的主机名,请使用 --with-node-id 选项为每个节点添加一个随机后缀,或者为您添加到集群的每个节点设计一个独特的名称,用 --node-name$K3S_NODE_NAME 传递。

1.2 操作系统

绝大多数现代Linux系统

1.3 硬件

硬件要求根据您部署的规模而变化。这里列出了最低建议。

  • 内存:最低512MB (建议至少为1GB)
  • CPU:最低1个
    ps.:可通过以下命令查看系统CPU个数和内存
#查看CPU个数  
cat /proc/cpuinfo | grep 'physical id' | sort | uniq | wc -l

#查看内存  
cat /proc/meminfo

1.4 磁盘

K3s 的性能取决于数据库的性能。为了确保最佳速度,我们建议尽可能使用 SSD。在使用 SD 卡或 eMMC 的 ARM 设备上,磁盘性能会有所不同。
ps.:可通过以下命令查看磁盘类型

# vda是你的磁盘名,可以通过df命令查看,然后修改成对应的信息
cat /sys/block/vda/queue/rotational
返回结果:
    返回  0  SSD盘
    返回  1  SATA盘

1.5 网络

        K3s server 需要 6443 端口才能被所有节点访问。
        当使用 Flannel VXLAN 时,节点需要能够通过 UDP 端口 8472 访问其他节点。节点不应该在其他端口上监听。K3s 使用反向隧道,这样节点与服务器建立出站连接,所有的 kubelet 流量都通过该隧道运行。然而,如果你不使用 Flannel 并提供自己的自定义 CNI,那么 K3s 就不需要 8472 端口。
        如果要使用metrics server,则需要在每个节点上打开端口 10250 端口。
        如果计划使用嵌入式 etcd 实现高可用性,则 server 节点必须在端口 2379 和 2380 上可以相互访问。
        重要: 节点上的 VXLAN 端口不应暴露给全世界,因为它公开了集群网络,任何人都可以访问它。应在禁止访问端口 8472 的防火墙/安全组后面运行节点
K3s Server节点的入站规则:

协议端口描述
TCP6443K3s agent 节点Kubernetes API Server
UDP8472K3s server 和 agent 节点仅对 Flannel VXLAN 需要
TCP10250K3s server 和 agent 节点Kubelet metrics
TCP2379-2380K3s server 节点只有嵌入式 etcd 高可用才需要

1.6 防火墙

master 服务器和 worker 服务器的防火墙都需要关闭,具体操作如下:

1.6.1 检查防火墙状态(以 CentOS Linux release 7.7.1908 (Core) 为例)

sudo firewall-cmd --state
sudo systemctl status firewalld.service

1.6.2 关闭防火墙服务

sudo systemctl stop firewalld.service

1.6.3 关闭防火墙自动启动服务

sudo systemctl disable firewalld.service

1.6.4 检查防火墙是否关闭

sudo systemctl status firewalld.service

1.7 安装iptable

服务器通常不携带 iptable 服务,因此需要执行以下命令安装 iptable:

yum -y install iptable

2 Docker安装

2.1 初步安装

Docker要求运行在Centos 7上,要求系统为64位,系统内核版本3.10以上
查看当前版本:

uname -an

下载安装docker:

yum -y install docker

启动docker服务:

service docker start

检查docker是否安装成功

docker version 

2.2 配置镜像网站

进入 /etc/docker,没有daemon.json文件就自己新建一个:

cd /etc/docker

编辑daemon.json文件:
加入这段代码:

{
 "registry-mirrors": ["https://registry.docker-cn.com"]
}

然后重启docker

systemctl restart docker.service

2.3 更新 Docker 版本

使用以下命令升级 Docker 到最新版本:

curl -fsSL https://get.docker.com/ | sh
systemctl restart docker.service

3 K3s安装

ps.:安装方式为通过脚本安装,如需使用其他安装方式请参阅官方文档

3.1 K3s server 安装

3.1.1 安装脚本

K3s 提供了一个安装脚本,可以方便的在 systemd 和 openrc 的系统上将其作为服务安装。这个脚本可以在 https://get.k3s.io 获得。要使用这种方法安装K3s,只需要运行:

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

ps.:中国境内用户,可以使用以下方法加速安装:

curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=ch sh -s - --docker

ps.:每台计算机必须具有唯一的主机名。如果不存在唯一的主机名,请添加 K3S_NODE_NAME 环境变量,并为每一个节点提供一个有效且唯一的主机名。

ps.:若采用步骤 3.1.1的命令,可直接跳转到步骤 3.1.4;若采用官方文档的命令,则需要执行步骤 3.1.2及 3.1.3

3.1.2 修改配置

修改配置文件,具体修改要求如下:

  • 把默认的容器引擎由 Containerd 切换到 Docker;
  • 修改配置文件权限,使执行 kubectl 命令不需要root权限。
    具体修改命令如下:
sudo vim /etc/systemd/system/multi-user.target.wants/k3s.service

修改文件中的 ExecStart的值,修改为:

ExecStart=/usr/local/bin/k3s \
    server \
        '--docker' \

3.1.3 重启服务

通过以下命令重启服务:

sudo systemctl daemon-reload
sudo systemctl restart k3s

3.1.4 检查 server 节点是否启动正常

通过以下命令检查节点是否正常启动:

sudo kubectl get nodes -o wide

如下输出对应的 control-plane,master 节点,表明 server 节点正常启动,注意到最后一个容器类型属性已经修改成了docker:

NAME                      STATUS   ROLES                  AGE    VERSION        INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
izwz995sygwab19zrn726wz   Ready    control-plane,master   109m   v1.20.4+k3s1   172.31.13.60   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   docker://20.10.5

ps.:如果显示权限不够,可以通过更改/etc/rancher/k3s/k3s.yaml文件的权限解决

sudo chmod 777 /etc/rancher/k3s/k3s.yaml

3.1.5 配置环境变量,为后续helm安装打基础

export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

3.1.6 卸载server节点的k3s(如有需要)

/usr/local/bin/k3s-uninstall.sh

3.2 K3s agent 安装

3.2.1 安装脚本

与 server 安装相似,工作节点上的 K3s 安装同样是从 https://get.k3s.io 上获得脚本。但在安装过程中,需要使用 K3S_URL 和 K3S_TOKEN 环境变量来运行安装脚本。这样可以在脚本安装的过程中,将工作节点之间注册添加到 K3s 集群当中。:
在 server 节点(master 节点)执行如下命令:注意从服务器的k3s.yaml的文件中获取端口号

echo /usr/local/bin/k3s agent --server https://172.31.13.60:6443 --token `sudo cat /var/lib/rancher/k3s/server/node-token`

获取输出结果,此结果即为token的值:

/usr/local/bin/k3s agent --server https://172.31.13.60:6443 --token K10fcbce86112a339eb83da520a2111b2f5c64659dc5467afa53498fb85c71be658::server:6ea0462849af2b81a0dee13c7ca664e4

agent上的k3s安装命令

# K3S_URL 是 K3S server 或 K3s 集群的IP地址及端口号
# K3S_TOKEN 是用于 server 或 agent 加入集群的共享 secret,通常被存储在 K3s server 服务器节点上的 /var/lib/rancher/k3s/server/nod-token 文件中 
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -s - --docker

ps.:每台计算机必须具有唯一的主机名。如果不存在唯一的主机名,请添加 K3S_NODE_NAME 环境变量,并为每一个节点提供一个有效且唯一的主机名。

ps.:若采用步骤 3.2.1的命令,可直接跳转到步骤 3.2.3;若采用官方文档的命令,则需要执行步骤 3.2.2

3.2.2 修改配置,重启服务

进入agent服务配置文件

sudo vim /etc/systemd/system/multi-user.target.wants/k3s-agent.service

将配置文件中 ExecStart 的值修改为:

ExecStart=/usr/local/bin/k3s \
    agent \
        '--docker' \

修改保存后执行以下命令重启K3s:

sudo systemctl daemon-reload
sudo systemctl restart k3s-agent

3.2.3 修改 k3s.yaml 文件

使用 scp 命令,将 master 服务器上的 /etc/rancher/k3s/k3s.yaml 文件发送到 worker 服务器上的对应位置,并通过 vi 命令修改文件中的 server 地址为 master 服务器IP。
修改完成后,执行以下命令重启 K3s agent 服务器:

sudo systemctl daemon-reload
sudo systemctl restart k3s-agent

3.2.3 检查 agent 节点是否启动正常

在 server 节点(maser 节点)执行以下命令,查看 agent 节点是否正常启动:

sudo kubectl get node -o wide

如下输出对应 worker 节点表明正常启动:

NAME                      STATUS   ROLES                  AGE    VERSION        INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
izwz995sygwab19zrn726wz   Ready    control-plane,master   127m   v1.20.4+k3s1   172.31.13.60   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   docker://20.10.5
izwz9fa0nvt6vfrz8ncbouz   Ready    worker                 110m   v1.20.4+k3s1   172.31.13.61   <none>        CentOS Linux 7 (Core)   3.10.0-1160.11.1.el7.x86_64   docker://20.10.5

worker的默认角色为none,需要执行以下命令更改为worker,${node}改为自己node的名称

kubectl label node ${node} node-role.kubernetes.io/worker=worker

3.2.4 卸载agent上的k3s(如有需要)

/usr/local/bin/k3s-agent-uninstall.sh

4 Dashboard 相关

4.1 在所有节点下载好docker镜像

标准yaml文件下载地址

https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yam

此dashboard.yaml内容如下(只有一处需要更改,就是将kubernetes-dashboard这个service,增加一个Nodeport,本例为31001):

# Copyright 2017 The Kubernetes Authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

apiVersion: v1
kind: Namespace
metadata:
  name: kubernetes-dashboard

---

apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  type: NodePort
  ports:
    - port: 443
      targetPort: 8443
      nodePort: 31001
  selector:
    k8s-app: kubernetes-dashboard

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-certs
  namespace: kubernetes-dashboard
type: Opaque

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-csrf
  namespace: kubernetes-dashboard
type: Opaque
data:
  csrf: ""

---

apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-key-holder
  namespace: kubernetes-dashboard
type: Opaque

---

kind: ConfigMap
apiVersion: v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-settings
  namespace: kubernetes-dashboard

---

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
rules:
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
  - apiGroups: [""]
    resources: ["secrets"]
    resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
    verbs: ["get", "update", "delete"]
    # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
  - apiGroups: [""]
    resources: ["configmaps"]
    resourceNames: ["kubernetes-dashboard-settings"]
    verbs: ["get", "update"]
    # Allow Dashboard to get metrics.
  - 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: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
rules:
  # Allow Metrics Scraper to get metrics from the Metrics server
  - apiGroups: ["metrics.k8s.io"]
    resources: ["pods", "nodes"]
    verbs: ["get", "list", "watch"]

---

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: kubernetes-dashboard
subjects:
  - kind: ServiceAccount
    name: kubernetes-dashboard
    namespace: kubernetes-dashboard

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kubernetes-dashboard
spec:
  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.0.0
          imagePullPolicy: Always
          ports:
            - containerPort: 8443
              protocol: TCP
          args:
            - --auto-generate-certificates
            - --namespace=kubernetes-dashboard
            # Uncomment the following line to manually specify Kubernetes API server Host
            # If not specified, Dashboard will attempt to auto discover the API server and connect
            # to it. Uncomment only if the default does not work.
            # - --apiserver-host=http://my-address:port
          volumeMounts:
            - name: kubernetes-dashboard-certs
              mountPath: /certs
              # Create on-disk volume to store exec logs
            - 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
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule

---

kind: Service
apiVersion: v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  ports:
    - port: 8000
      targetPort: 8000
  selector:
    k8s-app: dashboard-metrics-scraper

---

kind: Deployment
apiVersion: apps/v1
metadata:
  labels:
    k8s-app: dashboard-metrics-scraper
  name: dashboard-metrics-scraper
  namespace: kubernetes-dashboard
spec:
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      k8s-app: dashboard-metrics-scraper
  template:
    metadata:
      labels:
        k8s-app: dashboard-metrics-scraper
      annotations:
        seccomp.security.alpha.kubernetes.io/pod: 'runtime/default'
    spec:
      containers:
        - name: dashboard-metrics-scraper
          image: kubernetesui/metrics-scraper:v1.0.4
          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
      # Comment the following tolerations if Dashboard must not be deployed on master
      tolerations:
        - key: node-role.kubernetes.io/master
          effect: NoSchedule
      volumes:
        - name: tmp-volume
          emptyDir: {}

2,上面的rbac的serviceaccount是没有什么权限的,为了能管理整个k8s集群,加入一个cluster admin的角色,dashborad-admin-rabc.yaml内容如下:

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

4.2 在master节点应用yaml文件

kubectl apply -f dashboard.yaml
kubectl apply -f dashborad-admin-rabc.yaml

在这里插入图片描述

4.3 获取访问的token

kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

在这里插入图片描述

4.4 通过web访问dashbaord

访问https://172.31.13.60:31001/#/login
在这里插入图片描述

输入得到的TOKEN
在这里插入图片描述

出现以上界面即表示部署dashboard成功

5 相关检测

5.1 网络检测

5.1.1 检测

在根目录下建立 busybox.yaml 文件,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: busybox
  namespace: default
spec:
  containers:
  - name: busybox
    image: busybox:1.28.4
    command:
      - sleep
      - "3600"
    imagePullPolicy: IfNotPresent
  restartPolicy: Always

在命令行执行以下命令,创建名为 busybox 的 pod 容器:

kubectl apply -f busybox.yaml

在命令行依次执行以下命令,获取 K3s 集群中的全部 pod 容器信息和全部 service 服务信息:

#获取全部 pod 容器详细信息
kubectl get pod -A -o wide
#获取全部 service 服务详细信息
kubectl get svc -A -o wide

在命令行执行以下命令,进入 busybox 容器,或在 dashboard 控制台进入 busybox 容器的命令行界面:

kubectl exec -it busybox -- sh

在 busybox 容器的命令行界面,依次使用 ping 命令,测试 busybox 容器与其他容器、服务、节点的 ip地址,务必保证全部都可以联通(ping 通)

5.1.2 问题与解决方案

问题:
pod ping pod 或 pod ping service无响应:K3s 网络服务插件不完整。

解决:
安装ipvs 请参考
https://blog.csdn.net/ShaoFuQiJie/article/details/80426402

修改master节点的service文件

sudo vim /etc/systemd/system/multi-user.target.wants/k3s.service

加入以下参数
在这里插入图片描述

修改worker节点的service文件

sudo vim /etc/systemd/system/multi-user.target.wants/k3s-agent.service

同理加入上述参数
在这里插入图片描述

重启k3s集群。

Master 节点:
sudo systemctl daemon-reload 
sudo systemctl restart k3s

worker 节点:
sudo systemctl daemon-reload 
sudo systemctl restart k3s-agent
  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值