K3S 快速安装体验

#+SETUPFILE: ~/Dropbox/Doc/Org_Templates/level-1.org

k3s是经CNCF一致性认证的Kubernetes发行版,专为物联网及边缘计算设计。架构包含server节点,agent节点。在生产环境中部署,需要部署多server节点保证高可用。这里只是为了快速体验 k3s, 采用单节点 server 和多agent节点的方式。架构如下:

部署前工作

  • 系统更新
  • 网络配置:包括主机名配置,时区配置,软件源等
  • 关闭防火墙,selinux
  • 关闭交换分区

部署server节点

# 1. 先安装配置docker
[root@k3s1 ~]# yum install -y docker-ce
[root@k3s1 ~]# systemctl enable --now docker
# 2. 下载安装 k3s
[root@k3s1 ~]# wget https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
# 2.1 默认 k3s 不适用docker,采用 containerd,这里特别指明采用 docker
# 2.2 使用 INSTALL_K3S_MIRROR=cn 环境变量制定使用国内源加速下载
# 2.3 k3s 自带 lb 插件,这里我们禁用这个插件,后面采用 metallb 的方案
[root@k3s1 ~]# INSTALL_K3S_MIRROR=cn bash k3s-install.sh --docker --disable=traefik
# 3. 查看 k3s 的 token, 后面部署 agent 用到
[root@k3s1 ~]# cat /var/lib/rancher/k3s/server/node-token
K1013f26620ae0297e33b4369b3e634d41a93994787d3f9ca6f3c24dbad8d898ba3::server:eb416ac93cf97f38599d9207ac3d74d6

部署 agent 节点

# 1. 安装配置 docker
[root@k3s2 ~]# yum install -y docker-ce
[root@k3s2 ~]# systemctl enable --now docker
# 2. 下载安装 k3s
[root@k3s2 ~]# wget https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
# 2.1 默认 k3s 不适用docker,采用 containerd,这里特别指明采用 docker
# 2.2 使用 INSTALL_K3S_MIRROR=cn 环境变量制定使用国内源加速下载, SERVER_IP 是server服务器的IP地址,token通过上一步获取
[root@k3s2 ~]# INSTALL_K3S_MIRROR=cn K3S_URL=https://[SERVER_IP]:6443 K3S_TOKEN=[TOKEN] bash k3s-install.sh --docker

测试

部署完成后,在server节点验证集群情况

[root@k3s1 work]# kubectl get nodes
NAME   STATUS     ROLES                  AGE     VERSION
k3s1   Ready      control-plane,master   3m50s   v1.23.6+k3s1
k3s2   NotReady   <none>                 9s      v1.23.6+k3s1

[root@k3s1 work]# kubectl get pods -n kube-system
NAME                                      READY   STATUS              RESTARTS   AGE
helm-install-traefik-zd94v                0/1     ContainerCreating   0          3m50s
helm-install-traefik-crd-9qvk7            0/1     ContainerCreating   0          3m50s
coredns-d76bd69b-kmnwq                    1/1     Running             0          3m50s
local-path-provisioner-6c79684f77-wckqm   1/1     Running             0          3m50s
metrics-server-7cd5fcb6b7-m8ltf           1/1     Running             0          3m50s

部署一个nginx服务验证

[root@k3s1 work]# cat nginx.yaml && echo "==============================" && cat srv.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        ports:
        - containerPort: 80
==============================
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: NodePort
[root@k3s1 work]# kubectl apply -f nginx.yaml
[root@k3s1 work]# kubectl apply -f svc.yaml
[root@k3s1 ~]# kubectl get svc
NAME            TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.43.0.1      <none>        443/TCP        16h
nginx-service   NodePort    10.43.50.167   <none>        80:31574/TCP   3m18s

[root@k3s1 ~]# curl localhost:31574
<!DOCTYPE html>
......
</html>

部署负载均衡

k8s的LoadBalancer类型的Service依赖于外部的云提供的Load Balancer,metallb提供了在私有云或者裸机环境下的负载均衡方案。这里我们也采用 metallb 的方案。

安装 metallb

[root@k3s1 metallb]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/namespace.yaml
[root@k3s1 metallb]# kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.10.2/manifests/metallb.yaml
[root@k3s1 metallb]# kubectl get pods -n metallb-system
NAME                         READY   STATUS    RESTARTS   AGE
controller-f54fbc6f9-ppm96   1/1     Running   0          47s
speaker-g7g8l                1/1     Running   0          48s
speaker-h57p6                1/1     Running   0          48s

配置 metallb

[root@k3s1 metallb]# cat metallb-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  namespace: metallb-system
  name: config
data:
  config: |
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      # 可配置为下列形式或者192.168.1.0/24形式,根据预留的网段具体决定
      # 可配置多个,根据实际情况配置
      - 192.168.137.111-192.168.137.121
[root@k3s1 metallb]# kubectl apply -f metallb-configmap.yaml
configmap/config created

测试

部署一个 lb 的service

[root@k3s1 metallb]# cat lb.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer
[root@k3s1 metallb]# kubectl apply -f metallb-configmap.yaml
configmap/config created

# 这里我手动修改了 pod 里面nginx的内容为他的内网ip地址以便测试
[root@k3s1 metallb]# curl http://192.168.137.111
10.42.1.3
[root@k3s1 metallb]# curl http://192.168.137.111
10.42.0.22

其他

k3s 不支持 docker 的 systemd 的 cgroupdriver, 如果有自定义docker配置,务必不要配置此项

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦