0%

K3S安装

安装基础环境

新装环境

1
2
3
4
5
6
7
8
9
10
# master安装
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn INSTALL_K3S_EXEC='--write-kubeconfig-mode=644 --service-node-port-range=1-65535 --default-local-storage-path=/mnt/storage/k3s' sh -

# 加入其他节点
curl -sfL https://get.k3s.io | K3S_URL=https://<k3s-server-ip>:6443 K3S_TOKEN=<token> |INSTALL_K3S_EXEC='--write-kubeconfig-mode=644 --service-node-port-range=1-65535 --default-local-storage-path=/mnt/storage/k3s' sh -

# --write-kubeconfig-mode=644 设置配置文件权限
# --service-node-port-range=1-65535 解除端口限制,默认30000-32767
# --disable traefik 禁用Traefik Ingress
# --default-local-storage-path=/mnt/storage/k3s # 自定义本地存储(local-path-config)的默认存储路径

其中<k3s-server-ip>是K3s服务器的IP地址,<token>是由K3s服务器生成的唯一令牌。您可以使用以下命令在K3s服务器上获取此令牌:

1
sudo cat /var/lib/rancher/k3s/server/node-token
1
2
# 1.设置 kubeconfig 文件路径用于对 Kubernetes 集群的访问。
echo "export KUBECONFIG=/etc/rancher/k3s/k3s.yaml" >> ~/.bashrc

现有环境修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo systemctl stop k3s.service
vim /etc/systemd/system/k3s.service
# 修改ExecStart
# 原有内容
ExecStart=/usr/local/bin/k3s \
server \
'--write-kubeconfig-mode=644'
# 修改后
ExecStart=/usr/local/bin/k3s \
server \
'--write-kubeconfig-mode=644' \
'--service-node-port-range=1-65535' \
'--default-local-storage-path=/mnt/storage/k3s' \


sudo systemctl daemon-reload
sudo systemctl start k3s.service

安装管理工具Helm

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#安装helm
curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# 或通过包管理器安装
curl https://baltocdn.com/helm/signing.asc | gpg --dearmor | sudo tee /usr/share/keyrings/helm.gpg > /dev/null
sudo apt-get install apt-transport-https --yes
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/helm.gpg] https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

# ubuntu 使用snap安装
sudo snap install helm --classic

# 离线安装
# 下载最新版离线安装包 https://github.com/helm/helm/releases
tar xf helm-v2.11.0-linux-amd64.tar.gz
cp linux-amd64/helm linux-amd64/tiller /usr/local/bin/

常用Helm Charts

Artifact Hub

Bitnami Helm Charts

Microsoft

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 查看集权所有资源
kubectl get all -A -o wide

# 查看指定命名空间
kubectl get all -n {namespace name}

# 查看容器日志
kubectl logs -n {namespace name} pod/{pod name}

# 查看指定命名空间下资源详细信息
kubectl describe -n {namespace name} [service|pod|secret|carificate|...]

# 查看节点相关
kubectl get node --show-labels -o wide

# 重启pod
kubectl rollout restart {pod name} -n

# 伸缩实例数量
kubectl scale deploy whoami --replicas=5

# 查看 k3s 集群配置文件
kubectl cluster-info

## Helm常用命令
# 获取charts的values文件
helm show values bitnami/redis > values.yaml

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 创建2副本的whoami应用,默认1副本
kubectl create deploy whoami --image=traefik/whoami --replicas=2

# 查看部署应用信息
kubectl describe deploy whoami
# 监控Pod状态,通过缩容\扩容可直观看到Pod的调度状态
kubectl get pods --watch

kubectl scale deploy whoami --replicas=5

# 请求链路理解
request public-ip -> node-port -> svc-port -> pod-port -> container

# 发布K3s内网的服务
kubectl expose deploy whoami --port=80

# 查看服务状态
kubectl get svc whoami -owide
kubectl describe svc whoami

# 映射端口到宿主机
# --tareget-port 容器映射端口
# --external-ip 指定公网IP
# --prot 集群内暴露端口
# --node-port type=NodePort时提供给集群外访问的端口
kubectl expose deploy whoami --type=LoadBalancer --port=80 --external-ip <PUBLIC_IP>

# 清空测试
kubectl delete all --all

配置国内源(私有镜像库)

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 镜像仓库的复杂度。

K3s 镜像仓库配置文件由两大部分组成:mirrors 和 configs:

  • Mirrors 是一个用于定义专用镜像仓库的名称和 endpoint 的指令
  • Configs 部分定义了每个 mirror 的 TLS 和证书配置。对于每个 mirror,你可以定义 auth 和/或 tls

containerd 使用了类似 K8S 中 svc 与 endpoint 的概念,svc 可以理解为访问名称,这个名称会解析到对应的 endpoint 上。也可以理解 mirror 配置就是一个反向代理,它把客户端的请求代理到 endpoint 配置的后端镜像仓库。mirror 名称可以随意填写,但是必须符合 IP 或域名的定义规则。并且可以配置多个 endpoint,默认解析到第一个 endpoint,如果第一个 endpoint 没有返回数据,则自动切换到第二个 endpoint,以此类推。

1
2
3
4
5
6
7
8
9
10
11
12
mirrors:
"172.31.6.200:5000":
endpoint:
- "http://172.31.6.200:5000"
"rancher.ksd.top:5000":
endpoint:
- "http://172.31.6.200:5000"
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"

非安全(http)私有仓库配置

配置非安全(http)私有仓库,只需要在 endpoint 中指定 http 协议头的地址即可。

在没有 TLS 通信的情况下,需要为 endpoints 指定 http://,否则将默认为 https。

无认证
1
2
3
4
mirrors:
"172.31.6.200:5000":
endpoint:
- "http://172.31.6.200:5000"
有认证
1
2
3
4
5
6
7
8
9
mirrors:
"35.182.134.80":
endpoint:
- "http://35.182.134.80"
configs:
"35.182.134.80":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password

安全(https)私有仓库配置

使用授信 ssl 证书
1
2
3
4
5
6
7
8
9
mirrors:
"harbor.kingsd.top":
endpoint:
- "https://harbor.kingsd.top"
configs:
"harbor.kingsd.top":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password
使用自签 ssl 证书

如果后端仓库使用的是自签名的 ssl 证书,那么需要配置 CA 证书 用于 ssl 证书的校验。

1
2
3
4
5
6
7
8
9
10
11
mirrors:
"harbor-ksd.kingsd.top":
endpoint:
- "https://harbor-ksd.kingsd.top"
configs:
"harbor-ksd.kingsd.top":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password
tls:
ca_file: /opt/certs/ca.crt
ssl 双向认证

如果镜像仓库配置了双向认证,那么需要为 containerd 配置 ssl 证书用于 镜像仓库对 containerd 做认证。

1
2
3
4
5
6
7
8
9
10
11
12
13
mirrors:
"harbor-ksd.kingsd.top":
endpoint:
- "https://harbor-ksd.kingsd.top"
configs:
"harbor-ksd.kingsd.top":
auth:
username: admin # this is the registry username
password: Harbor12345 # this is the registry password
tls:
ca_file: /opt/certs/ca.crt # path to the ca file used in the registry
cert_file: /opt/certs/harbor-ksd.kingsd.top.cert # path to the cert file used in the registry
key_file: /opt/certs/harbor-ksd.kingsd.top.key # path to the key file used in the registry

加速器配置

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 配置多个仓库地址来实现 加速地址+默认仓库地址。如下配置示例:

1
2
3
4
5
mirrors:
"docker.io":
endpoint:
- "https://fogjl973.mirror.aliyuncs.com"
- "https://registry-1.docker.io"

参考

Kubernetes 入门到实践:搭建 K3s 集群初体验 - 知乎 (zhihu.com)

离线安装Air-Gap Install | K3s