K3S 和 Rancher 安装部署&配置

原文链接: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。硬件要求:

配置最小建议
CPU1核心2个核
RAM512 MB1 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 服务将被配置为在节点重启后或进程崩溃或被杀死时自动重启。
  • 将安装其他实用程序,包括 kubectlcrictlctrk3s-killall.shk3s-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:

  1. 轻松的在其他任何环境使用 .kube/config 文件来操作和访问集群,这包括在本地开发环境下使用kt-connect的时候,若 K8S api-server 监听在内网IP 上,外部网络环境将无法访问。
  2. 在使用多云服务厂商构建 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_URLK3S_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

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值