资讯详情

k3s,k9s harbor https

介绍安装选项 | 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命令无需rootsudo
  • --write-kubeconfig ~/.kube/config效果是将配置文件写入k8s默认使用的位置,而不是k3s默认的位置/etc/rancher/k3s/k3s.yaml。后者会导致istiohelm需要额外设置或无法运行。

虽说 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模式部署(外部数据库)

  1. 部署一个外部数据库
  2. 启动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_URLK3S_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/

跳转中...https://link.zhihu.com/?target=https%3A//github.com/containerd/cri/blob/master/docs/registry.md

案例: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的安装及踩的部分坑。 从名字上也能看出,k3sk8s少了些东西,详情可见其官网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

标签: 连接器eins探针deins探针连接器d连接器xf3h

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台