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节点的运行状态,测试结束。

参考:

https://docs.k3s.io/quick-start

https://kube-vip.io/docs/usage/k3s/

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注