
K3S是Kubernetes的一个轻量级定制版本,资源占用小,适合嵌入式和其他小型设备使用。
和Kubernetes相比,它的安装部署非常简单,但又具有Kubernetes的大部分功能,扩展性也很不错,是一个比较省心的选择。
安装步骤如下:
1.准备6台主机,其中3台作为server ,3台作为agent。
每台server配置2个CPU、2G内存,每台agent配置2个CPU、1G内存,操作系统debian12 , Kubernetes版本1.28.4。
各个节点的IP地址如下:
主机名 IP
k3s-master1 192.168.234.101
k3s-master2 192.168.234.102
k3s-master3 192.168.234.103
k3s-worker1 192.168.234.111
k3s-worker2 192.168.234.112
k3s-worker3 192.168.234.113
VIP 192.168.234.120
2. 在k3s-master1上安装k3s,运行
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=mytoken sh -s - server \
--cluster-init \
--tls-san=192.168.234.120
其中mytoken是用于节点验证的令牌,根据实际情况修改。
3. 在k3s-master1上安装kube-vip,先运行
apt install jq curl
再运行
curl https://kube-vip.io/manifests/rbac.yaml > /var/lib/rancher/k3s/server/manifests/kube-vip-rbac.yaml
export VIP=192.168.234.120
export INTERFACE=ens33
KVVERSION=$(curl -sL https://api.github.com/repos/kube-vip/kube-vip/releases | jq -r ".[0].name")
alias kube-vip="ctr image pull ghcr.io/kube-vip/kube-vip:$KVVERSION; ctr run --rm --net-host ghcr.io/kube-vip/kube-vip:$KVVERSION vip /kube-vip"
kube-vip manifest daemonset \
--interface $INTERFACE \
--address $VIP \
--inCluster \
--taint \
--controlplane \
--arp \
--leaderElection > /var/lib/rancher/k3s/server/manifests/kube-vip.yaml
完成kube-vip安装,其中ens33是网卡名字,根据实际情况修改。
4. 在k3s-master2、k3s-master3主机上安装k3s,运行
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=mytoken sh -s - server \
--server https://192.168.234.101:6443 \
--tls-san=192.168.234.120
加入集群。
5. 在agent主机上安装k3s,运行
curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_TOKEN=mytoken sh -s - agent --server https://192.168.234.120:6443
加入集群。
6. 运行
kubectl get node
kubectl top node
kubectl get pod -A
检查安装情况,确保所有节点和pod都运行正常。如果发现问题,及时修复解决。
这样,安装就完成了。
接下来,做一个简单测试。
1.部署测试用的pod和service
kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0
kubectl expose deployment hello-server --type LoadBalancer --port 81 --target-port 8080
2.扩展deployment数量
kubectl scale --replicas=6 deployment hello-server
对于K3S来说,server和agent节点都可以用来部署业务,这和Kubernetes是不一样的。
3. 运行
for i in {1..5}; do curl http://192.168.234.111:81; done
K3S的servicelb负载均衡, 端口开放在每一个节点,可以选择任何一个节点访问。
得到类似下面的输出:
Hello, world!
Version: 1.0.0
Hostname: hello-server-5f8d66645-7r6x2
Hello, world!
Version: 1.0.0
Hostname: hello-server-5f8d66645-c6qq6
Hello, world!
Version: 1.0.0
Hostname: hello-server-5f8d66645-4tzg7
Hello, world!
Version: 1.0.0
Hostname: hello-server-5f8d66645-7r6x2
Hello, world!
Version: 1.0.0
Hostname: hello-server-5f8d66645-xm5j5
4. 安装HTTPS证书
请首先完成网站域名的注册,假定使用google domian免费域名,域名为www.mydomain.xyz, 该域名指向每一个节点的IP地址。
先安装acme.sh
curl https://get.acme.sh | sh -s email=youremail@email.com
alias acme.sh=~/.acme.sh/acme.sh
接下来申请证书,运行
export GOOGLEDOMAINS_ACCESS_TOKEN="xxxxxxxxxxxxxxxxxx"
acme.sh --set-default-ca --server letsencrypt
acme.sh --issue --dns dns_googledomains -d www.mydomain.xyz --force
GOOGLEDOMAINS_ACCESS_TOKEN可以在google domain网站的”安全,acme dns API”栏目下生成。
5.生成证书密钥
kubectl create secret tls hwcert --key /root/.acme.sh/www.mydomain.xyz_ecc/www.mydomain.xyz.key --cert /root/.acme.sh/www.mydomain.xyz_ecc/www.mydomain.xyz.cer
6.部署ingress
把下列内容保存到hwingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-www-mydomain-xyz
annotations:
ingressClassName: traefik
namespace: default
spec:
tls:
- hosts:
- www.mydomain.xyz
secretName: hwcert
rules:
- host: www.mydomian.xyz
http:
paths:
- backend:
service:
name: hello-server
port:
number: 81
path: /
pathType: Prefix
执行kubectl apply -f hwingress.yaml生效
7. 用浏览器访问https://www.mydomain.xyz,确认ingress运行正常。
刷新浏览器,可以看到Hostname在不断变化,说明ingress已经把负载分配到了多个节点。
8.接下来,简单测试高可用性。
把server和agent节点各关闭一台。
用kubectl get node命令,看到类似如下输出
NAME STATUS ROLES AGE VERSION
k3s-master1 Ready control-plane,etcd,master 7d v1.28.4+k3s2
k3s-master2 NotReady control-plane,etcd,master 7d v1.28.4+k3s2
k3s-master3 Ready control-plane,etcd,master 7d v1.28.4+k3s2
k3s-worker1 Ready 7d v1.28.4+k3s2
k3s-worker2 NotReady 7d v1.28.4+k3s2
k3s-worker3 Ready 7d v1.28.4+k3s2
运行
for i in {1..5}; do curl http://192.168.234.111:81; done
可以发现,HTTP请求返回正常,但Hostname少了两个。
再用浏览器访问https://www.mydomain.xyz,可以看到响应正常,多次刷新,可以看到Hostname也少了两个。
9. 恢复server和agent节点的运行状态,测试结束。
参考: