第27节 k3s 补充(高级)
❤️💕💕新时代拥抱云原生,云原生具有环境统一、按需付费、即开即用、稳定性强特点。Myblog:http://nsddd.top
k3s vs k3d
k3s是一个非常高效和轻量级的完全兼容的 Kubernetes 发行版。
k3d是一个旨在在 Docker 中轻松运行 k3s 的实用程序,它提供了一个简单的 CLI 来创建、运行、删除具有 1 到 n 个节点的完全合规的 Kubernetes 集群。
K3s 包括:
- Flannel:一个非常简单的 L2 overlay 网络,满足 Kubernetes 的要求。这是一个CNI 插件(Container Network Interface),如Calico、Romana、Weave-net Flannel 不支持 Kubernetes Network Policy,但可以用 Calico 代替(见下一节)。
- CoreDNS:一个灵活的、可扩展的 DNS 服务器,可以作为 Kubernetes 集群的 DNS
- Traefik是一个现代的 HTTP 反向代理和负载均衡器。在下一节中,我还将展示如何用 Traefik v2 或 Nginx 替换它
- Klipper 负载均衡器:使用可用主机端口的服务负载均衡器。
- SQLite3 : 默认使用的存储后端(也支持 MySQL、Postgres 和 etcd3)
- Containerd是一个像 Docker 一样的运行时容器,没有镜像构建部分
这些组件的选择是为了拥有最轻量级的分布。但正如我们稍后将在本博客中看到的那样,k3s 是一个模块化发行版,其中的组件可以轻松更换。
最近,k3s作为第一个 Kubernetes 发行版在沙箱级别加入了云原生计算基金会(CNCF) (引发了很多关于 k3s 是否应该成为 kubernetes 子项目的争论)。
证书轮换
默认情况下,K3s 的证书在 12 个月内过期。
如果证书已经过期或剩余的时间不足 90 天,则在 K3s 重启时轮换证书。
# 查询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 20220807
# 重启K3s服务
service k3s restart
自动部署清单
在/var/lib/rancher/k3s/server/manifests
中找到的任何文件都会以类似kubectl apply
的方式自动部署到 Kubernetes。
关于部署 Helm charts 的信息,请参阅Helm章节。
使用 Docker 作为容器运行时
K3s 包含并默认为containerd, 一个行业标准的容器运行时。
要使用 Docker 而不是 containerd
。
在 K3s 节点上安装
Docker
。可以使用Rancher
的一个Docker 安装脚本来安装 Docker:curl https://releases.rancher.com/install-docker/19.03.sh | sh
使用
--docker
选项安装 K3s:curl -sfL https://get.k3s.io | sh -s - --docker
国内用户,可以使用以下方法加速安装:
curl -sfL http://rancher-mirror.cnrancher.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
确认 Docker 容器正在运行:
$ 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 与 Docker 一起使用
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
配置 containerd
K3s 将会在/var/lib/rancher/k3s/agent/etc/containerd/config.toml
中为 containerd
生成 config.toml
。
如果要对这个文件进行高级定制,你可以在同一目录中创建另一个名为 config.toml.tmpl
的文件,此文件将会代替默认设置。
config.toml.tmpl
将被视为 Go 模板文件,并且config.Node
结构被传递给模板。此模板示例介绍了如何使用结构来自定义配置文件。
节点标签和污点
K3s agents 可以通过--node-label
和--node-taint
选项进行配置,这两个选项可以给 kubelet 添加标签和污点。这两个选项只能在注册时添加标签和/或污点,所以它们只能被添加一次,之后不能再通过运行 K3s 命令来改变。
如果你想在节点注册后更改节点标签和污点,你应该使用kubectl
。关于如何添加污点和节点标签,请参考 Kubernetes 官方文档。
# 添加label和taint
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
使用安装脚本启动 Server 节点
安装脚本将自动检测您的操作系统是使用 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
)。
Alpine Linux 安装的额外准备工作
设置 Alpine Linux 前,您需要进行以下准备工作:
更新
/etc/update-extlinux.conf
添加:default_kernel_opts="... cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory"
更新配置并重启:
update-extlinux reboot
运行 K3d(Docker 中的 K3s)和 docker-compose
k3d是一个设计用于在 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
在 Raspbian Buster 上启用旧版的 iptables
Raspbian Buster 默认使用nftables
而不是iptables
。 K3S 网络功能需要使用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
为 Raspbian Buster 启用 cgroup
标准的 Raspbian Buster 安装没有启用 cgroups
。K3S 需要cgroups
来启动 systemd 服务。在/boot/cmdline.txt
中添加cgroup_memory=1 cgroup_enable=memory
就可以启用cgroups
。
/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
SELinux 支持
从 v1.19.4+k3s1 开始支持。从 v1.17.4+k3s1 开始是试验性的。
如果您在默认启用 SELinux 的系统(如 CentOS)上安装 K3s,您必须确保安装了正确的 SELinux 策略。
自动安装
从 v1.19.3+k3s2 开始可用。
如果在兼容的系统上,如果不执行离线安装,则安装脚本将从 Rancher RPM 存储库自动安装 SELinux RPM。可以通过设置 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
要强制安装脚本记录警告而不是失败,您可以设置以下环境变量: INSTALL_K3S_SELINUX_WARN=true
。
Red Hat 和 CentOS 的额外准备
建议运行以下命令,关闭 firewalld
:
systemctl disable firewalld --now
END 链接
✴️版权声明 © :本书所有内容遵循CC-BY-SA 3.0协议(署名-相同方式共享)©