介绍安装选项 | Rancher文档
K3s Agent配置参考 | Rancher文档
Rancher 离线安装 - 3、安装 Kubernetes 集群 - 《Rancher 2.4.8 中文文档》 - 书栈网 · BookStack
是rancher?开源的一个Kubernetes发行版,从名字上就可以看出k3s相对k8s做了很多裁剪和优化,二进制程序不到50MB,只需要512MB内存可以运行。
之所以叫k3s是因为相对k8s切割以下五个部分:
- 过时功能和非默认功能
- Alpha功能
- 内置云提供商插件
- 内置存储驱动
- Docker
相对k8s主要优化如下:
- 使用嵌入式轻量级数据库SQLite作为默认数据存储替代etcd,当然etcd还是支持。
- 内置了local storage provider、service load balancer、helm controller、Traefik ingress controller,开箱即用。
- 所有Kubernetes如控制平面组件api-server、scheduler当包装成为一个简化的二进制程序时,控制平面只需要一个过程。
- 删除内置插件(例如cloudprovider插件和存储插件)。
- 为了减少外部依赖,操作系统只需要安装新的核心和支持cgroup即可,k3s已包含安装包containerd、Flannel、CoreDNS,一键安装非常方便,不需要额外安装Docker、Flannel等组件。
k3s四大使用场景如下:
- Edge
- IoT
- CI
- ARM
当然,如果你想学习k8s,而且不想折腾k8s可以使用繁琐的安装部署k3s代替k8s,k3s包含了k8s所有k8s事实上,大多数情况下不使用附加功能。
一 master节点
如快速启动指南所述,您可以使用它https://get.k3s.io基于提供的安装脚本 systemd 和 openrc 安装在系统上 K3s 作为服务。
最简单的命令形式如下:
curl -sfL https://get.k3s.io | sh -
参数
当然还有其他参数,可以找到
--docker # 使用docker 作为runtime --kube-apiserver-arg --feature-gates ServerSideApply=false # 关闭了 ServerSideApply 特点,毕竟不想太多yaml看到一堆 field,它还可以减少磁盘空间和内存的占用 --disable servicelb # 我只有一个树莓派,暂时不需要 lb 了吧 --disable traefik # K3s 使用 1.8 版本,自己部署使用2.x版本 --disable-cloud-controller # 不需要
[root@jettoloader k3s-ansible-master]# k3s server --help | grep disable --etcd-disable-snapshots (db) Disable automatic etcd snapshots --disable value (components) Do not deploy packaged components and delete any deployed components (valid items: coredns, servicelb, traefik, local-storage, metrics-server) --disable-scheduler (components) Disable Kubernetes default scheduler --disable-cloud-controller (components) Disable k3s default cloud controller manager --disable-kube-proxy (components) Disable running kube-proxy --disable-network-policy (components) Disable k3s default network policy controller --disable-helm-controller (components) Disable Helm controller
静态pod路径
[root@localhost metrics-server]# ls /var/lib/rancher/k3s/server/manifests/ ccm.yaml coredns.yaml local-storage.yaml metrics-server rolebindings.yaml traefik.yaml
国内用户可采用以下方法加速安装:
export INSTALL_K3S_SKIP_DOWNLOAD=true export INSTALL_K3S_EXEC="--docker --write-kubeconfig ~/.kube/config --write-kubeconfig-mode 666"
INSTALL_K3S_SKIP_DOWNLOAD=true
不下载效果k3s
可执行文件INSTALL_K3S_EXEC="(略)"
效果为启动k3s
额外参数用于服务--docker
效果为使用docker
而非默认containerd
--write-kubeconfig-mode 666
效果是将配置文件的权限改为非所有者可读可写,从而使kubectl
命令无需root
或sudo
--write-kubeconfig ~/.kube/config
效果是将配置文件写入k8s
默认使用的位置,而不是k3s
默认的位置/etc/rancher/k3s/k3s.yaml
。后者会导致istio
、helm
需要额外设置或无法运行。
虽说 K3s 内核是一个 K8s,但他的整体结构和运行机制都是 rancher 魔改了。K3s 相较于 K8s 其较大的区别如下:
- 存储etcd 使用 嵌入的 sqlite 替换,但可外接 etcd 存储
- apiserver 、schedule 所有其他组件都以过程的形式简化并在节点上运行
- 使用网络插件 Flannel, 使用反向代理入口 traefik 代替 ingress nginx
- 默认使用 local-path-provisioner 提供本地存储卷
在真正使用K3s在此之前,最好先了解一下他的一般结构和操作模式,这里先上他的架构图:
单点
高可用
从架构图中可以看出 K3s 分为两种部署方式:单点测试 和 高可用模式。通过这种比较,可以看出单点测试模式只有一个控制节点(在 K3s 里叫做server node,相当于 K8s 的 master node),而且K3s使用数据存储 sqlite 并内置在控制节点上;高可用模式是扩展 server node 变为3个,需要外部存储(etcd、mysql等),确保集群的高可用性
可见,K8s 所有控制面组件最终以过程的形式运行 server node 上,不再静态pod形式。使用数据库 SQLite ,没有etcd 这么重。也就是说,当我们安装部署好的时候 K3s 后,使用kubectl get po -n kube-system
没有时间 apiserver、scheduler 等控制面的pod了。
Agent 端 kubelet 和 kube proxy 都是进程化的,容器运行时也是由docker 改为 containerd。
server node 和 agent node 通过特殊的代理通道连接。
这种操作机制确实能感觉到 K3s 极大的轻量化 K8s。
默认端需要监控和开放如下
PROTOCOL PORT SOURCE DESCRIPTION
TCP 6443 K3s agent nodes Kubernetes API
UCP 8472 K3s server and agent nodes Required only for Flannel VXLAN
TCP 10250 K3s server and agent nodes kubelet
网络配置 K3s使用Flannel vxlan作为默认的CNI提供容器网络,如果需要修改的话,可以通过如下参数指定:
CLI FLAG AND VALUE DESCRIPTION –flannel-backend=vxlan 使用vxlan(默认). –flannel-backend=ipsec 使用IPSEC后端对网络流量进行加密. –flannel-backend=host-gw 使用host_gw模式. –flannel-backend=wireguard 使用WireGuard后端对网络流量进行加密。 可能需要其他内核模块和配置.如果用独立的CNI可以在安装时指定参数--flannel-backend=none
, 然后单独安装自己的CNI
HA模式部署(外部数据库)
- 部署一个外部数据库
- 启动Server节点 使用外部数据库时需要指定datastore-endpoint,支持MySQL,PostgreSQL,etcd等 使用MySQL数据库
curl -sfL https://get.k3s.io | sh -s - server \
--datastore-endpoint="mysql://username:password@tcp(hostname:3306)/database-name"
使用PG数据库
curl -sfL https://get.k3s.io | sh -s - server \
--datastore-endpoint="postgres://username:password@hostname:port/database-name"
使用etcd数据库
curl -sfL https://get.k3s.io | sh -s - server \
--datastore-endpoint="https://etcd-host-1:2379,https://etcd-host-2:2379,https://etcd-host-3:2379"
对于需要证书认证的可以指定如下参数(或者环境变量) --datastore-cafile K3S_DATASTORE_CAFILE --datastore-certfile K3S_DATASTORE_CERTFILE --datastore-keyfile K3S_DATASTORE_KEYFILE
- 3.配置固定IP(VIP)
K3s Agent注册时需要指定一个K3s Server的URL,对于HA模式,指定任意一个Server的IP都可以,但是建议是使用一个固定的IP(可以使用负载均衡,DNS,VIP)
- 4 启动Agent节点
K3S_TOKEN=SECRET k3s agent --server https://fixed-registration-address:6443
HA模式部署(内置数据库)
这种模式下,Server节点个数必须是奇数个,推荐是三个Server节点 启动第一个Server节点的时候需要携带--cluster-init
参数,以及K3S_TOKEN
K3S_TOKEN=SECRET k3s server --cluster-init
然后在启动其他Server节点
K3S_TOKEN=SECRET k3s server --server https://<ip or hostname of server1>:6443
========================================================
[root@localhost k3s]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='--service-node-port-range=1024-65535 --bind-address=0.0.0.0 --https-listen-port=6443 --cluster-cidr=10.42.0.0/16 --service-cidr=10.43.0.0/16 --cluster-dns=10.43.0.254 --cluster-domain=jettech.com' K3S_NODE_NAME=172.16.10.5 sh -
通过如上只执行了一个命令即部署了一套all in one k3s单节点环境,相对k8s无需额外安装如下组件:
- kubelet
- kube-proxy
- Docker
- etcd
- ingress,如ngnix
当然可以使用k3s agent添加更多的worker node,只需要添加K3S_URL
和K3S_TOKEN
参数即可,其中K3S_URL
为api-server URL,而k3S_TOKEN
为node注册token,保存在master节点的/var/lib/rancher/k3s/server/node-token
路径。
k3s内置了一个kubectl命令行工具,通过k3s kubectl
调用,为了与k8s的kubectl命令一致,可以设置alias别名:
# 该步骤可以省略,在/usr/local/bin中已经添加了一个kubectl软链接到k3s
alias kubectl='k3s kubectl`
# 配置kubectl命令补全
source <(kubectl completion bash)
[root@localhost bin]# kubectl get pod -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-9cf544f65-4p277 1/1 Running 0 22m
coredns-85cb69466-j6xtx 1/1 Running 0 22m
local-path-provisioner-64ffb68fd-5bt6v 1/1 Running 0 22m
helm-install-traefik-crd--1-5hfpf 0/1 Completed 0 22m
helm-install-traefik--1-c42qv 0/1 Completed 1 22m
svclb-traefik-qvsks 2/2 Running 0 19m
traefik-786ff64748-vdn6v 1/1 Running 0 19m
svclb-traefik-ql97k 2/2 Running 0 14m
我们发现并没有运行apiserver、controller-manager、scheduler、kube-proxy以及flannel等组件,因为这些都内嵌到了k3s进程。另外k3s已经给我们默认部署运行了traefik ingress、metrics-server等,不需要再额外安装了。
k3s默认没有使用Docker作为容器运行环境,而是使用了内置的contained,可以使用crictl
子命令与CRI交互。
当然如果习惯使用docker命令行可以设置如下别名:
alias docker='k3s crictl'
# 配置docker命令补全
source <(docker completion)
complete -F _cli_bash_autocomplete docker
当然我们只是使用crictl
模拟了docker
命令,相对真正的docker
我们发现多了ATTEMPT
以及POD ID
,这是CRI所特有的。
解释:INSTALL_K3S_EXEC 命令是传参的,参数可以选用下面的所有,给kube-apiserver-arg,kube-controller-manager和kube-scheduler-arg 传参
OPTIONS:
--config FILE, -c FILE (config) Load configuration from FILE (default: "/etc/rancher/k3s/config.yaml") [$K3S_CONFIG_FILE]
--debug (logging) Turn on debug logs [$K3S_DEBUG]
-v value (logging) Number for the log level verbosity (default: 0)
--vmodule value (logging) Comma-separated list of pattern=N settings for file-filtered logging
--log value, -l value (logging) Log to file
--alsologtostderr (logging) Log to standard error as well as file (if set)
--bind-address value (listener) k3s bind address (default: 0.0.0.0)
--https-listen-port value (listener) HTTPS listen port (default: 6443)
--advertise-address value (listener) IPv4 address that apiserver uses to advertise to members of the cluster (default: node-external-ip/node-ip)
--advertise-port value (listener) Port that apiserver uses to advertise to members of the cluster (default: listen-port) (default: 0)
--tls-san value (listener) Add additional hostnames or IPv4/IPv6 addresses as Subject Alternative Names on the server TLS cert
--data-dir value, -d value (data) Folder to hold state default /var/lib/rancher/k3s or ${HOME}/.rancher/k3s if not root
--cluster-cidr value (networking) IPv4/IPv6 network CIDRs to use for pod IPs (default: 10.42.0.0/16)
--service-cidr value (networking) IPv4/IPv6 network CIDRs to use for service IPs (default: 10.43.0.0/16)
--service-node-port-range value (networking) Port range to reserve for services with NodePort visibility (default: "30000-32767")
--cluster-dns value (networking) IPv4 Cluster IP for coredns service. Should be in your service-cidr range (default: 10.43.0.10)
--cluster-domain value (networking) Cluster Domain (default: "cluster.local")
--flannel-backend value (networking) One of 'none', 'vxlan', 'ipsec', 'host-gw', or 'wireguard' (default: "vxlan")
--token value, -t value (cluster) Shared secret used to join a server or agent to a cluster [$K3S_TOKEN]
--token-file value (cluster) File containing the cluster-secret/token [$K3S_TOKEN_FILE]
--write-kubeconfig value, -o value (client) Write kubeconfig for admin client to this file [$K3S_KUBECONFIG_OUTPUT]
--write-kubeconfig-mode value (client) Write kubeconfig with this mode [$K3S_KUBECONFIG_MODE]
--kube-apiserver-arg value (flags) Customized flag for kube-apiserver process
--etcd-arg value (flags) Customized flag for etcd process
--kube-controller-manager-arg value (flags) Customized flag for kube-controller-manager process
--kube-scheduler-arg value (flags) Customized flag for kube-scheduler process
--kube-cloud-controller-manager-arg value (flags) Customized flag for kube-cloud-controller-manager process
--datastore-endpoint value (db) Specify etcd, Mysql, Postgres, or Sqlite (default) data source name [$K3S_DATASTORE_ENDPOINT]
--datastore-cafile value (db) TLS Certificate Authority file used to secure datastore backend communication [$K3S_DATASTORE_CAFILE]
--datastore-certfile value (db) TLS certification file used to secure datastore backend communication [$K3S_DATASTORE_CERTFILE]
--datastore-keyfile value (db) TLS key file used to secure datastore backend communication [$K3S_DATASTORE_KEYFILE]
--etcd-expose-metrics (db) Expose etcd metrics to client interface. (Default false)
--etcd-disable-snapshots (db) Disable automatic etcd snapshots
--etcd-snapshot-name value (db) Set the base name of etcd snapshots. Default: etcd-snapshot-<unix-timestamp> (default: "etcd-snapshot")
--etcd-snapshot-schedule-cron value (db) Snapshot interval time in cron spec. eg. every 5 hours '* */5 * * *' (default: "0 */12 * * *")
--etcd-snapshot-retention value (db) Number of snapshots to retain (default: 5)
--etcd-snapshot-dir value (db) Directory to save db snapshots. (Default location: ${data-dir}/db/snapshots)
--etcd-s3 (db) Enable backup to S3
--etcd-s3-endpoint value (db) S3 endpoint url (default: "s3.amazonaws.com")
--etcd-s3-endpoint-ca value (db) S3 custom CA cert to connect to S3 endpoint
--etcd-s3-skip-ssl-verify (db) Disables S3 SSL certificate validation
--etcd-s3-access-key value (db) S3 access key [$AWS_ACCESS_KEY_ID]
--etcd-s3-secret-key value (db) S3 secret key [$AWS_SECRET_ACCESS_KEY]
--etcd-s3-bucket value (db) S3 bucket name
--etcd-s3-region value (db) S3 region / bucket location (optional) (default: "us-east-1")
--etcd-s3-folder value (db) S3 folder
--etcd-s3-insecure (db) Disables S3 over HTTPS
--etcd-s3-timeout value (db) S3 timeout (default: 30s)
--default-local-storage-path value (storage) Default local storage path for local provisioner storage class
--disable value (components) Do not deploy packaged components and delete any deployed components (valid items: coredns, servicelb, traefik, local-storage, metrics-server)
--disable-scheduler (components) Disable Kubernetes default scheduler
--disable-cloud-controller (components) Disable k3s default cloud controller manager
--disable-kube-proxy (components) Disable running kube-proxy
--disable-network-policy (components) Disable k3s default network policy controller
--disable-helm-controller (components) Disable Helm controller
--node-name value (agent/node) Node name [$K3S_NODE_NAME]
--with-node-id (agent/node) Append id to node name
--node-label value (agent/node) Registering and starting kubelet with set of labels
--node-taint value (agent/node) Registering kubelet with set of taints
--image-credential-provider-bin-dir value (agent/node) The path to the directory where credential provider plugin binaries are located (default: "/var/lib/rancher/credentialprovider/bin")
--image-credential-provider-config value (agent/node) The path to the credential provider plugin config file (default: "/var/lib/rancher/credentialprovider/config.yaml")
--docker (agent/runtime) Use docker instead of containerd
--container-runtime-endpoint value (agent/runtime) Disable embedded containerd and use alternative CRI implementation
--pause-image value (agent/runtime) Customized pause image for containerd or docker sandbox (default: "rancher/mirrored-pause:3.1")
--snapshotter value (agent/runtime) Override default containerd snapshotter (default: "overlayfs")
--private-registry value (agent/runtime) Private registry configuration file (default: "/etc/rancher/k3s/registries.yaml")
--node-ip value, -i value (agent/networking) IPv4/IPv6 addresses to advertise for node
--node-external-ip value (agent/networking) IPv4/IPv6 external IP addresses to advertise for node
--resolv-conf value (agent/networking) Kubelet resolv.conf file [$K3S_RESOLV_CONF]
--flannel-iface value (agent/networking) Override default flannel interface
--flannel-conf value (agent/networking) Override default flannel config file
--kubelet-arg value (agent/flags) Customized flag for kubelet process
--kube-proxy-arg value (agent/flags) Customized flag for kube-proxy process
--protect-kernel-defaults (agent/node) Kernel tuning behavior. If set, error if kernel tunables are different than kubelet defaults.
--rootless (experimental) Run rootless
--agent-token value (cluster) Shared secret used to join agents to the cluster, but not servers [$K3S_AGENT_TOKEN]
--agent-token-file value (cluster) File containing the agent secret [$K3S_AGENT_TOKEN_FILE]
--server value, -s value (cluster) Server to connect to, used to join a cluster [$K3S_URL]
--cluster-init (cluster) Initialize a new cluster using embedded Etcd [$K3S_CLUSTER_INIT]
--cluster-reset (cluster) Forget all peers and become sole member of a new cluster [$K3S_CLUSTER_RESET]
--cluster-reset-restore-path value (db) Path to snapshot file to be restored
--secrets-encryption (experimental) Enable Secret encryption at rest
--system-default-registry value (image) Private registry to be used for all system images [$K3S_SYSTEM_DEFAULT_REGISTRY]
--selinux (agent/node) Enable SELinux in containerd [$K3S_SELINUX]
--lb-server-port value (agent/node) Local port for supervisor client load-balancer. If the supervisor and apiserver are not colocated an additional port 1 less than this port will also be used for the apiserver client load-balancer. (default: 6444) [$K3S_LB_SERVER_PORT]
--no-flannel (deprecated) use --flannel-backend=none
--no-deploy value (deprecated) Do not deploy packaged components (valid items: coredns, servicelb, traefik, local-storage, metrics-server)
--cluster-secret value (deprecated) use --token [$K3S_CLUSTER_SECRET]
如何使用标志和环境变量
示例 A: K3S_KUBECONFIG_MODE#
允许写入 kubeconfig 文件的选项对于允许将 K3s 集群导入 Rancher 很有用。以下是传递该选项的两种方式。
使用标志 --write-kubeconfig-mode 644
:
[root@localhost k3s]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh - --write-kubeconfig-mode 644
使用环境变量 K3S_KUBECONFIG_MODE
:
$ curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE="644" sh -s -
[root@localhost k3s]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_KUBECONFIG_MODE="644" sh -
示例 B:INSTALL_K3S_EXEC
[root@localhost k3s]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='--service-node-port-range=1024-65535 --bind-address=0.0.0.0 --https-listen-port=6443 --cluster-cidr=10.42.0.0/16 --service-cidr=10.43.0.0/16 --cluster-dns=10.43.0.254 --cluster-domain=jettech.com' K3S_NODE_NAME=172.16.10.5 sh -
示例 C:/etc/rancher/k3s/config.yaml 配置文件方式
除了使用环境变量和 CLI 参数配置 K3s 之外,K3s 还可以使用配置文件。
默认情况下,位于 的 YAML 文件中的值/etc/rancher/k3s/config.yaml
将在安装时使用。
基本server
配置文件的示例如下:
write-kubeconfig-mode: "0644"
tls-san:
- "foo.local"
node-label:
- "foo=bar"
- "something=amazing"
通常,CLI 参数映射到它们各自的 YAML 键,可重复的 CLI 参数表示为 YAML 列表。
下面显示了一个仅使用 CLI 参数的相同配置来演示这一点:
k3s server \
--write-kubeconfig-mode "0644" \
--tls-san "foo.local" \
--node-label "foo=bar" \
--node-label "something=amazing"
也可以同时使用配置文件和 CLI 参数。在这些情况下,值将从两个源加载,但 CLI 参数将优先。对于诸如 之类的可重复参数--node-label
,CLI 参数将覆盖列表中的所有值。
最后,可以通过 cli 参数--config FILE, -c FILE
或环境变量更改配置文件的位置$K3S_CONFIG_FILE
。
Rancher Docs: Installation Options
K3s Server 配置参考 | Rancher文档
二 node节点
[root@localhost k3s]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://172.16.10.5:6443 K3S_TOKEN=K102958f25bdb3fa9df981deaff123d936eb6fd6d96483ca147bee4fbc719bdafa8::server:acab1c0f7d143fe4ff96b311734aba31 K3S_NODE_NAME="172.16.10.15" sh -
三 卸载
/usr/local/bin/k3s-uninstall.sh
[root@localhost bin]# rm -rf /etc/rancher/node/password
[root@localhost bin]# rm -rf /var/lib/rancher/k3s/server/cred/passwd
不是删除/etc/rancher/node/password文件 下次在启动agent和server密码不一致会导致agent注册不成功到server
harbor作为k3s的镜像仓库
K3s 默认的 containerd 配置文件目录为/var/lib/rancher/k3s/agent/etc/containerd/config.toml,但直接操作 containerd 的配置文件去设置镜像仓库或加速器相比于操作 docker 要复杂许多。K3s 为了简化配置 containerd 镜像仓库的复杂度,K3s 会在启动时检查/etc/rancher/k3s/中是否存在 registries.yaml 文件,如果存在该文件,就会根据 registries.yaml 的内容转换为 containerd 的配置并存储到/var/lib/rancher/k3s/agent/etc/containerd/config.toml,从而降低了配置 containerd 镜像仓库的复杂度
[root@localhost k3s]# cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml
[plugins.opt]
path = "/var/lib/rancher/k3s/agent/containerd"
[plugins.cri]
stream_server_address = "127.0.0.1"
stream_server_port = "10010"
enable_selinux = false
sandbox_image = "rancher/mirrored-pause:3.1"
[plugins.cri.containerd]
snapshotter = "overlayfs"
disable_snapshot_annotations = true
[plugins.cri.cni]
bin_dir = "/var/lib/rancher/k3s/data/2e877cf4762c3c7df37cc556de3e08890fbf450914bb3ec042ad4f36b5a2413a/bin"
conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d"
[plugins.cri.containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins.cri.registry.mirrors]
[plugins.cri.registry.mirrors."192.168.99.41"]
endpoint = ["https://192.168.99.41"]
[plugins.cri.registry.mirrors."harbor.jettech.com"]
endpoint = ["https://harbor.jettech.com"]
[plugins.cri.registry.configs."harbor.jettech.com".tls]
ca_file = "/var/lib/rancher/k3s/cacerts.pem"
containerd 使用了类似 k8s 中 与 的概念。svc 可以理解为访问 url,这个 url 会解析到对应的 endpoint 上。也可以理解 配置就是一个反向代理,它把客户端的请求代理到 endpoint 配置的后端镜像仓库。mirror 名称可以随意填写,但是必须符合 IP 或域名
的定义规则。并且可以配置多个 endpoint,默认解析到第一个 endpoint,如果第一个 endpoint 没有返回数据,则自动切换到第二个 endpoint,以此类推。
配置 K3S 仓库镜像,比如以下配置示例:创建
cat >/etc/rancher/k3s/registries.yaml <<EOF
mirrors:
docker.io:
endpoint:
- http://core.harbor.k8s.local
rewrite:
"(^.+\$)": "docker.io/\$1"
quay.io:
endpoint:
- http://core.harbor.k8s.local
rewrite:
"(^.+\$)": "quay.io/\$1"
gcr.io:
endpoint:
- http://core.harbor.k8s.local
rewrite:
"(^.+\$)": "gcr.io/\$1"
k8s.gcr.io:
endpoint:
- http://core.harbor.k8s.local
rewrite:
"(^.+\$)": "k8s.gcr.io/\$1"
EOF
# 注意:\$ 是为了 bash 转义 $ ,如果是手工编辑保存要把转义符 \ 去掉
# 需要重启 k3s server 让设置生效
rc-service k3s restart
# 确认配置已经生效
crictl info
实现的关键在于 rewrite
规则,在镜像名前面加上 harbor 项目名作为前缀,拉取镜像的请求才能被正确的路由。这一点至关重要。使用 Harbor 作为 K3S 的镜像代理缓存后端 - roy2220 - 博客园
值得一提的是 rewrite
特性并不是 containerd 官方版本的特性,由 rancher 魔改版本实现。rancher 给 containerd 提交了 Pull Request,撰写本文的时候还在讨论中,没有明确接受还是拒绝。
mirrors:
"*":
endpoint:
- "http://192.168.50.119"
"192.168.50.119":
endpoint:
- "http://192.168.50.119"
"reg.test.com":
endpoint:
- "http://192.168.50.119"
"docker.io":
endpoint:
- "https://7bezldxe.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
可以通过 crictl pull 192.168.50.119/library/alpine
和 crictl pull reg.test.com/library/alpine
获取到镜像,但镜像都是从同一个后端仓库获取。
注意: 名称也可以设置为 *
, 表示适配任意的仓库名称来获取到镜像,这样配置会出现很多镜像名称,不方便管理,不建议这样配置。
非安全(http)私有仓库配置
配置非安全(http)私有仓库,只需要在 endpoint 中指定 http 地址的后端仓库即可。
- 以
http://192.168.50.119
仓库为例
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"192.168.50.119":
endpoint:
- "http://192.168.50.119"
EOF
systemctl restart k3s
安全(https)私有仓库配置
- 使用授信 ssl 证书
与非安全(http)私有仓库配置类似,只需要配置 endpoint 中指定 https 地址的后端仓库即可。
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"192.168.50.119":
endpoint:
- "https://192.168.50.119"
EOF
systemctl restart k3s
- 使用自签 ssl 证书
如果后端仓库使用的是自签名的 ssl 证书,那么需要配置 CA 证书 用于 ssl 证书的校验。
docs-rancher2/_index.md at master · cnrancher/docs-rancher2 · GitHub
可以配置 Containerd 连接到私有镜像仓库,并使用它们在节点上拉取私有镜像。
启动时,K3s 会检查/etc/rancher/k3s/
中是否存在registries.yaml
文件,并指示 containerd 使用文件中定义的镜像仓库。如果你想使用一个私有的镜像仓库,那么你需要在每个使用镜像仓库的节点上以 root 身份创建这个文件。
请注意,server 节点默认是可以调度的。如果你没有在 server 节点上设置污点,那么将在它们上运行工作负载,请确保在每个 server 节点上创建registries.yaml
文件。
Containerd 中的配置可以用于通过 TLS 连接到私有镜像仓库,也可以与启用验证的镜像仓库连接。下一节将解释registries.yaml
文件,并给出在 K3s 中使用私有镜像仓库配置的不同例子。
该文件由两大部分组成:
- mirrors
- configs
Mirrors
Mirrors 是一个用于定义专用镜像仓库的名称和 endpoint 的指令,例如。
mirrors:
mycustomreg.com:
endpoint:
- "https://mycustomreg.com:5000"
每个 mirror 必须有一个名称和一组 endpoint。当从镜像仓库中拉取镜像时,containerd 会逐一尝试这些 endpoint URL,并使用第一个可用的 endpoint。
Configs
Configs 部分定义了每个 mirror 的 TLS 和证书配置。对于每个 mirror,你可以定义auth
和/或tls
。TLS 部分包括:
指令 | 描述 |
---|---|
cert_file |
用来与镜像仓库进行验证的客户证书路径 |
key_file |
用来验证镜像仓库的客户端密钥路径 |
ca_file |
定义用于验证镜像仓库服务器证书文件的 CA 证书路径 |
insecure_skip_verify |
定义是否应跳过镜像仓库的 TLS 验证的布尔值 |
凭证由用户名/密码或认证 token 组成:
- username: 镜像仓库身份验证的用户名
- password: 镜像仓库身份验证的用户密码
- auth: 镜像仓库 auth 的认证 token
以下是在不同模式下使用私有镜像仓库的基本例子:
使用 TLS
下面的例子展示了当你使用 TLS 时,如何在每个节点上配置/etc/rancher/k3s/registries.yaml
。
有认证
mirrors:
docker.io:
endpoint:
- "https://mycustomreg.com:5000"
configs:
"mycustomreg:5000":
auth:
username: xxxxxx # 这是私有镜像仓库的用户名
password: xxxxxx # 这是私有镜像仓库的密码
tls:
cert_file: # 镜像仓库中使用的cert文件的路径。
key_file: # 镜像仓库中使用的key文件的路径。
ca_file: # 镜像仓库中使用的ca文件的路径。
无认证
mirrors:
docker.io:
endpoint:
- "https://mycustomreg.com:5000"
configs:
"mycustomreg:5000":
tls:
cert_file: # 镜像仓库中使用的cert文件的路径。
key_file: # 镜像仓库中使用的key文件的路径。
ca_file: # 镜像仓库中使用的ca文件的路径。
不使用 TLS
下面的例子展示了当你不使用 TLS 时,如何在每个节点上配置/etc/rancher/k3s/registries.yaml
。
有认证
mirrors:
docker.io:
endpoint:
- "http://mycustomreg.com:5000"
configs:
"mycustomreg:5000":
auth:
username: xxxxxx # 这是私有镜像仓库的用户名
password: xxxxxx # 这是私有镜像仓库的密码
无认证
mirrors:
docker.io:
endpoint:
- "http://mycustomreg.com:5000"
在没有 TLS 通信的情况下,需要为 endpoints 指定
http://
,否则将默认为 https。
为了使镜像仓库更改生效,你需要重新启动每个节点上的 K3s。
添加镜像到私有镜像仓库
首先,从 GitHub 上获取你正在使用的版本的 k3s-images.txt 文件。 从 docker.io 中拉取 k3s-images.txt 文件中列出的 K3s 镜像。
示例: docker pull docker.io/rancher/coredns-coredns:1.6.3
然后,将镜像重新标记成私有镜像仓库。
示例: docker tag coredns-coredns:1.6.3 mycustomreg:5000/coredns-coredns
最后,将镜像推送到私有镜像仓库。
示例: docker push mycustomreg:5000/coredns-coredns
私有仓库
[root@localhost ~]# docker run --name refistry -d -p 5000:5000 -v /opt/registry:/var/lib/registry docker.io/library/registry:latest
或
[root@localhost bin]# k3s ctr images pull docker.io/library/registry:latest
[root@localhost bin]# k3s ctr images ls -q
docker.io/library/registry:latest
docker.io/rancher/klipper-helm:v0.6.6-build20211022
docker.io/rancher/klipper-lb:v0.3.4
docker.io/rancher/local-path-provisioner:v0.0.20
docker.io/rancher/mirrored-coredns-coredns:1.8.4
docker.io/rancher/mirrored-library-busybox:1.32.1
docker.io/rancher/mirrored-library-traefik:2.5.0
docker.io/rancher/mirrored-metrics-server:v0.5.0
docker.io/rancher/mirrored-pause:3.1
通过ctr方式启动容器服务
[root@localhost bin]# k3s ctr run --null-io --net-host -mount type=bind,src=/opt/registry,dst=/var/lib/registry,options=rbind:rw -d docker.io/library/registry:latest jettech-registry
[root@localhost bin]# k3s ctr c ls
CONTAINER IMAGE RUNTIME
jettech-registry docker.io/library/registry:latest io.containerd.runc.v2
tag
[root@localhost bin]# ctr i tag docker.io/rancher/klipper-helm:v0.6.6-build20211022 172.16.10.5:5000/klipper-helm:v0.6.6-build20211022
push
[root@localhost bin]# ctr i push --plain-http 172.16.10.5:5000/klipper-helm:v0.6.6-build20211022
="": 指定额外的容器挂载(例如:type=bind,src=/tmp,dst=/host,options=rbind:ro)
: 为容器启用主机网络
: 运行特权容器
ctr - Linux Man Pages (1)
k3s ctr images 操作
tag:
[root@localhost bin]# k3s ctr i tag docker.io/rancher/klipper-helm:v0.6.6-build20211022 harbor.jettech.com/test/rancher/klipper-helm:v0.6.6-build20211022
push和https:
[root@localhost bin]# k3s ctr images push harbor.jettech.com/test/rancher/klipper-helm:v0.6.6-build20211022
push和http:
[root@localhost bin]# k3s ctr images push --plain-http harbor.jettech.com/test/rancher/klipper-helm:v0.6.6-build20211022
pull和http:
[root@localhost bin]# k3s ctr images pull --plain-http 172.16.10.5:5000/klipper-helm:v0.6.6-build20211022
[root@localhost ~]#cat >> /etc/rancher/k3s/registries.yaml
mirrors:
"192.168.99.41":
endpoint:
- "https://192.168.99.41"
"harbor.jettech.com":
endpoint:
- "https://harbor.jettech.com"
configs:
"harbor.jettech.com":
tls:
ca_file: /var/lib/rancher/k3s/cacerts.pem
#insecure_skip_verify: true
EOF
ca_file: /var/lib/rancher/k3s/cacerts.pem
#insecure_skip_verify: true
二者选其一
注意cacerts.pem 是harbor的ca根证书
- ssl 双向认证
如果镜像仓库配置了双向认证,这个时候 containerd 作为客户端,那么需要为 containerd 配置 ssl 证书用于镜像仓库对 containerd 做认证。
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"harbor.jettech.com":
endpoint:
- "https://harbor.jettech.com"
configs:
"harbor.jettech.com":
auth:
username: admin
password: Harbor12345
tls:
ca_file: /var/lib/rancher/k3s/cakey.pem
cert_file: /var/lib/rancher/k3s/harbor.jettech.com.crt
key_file: /var/lib/rancher/k3s/harbor.jettech.com.key
EOF
systemctl restart k3s
[root@localhost ssl]# cat /var/lib/rancher/k3s/agent/etc/containerd/config.toml
[plugins.opt]
path = "/var/lib/rancher/k3s/agent/containerd"
[plugins.cri]
stream_server_address = "127.0.0.1"
stream_server_port = "10010"
enable_selinux = false
sandbox_image = "rancher/mirrored-pause:3.1"
[plugins.cri.containerd]
snapshotter = "overlayfs"
disable_snapshot_annotations = true
[plugins.cri.cni]
bin_dir = "/var/lib/rancher/k3s/data/2e877cf4762c3c7df37cc556de3e08890fbf450914bb3ec042ad4f36b5a2413a/bin"
conf_dir = "/var/lib/rancher/k3s/agent/etc/cni/net.d"
[plugins.cri.containerd.runtimes.runc]
runtime_type = "io.containerd.runc.v2"
[plugins.cri.registry.mirrors]
[plugins.cri.registry.mirrors."harbor.jettech.com"]
endpoint = ["https://harbor.jettech.com"]
[plugins.cri.registry.configs."harbor.jettech.com".auth]
username = "admin"
password = "Harbor12345"
[plugins.cri.registry.configs."harbor.jettech.com".tls]
ca_file = "/var/lib/rancher/k3s/cakey.pem"
cert_file = "/var/lib/rancher/k3s/harbor.jettech.com.crt"
key_file = "/var/lib/rancher/k3s/harbor.jettech.com.key"
仓库授权认证
对于仓库中的私有项目,需要用户名和密码认证授权才能获取镜像,可以通过添加 configs 来配置用户名和密码。配置仓库认证时,mirror
需要与 configs
匹配。比如,如果配置了一个 mirrors
为 192.168.50.119
,那么在 configs
中也需要配置一个 192.168.50.119
。
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"192.168.50.119":
endpoint:
- "https://192.168.50.119"
configs:
"192.168.50.119":
auth:
username: xxxxxx # this is the registry username
password: xxxxxx # this is the registry password
tls:
cert_file: # path to the cert file used in the registry
key_file: # path to the key file used in the registry
ca_file: # path to the ca file used in the registry
EOF
systemctl restart k3s
配置 containerd 镜像仓库完全攻略-InfoQ
加速器配置
containerd 与 docker 都有默认仓库,并且都为 docker.io
。如果配置中未指定 mirror 为 docker.io
,重启 containerd 后会自动加载 docker.io
配置。与 docker 不同的是,containerd 可以修改 docker.io
对应的 endpoint( 默认为 https://registry-1.docker.io ),而 docker 无法修改。
docker 中可以通过 registry-mirrors
设置镜像加速地址。如果 pull 的镜像不带仓库地址(项目名+镜像名:tag
),则会从默认镜像仓库去拉取镜像。如果配置了镜像加速地址,会先访问镜像加速仓库,如果没有返回数据,再访问默认吧镜像仓库。
containerd 目前没有直接配置镜像加速的功能,因为 containerd 中可以修改 docker.io
对应的 endpoint,所以可以通过修改 endpoint 来实现镜像加速下载。因为 endpoint 是轮训访问,所以可以给 docker.io
配置多个仓库地址来实现 加速地址+默认仓库地址
。如下配置示例:
cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"192.168.50.119":
endpoint:
- "http://192.168.50.119"
"docker.io":
endpoint:
- "https://7bezldxe.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
EOF
systemctl restart k3s
完整配置示例
mirrors:
"192.168.50.119":
endpoint:
- "http://192.168.50.119"
"docker.io":
endpoint:
- "https://7bezldxe.mirror.aliyuncs.com"
- "https://registry-1.docker.io"
configs:
"192.168.50.119":
auth:
username: '' # this is the registry username
password: '' # this is the registry password
tls:
cert_file: '' # path to the cert file used in the registry
key_file: '' # path to the key file used in the registry
ca_file: '' # path to the ca file used in the registry
"docker.io":
auth:
username: '' # this is the registry username
password: '' # this is the registry password
tls:
cert_file: '' # path to the cert file used in the registry
key_file: '' # path to the key file used in the registry
ca_file: '' # path to the ca file used in the registry
如果 docker.io 的 endpoint 对应了带有私有项目的镜像仓库,那么这里需要为 docker.io 添加 auth 配置。
https://rancher.com/docs/k3s/latest/en/installation/private-registry/
案例:nginx busybnox
配置私有仓库地址,认证相关
[root@localhost k3s]# cat /etc/rancher/k3s/registries.yaml
mirrors:
"192.168.99.41":
endpoint:
- "https://192.168.99.41"
"harbor.jettech.com":
endpoint:
- "https://harbor.jettech.com"
configs:
"harbor.jettech.com":
auth:
username: admin
password: Harbor12345
"harbor.jettech.com":
tls:
ca_file: /var/lib/rancher/k3s/cacerts.pem
启动服务
systemctl restart k3s
cacerts.pem是私有镜像库harbor的跟证书
部署应用
[root@localhost k3s]# cat busybox.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: busybox
labels: {name: busybox}
spec:
replicas: 1
selector:
matchLabels: {name: busybox}
template:
metadata:
name: busybox
labels: {name: busybox}
spec:
containers:
- name: busybox
image: harbor.jettech.com/library/busybox:1.28.4
#image: busybox:1.28.4
args:
- /bin/sh
- -c
- sleep 10; touch /tmp/healthy; sleep 30000
readinessProbe: #就绪探针
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 10 #10s之后开始第一次探测
periodSeconds: 5
[root@localhost k3s]# cat nginx.yaml
apiVersion: v1
kind: Service
metadata:
labels: {name: nginx}
name: nginx
spec:
ports:
- {name: t9080, nodePort: 30001, port: 80, protocol: TCP, targetPort: 80}
selector: {name: nginx}
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
labels: {name: nginx}
spec:
replicas: 1
selector:
matchLabels: {name: nginx}
template:
metadata:
name: nginx
labels: {name: nginx}
spec:
containers:
- name: nginx
image: harbor.jettech.com/jettechtools/nginx:1.21.4
#image: nginx:1.21.4
查看服务器启动情况
[root@localhost k3s]# k3s kubectl get all --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/metrics-server-9cf544f65-86k8m 1/1 Running 0 34m
kube-system pod/local-path-provisioner-64ffb68fd-dzqj8 1/1 Running 0 34m
kube-system pod/helm-install-traefik-crd--1-g4wrf 0/1 Completed 0 34m
kube-system pod/helm-install-traefik--1-mbvj6 0/1 Completed 1 34m
kube-system pod/svclb-traefik-zlhkx 2/2 Running 0 33m
kube-system pod/coredns-85cb69466-24fsj 1/1 Running 0 34m
kube-system pod/traefik-786ff64748-pshkv 1/1 Running 0 33m
default pod/busybox-df657bd58-zfkwb 1/1 Running 0 18m
default pod/nginx-56446dcd6d-2qb4k 1/1 Running 0 17m
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 34m
kube-system service/kube-dns ClusterIP 10.43.0.254 <none> 53/UDP,53/TCP,9153/TCP 34m
kube-system service/metrics-server ClusterIP 10.43.77.182 <none> 443/TCP 34m
kube-system service/traefik LoadBalancer 10.43.150.180 172.16.10.5 80:5668/TCP,443:10383/TCP 33m
default service/nginx NodePort 10.43.229.75 <none> 80:30001/TCP 17m
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
kube-system daemonset.apps/svclb-traefik 1 1 1 1 1 <none> 33m
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE
kube-system deployment.apps/metrics-server 1/1 1 1 34m
kube-system deployment.apps/local-path-provisioner 1/1 1 1 34m
kube-system deployment.apps/coredns 1/1 1 1 34m
kube-system deployment.apps/traefik 1/1 1 1 33m
default deployment.apps/busybox 1/1 1 1 18m
default deployment.apps/nginx 1/1 1 1 17m
NAMESPACE NAME DESIRED CURRENT READY AGE
kube-system replicaset.apps/metrics-server-9cf544f65 1 1 1 34m
kube-system replicaset.apps/local-path-provisioner-64ffb68fd 1 1 1 34m
kube-system replicaset.apps/coredns-85cb69466 1 1 1 34m
kube-system replicaset.apps/traefik-786ff64748 1 1 1 33m
default replicaset.apps/busybox-df657bd58 1 1 1 18m
default replicaset.apps/nginx-56446dcd6d 1 1 1 17m
NAMESPACE NAME COMPLETIONS DURATION AGE
kube-system job.batch/helm-install-traefik-crd 1/1 23s 34m
kube-system job.batch/helm-install-traefik 1/1 25s 34m
nslookup:
[root@localhost k3s]# kubectl exec -it pod/busybox-df657bd58-zfkwb sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
/ # nslookup nginx
Server: 10.43.0.254
Address 1: 10.43.0.254 kube-dns.kube-system.svc.jettech.com
Name: nginx
Address 1: 10.43.229.75 nginx.default.svc.jettech.com
/ # nslookup nginx.default.svc.jettech.com
Server: 10.43.0.254
Address 1: 10.43.0.254 kube-dns.kube-system.svc.jettech.com
Name: nginx.default.svc.jettech.com
Address 1: 10.43.229.75 nginx.default.svc.jettech.com
离线安装部署
针对生产环境下的 K3s,一个不可逾越的问题就是离线安装。在你的离线环境需要准备以下 3 个组件:
-
K3s 的安装脚本
-
K3s 的二进制文件
-
K3s 依赖的镜像
以上三个组件都可以通过K3s Release页面(https://github.com/k3s-io/k3s/releases)下载,如果在国内使用,推荐从 http://mirror.cnrancher.com 获得这些组件。
我认为离线安装的重点在于K3s 依赖的镜像部分,因为 K3s 的"安装脚本"和"二进制文件"只需要下载到对应目录,然后赋予相应的权限即可,非常简单。但K3s 依赖的镜像的安装方式取决于你使用的是手动部署镜像还是私有镜像仓库,也取决于容器运行时使用的是containerd还是docker。
针对不同的组合形式,可以分为以下几种形式来实现离线安装:
-
Containerd + 手动部署镜像方式
-
Docker + 手动部署镜像方式
-
Containerd + 私有镜像仓库方式
-
Docker + 私有镜像仓库方式
Containerd + 手动部署镜像方式 假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)、K3s 依赖的镜像(k3s-airgap-images-amd64.tar)下载到了/root目录下。
如果你使用的容器运行时为containerd,在启动 K3s 时,它会检查/var/lib/rancher/k3s/agent/images/是否存在可用的镜像压缩包,如果存在,就将该镜像导入到containerd 镜像列表中。所以我们只需要下载 K3s 依赖的镜像到/var/lib/rancher/k3s/agent/images/目录,然后启动 K3s 即可。
1、导入镜像到 containerd 镜像列表
sudo mkdir -p /var/lib/rancher/k3s/agent/images/
sudo cp /root/k3s-airgap-images-amd64.tar /var/lib/rancher/k3s/agent/images/
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
INSTALL_K3S_SKIP_DOWNLOAD=true /root/k3s-install.sh
[root@localhost bin]# crictl images
IMAGE TAG IMAGE ID SIZE
docker.io/rancher/klipper-helm v0.6.6-build20211022 194c895f8d63f 242MB
docker.io/rancher/klipper-lb v0.3.4 746788bcc27e2 8.48MB
docker.io/rancher/local-path-provisioner v0.0.20 933989e1174c2 35.2MB
docker.io/rancher/mirrored-coredns-coredns 1.8.4 8d147537fb7d1 47.7MB
docker.io/rancher/mirrored-library-busybox 1.32.1 388056c9a6838 1.45MB
docker.io/rancher/mirrored-library-traefik 2.5.0 3c1baa65c3430 98.3MB
docker.io/rancher/mirrored-metrics-server v0.5.0 1c655933b9c56 64.8MB
docker.io/rancher/mirrored-pause 3.1 da86e6ba6ca19 746kB
Docker + 手动部署镜像方式 假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)、K3s 依赖的镜像(k3s-airgap-images-amd64.tar)下载到了/root目录下。
与 containerd 不同,使用 docker 作为容器运行时,启动 K3s 不会导入/var/lib/rancher/k3s/agent/images/目录下的镜像。所以在启动 K3s 之前我们需要将 K3s 依赖的镜像手动导入到 docker 镜像列表中。
sudo docker load -i /root/k3s-airgap-images-amd64.tar
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='--docker' /root/k3s-install.sh
稍等片刻,即可查看到 K3s 已经成功启动:
root@k3s-docker:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
rancher/klipper-helm v0.3.2 4be09ab862d4 7 weeks ago 145MB
rancher/coredns-coredns 1.8.0 296a6d5035e2 2 months ago 42.5MB
rancher/library-busybox 1.31.1 1c35c4412082 7 months ago 1.22MB
rancher/local-path-provisioner v0.0.14 e422121c9c5f 7 months ago 41.7MB
rancher/library-traefik 1.7.19 aa764f7db305 14 months ago 85.7MB
rancher/metrics-server v0.3.6 9dd718864ce6 14 months ago 39.9MB
rancher/klipper-lb v0.1.2 897ce3c5fc8f 19 months ago 6.1MB
rancher/pause 3.1 da86e6ba6ca1 3 years ago 742kB
Containerd + 私有镜像仓库方式 假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)下载到了/root目录下。并且 K3s 所需要的镜像已经上传到了镜像仓库(本例的镜像仓库地址为:http://192.168.64.44:5000)。K3s 所需的镜像列表可以从 K3s Release页面的k3s-images.txt获得。私有镜像仓库配置参考 | Rancher文档
sudo mkdir -p /etc/rancher/k3s
sudo cat >> /etc/rancher/k3s/registries.yaml <<EOF
mirrors:
"docker.io":
endpoint:
- "http://192.168.64.44:5000"
- "https://registry-1.docker.io"
EOF
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
INSTALL_K3S_SKIP_DOWNLOAD=true /root/k3s-install.sh
Docker + 私有镜像仓库方式
假设你已经将同一版本的 K3s 的安装脚本(k3s-install.sh)、K3s 的二进制文件(k3s)下载到了/root目录下。并且 K3s 所需要的镜像已经上传到了镜像仓库(本例的镜像仓库地址为:http://192.168.64.44:5000)。K3s 所需的镜像列表可以从 K3s Release页面的k3s-images.txt获得。k3s-images.txt内容
k3s 版本:v1.22.5+k3s1
docker.io/rancher/klipper-helm:v0.6.6-build20211022
docker.io/rancher/klipper-lb:v0.3.4
docker.io/rancher/local-path-provisioner:v0.0.20
docker.io/rancher/mirrored-coredns-coredns:1.8.4
docker.io/rancher/mirrored-library-busybox:1.32.1
docker.io/rancher/mirrored-library-traefik:2.5.0
docker.io/rancher/mirrored-metrics-server:v0.5.0
docker.io/rancher/mirrored-pause:3.1
1、配置 K3s 镜像仓库
Docker 不支持像 containerd 那样可以通过修改 docker.io 对应的 endpoint(默认为 https://registry-1.docker.io)来间接修改默认镜像仓库的地址。但在Docker中可以通过配置registry-mirrors来实现从其他镜像仓库中获取K3s镜像。这样配置之后,会先从registry-mirrors配置的地址拉取镜像,如果获取不到才会从默认的docker.io获取镜像,从而满足了我们的需求。
cat >> /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["http://192.168.64.44:5000"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo chmod a+x /root/k3s /root/k3s-install.sh
sudo cp /root/k3s /usr/local/bin/
INSTALL_K3S_SKIP_DOWNLOAD=true INSTALL_K3S_EXEC='--docker' /root/k3s-install.sh
后 记 手动部署镜像方式比较适合小规模安装、节点数量不多的场景。私有镜像仓库比较适合规模比较大节点数比较多的集群。本文的docker registry采用的是最简单的搭建方式docker run -d -p 5000:5000 --restart=always --name registry registry:2,可能在你的环境中由于镜像仓库的搭建方式不同,你可能需要修改一些关于registry的参数。
参考资料
K3s离线安装文档:
https://docs.rancher.cn/docs/k3s/installation/airgap/_index/
=========================================================
k3s
是rancher®出品的一个简化、轻量的k8s
,本篇博客记录k3s
的安装及踩的部分坑。 从名字上也能看出,k3s
比k8s
少了些东西,详情可见其官网k3s.io,本地试验可参考官网离线安装教程
首先去其github的releases页下载主可执行文件k3s
、离线安装包k3s-airgap-images-amd64.tar
和安装脚本 我用的是v1.18.6+k3s1
版本,其于2020年7月16日发布。 增加可执行文件和脚本的可执行权限
wget https://get.k3s.io -O install-k3s.sh
chmod +x install-k3s.sh
[root@localhost bin]# cat install-k3s.sh
#!/bin/sh
set -e
set -o noglob
# Usage:
# curl ... | ENV_VAR=... sh -
# or
# ENV_VAR=... ./install.sh
#
# Example:
# Installing a server without traefik:
# curl ... | INSTALL_K3S_EXEC="--disable=traefik" sh -
# Installing an agent to point at a server:
# curl ... | K3S_TOKEN=xxx K3S_URL=https://server-url:6443 sh -
#
# Environment variables:
# - K3S_*
# Environment variables which begin with K3S_ will be preserved for the
# systemd service to use. Setting K3S_URL without explicitly setting
# a systemd exec command will default the command to "agent", and we
# enforce that K3S_TOKEN or K3S_CLUSTER_SECRET is also set.
#
# - INSTALL_K3S_SKIP_DOWNLOAD
# If set to true will not download k3s hash or binary.
#
# - INSTALL_K3S_FORCE_RESTART
# If set to true will always restart the K3s service
#
# - INSTALL_K3S_SYMLINK
# If set to 'skip' will not create symlinks, 'force' will overwrite,
# default will symlink if command does not exist in path.
#
# - INSTALL_K3S_SKIP_ENABLE
# If set to true will not enable or start k3s service.
#
# - INSTALL_K3S_SKIP_START
# If set to true will not start k3s service.
#
# - INSTALL_K3S_VERSION
# Version of k3s to download from github. Will attempt to download from the
# stable channel if not specified.
#
# - INSTALL_K3S_COMMIT
# Commit of k3s to download from temporary cloud storage.
# * (for develo