k3s 安装与使用

一、安装

1、安装

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

cat /var/lib/rancher/k3s/server/node-token
curl -sfL https://get.k3s.io | K3S_URL=https://myserver:6443 K3S_TOKEN=XXX sh -

国内安装:

server:

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

node:

curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://myserver:6443 K3S_TOKEN=mynodetoken sh -

2、 k3s 安装配置 helm

curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash

cp /etc/rancher/k3s/k3s.yaml $HOME/.kube/config
或
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml

helm ls
helm repo add aliyuncs https://apphub.aliyuncs.com
helm repo add bitnami https://charts.bitnami.com/bitnami

# vim /root/.config/helm

3、修改k3s使用本地仓库

vim /etc/hosts
192.168.0.242 local.com

scp -r 192.168.0.242:/etc/docker/certs.d/local.com /etc/docker/certs.d/
vim /etc/rancher/k3s/registries.yaml
mirrors:
  local.com:
    endpoint:
      - "https://local.com"
configs:
  "local.com":
    auth:
      username: admin
      password: qwe
    tls:
      cert_file: /etc/docker/certs.d/local.com/local.com.cert
      key_file: /etc/docker/certs.d/local.com/local.com.key
      ca_file: /etc/docker/certs.d/local.com/ca.crt

4、k3s 可配置环境变量

Environment Variable Description
INSTALL_K3S_SKIP_DOWNLOAD 如果设置为 "true "将不会下载 K3s 的哈希值或二进制。
INSTALL_K3S_SYMLINK 默认情况下,如果路径中不存在命令,将为 kubectl、crictl 和 ctr 二进制文件创建符号链接。如果设置为'skip'将不会创建符号链接,而'force'将覆盖。
INSTALL_K3S_SKIP_ENABLE 如果设置为 "true",将不启用或启动 K3s 服务。
INSTALL_K3S_SKIP_START 如果设置为 "true "将不会启动 K3s 服务。
INSTALL_K3S_VERSION 从 Github 下载 K3s 的版本。如果没有指定,将尝试从"stable"频道下载。
INSTALL_K3S_BIN_DIR 安装 K3s 二进制文件、链接和卸载脚本的目录,或者使用/usr/local/bin作为默认目录。
INSTALL_K3S_BIN_DIR_READ_ONLY 如果设置为 true 将不会把文件写入INSTALL_K3S_BIN_DIR,强制设置INSTALL_K3S_SKIP_DOWNLOAD=true
INSTALL_K3S_SYSTEMD_DIR 安装 systemd 服务和环境文件的目录,或者使用/etc/systemd/system作为默认目录。
INSTALL_K3S_EXEC 带有标志的命令,用于在服务中启动 K3s。如果未指定命令,并且设置了K3S_URL,它将默认为“agent”。如果未设置K3S_URL,它将默认为“server”。要获得帮助,请参考此示例。
INSTALL_K3S_NAME 要创建的 systemd 服务名称,如果以服务器方式运行 k3s,则默认为'k3s';如果以 agent 方式运行 k3s,则默认为'k3s-agent'。如果指定了服务名,则服务名将以'k3s-'为前缀。
INSTALL_K3S_TYPE 要创建的 systemd 服务类型,如果没有指定,将从 K3s exec 命令中默认。
INSTALL_K3S_CHANNEL_URL 用于获取 K3s 下载网址的频道 URL。默认为https://update.k3s.io/v1-release/channels
INSTALL_K3S_CHANNEL 用于获取 K3s 下载 URL 的通道。默认值为 "stable"。选项包括:stable, latest, testing

二、集群安装

1、下载 install 脚本

curl -sfL https://get.k3s.io -o install.sh

2、准备 k3s、离线镜像

3、server 安装

vim install.sh
...
INSTALL_K3S_SKIP_DOWNLOAD=true
INSTALL_K3S_EXEC="--docker"
cp k3s /usr/local/bin/
mkdir -p /var/lib/rancher/k3s/agent/images/
cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
...
./install.sh

4、agent 安装

从 server 获取 token

cat /var/lib/rancher/k3s/server/node-token 
K10bc4ac5219e3d43898a2fd70eba5160ef3c38cd6485eeb3c60c6ac1aa80a14f63::server:d1a22f5300bf09bcab32632de490309a
vim install.sh
...
export K3S_URL="https://node1:6443"
export K3S_TOKEN="K10bc4ac5219e3d43898a2fd70eba5160ef3c38cd6485eeb3c60c6ac1aa80a14f63::server:d1a22f5300bf09bcab32632de490309a"
INSTALL_K3S_SKIP_DOWNLOAD=true
INSTALL_K3S_EXEC="--docker"
cp k3s /usr/local/bin/
mkdir -p /var/lib/rancher/k3s/agent/images/
cp k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
...
./install.sh

三、使用

1、k3s 二进制文件启动

k3s server &
# Kubeconfig is written to /etc/rancher/k3s/k3s.yaml
k3s kubectl get node

# On a different node run the below. NODE_TOKEN comes from /var/lib/rancher/k3s/server/node-token
# on your server
k3s agent --server https://myserver:6443 --token ${NODE_TOKEN}

2、常用命令

crictl: CRI 的 CLI 工具

ctr: containerd 本身的 CLI 工具

k3s kubectl get nodes
k3s kubectl get all -A

crictl ps
crictl images
crictl pull rancher/rancher-agent:v2.4.8

# 清理未使用镜像
crictl rmi --prune

ctr images ls
ctr c ls
ctr image import busybox.tar

# 镜像标记tag
ctr -n k8s.io i tag hub.dream.io/hello:latest hub.dream.io/hello:second

# 删除镜像
ctr -n k8s.io i rm hub.dream.io/hello:latest

# 拉取镜像
ctr -n k8s.io i pull -k hub.dream.io/hello:latest

# 推送镜像
ctr -n k8s.io i push -k hub.dream.io/hello:latest

# 导出镜像
ctr -n k8s.io i export hello.tar hub.dream.io/hello:latest

# 导入镜像
ctr -n k8s.io i import hello.tar 

# 不支持 build,commit 镜像

# 查看容器相关操作
ctr c 

# 运行容器
  ctr -n k8s.io run --null-io --net-host -d \
    --env PASSWORD=$drone_password \
    --mount type=bind,src=/etc,dst=/host-etc,options=rbind:rw \
    --mount type=bind,src=/root/.kube,dst=/root/.kube,options=rbind:rw \
    $image sysreport bash /sysreport/run.sh
  1. --null-io: 将容器内标准输出重定向到/dev/null
  2. --net-host: 主机网络
  3. -d: 当task执行后就进行下一步shell命令,如没有选项,则会等待用户输入,并定向到容器内

# K3s worker 节点的角色默认为none
kubectl label node ${node} node-role.kubernetes.io/worker=worker

四、其他

1、ctr 访问 k3s crictl 资源

ctr -a "/run/k3s/containerd/containerd.sock" -namespace k8s.io i ls

2、使用 kubectl / helm 从外部访问集群

将 /etc/rancher/k3s/k3s.yaml 复制到集群外部的计算机上的~/.kube/config。然后用 K3s 服务器的 IP 或名称替换 "localhost"。

export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get pods --all-namespaces
helm ls --all-namespaces
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get pods --all-namespaces
helm --kubeconfig /etc/rancher/k3s/k3s.yaml ls --all-namespaces

3、curl 请求 kubernetes api

kubectl get secrets
kubectl describe secrets default-token-l28jq
curl --insecure https://192.168.163.121:6443/api --header "Authorization: bearer $token"

4、k3s-killall.sh

要停止所有的 k3s 容器并重置容器的状态,可以使用k3s-killall.sh脚本。

killall 脚本清理容器、k3s 目录和网络组件,同时也删除了 iptables 链和所有相关规则。集群数据不会被删除。

5、k3s-uninstall.sh

全部删除完,包括配置和数据。

6、设置私有仓库

1)k3s
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
  "192.168.0.10:3000":
    endpoint:
      - "http://192.168.0.10:3000"
EOF
systemctl restart k3s

cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml
...
[plugins.cri.registry.mirrors]

[plugins.cri.registry.mirrors."192.168.0.10:3000"]
  endpoint = ["http://192.168.0.10:3000"]

[plugins.cri.registry.mirrors."rancher.ksd.top:5000"]
  endpoint = ["192.168.0.10:3000"]
...
2)、docker
cat /etc/docker/daemon.json
{
 "registry-mirrors":     ["https://docker.mirrors.ustc.edu.cn/"],
 "insecure-registries":  ["192.168.0.90:3000"]
}
3)、containerd
containerd config default > /etc/containerd/config.toml 

cat /etc/containerd/config.toml 
[plugins.cri.registry.mirrors]

[plugins.cri.registry.mirrors."192.168.0.10:3000"]
  endpoint = ["http://192.168.0.10:3000"]

systemctl restart containerd.service

五、k3s证书有效期

https://kingsd.top/2022/04/07/k3s-custom-ca/

1、创建100年有效期CA证书
mkdir -p /var/lib/rancher/k3s/server/tls
cd /var/lib/rancher/k3s/server/tls
openssl genrsa -out client-ca.key 2048
openssl genrsa -out server-ca.key 2048
openssl genrsa -out request-header-ca.key 2048
openssl req -x509 -new -nodes -key client-ca.key -sha256 -days 36500 -out client-ca.crt -addext keyUsage=critical,digitalSignature,keyEncipherment,keyCertSign -subj '/CN=k3s-client-ca'
openssl req -x509 -new -nodes -key server-ca.key -sha256 -days 36500 -out server-ca.crt -addext keyUsage=critical,digitalSignature,keyEncipherment,keyCertSign -subj '/CN=k3s-server-ca'
openssl req -x509 -new -nodes -key request-header-ca.key -sha256 -days 36500 -out request-header-ca.crt -addext keyUsage=critical,digitalSignature,keyEncipherment,keyCertSign -subj '/CN=k3s-request-header-ca'
2、使用自签名CA证书启动k3s

因为已经在 /var/lib/rancher/k3s/server/tls 创建了CA证书,所以当启动k3s时,将使用已创建的CA颁发证书。

直接安装k3s

curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=v1.21  sh -
3、查看证书有效期
cd /var/lib/rancher/k3s/server/tls

for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done
/var/lib/rancher/k3s/server/tls/client-admin.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/client-ca.crt
notAfter=Mar 14 02:49:24 2122 GMT
/var/lib/rancher/k3s/server/tls/client-controller.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/client-k3s-cloud-controller.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/client-k3s-controller.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/client-kube-proxy.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/client-scheduler.crt
notAfter=Apr  7 02:50:31 2023 GMT
/var/lib/rancher/k3s/server/tls/request-header-ca.crt
notAfter=Mar 14 02:49:24 2122 GMT
/var/lib/rancher/k3s/server/tls/server-ca.crt
notAfter=Mar 14 02:49:24 2122 GMT
/var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt
notAfter=Apr  7 02:50:31 2023 GMT
kubectl get secret -n kube-system k3s-serving -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -text | grep Not
            Not Before: Apr  7 02:49:24 2022 GMT
            Not After : Apr  7 02:50:31 2023 GMT

从结果可以看到,CA证书的有效期已经变成100年,其他客户端证书的有效期依然是1年

4、模拟证书过期,轮换证书

将服务器时间调整为50年后

~# timedatectl set-ntp no
~# date -s 20720407
Thu Apr  7 00:00:00 CST 2072
~# date
Thu Apr  7 00:00:00 CST 2072

重启k3s,触发证书轮换

service k3s restart

证书轮换后,再次 查询证书的有效期

for i in `ls /var/lib/rancher/k3s/server/tls/*.crt`; do echo $i; openssl x509 -enddate -noout -in $i; done

/var/lib/rancher/k3s/server/tls/client-admin.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/client-auth-proxy.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/client-ca.crt
notAfter=Mar 14 02:49:24 2122 GMT
/var/lib/rancher/k3s/server/tls/client-controller.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/client-k3s-cloud-controller.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/client-k3s-controller.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/client-kube-apiserver.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/client-kube-proxy.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/client-scheduler.crt
notAfter=Apr  6 16:00:41 2073 GMT
/var/lib/rancher/k3s/server/tls/request-header-ca.crt
notAfter=Mar 14 02:49:24 2122 GMT
/var/lib/rancher/k3s/server/tls/server-ca.crt
notAfter=Mar 14 02:49:24 2122 GMT
/var/lib/rancher/k3s/server/tls/serving-kube-apiserver.crt
notAfter=Apr  6 16:00:41 2073 GMT
kubectl get secret -n kube-system k3s-serving -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -text | grep Not
            Not Before: Apr  7 02:49:24 2022 GMT
            Not After : Apr  6 16:01:11 2073 GMT
kubectl get nodes
NAME    STATUS   ROLES                  AGE   VERSION
dev-1   Ready    control-plane,master   50y   v1.21.11+k3s1

k3s 服务重启后,会自动轮换k3s证书。从以上结果可以看到k3s的证书已经更新到2073年,已经突破了k3s默认生成CA的10年有限期,证明自签名的CA已经生效,客户端证书是由自签名CA颁发

5、后记

通过使用自签名CA的形式来延长CA证书的有效期,其他客户端证书有效期依然为1年,因此还需要在证书已经过期或剩余的时间不足90天时重启k3s来触发客户端证书轮换。

六、FAQ

error: failed to run Kubelet: failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

"Failed to run kubelet" err="failed to run Kubelet: misconfiguration: kubelet cgroup driver: \"cgroupfs\" is different from docker cgroup driver: \"systemd\""

vim /etc/systemd/system/docker.service.d/docker-options.conf
...
--exec-opt native.cgroupdriver=cgroupfs
...

vim /etc/docker/daemon.json 
{
    "exec-opts": ["native.cgroupdriver=cgroupfs"]
}

{"exec-opts": ["native.cgroupdriver=systemd"]}

results matching ""

    No results matching ""