k3s安裝與部署


k3s安裝與部署

一、k3s介紹

1.1、什么是k3s

中文網站:http://docs.rancher.cn/docs/k3s/quick-start/_index/

k3s是經過CNCF認證的由Rancher公司開發維護的一個輕量級的 Kubernetes 發行版,內核機制還是和 k8s 一樣,但是剔除了很多外部依賴以及 K8s 的 alpha、beta 特性,同時改變了部署方式和運行方式,目的是輕量化 K8s,簡單來說,K3s 就是閹割版 K8s,消耗資源極少。它主要用於邊緣計算、物聯網等場景。K3s 具有以下特點:

1)安裝簡單,占用資源少,只需要512M內存就可以運行起來;
2)apiserver 、schedule 等組件全部簡化,並以進程的形式運行在節點上,把程序都打包為單個二進制文件,每個程序只需要占用100M內存;
3)使用基於sqlite3的輕量級存儲后端作為默認存儲機制。同時支持使用etcd3、MySQL 和PostgreSQL作為存儲機制;
4)默認使用 local-path-provisioner 提供本地存儲卷;
5)默認安裝了Helm controllerTraefik Ingress controller
6)所有 Kubernetes control-plane 組件的操作都封裝在單個二進制文件和進程中,使 K3s 具有自動化和管理包括證書分發在內的復雜集群操作的能力。
7)減少外部依賴,操作系統只需要安裝較新的內核(centos7.6就可以,不需要升級內核)以及支持cgroup即可,k3s安裝包已經包含了containerd、Flannel、CoreDNS,非常方便地一鍵式安裝,不需要額外安裝Docker、Flannel等組件。

1.2、邊緣計算

image-20210715093926427

1.3、k3s架構

1.3.1、單節點的k3s架構

image-20210715093411379

1)k3s server節點是運行k3s server命令的機器(裸機或者虛擬機),而k3s Agent 節點是運行k3s agent命令的機器。

2)單點架構只有一個控制節點(在 K3s 里叫做server node,相當於 K8s 的 master node),而且K3s的數據存儲使用 sqlite 並內置在了控制節點上

3)在這種配置中,每個 agent 節點都注冊到同一個 server 節點。K3s 用戶可以通過調用server節點上的K3s API來操作Kubernetes資源。

1.3.2、高可用的K3S架構

image-20210715093724991

雖然單節點 k3s 集群可以滿足各種用例,但對於 Kubernetes control-plane 的正常運行至關重要的環境,可以在高可用配置中運行 K3s。一個高可用 K3s 集群由以下幾個部分組成:

1)K3s Server 節點:兩個或者更多的server節點將為 Kubernetes API 提供服務並運行其他 control-plane 服務

2)外部數據庫:外部數據存儲(與單節點 k3s 設置中使用的嵌入式 SQLite 數據存儲相反)

二、k3s部署

2.1、環境規划

集群角色 ip地址 安裝的組件 配置
server節點 192.168.40.180 k3s server 2C2G
agent節點 192.168.40.181 k3s agent 2C2G

2.2、安裝步驟

1)系統初始化

1、配置yum源
2、關掉防火牆
3、關掉selinux
4、修改內核參數
5、關掉swap交換分區

2)安裝containerd

yum install -y yum-utils
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install containerd -y
systemctl start containerd && systemctl enable containerd

3)安裝k3s

# 在k3s server上執行
curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn sh -

image-20210715102319320

4)驗證安裝是否成功

[root@k3s-server ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k3s-server   Ready    control-plane,master   13m   v1.21.2+k3s1
[root@k3s-server ~]# kubectl get pods -n kube-system
NAME                                      READY   STATUS      RESTARTS   AGE
metrics-server-86cbb8457f-bpt5v           1/1     Running     0          13m
coredns-7448499f4d-fsvsd                  1/1     Running     0          13m
local-path-provisioner-5ff76fc89d-xqlq9   1/1     Running     0          13m
helm-install-traefik-crd-k5dcn            0/1     Completed   0          13m
helm-install-traefik-lg4cs                0/1     Completed   0          13m
svclb-traefik-nnlmh                       2/2     Running     0          7m59s
traefik-97b44b794-qlkwx                   1/1     Running     0          8m
[root@k3s-server ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.43.0.1    <none>        443/TCP   14m

5)k3s集群添加work節點

# 提取join token
[root@k3s-server ~]# cat /var/lib/rancher/k3s/server/node-token
K10ea021e6e6ca43973ceeb1ec005ffe5bc4d4e1b5993914081cdc9480826dbaac1::server:ec6135f63a1e4f4447ea8fe42c6508b1

# 在agent上執行
[root@k3s-agent ~]# curl -sfL http://rancher-mirror.cnrancher.com/k3s/k3s-install.sh | INSTALL_K3S_MIRROR=cn K3S_URL=https://192.168.40.180:6443 K3S_TOKEN=K10ea021e6e6ca43973ceeb1ec005ffe5bc4d4e1b5993914081cdc9480826dbaac1::server:ec6135f63a1e4f4447ea8fe42c6508b1 sh -

image-20210715103149849

# 查看
[root@k3s-server ~]# kubectl get nodes
NAME         STATUS   ROLES                  AGE   VERSION
k3s-server   Ready    control-plane,master   21m   v1.21.2+k3s1
k3s-agent    Ready    <none>                 68s   v1.21.2+k3s1

三、k3s部署應用- Guestbook 留言板

image-20210715103301208

1)安裝redis-master

[root@k3s-server ~]# cat redis-master-deployment.yaml 
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: redis-master
  labels:
    app: redis
spec:
  selector:
    matchLabels:
      app: redis
      role: master
      tier: backend
  replicas: 1
  template:
    metadata:
      labels:
        app: redis
        role: master
        tier: backend
    spec:
      containers:
      - name: master
        image: kubeguide/redis-master
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 6379
        
[root@k3s-server ~]# cat redis-master-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: redis-master
  labels:
    app: redis
    role: master
    tier: backend
spec:
  ports:
  - port: 6379
    targetPort: 6379
  selector:
    app: redis
    role: master
    tier: backend
    
# 更新
[root@k3s-server ~]# kubectl apply -f redis-master-deployment.yaml 
[root@k3s-server ~]# kubectl apply -f redis-master-service.yaml

注意:如果已經有離線鏡像包,可用如下方法導入

[root@k3s-agent ~]# ctr images import frontend.tar.gz
[root@k3s-agent ~]# ctr images import redis-master.tar.gz
[root@k3s-agent ~]# ctr images import redis-slave.tar.gz

2)安裝redis-slave

[root@k3s-server ~]# cat redis-slave-deployment.yaml 
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: redis-slave
  labels:
    app: redis
spec:
  selector:
    matchLabels:
      app: redis
      role: slave
      tier: backend
  replicas: 1
  template:
    metadata:
      labels:
        app: redis
        role: slave
        tier: backend
    spec:
      containers:
      - name: slave
        image: kubeguide/guestbook-redis-slave
        imagePullPolicy: IfNotPresent
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 6379

[root@k3s-server ~]# cat redis-slave-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: redis-slave
  labels:
    app: redis
    role: slave
    tier: backend
spec:
  ports:
  - port: 6379
  selector:
    app: redis
    role: slave
    tier: backend
    
[root@k3s-server ~]# kubectl apply -f redis-slave-deployment.yaml 
[root@k3s-server ~]# kubectl apply -f redis-slave-service.yaml
[root@k3s-server ~]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
redis-master-7f9c7745cf-qb8jd   1/1     Running   0          9m9s
redis-slave-66c6dd7c96-v7d48    1/1     Running   0          114s

3)創建frontend

[root@k3s-server ~]# cat frontend-deployment.yaml 
apiVersion: apps/v1 
kind: Deployment
metadata:
  name: frontend
  labels:
    app: guestbook
spec:
  selector:
    matchLabels:
      app: guestbook
      tier: frontend
  replicas: 1
  template:
    metadata:
      labels:
        app: guestbook
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: kubeguide/guestbook-php-frontend
        imagePullPolicy: IfNotPresent
        env:
        - name: GET_HOSTS_FROM
          value: dns
        ports:
        - containerPort: 80

[root@k3s-server ~]# cat frontend-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  type: NodePort 
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30001
  selector:
    app: guestbook
    tier: frontend
    
[root@k3s-server ~]# kubectl apply -f frontend-deployment.yaml 
[root@k3s-server ~]# kubectl apply -f frontend-service.yaml
[root@k3s-server ~]# kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
redis-master-7f9c7745cf-qb8jd   1/1     Running   0          16m
redis-slave-66c6dd7c96-v7d48    1/1     Running   0          9m37s
frontend-cc6c958c7-jddl6        1/1     Running   0          2m56s
[root@k3s-server ~]# kubectl get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes     ClusterIP   10.43.0.1       <none>        443/TCP        42m
redis-master   ClusterIP   10.43.41.230    <none>        6379/TCP       17m
redis-slave    ClusterIP   10.43.220.9     <none>        6379/TCP       9m50s
frontend       NodePort    10.43.147.104   <none>        80:30001/TCP   6m23s

image-20210715105422934

四、k3s卸載

# 在server節點執行如下:
[root@k3s-server ~]# /usr/local/bin/k3s-uninstall.sh

# 在agent節點執行如下:
[root@k3s-agent ~]# /usr/local/bin/k3s-agent-uninstall.sh


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM