Loading

使用 k3s 搭建高可用 k8s 集群 (on Alpine 3)

准备

3台预装 Alpine 3.13 的虚拟/物理机节点,网络互通

TIPS: VirtualBox 可以给虚拟机添加两块网卡,第一块 eth0 设置 host-only 网络方便虚拟机和虚拟机&虚拟机和宿主机互通(不启用 DHCP),第二块 eth1 设置 NAT 网络用于访问外网(启用 DHCP)

配置静态 IP

默认情况下,节点 IP 由 DHCP 动态分配,IP 可能会变更带来不必要的麻烦,编辑 /etc/network/interfaces 设置为静态 IP

node-1

...
iface eth0 inet static
        address 10.0.0.101/24
...

node-2

...
iface eth0 inet static
        address 10.0.0.102/24
...

node-3

...
iface eth0 inet static
        address 10.0.0.103/24
...

保存修改后重启网络

rc-service networking restart

(可选)添加静态hosts记录

cat >>/etc/hosts <<EOF
10.0.0.101 node-1
10.0.0.102 node-2
10.0.0.103 node-3
EOF

(可选)设置 hostname方便识别主机

echo node-1 >/etc/hostname
hostname -F /etc/hostname

(可选)使用阿里云dns避免dns污染

cat >/etc/resolv.conf <<EOF
nameserver 223.5.5.5
nameserver 223.6.6.6
EOF

预下载安装 k3s 需要的资源

apk add curl
mkdir k3s-download

( \
	cd k3s-download; \
	export HTTPS_PROXY=socks5h://<YOUR-PROXY-SERVER>; \
	curl -L https://api.github.com/repos/k3s-io/k3s/releases/latest \
	| sed -E -n 's/.*"browser_download_url": "([^"]+\/(k3s|k3s-airgap-images-amd64\.tar\.gz))".*/\1/p' \
	| xargs -I {} curl -LO -C- {}; \
	curl -Lo install.sh https://get.k3s.io; \
)

ls k3s-download
# 包含3个文件:k3s, k3s-airgap-images-amd64.tar.gz, install.sh

可以只在一个节点下载,其余节点用 scp 拷贝 k3s-download 文件夹

安装 k3s

拷贝 k3s cli 到 /usr/local/bin,并设置可执行属性

install k3s-download/k3s /usr/local/bin/k3s

拷贝 k3s 依赖的镜像包到特定的 images 目录

mkdir -p /var/lib/rancher/k3s/agent/images
cp k3s-download/k3s-airgap-images-amd64.tar.gz /var/lib/rancher/k3s/agent/images

启动 k8s 集群

生成随机 token

head -c12 /dev/urandom | base64

记住这个 token 用于替换后续的 <YOUR-TOKEN>

在 node-1 启动第一个 k3s server

INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_TOKEN=<YOUR-TOKEN> \
sh k3s-download/install.sh server --flannel-backend=host-gw --flannel-iface=eth0 --node-ip 10.0.0.101 --cluster-init

在 node-2 启动第二个 k3s server

INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_TOKEN=<YOUR-TOKEN> \
sh k3s-download/install.sh server --flannel-backend=host-gw --flannel-iface=eth0 --node-ip 10.0.0.102 --server https://10.0.0.101:6443

在 node-3 启动第三个 k3s server

INSTALL_K3S_SKIP_DOWNLOAD=true \
K3S_TOKEN=<YOUR-TOKEN> \
sh k3s-download/install.sh server --flannel-backend=host-gw --flannel-iface=eth0 --node-ip 10.0.0.103 --server https://10.0.0.101:6443

等待 k8s 节点就绪(Ready 状态)

kubectl get nodes
# NAME     STATUS   ROLES                       AGE   VERSION
# node-1   Ready    control-plane,etcd,master   20m   v1.21.0+k3s1
# node-2   Ready    control-plane,etcd,master   18m   v1.21.0+k3s1
# node-3   Ready    control-plane,etcd,master   18m   v1.21.0+k3s1

查看 k8s pods 信息

kubectl get pods -A
# NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
# kube-system   coredns-7448499f4d-td44d                  1/1     Running     0          18m
# kube-system   helm-install-traefik-crd-scj8d            0/1     Completed   0          18m
# kube-system   helm-install-traefik-f6zq7                0/1     Completed   1          18m
# kube-system   local-path-provisioner-5ff76fc89d-4nlgj   1/1     Running     0          18m
# kube-system   metrics-server-86cbb8457f-fckks           1/1     Running     0          18m
# kube-system   svclb-traefik-4jz29                       2/2     Running     0          16m
# kube-system   svclb-traefik-kmcpj                       2/2     Running     0          18m
# kube-system   svclb-traefik-zb7jg                       2/2     Running     0          16m
# kube-system   traefik-97b44b794-l7dvf                   1/1     Running     0          18m

设置 https 代理

2021年如果不使用外网代理,拖取外网镜像会非常遭罪,可以通过环境变量为 k3s 设置 https 代理

cat >>/etc/rancher/k3s/k3s.env <<EOF
HTTPS_PROXY=http://<YOUR-PROXY-SERVER>
NO_PROXY=10.0.0.0/24,10.42.0.0/16,10.43.0.0/16
EOF

# 需要重启 k3s server 让设置生效
rc-service k3s restart

备注:10.0.0.0/24 为 node 的网段,10.42.0.0/16 为 pod ip 的网段,10.43.0.0/16 为 service cluster ip 的网段。

卸载 k3s

k3s-uninstall.sh
posted @ 2021-05-13 21:42  roy2220  阅读(1281)  评论(0编辑  收藏  举报