虚拟机搭建k3s多节点

  • 节点服务器安装

# 所有的用户名和密码
user01
123456

# 创建节点,不要用下划线
nodemaster
# 然后克隆出
node01
node02

# 内网测试需要这一步: 统一设置host,实体机最好也设置
networking.hosts={
  "192.168.122.48" = [ "nodemaster" ];
  "192.168.122.47" = [ "node01" ];
  "192.168.122.46" = [ "node02" ];
};

# 编辑和生效
sudo vi /etc/nixos/configuration.nix
sudo nixos-rebuild switch --option substituters "https://mirror.nju.edu.cn/nix-channels/store/" --show-trace
# 测试是否可以ping
ping nodemaster
ping node01
ping node02
  • 软件安装

# nodemaster安装k3s
ssh user01@nodemaster

services.k3s.enable=true;
services.k3s.role="server";
services.k3s.extraFlags="--node-name nodemaster";

# 检查报错
systemctl status k3s.service
sudo k3s kubectl get node
# master起来之后就直接安装 kube-dashboard
sudo k3s kubectl port-forward -n kubernetes-dashboard --address 0.0.0.0 service/kubernetes-dashboard 8080:443
# https://nodemaster:8080/#/login

# 最后配置节点 sudo cat /var/lib/rancher/k3s/server/node-token
services.k3s.enable=true;
services.k3s.role="agent";
services.k3s.extraFlags="--node-name node01";
services.k3s.token="K107af8350ca00739a455638dbe5acb190d6917a19f63e06dee591713edd13a43d6::server:27115c1e1d5473aaf61d2860b0f8a018";
services.k3s.serverAddr="https://nodemaster:6443";


# 查看节点
sudo k3s kubectl get node
# NAME         STATUS   ROLES                  AGE     VERSION
# node01       Ready    <none>                 3m59s   v1.23.10+k3s1
# nodemaster   Ready    control-plane,master   168m    v1.23.10+k3s1
# node02       Ready    <none>                 118s    v1.23.10+k3s1

sudo ls -lh /var/lib/libvirt/images/                                                                         1 # 总用量 24G
# -rw------- 1 root root 2.6G 11月 14 20:18 nixos-node01.qcow2
# -rw------- 1 root root 2.7G 11月 14 20:18 nixos-node02.qcow2
# -rw------- 1 root root  21G 11月 14 20:20 nixos.qcow2
# 如果内网测试ingress不能获取ADDRESS(ingress也配上域名)
# 在Service的ports同级增加externalIPs指定为 内网ip/外网ip
externalIPs:
  - 192.168.122.48
# 生效之后即使ADDRESS为空现在也可以访问 http://nodemaster/

# 在svc中:
# 通过CLUSTER-IP(对内)/EXTERNAL-IP(都兼容)都可以访问对应的服务
  • kubectl使用配置文件

# 优先级最高
sudo kubectl --kubeconfig=/etc/rancher/k3s/k3s.yaml get pods
# 优先级中
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
# 优先级低,但是可以不需要使用sudo
sudo cp /etc/rancher/k3s/k3s.yaml /home/jcleng/.kube/config
sudo chown jcleng /home/jcleng/.kube/config
kubectl get pods
  • 80端口进行暴露服务

# A.traefik+Ingress: 默认的80端口被traefik服务占用了,类型是LoadBalancer,接管了80和443的入口,可以直接使用 kind: Ingress 进行部署
kubectl get service --all-namespaces
# NAMESPACE     NAME               TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
# default       kubernetes         ClusterIP      10.43.0.1       <none>        443/TCP                      66m
# kube-system   kube-dns           ClusterIP      10.43.0.10      <none>        53/UDP,53/TCP,9153/TCP       66m
# kube-system   metrics-server     ClusterIP      10.43.67.252    <none>        443/TCP                      66m
# kube-system   traefik            LoadBalancer   10.43.237.166   192.168.0.7   80:32733/TCP,443:30316/TCP   64m
# default       service-testhold   NodePort       10.43.48.89     <none>        9501:80/TCP                  40m

# B.Ingressnginx+Ingress,自行安装Ingressnginx

# C.NodePort+nginx/caddy 自行操作入口进行负载均衡
  • C.自己配置caddy作为应用入口,替代traefik+ingress-nginx

www.leng2011.icu:443 {
  reverse_proxy * {
    to http://127.0.0.1:20826
  }
  tls /home/jcleng/www.leng2011.icu_bundle.crt /home/jcleng/www.leng2011.icu.key
}
www.leng2011.icu:80 {
  redir https://www.leng2011.icu
}

# sudo caddy run -config ./Caddyfile
# 需要备案成功即可访问

# 实际测试如果LoadBalancer/caddy入口加了ssl,ingress就可以不加ssl即可
  • 检查k3s默认启动时的基础服务

sudo k3s crictl images
# IMAGE                                        TAG                    IMAGE ID            SIZE
# docker.io/rancher/klipper-helm               v0.7.3-build20220613   38b3b9ad736af       83MB
# docker.io/rancher/klipper-lb                 v0.3.5                 dbd43b6716a08       3.33MB
# docker.io/rancher/local-path-provisioner     v0.0.21                fb9b574e03c34       11.4MB
# docker.io/rancher/mirrored-coredns-coredns   1.9.1                  99376d8f35e0a       14.1MB
# docker.io/rancher/mirrored-library-traefik   2.9.1                  e6de8578b2384       33.4MB
# docker.io/rancher/mirrored-metrics-server    v0.6.1                 e57a417f15d36       28.1MB
# docker.io/rancher/mirrored-pause             3.6                    6270bb605e12e       301kB

sudo k3s crictl ps
# CONTAINER           IMAGE               CREATED             STATE               NAME                     ATTEMPT             POD ID              POD
# 304fd62642a58       e6de8578b2384       11 hours ago        Running             traefik                  0                   7db66edaf6b6f       traefik-9c6dc6686-dztj7
# 917af9586a598       dbd43b6716a08       11 hours ago        Running             lb-tcp-443               0                   910ab3a0a8740       svclb-traefik-541f40a6-65lnc
# aa83ed171c590       dbd43b6716a08       11 hours ago        Running             lb-tcp-80                0                   910ab3a0a8740       svclb-traefik-541f40a6-65lnc
# 316cc247cb033       e57a417f15d36       11 hours ago        Running             metrics-server           0                   d57ecb95239a8       metrics-server-5c8978b444-hctsb
# 534a443df85b5       99376d8f35e0a       11 hours ago        Running             coredns                  0                   058b64e247624       coredns-75fc8f8fff-4wpzr
# 64778137d1346       fb9b574e03c34       11 hours ago        Running             local-path-provisioner   0                   e7aff696ab4d7       local-path-provisioner-5b5579c644-jtj4x

# 通过ctr修改镜像tag
ctr --namespace=k8s.io image tag docker.io/library/httpd:latest k8s.gcr.io/httpd:latest
nerdctl -n k8s.io tag docker.io/library/httpd:latest k8s.gcr.io/httpd:latest
  • 重启服务

kubectl -n kube-system rollout status deployments/traefik
  • 关于traefik,默认自带可以直接使用(LoadBalancer)

kubectl -n kube-system get svc

#NAME             TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                      AGE
#kube-dns         ClusterIP      10.43.0.10      <none>           53/UDP,53/TCP,9153/TCP       3d23h
#metrics-server   ClusterIP      10.43.250.225   <none>           443/TCP                      3d23h
#traefik          LoadBalancer   10.43.29.240    172.23.186.253   80:32528/TCP,443:30364/TCP   150m


# 主ingress,默认是traefik,不加ingressClassName
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: stable
spec:
  # ingressClassName: traefik
  rules:
    - host: test.leng2011.icu
      http:
        paths:
          - backend:
              service:
                name: service-testhold
                port:
                  number: 80
            path: /
            pathType: Prefix