默認情況下,K3s 的證書在 12 個月內(nèi)過期。
如果證書已經(jīng)過期或剩余的時間不足 90 天,則在 K3s 重啟時輪換證書。
在?/var/lib/rancher/k3s/server/manifests
?中找到的任何文件都會以類似?kubectl apply
?的方式自動部署到 Kubernetes,在啟動和在磁盤上更改文件時都是如此。從該目錄中刪除文件不會從集群中刪除相應(yīng)的資源。
關(guān)于部署 Helm charts 的信息,請參閱Helm章節(jié)。
K3s 包含并默認為containerd, 一個行業(yè)標準的容器運行時。
要使用 Docker 而不是 containerd,
curl https://releases.rancher.com/install-docker/19.03.sh | sh
--docker
?選項安裝 K3s:curl -sfL https://get.k3s.io | sh -s - --docker
國內(nèi)用戶,可以使用以下方法加速安裝:
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s - --docker
$ sudo k3s kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system local-path-provisioner-6d59f47c7-lncxn 1/1 Running 0 51s
kube-system metrics-server-7566d596c8-9tnck 1/1 Running 0 51s
kube-system helm-install-traefik-mbkn9 0/1 Completed 1 51s
kube-system coredns-8655855d6-rtbnb 1/1 Running 0 51s
kube-system svclb-traefik-jbmvl 2/2 Running 0 43s
kube-system traefik-758cd5fc85-2wz97 1/1 Running 0 43s
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3e4d34729602 897ce3c5fc8f "entry" About a minute ago Up About a minute k8s_lb-port-443_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
bffdc9d7a65f rancher/klipper-lb "entry" About a minute ago Up About a minute k8s_lb-port-80_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
436b85c5e38d rancher/library-traefik "/traefik --configfi…" About a minute ago Up About a minute k8s_traefik_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
de8fded06188 rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_svclb-traefik-jbmvl_kube-system_d46f10c6-073f-4c7e-8d7a-8e7ac18f9cb0_0
7c6a30aeeb2f rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_traefik-758cd5fc85-2wz97_kube-system_07abe831-ffd6-4206-bfa1-7c9ca4fb39e7_0
ae6c58cab4a7 9d12f9848b99 "local-path-provisio…" About a minute ago Up About a minute k8s_local-path-provisioner_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
be1450e1a11e 9dd718864ce6 "/metrics-server" About a minute ago Up About a minute k8s_metrics-server_metrics-server-7566d596c8-9tnck_kube-system_031e74b5-e9ef-47ef-a88d-fbf3f726cbc6_0
4454d14e4d3f c4d3d16fe508 "/coredns -conf /etc…" About a minute ago Up About a minute k8s_coredns_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
c3675b87f96c rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_coredns-8655855d6-rtbnb_kube-system_d05725df-4fb1-410a-8e82-2b1c8278a6a1_0
4b1fddbe6ca6 rancher/pause:3.1 "/pause" About a minute ago Up About a minute k8s_POD_local-path-provisioner-6d59f47c7-lncxn_kube-system_2dbd22bf-6ad9-4bea-a73d-620c90a6c1c1_0
64d3517d4a95 rancher/pause:3.1 "/pause"
crictl 為兼容 CRI 的容器運行時提供了 CLI
如果你想在使用?--docker
?選項安裝 K3s 后使用 crictl,請參考官方文檔來安裝 crictl。
$ VERSION="v1.17.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
rancher/coredns-coredns 1.6.3 c4d3d16fe508b 44.3MB
rancher/klipper-helm v0.2.5 6207e2a3f5225 136MB
rancher/klipper-lb v0.1.2 897ce3c5fc8ff 6.1MB
rancher/library-traefik 1.7.19 aa764f7db3051 85.7MB
rancher/local-path-provisioner v0.0.11 9d12f9848b99f 36.2MB
rancher/metrics-server v0.3.6 9dd718864ce61 39.9MB
rancher/pause 3.1 da86e6ba6ca19 742kB
etcdctl 為 etcd 提供了一個 CLI。
如果你想在嵌入式 etcd 的 K3s 里使用 etcdctl,請先參考官方文檔安裝 etcdctl。
$ VERSION="v3.5.0"
$ curl -L https://github.com/etcd-io/etcd/releases/download/${VERSION}/etcd-${VERSION}-linux-amd64.tar.gz --output etcdctl-linux-amd64.tar.gz
$ sudo tar -zxvf etcdctl-linux-amd64.tar.gz --strip-components=1 -C /usr/local/bin etcd-${VERSION}-linux-amd64/etcdctl
然后開始使用帶有適當 K3s 標志的 etcdctl 命令:
$ sudo etcdctl --cacert=/var/lib/rancher/k3s/server/tls/etcd/server-ca.crt --cert=/var/lib/rancher/k3s/server/tls/etcd/client.crt --key=/var/lib/rancher/k3s/server/tls/etcd/client.key version
K3s 將會在?/var/lib/rancher/k3s/agent/etc/containerd/config.toml
?中為 containerd 生成 config.toml。
如果要對這個文件進行高級定制,你可以在同一目錄中創(chuàng)建另一個名為 ?config.toml.tmpl
? 的文件,此文件將會代替默認設(shè)置。
?config.toml.tmpl
? 其實是一個 Go 模板文件,并且 ?config.Node
? 結(jié)構(gòu)傳遞給模板。
警告: 這個功能是試驗性的
Rootless 模式允許以非特權(quán)用戶的身份運行 k3s,這樣可以保護主機上的真正的 root 免受潛在的容器攻擊。
請參閱 https://rootlesscontaine.rs/ 了解 Rootless 模式。
在 rootless 運行時,將創(chuàng)建一個新的網(wǎng)絡(luò)名稱空間。這意味著 K3s 實例在與主機完全分離的網(wǎng)絡(luò)上運行。從主機訪問在 K3s 中運行的服務(wù)的唯一方法是設(shè)置端口轉(zhuǎn)發(fā)到 K3s 網(wǎng)絡(luò)名稱空間。我們有一個控制器,它將自動將 6443 和 1024 以下的服務(wù)端口綁定到主機,偏移量為 10000。
也就是說服務(wù)端口 80 在主機上會變成 10080,但 8080 會變成 8080,沒有任何偏移。
目前,只有?LoadBalancer
?服務(wù)會自動綁定。
不支持 Cgroup v1,支持 V2。
多集群安裝沒有經(jīng)過測試,也沒有記錄。
k3s-rootless.service
?。確保使用相同版本的?k3s-rootless.service
?和?k3s
?。k3s-rootless.service
? 安裝到 ?~/.config/systemd/user/k3s-rootless.service
?。不支持將該文件安裝為全系統(tǒng)服務(wù)(?/etc/systemd/...
?)。根據(jù) ?k3s
? 二進制文件的路徑,你可能需要修改文件中的 ?ExecStart=/usr/local/bin/k3s ...
? 行。systemctl --user daemon-reload
?。systemctl --user enable --now k3s-rootless
?。KUBECONFIG=~/.kube/k3s.yaml kubectl get pods -A
?,并確保 pods 正在運行。注意:不要嘗試在終端上運行?k3s server --rootless
?,因為它不能啟用 cgroup v2 授權(quán)。 如果你真的需要在終端上運行,請在 ?systemd-run --user -p Delegate=yes --tty
? 前加上一個 systemd 范圍。
即:?systemd-run --user -p Delegate=yes --tty k3s server --rootless
?。
systemctl --user status k3s-rootless
? 來檢查守護進程的狀態(tài)。journalctl --user -f -u k3s-rootless
? 查看守護程序日志。K3s agents 可以通過?--node-label
?和?--node-taint
?選項進行配置,這兩個選項可以給 kubelet 添加標簽和污點。這兩個選項只能在注冊時添加標簽和/或污點,所以它們只能被添加一次,之后不能再通過運行 K3s 命令來改變。
如果你想在節(jié)點注冊后更改節(jié)點標簽和污點,你應(yīng)該使用?kubectl
?。
安裝腳本將自動檢測您的操作系統(tǒng)是使用 systemd 還是 openrc 并啟動服務(wù)。當使用 openrc 運行時,日志將在?/var/log/k3s.log
?中創(chuàng)建。
當使用 systemd 運行時,日志將在?/var/log/syslog
?中創(chuàng)建,并使用?journalctl -u k3s
?查看。
使用安裝腳本進行安裝和自動啟動的示例:
curl -sfL https://get.k3s.io | sh -
國內(nèi)用戶,可以使用以下方法加速安裝:
curl -sfL https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -
當手動運行 server 時,你應(yīng)該得到一個類似于下面的輸出:
$ 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 將創(chuàng)建大量的日志,輸出可能會更長。默認情況下,server 會將自身注冊為一個節(jié)點(運行 agent)。
設(shè)置 Alpine Linux 前,您需要進行以下準備工作:
default_kernel_opts="... cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
update-extlinux
reboot
建議關(guān)閉 firewalld:
systemctl disable firewalld --now
如果啟用,則需要禁用 nm-cloud-setup 并重新啟動節(jié)點:
systemctl disable nm-cloud-setup.service nm-cloud-setup.timer
reboot
Raspberry Pi OS(以前稱為 Raspbian)默認使用 ?nftables
?而不是 ?iptables
?。 K3S 網(wǎng)絡(luò)功能需要 ?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
標準 Raspberry Pi OS 安裝時不會啟用 ?cgroups
?。 K3S 需要 ?cgroups
?來啟動 systemd 服務(wù)??梢酝ㄟ^將 ?cgroup_memory=1 cgroup_enable=memory
? 附加到 ?/boot/cmdline.txt
? 來啟用 ?cgroups
?。
從 Ubuntu 21.10 開始,Raspberry Pi 上的 vxlan 支持已移至單獨的內(nèi)核模塊中。
sudo apt install linux-modules-extra-raspi
k3d是一個設(shè)計用于在 Docker 中輕松運行 K3s 的工具。
它可以通過 MacOS 上的brew工具安裝:
brew install k3d
?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
console=serial0,115200 console=tty1 root=PARTUUID=58b06195-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait cgroup_memory=1 cgroup_enable=memory
從 v1.19.4+k3s1 開始支持。從 v1.17.4+k3s1 開始是試驗性的。
如果您在默認啟用 SELinux 的系統(tǒng)(如 CentOS)上安裝 K3s,您必須確保安裝了正確的 SELinux 策略。
從 v1.19.3+k3s2 開始可用。
如果在兼容的系統(tǒng)上,如果不執(zhí)行離線安裝,則安裝腳本將從 Rancher RPM 存儲庫自動安裝 SELinux RPM??梢酝ㄟ^設(shè)置 ?INSTALL_K3S_SKIP_SELINUX_RPM=true
? 來跳過自動安裝。
可以使用以下命令安裝必要的策略:
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
要強制安裝腳本記錄警告而不是失敗,您可以設(shè)置以下環(huán)境變量: ?INSTALL_K3S_SELINUX_WARN=true
?。
SELinux enforcement 的啟用或禁用方式取決于 K3s 的版本。
要使用 SELinux,請在啟動 K3s server 和 agent 時指定?--selinux
?標志。
這個選項也可以在 K3s配置文件中指定:
selinux: true
不要使用?--disable-selinux
?選項。它已經(jīng)被廢棄,在未來的小版本中,它可能會因為被忽略或不被識別,從而導(dǎo)致錯誤。
在 SELinux 下不支持使用自定義的?--data-dir
?。要自定義它,你很可能需要編寫自己的自定義策略。為了獲得指導(dǎo),你可以參考container/container-selinux資源庫,它包含了容器運行時的 SELinux 策略文件,以及rancher/k3s-selinux資源庫,它包含了 K3s 的 SELinux 策略。
內(nèi)置 containerd 會自動啟用 SELinux。
要關(guān)閉嵌入式 containerd 中的 SELinux enforcement,請使用?--disable-selinux
?標志啟動 K3s。
在 SELinux 下不支持使用自定義的?--data-dir
?。要自定義它,你很可能需要編寫自己的自定義策略。為了獲得指導(dǎo),你可以參考container/container-selinux資源庫,它包含了容器運行時的 SELinux 策略文件,以及rancher/k3s-selinux資源庫,它包含了 K3s 的 SELinux 策略。
拉取鏡像被稱為容器生命周期中耗時的步驟之一。根據(jù)Harter, et al.:
拉取包占容器啟動時間的 76%,但其中只有 6.4%的數(shù)據(jù)被讀取
為了解決這個問題,k3s 實驗性地支持鏡像內(nèi)容的延遲拉取。這允許 k3s 在拉取整個鏡像之前啟動一個容器。相反,按需獲取必要的內(nèi)容塊(例如單個文件)。特別是對于大鏡像,這種技術(shù)可以縮短容器啟動延遲。
要啟用延遲拉取,目標鏡像需要格式化為 eStargz。這是一種 OCI 的替代品,但 100% 與 OCI 兼容的鏡像格式,用于延遲拉取。由于兼容性,eStargz 可以推送到標準容器注冊表(例如 ghcr.io),并且即使在 eStargz-agnostic 運行時,它也仍然可運行。
eStargz 是基于谷歌 CRFS 項目提出的 stargz 格式開發(fā)的,具有內(nèi)容驗證、性能優(yōu)化等實用功能。
關(guān)于延遲拉取和 eStargz 的更多細節(jié),請參考 Stargz Snapshotter 項目資源庫。
如以下所示,k3s server 和 agent 需要 ?--snapshotter=stargz
? 選項。
k3s server --snapshotter=stargz
使用此配置,您可以對 eStargz 格式的鏡像執(zhí)行延遲拉取。以下 Pod 清單使用 eStargz 格式的 ?node:13.13.0
? 鏡像 (?ghcr.io/stargz-containers/node:13.13.0-esgz
?)。k3s 對這個鏡像進行了延遲拉取。
apiVersion: v1
kind: Pod
metadata:
name: nodejs
spec:
containers:
- name: nodejs-estargz
image: ghcr.io/stargz-containers/node:13.13.0-esgz
command: ["node"]
args:
- -e
- var http = require('http');
http.createServer(function(req, res) {
res.writeHead(200);
res.end('Hello World!\n');
}).listen(80);
ports:
- containerPort: 80
可以在不使用 Rancher 的情況下安裝 K3s 的 Rancher 日志。應(yīng)執(zhí)行以下指令來實現(xiàn):
helm repo add rancher-charts https://charts.rancher.io
helm repo update
helm install --create-namespace -n cattle-logging-system rancher-logging-crd rancher-charts/rancher-logging-crd
helm install --create-namespace -n cattle-logging-system rancher-logging --set additionalLoggingSources.k3s.enabled=true rancher-charts/rancher-logging
在 K3s 中,有兩種類型的 token:K3S_TOKEN 和 K3S_AGENT_TOKEN。
K3S_TOKEN:定義了 server 提供 HTTP 配置資源所需的密鑰。其他 server 在加入 K3s HA 集群之前會請求這些資源。如果沒有定義 K3S_AGENT_TOKEN,agent 也使用這個 token 來訪問加入集群所需的 HTTP 資源。請注意,這個 token 還用于為數(shù)據(jù)庫中的重要內(nèi)容(例如引導(dǎo)數(shù)據(jù))生成加密密鑰。
K3S_AGENT_TOKEN(可選):定義了 server 向 agent 提供 HTTP 配置資源所需的密鑰。如果沒有定義,agent 將需要 K3S_TOKEN。推薦使用 K3S_AGENT_TOKEN 避免 agent 節(jié)點必須知道 K3S_TOKEN,它也用于加密數(shù)據(jù)。
如果沒有定義 K3S_TOKEN,第一個 K3s server 將生成一個隨機的 K3S_TOKEN。其結(jié)果是 /var/lib/rancher/k3s/server/token
中的部分內(nèi)容。例如,K1070878408e06a827960208f84ed18b65fa10f27864e71a57d9e053c4caff8504b::server:df54383b5659b9280aa1e73e60ef78fc
,其中 df54383b5659b9280aa1e73e60ef78fc
是 K3S_TOKEN。
更多建議: