17-K3S 高级选项和配置

1 高级选项和配置

本节包含一些高级信息,描述了你可以运行和管理 K3s 的不同方式:

官方参考资料:高级选项和配置

1.1 证书轮换

默认情况下,K3s 集群启动之后,会生成一系列的证书,K3s 的证书在 12 个月(一年之内)内过期。

如果证书已经过期或剩余的时间不足 90 天,则在 K3s 重启时轮换证书。重启 K3s 并不会对业务的 Pod 有任何的影响。

# 部署单节点的K3s集群
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
  INSTALL_K3S_MIRROR=cn \
  INSTALL_K3S_EXEC="--docker" \
  K3S_KUBECONFIG_OUTPUT=/root/.kube/config \
  INSTALL_K3S_VERSION="v1.21.14+k3s1" \
  K3S_TOKEN="rancher" sh -

# 查询K3s证书过期时间
$ for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; \
  do \
    echo $i; openssl x509 -enddate -noout -in $i; \
  done

# 修改系统时间为证书过期前90天或证书过期后
$ timedatectl set-ntp no
$ date -s 20240807

$ kubectl get nodes
Unable to connect to the server: x509: certificate has expired or is not yet valid: current time 2026-08-07T00:00:04+08:00 is after 2025-08-06T16:00:35Z
$ tail -n 200 -f /var/log/messages
ojected volume kube-api-access-5kmph for pod kube-system/coredns-574bcc6c46-bdz6b: token "coredns"/"kube-system"/[]string(nil)/3607/v1.BoundObjectReference{Kind:"Pod", APIVersion:"v1", Name:"coredns-574bcc6c46-bdz6b", UID:"55b42ec9-8398-4b05-9ebd-dec42d4f5b88"} expired and refresh failed: Post "https://127.0.0.1:6443/api/v1/namespaces/kube-system/serviceaccounts/coredns/token": x509: certificate has expired or is not yet valid: current time 2026-08-07T00:00:35+08:00 is after 2025-08-06T16:00:35Z

# 重启K3s服务(手动触发K3s证书的更新)
service k3s restart

img

重启 K3s 服务之后就会证书更新(更新证书需要一段时间)

img

1.2 自动部署清单

/var/lib/rancher/k3s/server/manifests中找到的任何文件都会以类似kubectl apply & kubectl create的方式自动部署到 Kubernetes。

关于部署 Helm charts 的信息,请参阅Helm章节。

---
# nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name:  nginx-deploy
  namespace: default
  labels:
    app:  nginx-deploy
spec:
  selector:
    matchLabels:
      app: nginx-deploy
  replicas: 3
  template:
    metadata:
      labels:
        app:  nginx-deploy
    spec:
      containers:
      - name:  nginx-deploy
        image:  docker.io/nginx:1.23.3-alpine
        ports:
        - containerPort:  80
          name:  http
---
# nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
  namespace: default
spec:
  selector:
    app: nginx-deploy
  type: NodePort
  ports:
  - name: nginx-http
    protocol: TCP
    port: 80
    targetPort: 80
    nodePort: 30080
$ cp -av nginx-deploy-svc.yaml /var/lib/rancher/k3s/server/manifests
$ ls -l /var/lib/rancher/k3s/server/manifests
total 28
-rw------- 1 root root 1108 Mar  7 17:41 ccm.yaml
-rw------- 1 root root 4381 Mar  7 17:41 coredns.yaml
-rw------- 1 root root 3645 Mar  7 17:41 local-storage.yaml
drwx------ 2 root root  227 Mar  7 17:41 metrics-server
-rw-r--r-- 1 root root  699 Mar  7 17:43 nginx-deploy-svc.yaml
-rw------- 1 root root 1039 Mar  7 17:41 rolebindings.yaml
-rw------- 1 root root 1098 Mar  7 17:41 traefik.yaml

# 自动部署nginx的资源
$ kubectl get all
NAME                               READY   STATUS    RESTARTS   AGE
pod/nginx-deploy-d4c47bf76-qdhpc   1/1     Running   0          2m43s
pod/nginx-deploy-d4c47bf76-rjvxw   1/1     Running   0          2m43s
pod/nginx-deploy-d4c47bf76-zq29b   1/1     Running   0          2m43s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/kubernetes   ClusterIP   10.43.0.1       <none>        443/TCP        4m50s
service/nginx-svc    NodePort    10.43.165.157   <none>        80:30080/TCP   2m43s

NAME                           READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deploy   3/3     3            3           2m43s

NAME                                     DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deploy-d4c47bf76   3         3         3       2m43s

1.3 使用 Docker 作为容器运行时

K3s 包含并默认为containerd, 一个行业标准的容器运行时。

要使用 Docker 而不是 containerd

  1. 在 K3s 节点上安装 Docker。可以使用 Rancher 的一个Docker 安装脚本来安装 Docker:
curl https://releases.rancher.com/install-docker/19.03.sh | sh
  1. 使用--docker选项安装 K3s:
# 默认使用containerd的容器运行时环境
# 如果在containerd部署的集群,再使用该命令添加--docker参数,那么数据是无法进行同步的
# 即需要在Docker的运行时环境中再部署一套业务
# 默认是通过DockerHub拉取镜像,可以使用INSTALL_K3S_MIRROR=cn从国内进行拉取镜像
curl -sfL https://get.k3s.io | sh -s - --docker

💡国内用户,可以使用以下方法加速安装:

$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
  INSTALL_K3S_MIRROR=cn sh -s - --docker
# 或者
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
  INSTALL_K3S_MIRROR=cn \
  INSTALL_K3S_EXEC="--docker" \
  K3S_KUBECONFIG_OUTPUT=/root/.kube/config \
  INSTALL_K3S_VERSION="v1.21.14+k3s1" \
  K3S_TOKEN="rancher" sh -

# 验证使用Docker的容器运行时环境
$ tail -n 4 /etc/systemd/system/k3s.service
ExecStart=/usr/local/bin/k3s \
    server \
        '--docker' \
  1. 确认集群可用:
$ kubectl get pods --all-namespaces
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   local-path-provisioner-79f67d76f8-ttgfh   1/1     Running     0          52s
kube-system   coredns-597584b69b-qq5z8                  1/1     Running     0          52s
kube-system   svclb-traefik-a648aa7f-dfpqp              2/2     Running     0          48s
kube-system   helm-install-traefik-crd-67llw            0/1     Completed   0          53s
kube-system   helm-install-traefik-8prcj                0/1     Completed   1          53s
kube-system   traefik-66c46d954f-r7xkj                  1/1     Running     0          48s
kube-system   metrics-server-5f9f776df5-qtrtc           1/1     Running     0          52s
  1. 确认 Docker 容器正在运行:
# 查看镜像的状态
$ sudo docker images
REPOSITORY                         TAG                    IMAGE ID       CREATED         SIZE
nginx                              1.23.3-alpine          2bc7edbc3cf2   3 weeks ago     40.7MB
calico/kube-controllers            v3.25.0                5e785d005ccc   7 weeks ago     71.6MB
calico/cni                         v3.25.0                d70a5947d57e   7 weeks ago     198MB
calico/node                        v3.25.0                08616d26b8e7   7 weeks ago     245MB
rancher/mirrored-metrics-server    v0.6.2                 25561daa6660   3 months ago    68.9MB
rancher/klipper-lb                 v0.4.0                 3449ea2a2bfa   3 months ago    8.76MB
rancher/klipper-helm               v0.7.4-build20221121   6f2af12f2834   3 months ago    251MB
rancher/mirrored-library-traefik   2.9.4                  288889429bec   4 months ago    135MB
rancher/local-path-provisioner     v0.0.23                9621e18c3388   4 months ago    37.4MB
rancher/mirrored-coredns-coredns   1.9.4                  a81c2ec4e946   5 months ago    49.8MB
rancher/mirrored-pause             3.6                    6270bb605e12   18 months ago   683kB

# 查看容器的状态
$ sudo docker ps
CONTAINER ID   IMAGE                        COMMAND                  CREATED              STATUS              PORTS     NAMES
72790bef3481   288889429bec                 "/entrypoint.sh --gl…"   About a minute ago   Up About a minute             k8s_traefik_traefik-66c46d954f-r7xkj_kube-system_b6d8d5a3-9101-47dc-92ee-8b8e7f7a89a9_0
5fde5015b5c2   rancher/mirrored-pause:3.6   "/pause"                 About a minute ago   Up About a minute             k8s_POD_traefik-66c46d954f-r7xkj_kube-system_b6d8d5a3-9101-47dc-92ee-8b8e7f7a89a9_0
591dd96d82dc   3449ea2a2bfa                 "entry"                  About a minute ago   Up About a minute             k8s_lb-tcp-443_svclb-traefik-a648aa7f-dfpqp_kube-system_ab119579-be89-469a-95de-809898cfec70_0
4c7e2f75316a   3449ea2a2bfa                 "entry"                  About a minute ago   Up About a minute             k8s_lb-tcp-80_svclb-traefik-a648aa7f-dfpqp_kube-system_ab119579-be89-469a-95de-809898cfec70_0
9be56dd5e3e9   rancher/mirrored-pause:3.6   "/pause"                 About a minute ago   Up About a minute             k8s_POD_svclb-traefik-a648aa7f-dfpqp_kube-system_ab119579-be89-469a-95de-809898cfec70_0
1537f4b91e88   25561daa6660                 "/metrics-server --c…"   About a minute ago   Up About a minute             k8s_metrics-server_metrics-server-5f9f776df5-qtrtc_kube-system_5605d10b-3c35-49e7-935c-db3bff7cba3b_0
eaad0b26823f   a81c2ec4e946                 "/coredns -conf /etc…"   About a minute ago   Up About a minute             k8s_coredns_coredns-597584b69b-qq5z8_kube-system_574ebd44-e071-487e-90f6-766ecf640288_0
e7653fc11bf7   9621e18c3388                 "local-path-provisio…"   About a minute ago   Up About a minute             k8s_local-path-provisioner_local-path-provisioner-79f67d76f8-ttgfh_kube-system_fe617e4d-a19b-4611-a4d8-5491ace1d400_0
1d6519574592   rancher/mirrored-pause:3.6   "/pause"                 About a minute ago   Up About a minute             k8s_POD_coredns-597584b69b-qq5z8_kube-system_574ebd44-e071-487e-90f6-766ecf640288_0
19384cabe50a   rancher/mirrored-pause:3.6   "/pause"                 About a minute ago   Up About a minute             k8s_POD_metrics-server-5f9f776df5-qtrtc_kube-system_5605d10b-3c35-49e7-935c-db3bff7cba3b_0
d3a7f8a9d819   rancher/mirrored-pause:3.6   "/pause"                 About a minute ago   Up About a minute             k8s_POD_local-path-provisioner-79f67d76f8-ttgfh_kube-system_fe617e4d-a19b-4611-a4d8-5491ace1d400_0

1.3.1 可选:将 crictl 与 Docker 一起使用

crictl 为兼容 CRI 的容器运行时提供了 CLI

如果你想在使用--docker选项安装 K3s 后使用 crictl,请参考官方文档来安装 crictl。

# 但是使用较少,原因是Docker的CLI工具比Containerd的CLI工具要丰富的多
$ VERSION="v1.26.0"
$ curl -L https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-${VERSION}-linux-amd64.tar.gz --output crictl-${VERSION}-linux-amd64.tar.gz
$ sudo tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
crictl

然后开始使用 crictl 命令:

$ sudo crictl version
Version:  0.1.0
RuntimeName:  docker
RuntimeVersion:  19.03.9
RuntimeApiVersion:  1.40.0

$ sudo crictl images
IMAGE                                        TAG                    IMAGE ID            SIZE
docker.io/library/nginx                      1.23.3-alpine          2bc7edbc3cf2f       16.7MB
docker.io/rancher/klipper-helm               v0.6.6-build20211022   194c895f8d63f       84.5MB
docker.io/rancher/klipper-lb                 v0.3.4                 746788bcc27e2       3.33MB
docker.io/rancher/local-path-provisioner     v0.0.21                fb9b574e03c34       11.4MB
docker.io/rancher/mirrored-coredns-coredns   1.9.1                  99376d8f35e0a       14.1MB
docker.io/rancher/mirrored-library-traefik   2.6.1                  cf9fa2c5f0d2e       30.3MB
docker.io/rancher/mirrored-metrics-server    v0.5.2                 f73640fb50619       26MB

1.3.2 清理节点

  • 在使用 Containerd 作为容器运行时环境CRI,则可以使用k3s-uninstall.sh直接删除K3s集群环境
  • 在使用 Docker 作为容器运行时环境CRI,则即使使用k3s-uninstall.sh直接删除K3s集群环境,也会残留部分 K3s 容器信息,需要管理员手动删除 K3s 集群的容器,docker rm -f $(docker ps -aq),同时建议推荐使用Rancher - K3s的清理脚本运行

以下操作将删除节点中的数据(包括容器,卷,iptables 等),在执行命令之前,请先查看该脚本,确保您理解这个脚本在做什么,并且确保已进行了数据备份。

Reference:https://docs.rancher.cn/docs/rancher2/trending-topics/cleaning-cluster-nodes/_index/#%E6%B8%85%E7%90%86%E8%84%9A%E6%9C%AC

#!/bin/bash

KUBE_SVC='
kubelet
kube-scheduler
kube-proxy
kube-controller-manager
kube-apiserver
'

for kube_svc in ${KUBE_SVC};
do
  # 停止服务
  if [[ `systemctl is-active ${kube_svc}` == 'active' ]]; then
    systemctl stop ${kube_svc}
  fi
  # 禁止服务开机启动
  if [[ `systemctl is-enabled ${kube_svc}` == 'enabled' ]]; then
    systemctl disable ${kube_svc}
  fi
done

# 停止所有容器
docker stop $(docker ps -aq)

# 删除所有容器
docker rm -f $(docker ps -qa)

# 删除所有容器卷
docker volume rm $(docker volume ls -q)

# 卸载mount目录
for mount in $(mount | grep tmpfs | grep '/var/lib/kubelet' | awk '{ print $3 }') /var/lib/kubelet /var/lib/rancher;
do
  umount $mount;
done

# 备份目录
mv /etc/kubernetes /etc/kubernetes-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/etcd /var/lib/etcd-bak-$(date +"%Y%m%d%H%M")
mv /var/lib/rancher /var/lib/rancher-bak-$(date +"%Y%m%d%H%M")
mv /opt/rke /opt/rke-bak-$(date +"%Y%m%d%H%M")

# 删除残留路径
rm -rf /etc/ceph \
    /etc/cni \
    /opt/cni \
    /run/secrets/kubernetes.io \
    /run/calico \
    /run/flannel \
    /var/lib/calico \
    /var/lib/cni \
    /var/lib/kubelet \
    /var/log/containers \
    /var/log/kube-audit \
    /var/log/pods \
    /var/run/calico \
    /usr/libexec/kubernetes

# 清理网络接口
no_del_net_inter='
lo
docker0
eth
ens
bond
'

network_interface=`ls /sys/class/net`

for net_inter in $network_interface;
do
  if ! echo "${no_del_net_inter}" | grep -qE ${net_inter:0:3}; then
    ip link delete $net_inter
  fi
done

# 清理残留进程
port_list='
80
443
6443
2376
2379
2380
8472
9099
10250
10254
'

for port in $port_list;
do
  pid=`netstat -atlnup | grep $port | awk '{print $7}' | awk -F '/' '{print $1}' | grep -v - | sort -rnk2 | uniq`
  if [[ -n $pid ]]; then
    kill -9 $pid
  fi
done

kube_pid=`ps -ef | grep -v grep | grep kube | awk '{print $2}'`

if [[ -n $kube_pid ]]; then
  kill -9 $kube_pid
fi

# 清理Iptables表
## 注意:如果节点Iptables有特殊配置,以下命令请谨慎操作
sudo iptables --flush
sudo iptables --flush --table nat
sudo iptables --flush --table filter
sudo iptables --table nat --delete-chain
sudo iptables --table filter --delete-chain
systemctl restart docker

当K3s使用Docker作为容器运行时环境时,使用K3s自带的卸载K3s脚本是清理不干净环境的,需要借用官网的清理节点的脚本进行彻底删除

当K3s使用Containerd作为容器运行时环境时,使用K3s自带的卸载K3s脚本是可以正常清理环境的

1.4 配置 containerd

Containerd 对配置镜像以及其他设置时,使用Containerd的语法是很难配置的,并且很难配置成功。

Reference:https://docs.rancher.cn/docs/k3s/installation/private-registry/_index

K3s 将会在/var/lib/rancher/k3s/agent/etc/containerd/config.toml中为 containerd 生成 config.toml。不太推荐直接修改 Containerd 的配置文件,建议通过 K3s 的启动命令的参数进行修改。

$ vim /var/lib/rancher/k3s/agent/etc/containerd/config.toml
[plugins.opt]
  path = "/var/lib/rancher/k3s/agent/containerd"

[plugins.cri]
  stream_server_address = "127.0.0.1"
  stream_server_port = "10010"
  enable_selinux = false
  sandbox_image = "rancher/mirrored-pause:3.5"

[plugins.cri.containerd]
  disable_snapshot_annotations = true
  snapshotter = "overlayfs"

[plugins.cri.cni]
  bin_dir = "/var/lib/rancher/k3s/data/b945d2fc310e0d5ca6d5d937c978b7724ae6066555ff18890ade9cac510baa70/bin"
  conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d"


[plugins.cri.containerd.runtimes.runc]
  runtime_type = "io.containerd.runc.v2"

如果要对这个文件进行高级定制,你可以在同一目录中创建另一个名为 config.toml.tmpl 的文件,此文件将会代替默认设置。

config.toml.tmpl将被视为 Go 模板文件,并且config.Node结构被传递给模板。此模板示例介绍了如何使用结构来自定义配置文件。

$ vim /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl
[plugins.opt]
  path = "/var/lib/rancher/k3s/agent/containerd"

[plugins.cri]
  stream_server_address = "127.0.0.1"
  stream_server_port = "10010"
  enable_selinux = false
  sandbox_image = "rancher/mirrored-pause:3.5"

[plugins.cri.containerd]
  disable_snapshot_annotations = true
  snapshotter = "overlayfs"

[plugins.cri.cni]
  bin_dir = "/var/lib/rancher/k3s/data/b945d2fc310e0d5ca6d5d937c978b7724ae6066555ff18890ade9cac510baa70/bin"
  conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d"


[plugins.cri.containerd.runtimes.runc]
  runtime_type = "io.containerd.runc.v2"

[plugins.cri.registry.mirrors]
  [plugins.cri.registry.mirrors."docker.io"]
    endpoint = ["https://po13h3y1.mirror.aliyuncs.com", "http://hub-mirror.c.163.com", "https://mirror.ccs.tencentyun.com", "http://f1361db2.m.daocloud.io", "https://registry-1.docker.io"]
$ curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
  INSTALL_K3S_MIRROR=cn \
  K3S_KUBECONFIG_OUTPUT=/root/.kube/config \
  INSTALL_K3S_VERSION="v1.21.14+k3s1" \
  K3S_TOKEN="rancher" sh -

# 修改配置文件后重启服务
$ systemctl restart k3s.service
# 查看配置生效情况
$ crictl info | grep -A 6 "\<endpoint\>"
          "endpoint": [
            "https://po13h3y1.mirror.aliyuncs.com",
            "http://hub-mirror.c.163.com",
            "https://mirror.ccs.tencentyun.com",
            "http://f1361db2.m.daocloud.io",
            "https://registry-1.docker.io"
          ],

1.5 节点标签和污点

K3s agents 可以通过--node-label--node-taint选项进行配置,这两个选项可以给 kubelet 添加标签和污点。这两个选项只能在注册时添加标签和/或污点,所以它们只能被添加一次,之后不能再通过运行 K3s 命令来改变。

如果你想在节点注册后更改节点标签和污点,你应该使用kubectl。关于如何添加污点节点标签,请参考 Kubernetes 官方文档。

# 添加label和taint
# --node-label 是可以通过以下命令进行更新的<标签>
# --node-taint 是不可以通过以下命令进行更新的<污点> 需要通过 kubectl 进行修改
curl -sfL https://get.k3s.io | sh -s - --node-label app=k3s --node-taint special=true:NoSchedule

# 查询label和taint
kubectl get nodes --show-labels
kubectl describe nodes | grep Taints

1.6 使用安装脚本启动 Server 节点

Reference:https://docs.rancher.cn/docs/k3s/installation/install-options/server-config/_index

安装脚本将自动检测您的操作系统是使用 systemd 还是 openrc 并启动服务。当使用 openrc 运行时,日志将在/var/log/k3s.log中创建。

当使用 systemd 运行时,日志将在/var/log/syslog中创建,并使用journalctl -u k3s查看。

使用安装脚本进行安装和自动启动的示例:

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

💡国内用户,可以使用以下方法加速安装:

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

当手动运行 server 时,你应该得到一个类似于下面的输出:

# 推荐使用安装脚本进行安装
$ k3s server
INFO[2019-01-22T15:16:19.908493986-07:00] Starting k3s dev
INFO[2019-01-22T15:16:19.908934479-07:00] Running kube-apiserver --allow-privileged=true --authorization-mode Node,RBAC --service-account-signing-key-file /var/lib/rancher/k3s/server/tls/service.key --service-cluster-ip-range 10.43.0.0/16 --advertise-port 6445 --advertise-address 127.0.0.1 --insecure-port 0 --secure-port 6444 --bind-address 127.0.0.1 --tls-cert-file /var/lib/rancher/k3s/server/tls/localhost.crt --tls-private-key-file /var/lib/rancher/k3s/server/tls/localhost.key --service-account-key-file /var/lib/rancher/k3s/server/tls/service.key --service-account-issuer k3s --api-audiences unknown --basic-auth-file /var/lib/rancher/k3s/server/cred/passwd --kubelet-client-certificate /var/lib/rancher/k3s/server/tls/token-node.crt --kubelet-client-key /var/lib/rancher/k3s/server/tls/token-node.key
Flag --insecure-port has been deprecated, This flag will be removed in a future version.
INFO[2019-01-22T15:16:20.196766005-07:00] Running kube-scheduler --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --port 0 --secure-port 0 --leader-elect=false
INFO[2019-01-22T15:16:20.196880841-07:00] Running kube-controller-manager --kubeconfig /var/lib/rancher/k3s/server/cred/kubeconfig-system.yaml --service-account-private-key-file /var/lib/rancher/k3s/server/tls/service.key --allocate-node-cidrs --cluster-cidr 10.42.0.0/16 --root-ca-file /var/lib/rancher/k3s/server/tls/token-ca.crt --port 0 --secure-port 0 --leader-elect=false
Flag --port has been deprecated, see --secure-port instead.
INFO[2019-01-22T15:16:20.273441984-07:00] Listening on :6443
INFO[2019-01-22T15:16:20.278383446-07:00] Writing manifest: /var/lib/rancher/k3s/server/manifests/coredns.yaml
INFO[2019-01-22T15:16:20.474454524-07:00] Node token is available at /var/lib/rancher/k3s/server/node-token
INFO[2019-01-22T15:16:20.474471391-07:00] To join node to cluster: k3s agent -s https://10.20.0.3:6443 -t ${NODE_TOKEN}
INFO[2019-01-22T15:16:20.541027133-07:00] Wrote kubeconfig /etc/rancher/k3s/k3s.yaml
INFO[2019-01-22T15:16:20.541049100-07:00] Run: k3s kubectl

由于 agent 将创建大量的日志,输出可能会更长。默认情况下,server 会将自身注册为一个节点(运行 agent)。

1.7 Alpine Linux 安装的额外准备工作

设置 Alpine Linux 前,您需要进行以下准备工作:

  1. 更新 **/etc/update-extlinux.conf** 添加:
# 启用cgroup的内核功能
default_kernel_opts="...  cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
  1. 更新配置并重启:
update-extlinux 
reboot

1.8 运行 K3d(Docker 中的 K3s)和 docker-compose

k3d 是一个设计用于在 Docker 中轻松运行 K3s 的工具。

  • 可以在 k3d 创建容器化的 k3s 集群
  • 可以使用容器在单台计算机上启动多节点 k3s 集群

它可以通过 MacOS 上的 brew工具安装:

# 需要有Docker容器运行时环境
brew install k3d

可以通过 Linux 进行安装:

# Linux
# 安装Docker环境
$ curl https://releases.rancher.com/install-docker/20.10.sh | sh

# https://github.com/k3d-io/k3d/releases/download/v5.4.8/k3d-linux-amd64
$ wget https://github.com/k3d-io/k3d/releases/download/v5.4.8/k3d-linux-amd64
$ mv k3d-linux-amd64 /usr/local/bin/k3d && chmod +x /usr/local/bin/k3d

# 查看K3d版本
# 需要注意 Docker 版本和 K3d 版本之间的对应关系
$ k3d version
k3d version v5.4.8
k3s version v1.25.6-k3s1 (default)

# 创建集群环境
# --servers 指定 K3s servers 的节点数
# --agents  指定 K3s agents  的节点数
$ k3d cluster create demo --servers 1 --agents 2
# 若出现相关的报错,可以使用以下的解决方案
# 原因是因为防火墙关闭之后需要重启docker服务(systemctl restart docker)

INFO[0000] Prep: Network
INFO[0000] Created network 'k3d-demo'
INFO[0000] Created image volume k3d-demo-images
INFO[0000] Starting new tools node...
INFO[0001] Creating node 'k3d-demo-server-0'
INFO[0005] Creating node 'k3d-demo-agent-0'
INFO[0005] Creating node 'k3d-demo-agent-1'
INFO[0005] Creating LoadBalancer 'k3d-demo-serverlb'
INFO[0005] Using the k3d-tools node to gather environment information
INFO[0007] Pulling image 'ghcr.io/k3d-io/k3d-tools:5.4.8'
INFO[0011] Starting Node 'k3d-demo-tools'
INFO[0011] HostIP: using network gateway 172.18.0.1 address
INFO[0011] Starting cluster 'demo'
INFO[0011] Starting servers...
INFO[0011] Starting Node 'k3d-demo-server-0'
INFO[0016] Starting agents...
INFO[0016] Starting Node 'k3d-demo-agent-0'
INFO[0016] Starting Node 'k3d-demo-agent-1'
INFO[0020] Starting helpers...
INFO[0021] Starting Node 'k3d-demo-serverlb'
INFO[0027] Injecting records for hostAliases (incl. host.k3d.internal) and for 4 network members into CoreDNS configmap...
INFO[0029] Cluster 'demo' created successfully!
INFO[0029] You can now use it like this:
kubectl cluster-info

# 查看Docker Version版本
$ docker version
Client: Docker Engine - Community
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.7
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:04:24 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.7
  Git commit:       3056208
  Built:            Tue Oct 25 18:02:38 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.19
  GitCommit:        1e1ea6e986c6c86565bc33d52e34b81b3e2bc71f
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

# 查看Docker容器
$ docker ps
CONTAINER ID   IMAGE                            COMMAND                  CREATED              STATUS          PORTS                             NAMES
bf83b5a70ce7   ghcr.io/k3d-io/k3d-proxy:5.4.8   "/bin/sh -c nginx-pr…"   About a minute ago   Up 49 seconds   80/tcp, 0.0.0.0:42479->6443/tcp   k3d-demo-serverlb
7757176c59f9   rancher/k3s:v1.25.6-k3s1         "/bin/k3s agent"         About a minute ago   Up 52 seconds                                     k3d-demo-agent-1
90e99a19ef02   rancher/k3s:v1.25.6-k3s1         "/bin/k3s agent"         About a minute ago   Up 53 seconds                                     k3d-demo-agent-0
ab7f743a0848   rancher/k3s:v1.25.6-k3s1         "/bin/k3s server --t…"   About a minute ago   Up 58 seconds                                     k3d-demo-server-0

# 查看Node的节点
# 需要手动获取kubectl的二进制工具(或者使用k3s的二进制工具内置的kubectl选项)
$ k3s kubectl get nodes
INFO[0000] Acquiring lock file /var/lib/rancher/k3s/data/.lock
INFO[0000] Preparing data dir /var/lib/rancher/k3s/data/b945d2fc310e0d5ca6d5d937c978b7724ae6066555ff18890ade9cac510baa70
NAME                STATUS   ROLES                  AGE     VERSION
k3d-demo-agent-0    Ready    <none>                 3m6s    v1.25.6+k3s1
k3d-demo-agent-1    Ready    <none>                 3m6s    v1.25.6+k3s1
k3d-demo-server-0   Ready    control-plane,master   3m13s   v1.25.6+k3s1

img

rancher/k3s镜像也可用于在 Docker 运行的 K3s server 和 agent。

在 K3s repo 的根目录下有一个docker-compose.yml,作为如何从 Docker 运行 K3s 的示例。要从这个 repo 中运行docker-compose,请运行:

$ docker-compose up --scale agent=3
# kubeconfig is written to current dir

$ kubectl --kubeconfig kubeconfig.yaml get node
NAME           STATUS   ROLES    AGE   VERSION
497278a2d6a2   Ready    <none>   11s   v1.13.2-k3s2
d54c8b17c055   Ready    <none>   11s   v1.13.2-k3s2
db7a5a5a5bdd   Ready    <none>   12s   v1.13.2-k3s2

要只在 Docker 中运行 agent,使用docker-compose up agent

或者,也可以使用docker run命令:

sudo docker run \
  -d --tmpfs /run \
  --tmpfs /var/run \
  -e K3S_URL=${SERVER_URL} \
  -e K3S_TOKEN=${NODE_TOKEN} \
  --privileged rancher/k3s:vX.Y.Z

1.9 在 Raspbian Buster 上启用旧版的 iptables

Raspbian Buster 默认使用nftables而不是iptablesK3S 网络功能需要使用iptables,而不能使用nftables。 按照以下步骤切换配置Buster使用legacy iptables

sudo iptables -F
sudo update-alternatives --set iptables /usr/sbin/iptables-legacy
sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
sudo reboot

1.10 为 Raspbian Buster 启用 cgroup

标准的 Raspbian Buster 安装没有启用 cgroupsK3S 需要cgroups来启动 systemd 服务。在/boot/cmdline.txt中添加cgroup_memory=1 cgroup_enable=memory就可以启用cgroups

1.10.1 /boot/cmdline.txt 的示例

console=serial0,115200 console=tty1 root=PARTUUID=58b06195-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory

2 SELinux 支持

从 v1.19.4+k3s1 开始支持。从 v1.17.4+k3s1 开始是试验性的。

如果您在默认启用 SELinux 的系统(如 CentOS)上安装 K3s,您必须确保安装了正确的 SELinux 策略。

2.1 自动安装

从 v1.19.3+k3s2 开始可用。

如果在兼容的系统上,如果不执行离线安装,则安装脚本将从 Rancher RPM 存储库自动安装 SELinux RPM。可以通过设置 INSTALL_K3S_SKIP_SELINUX_RPM=true 来跳过自动安装。

2.2 手动安装

可以使用以下命令安装必要的策略:

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 

要强制安装脚本记录警告而不是失败,您可以设置以下环境变量:INSTALL_K3S_SELINUX_WARN=true

2.3 启用和禁用 SELinux Enforcement#

SELinux enforcement 的启用或禁用方式取决于 K3s 的版本。

2.3.1 K3s v1.19.1+k3s1#

要使用 SELinux,请在启动 K3s server 和 agent 时指定--selinux标志。

这个选项也可以在 K3s配置文件中指定:

selinux: true

不要使用--disable-selinux选项。它已经被废弃,在未来的小版本中,它可能会因为被忽略或不被识别,从而导致错误。

在 SELinux 下不支持使用自定义的--data-dir。要自定义它,你很可能需要编写自己的自定义策略。为了获得指导,你可以参考container/container-selinux资源库,它包含了容器运行时的 SELinux 策略文件,以及rancher/k3s-selinux资源库,它包含了 K3s 的 SELinux 策略。

2.3.2 V1.19.1+k3s1 之前的 K3s#

内置 containerd 会自动启用 SELinux。

要关闭嵌入式 containerd 中的 SELinux enforcement,请使用--disable-selinux标志启动 K3s。

在 SELinux 下不支持使用自定义的--data-dir。要自定义它,你很可能需要编写自己的自定义策略。为了获得指导,你可以参考container/container-selinux资源库,它包含了容器运行时的 SELinux 策略文件,以及rancher/k3s-selinux资源库,它包含了 K3s 的 SELinux 策略。

3 Red Hat 和 CentOS 的额外准备

建议运行以下命令,关闭 firewalld防火墙:

# 在生产环境和测试环境中可以执行firewalld功能
systemctl disable firewalld --now

如果启用,则需要禁用 nm-cloud-setup 并重新启动节点:

systemctl disable nm-cloud-setup.service nm-cloud-setup.timer
reboot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dark_Ice_

你的支持是我创作的核动力。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值