原文链接:https://www.hezebin.com/article/66698a2f02a8ac30292a18f5
简介
什么是 K3s?
K3s 是轻量级的 Kubernetes。K3s 易于安装,仅需要 Kubernetes 内存的一半,所有组件都在一个小于 100 MB 的二进制文件中。K3s 是一个完全兼容的 Kubernetes 发行版,具有一些增强功能。
为什么叫 K3s?
我们希望安装的 Kubernetes 只占用一半的内存。Kubernetes 是一个 10 个字母的单词,简写为 K8s。Kubernetes 的一半就是一个 5 个字母的单词,因此简写为 K3s。K3s 没有全称,也没有官方的发音。
安装前准备工作
K3S 能在大多数现代Linux系统上运行,本文操作系统环境 CentOS7。硬件要求:
配置 | 最小 | 建议 |
---|---|---|
CPU | 1核心 | 2个核 |
RAM | 512 MB | 1 GB |
关闭防火墙(可选)
根据实际情况可选择性的开放特定端口;若在云环境下,直接无脑关闭防火墙,使用云服务的防火墙功能配置。
systemctl stop firewalld
systemctl disable firewalld
启用IPv4数据包转发
如果你不确定你是否需要启用 IPv4,那请默认开启,参考 K8S 官方文档:https://kubernetes.io/zh-cn/docs/setup/production-environment/container-runtimes/#prerequisite-ipv4-forwarding-optional
使用以下命令验证 net.ipv4.ip_forward
是否设置为 1:
sysctl net.ipv4.ip_forward
若未启用则手动启用 IPv4 数据包转发:
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k3s.conf
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
启用后再次验证是否生效
关闭 swap
K8S禁止虚拟内存以提高性能:https://kubernetes.io/zh-cn/docs/setup/production-environment/tools/kubeadm/install-kubeadm/#%E5%87%86%E5%A4%87%E5%BC%80%E5%A7%8B
# 临时关闭swap
swapoff -a
# 永久关闭swap
sed -ri 's/.*swap.*/#&/' /etc/fstab
时钟同步
yum install chrony -y
sudo systemctl start chronyd
sudo systemctl enable chronyd
设置主机名称
每台主机必须具有唯一的主机名。如果你的计算机没有唯一的主机名,请传递 K3S_NODE_NAME
环境变量,并为每个节点提供一个有效且唯一的主机名。
hostnamectl set-hostname hezebin-k3s-master
每个节点添加 hosts:
echo "81.70.149.45 hezebin-k3s-master" >> /etc/hosts
echo "81.70.149.46 hezebin-k3s-node" >> /etc/hosts
SSH 配置
为了避免遇到SSH 经常断连,新环境最好在你的本地 SSH 客户端配置文件(通常是 ~/.ssh/config
)中添加以下行:
# vi ~/.ssh/config
Host *
ServerAliveInterval 60
修改 SSH 服务器的配置文件,通常是 /etc/ssh/sshd_config
# vi /etc/ssh/sshd_config
ClientAliveInterval 30 #客户端每隔多少秒向服务发送一个心跳数据
ClientAliveCountMax 3
重启 SSH 服务器:
service sshd restart
部署 K3S 环境
curl -sfLk https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.9+k3s1 sh -s - --disable traefik --advertise-address 81.70.149.45 --node-external-ip 81.70.149.45 --node-ip 81.70.149.45
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.28.9+k3s1 sh -s - --disable traefik --advertise-address 81.70.149.45 --node-external-ip 81.70.149.45 --node-ip 81.70.149.45
部署 Server
K3s 提供了一个安装脚本,可以方便地将其作为服务安装在基于 systemd 或 openrc 的系统上。该脚本可在 https://get.k3s.io 获得。要使用这种方法安装 K3s,只需运行:
# 不指定版本会下载最新的,建议降一个 k8s 版本,否则可能出现最新的版本 rancher 等组件不支持
curl -sfLk https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.9+k3s1 sh -s -
国内镜像源方式安装:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -s -
运行此安装脚本后:
- K3s 服务将被配置为在节点重启后或进程崩溃或被杀死时自动重启。
- 将安装其他实用程序,包括
kubectl
、crictl
、ctr
、k3s-killall.sh
和k3s-uninstall.sh
。 - kubeconfig 文件将写入到
/etc/rancher/k3s/k3s.yaml
,由 K3s 安装的 kubectl 将自动使用该文件。
单节点 Server 安装是一个功能齐全的 Kubernetes 集群,它包括了托管工作负载 pod 所需的所有数据存储、control plane、kubelet 和容器运行时组件。除非你希望向集群添加容量或冗余,否则没有必要添加额外的 Server 或 Agent 节点。
禁用 Traefik (可选)
K3S 默认安装了 Traefik 组件,由于我目前偏向于使用 LoadBalancer Service 的方式在 K8S 中部署一个 Nginx 的 Deploy 监听在 80 端口,Nginx 对于前端部署上方便很多,代理和流量转发上其功能和 Treafik 类似,就没必要再安装 Traefik 了。
脚本安装时添加--disable traefik
参数禁用 Treafik:
curl -sfLk https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.9+k3s1 sh -s - --disable traefik
使用 Docker 作为容器运行时(可选)
!!! note 提示!
在执行该部分操作前先提供一个结论:建议使用更加轻量的 Containerd 作为运行时,除非你实在更喜欢 Docker 一点!
!!!
K3S 包含且默认的容器运行时为 containerd,它是一个行业标准的容器运行时。 从 Kubernetes 1.24 开始,Kubelet 不再包含 dockershim,该组件允许 kubelet 与 dockerd 通信。 K3s 1.24 及更高版本包括了 cri-dockerd,它允许你无缝升级旧的 K3s 版本,同时继续使用 Docker 容器运行时。
要使用 Docker 而不是 containerd,在 K3s 节点上安装 Docker。你可以使用 Rancher 的一个 Docker 安装脚本来安装 Docker:
curl https://releases.rancher.com/install-docker/20.10.sh | sh
或者使用如下官方的步骤(https://docs.docker.com/engine/install/centos/)来自定义安装 Docker:
卸载旧版docker
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装yum-utils
,并设置docker镜像仓库
sudo yum install -y yum-utils
- 官方镜像源:
sudo yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 阿里云
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 清华大学源
sudo yum-config-manager \
--add-repo \
https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
默认安装最新版本的 docker engine 和 contianerd
sudo yum -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
若要安装指定版本,则先列出版本列表,再选择想要安装的版本
yum list docker-ce --showduplicates | sort -r
docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable
docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable
docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable
sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io docker-buildx-plugin docker-compose-plugin
安装完毕后启动 docker,并设置为开机启动
sudo systemctl start docker
sudo systemctl enable docker
阿里云镜像仓库加速: https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
针对Docker客户端版本大于 1.10.0 的用户,您可以通过修改daemon配置文件/etc/docker/daemon.json
来使用镜像加速器:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://uph96ue9.mirror.aliyuncs.com",
"https://mirror.ccs.tencentyun.com",
"https://hub-mirror.c.163.com",
"https://mirror.baidubce.com"
],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
完成 Docker 的安装后,使用 --docker
选项安装 K3S:
curl -sfLk https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.9+k3s1 sh -s - --disable traefik --docker
混合网络环境下使用公网 IP 部署
目前我有 2 个场景下需要用到公网 IP 来部署 K8S:
- 轻松的在其他任何环境使用
.kube/config
文件来操作和访问集群,这包括在本地开发环境下使用kt-connect
的时候,若 K8S api-server 监听在内网IP 上,外部网络环境将无法访问。 - 在使用多云服务厂商构建 K8S 集群时,由于网络不互通,只能通过公网 IP 来实现节点间的相互通信(因为曾经尝试过以新用户的身份同时薅了腾讯云、阿里云、华为云三台清凉云服务器来搭建一个 1master,2 node非高可用的 K8S 集群 😁)
使用公网 IP 来搭建需要指定参数 --advertise-address
、--node-external-ip
、--node-ip
,这三个配置分别表示 api-server 的广播地址、节点的对外 ip、节点的监听 IP:
curl -sfLk https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.9+k3s1 sh -s - --disable traefik --advertise-address 81.70.149.45 --node-external-ip 81.70.149.45 --node-ip 81.70.149.45
再举例一种比较特殊的情况,还是 1master,2node 的情况下,但是其中 1 个 node1 和 master 内网互通,另外一个 node2 和 master 与 node1 不互通,那么 node1 的 --node-ip
是可以为内网 IP 的,而 node2 的 --node-ip
必须为外网 IP,因为 2 个 node 间并不直接通信,都是通过 master 的 api-server 来通信的~
部署Agent
要安装其他 Agent 节点并将它们添加到集群,请使用 K3S_URL
和 K3S_TOKEN
环境变量运行安装脚本。以下示例演示了如何添加 Agent 节点:
# 混合网络添加 --node-external-ip 81.70.149.45 --node-ip 81.70.149.45
curl -sfLk https://get.k3s.io | INSTALL_K3S_VERSION=v1.28.9+k3s1 K3S_URL=https://81.70.149.45:6443 K3S_TOKEN=K10c3e39cb2a7693fbd87069fca7a645d07531e9439ca50a346d238addc6b551317::server:ec4d858d1affcc60c640aedc82a2c2da sh -s -
K3S_URL
参数会导致安装程序将 K3s 配置为 Agent 而不是 Server。K3s Agent 将注册到在 URL 上监听的 K3s Server。K3S_TOKEN
使用的值存储在 Server 节点上的 /var/lib/rancher/k3s/server/node-token
中。
cat /var/lib/rancher/k3s/server/node-token
国内镜像源:
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_VERSION=v1.28.9+k3s1 K3S_URL=https://81.70.149.45:6443 K3S_TOKEN=K10c3e39cb2a7693fbd87069fca7a645d07531e9439ca50a346d238addc6b551317::server:ec4d858d1affcc60c640aedc82a2c2da sh -s -
代理配置
K3s 的网络代理配置在 /etc/systemd/system/k3s.service.env
中,若使用了上文中的 V2ray 代理,K3s 在部署时会将代理环境变量添加到该服务的环境变量配置文件中。或手动添加配置:
http_proxy="http://127.0.0.1:1087"
https_proxy="http://127.0.0.1:1087"
修改后需重启 K3s 服务:
sudo systemctl restart k3s
集群访问
/etc/rancher/k3s/k3s.yaml
中存储的 kubeconfig 文件用于配置对 Kubernetes 集群的访问。如果你已经安装了上游的 Kubernetes 命令行工具(如 kubectl 或 helm),你需要用正确的 kubeconfig 路径配置它们。这可以通过导出 KUBECONFIG
环境变量或调用 --kubeconfig
命令行标志来完成。有关详细信息,请参阅以下示例。
使用 KUBECONFIG 环境变量:
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get pods --all-namespaces
helm ls --all-namespaces
或者在命令中指定 kubeconfig 文件的位置:
kubectl --kubeconfig /etc/rancher/k3s/k3s.yaml get pods --all-namespaces
helm --kubeconfig /etc/rancher/k3s/k3s.yaml ls --all-namespaces
使用 kubectl 从外部访问集群:
将 /etc/rancher/k3s/k3s.yaml
复制到位于集群外部的主机上的 ~/.kube/config
。然后,将 server
字段的值替换为你 K3s Server 的 IP 或名称。现在,你可以使用 kubectl
来管理 K3s 集群。
mkdir -p ~/.kube
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config
外部网络环境下记得将 config
配置中的 ip 改为公网 ip。
镜像仓库配置
K3s 启动后将检查是否 /etc/rancher/k3s/registries.yaml
存在。如果是这样,则在生成 containerd 配置时使用此文件中包含的注册表配置。官方文档:https://docs.k3s.io/zh/installation/private-registry
vi /etc/rancher/k3s/registries.yaml
下面包含了docker公共仓库镜像和我个人的私有仓库镜像配置:
mirrors:
"docker.io":
endpoint:
- "https://uph96ue9.mirror.aliyuncs.com"
- "https://mirror.ccs.tencentyun.com"
- "https://hub-mirror.c.163.com"
- "https://mirror.baidubce.com"
"ccr.ccs.tencentyun.com":
endpoint:
- "https://ccr.ccs.tencentyun.com"
"registry.cn-hangzhou.aliyuncs.com":
endpoint:
- "https://registry.cn-hangzhou.aliyuncs.com"
configs:
"registry.cn-hangzhou.aliyuncs.com":
auth:
username: ihezebin
password: xxxx
"ccr.ccs.tencentyun.com":
auth:
username: 100009173056
password: xxxx
重启 K3S 后试试拉取镜像:
sudo systemctl restart k3s
# 对于代理节点需要手动创建一下/etc/rancher/k3s目录
# sudo systemctl restart k3s-agent
crictl pull docker.io/library/nginx:alpine
crictl pull registry.cn-hangzhou.aliyuncs.com/rdc-incubator/kt-connect-shadow:v0.3.7
关于 containerd 镜像仓库的配置,可以查看官方代码仓库的描述,以下分别是过时的配置方式和最新的配置方式:
https://github.com/containerd/containerd/blob/release/1.5/docs/cri/registry.md
https://github.com/containerd/containerd/blob/release/1.5/docs/cri/config.md#registry-configuration
目前我用的 K3S 虽然使用的是 1.5 版本的,但是看了其源代码的模板中没有使用关于 mirrors
的配置,而是用了最新的使用 host 配置的方式:
所以查看 containerd 信息时 mirrors
还是为空的:
crictl info
cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml
另外 containerd 默认还是使用的 docker.io 仓库的镜像,我验证了一下,配置好国内镜像源后,在拉取镜像时虽然命中的 host 还是 docker.io,但是其流量已经全去了配置的镜像仓库了:
验证方式为安装 tcpdump
,并监听特定 host 流量:
sudo yum install tcpdump
sudo tcpdump -i any -n -s 0 -A host uph96ue9.mirror.aliyuncs.com
安装 Rancher
官方文档:https://ranchermanager.docs.rancher.com/zh/getting-started/quick-start-guides/deploy-rancher-manager/helm-cli
下面只要和 github 相关的链接,都可以在前面加 https://mirror.ghproxy.com/
走代理加速!
安装 Helm
yum install -y tar
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
实在不行,可以在 https://github.com/helm/helm/releases/tag/v3.15.3 下载后上传到服务器手动解压安装:
tar -zxvf helm-v3.15.3-linux-arm64.tar.gz
sudo mv linux-arm64/helm /usr/local/bin/helm
安装 cert-manager
在 K3s 集群中创建一个命名空间,用于部署 Rancher。你可以运行以下命令:
kubectl create namespace cattle-system
rancher 依赖 cert-manager ,开始安装 :
kubectl apply -f https://mirror.ghproxy.com/https://github.com/cert-manager/cert-manager/releases/download/v1.14.4/cert-manager.crds.yaml
helm repo add jetstack https://charts.jetstack.io
helm repo update
helm install cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace
若镜像仓库无法正常访问,手动下载后上传服务器:https://artifacthub.io/packages/helm/cert-manager/cert-manager?modal=install
tar -zxvf cert-manager-v1.15.2.tgz
helm install cert-manager ./cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.15.2
然后你会发现启动的 Pod 由于拉取不到docker.io/rancher/mirrored-pause:3.6
镜像而启动失败:
k get pod -n cert-manager
FATA[0197] pulling image: failed to pull and unpack image “docker.io/rancher/mirrored-pause:3.6”: failed to copy: httpReadSeeker: failed open: unexpected status code https://uph96ue9.mirror.aliyuncs.com/v2/rancher/mirrored-pause/blobs/sha256:7d46a07936af93fcce097459055f93ab07331509aa55f4a2a90d95a3ace1850e?ns=docker.io: 500 Internal Server Error - Server message: unknown: unknown error
手动保存和上传镜像包到服务器:
docker pull rancher/mirrored-pause:3.6
docker save -o mirrored-pause-3.6.tar rancher/mirrored-pause:3.6
ctr -n=k8s.io images import ./mirrored-pause-3.6.tar
crictl images
这个时候再看 cert-manager
的 Pod 应该已经正常了。
部署 Rancher
执行以下命令安装 Rancher。请将 <IP_OF_LINUX_NODE>
替换为你的 Linux 主机的 IP 地址或域名,如:rancher.hezebin.com
,并为 <PASSWORD_FOR_RANCHER_ADMIN>
设置一个安全的 Rancher 管理员密码:
helm repo add rancher-latest https://releases.rancher.com/server-charts/latest
# bootstrapPassword:为第一个管理员用户设置引导密码。登录后,管理员需要重置密码。如不设置,会使用随机生成的引导密码。
# hostname Helm尝试创建一个Ingress规则,该规则将指定的hostname(即DNS名)映射到Rancher服务。
helm install rancher rancher-latest/rancher \
--namespace cattle-system \
--set hostname=<IP_OF_LINUX_NODE> \
--set replicas=1 \
--set bootstrapPassword=<PASSWORD_FOR_RANCHER_ADMIN> \
--set tls=external
# 卸载
helm delete rancher --namespace cattle-system
不出意外国内的话 rancher/rancher:v2.9.0
镜像也拉取不到:
docker pull rancher/rancher:v2.9.0
docker pull rancher/rancher/shell:v0.2.1
docker save -o rancher:v2.9.0.tar rancher/rancher:v2.9.0
docker save -o shell:v0.2.1.tar rancher/shell:v0.2.1
ctr -n=k8s.io images import ./rancher:v2.9.0.tar
ctr -n=k8s.io images import ./shell:v0.2.1.tar
crictl images
日志
k3s 日志
journalctl -u k3s -f
containerd 日志
tail -f /var/lib/rancher/k3s/agent/containerd/containerd.log
卸载 K3S
To uninstall K3s from a server node, run:
/usr/local/bin/k3s-uninstall.sh
To uninstall K3s from an agent node, run:
/usr/local/bin/k3s-agent-uninstall.sh
Git
yum install -y git
ssh-keygen -t ed25519 -C "Gitee SSH Key"
ls ~/.ssh/
cat ~/.ssh/id_ed25519.pub
git clone git@gitee.com:hezebin-go/k8s-resources.git
其他
其他组件和更详细的信息还是参考官方文档:https://docs.k3s.io/zh