天天看點

一鍵部署k8s多、單叢集指令(波哥親測有效)

一鍵部署k8s多、單叢集指令(波哥親測有效)
項目位址: https://github.com/fanux/sealos
參考位址: https://fuckcloudnative.io/posts/sealos/
https://www.sealyun.com/goodsDetail?type=cloud_kernel&name=kubernetes
官方教程: https://www.sealyun.com/instructions/2      

安裝前提條件(k8s官方不支援Rhel8系列)

!!!!高能警告:Rhel8,Centos8和Rocky8預裝了podman和nftables,而nftables和kube-proxy不相容,Rhel8系列安裝k8s不能正常工作.建議使用Centos7(更新核心到5.4以上) 或Ubuntu.

issue提了快2年了,我看估計是沒戲了。https://github.com/kubernetes/kubernetes/pull/97070

高版本離線包自帶docker/containerd,如沒安裝docker/containerd會自動安裝.1.22版本以上強制安裝containerd,要求解除安裝docker.

安裝前的注意事項

Linux系統配置好主機名和IP位址,主機間配置ssh免密登入,無需更多配置

下載下傳kubernetes 離線安裝包.

下載下傳最新版本sealos.

務必同步伺服器時間

主機名不可重複

master節點CPU必須2C以上

請使用sealos 3.2.0以上版本

網卡名稱如果是不常見的,建議修改成規範的網卡名稱, 如(eth.|en.|em.*)

cni元件選擇cilium時要求核心版本不低于5.4

podSubnet: 100.64.0.0/10

serviceSubnet: 10.96.0.0/12

繼10.0.0.0/8、172.16.0.12、192.168.0.0/16之後又誕生了第四個私有IPv4位址,但100.64.0.0/10是在服務商網絡内,不同之處在于隻使用。

100.64.0.0/10,Shared address space,是預留給ISP營運商做NAT用的。ISP營運商裝置給使用者配置設定100.64.0.0/10内的IP,然後再在營運商裝置上進行NAT,轉換成公網IP。

一鍵部署k8s多、單叢集指令(波哥親測有效)

快速二進制包安裝k8s高可用叢集

不要指定網卡參數 --network,會導緻cni啟動不了

生産環境隻建議安裝次新版!!!

下載下傳并安裝sealos, sealos是個golang的二進制工具,直接下載下傳拷貝到bin目錄即可, release頁面也可下載下傳
wget -c https://sealyun-home.oss-cn-beijing.aliyuncs.com/sealos/latest/sealos && \
    chmod +x sealos && mv sealos /usr/bin      
下載下傳離線資源包
wget -c https://sealyun.oss-cn-beijing.aliyuncs.com/05a3db657821277f5f3b92d834bbaf98-v1.22.0/kube1.22.0.tar.gz      

安裝一個三master的kubernetes叢集

##### 如已設ssh免密登入可以不需要--passwd參數
##### --podcidr 配置pod網段
##### --svccidr 配置clusterip網段
##### --network  機器網卡名,CNI網卡發現用

sealos init --master 192.168.32.200 --master 192.168.32.202 --node 192.168.32.221 --pkg-url /root/kube1.22.7.tar.gz --version v1.22.7 --podcidr 10.244.0.0/16 --svccidr 10.93.0.0/12      

安裝單master的k8s叢集

sealos init \
    --master 192.168.0.2 \
    --node 192.168.0.12 \
    --pkg-url /root/kube1.22.0.tar.gz \
    --version v1.22.0      

安裝日志

安裝日志所在位置~/.sealos/sealos.log

自定義網絡

pod的ip位址段,也稱為cidr

podcidr 參數指定自定義pod網段 如 

--podcidr 10.244.0.0/16 \

#### svccidr 參數指定clusterip網段 如 

--svccidr 10.93.0.0/12 \

#### 不安裝cni插件
without-cni sealos自帶calico網絡,如果你想自己裝CNI不用預設可加此參數, 如 

sealos init --without-cni …

#### 自定義cni插件

-- network flannel      

添加證書

#需要添加證書, 在init的時候指定--cert-sans 域名即可
#證書有效期是99年

sealos init --cert-sans 域名 \
    --master 192.168.0.2 \
    --node 192.168.0.12 \
    --pkg-url /root/kube1.22.0.tar.gz \
    --version v1.22.0
    --podcidr 10.244.0.0/16 \
    --svccidr 10.93.0.0/12 \      

參數注釋

詳細參數: https://www.sealyun.com/instructions/2

一鍵部署k8s多、單叢集指令(波哥親測有效)

節點操作

增加master

sealos join --master 192.168.0.6 --master 192.168.0.7
sealos join --master 192.168.0.6-192.168.0.9  # 或者多個連續IP      

增加node

sealos join --node 192.168.0.6 --node 192.168.0.7
sealos join --node 192.168.0.6-192.168.0.9  # 或者多個連續IP      

删除指定master節點

sealos clean --master 192.168.0.6 --master 192.168.0.7
sealos clean --master 192.168.0.6-192.168.0.9  # 或者多個連續IP      

删除指定node節點

sealos clean --node 192.168.0.6 --node 192.168.0.7
sealos clean --node 192.168.0.6-192.168.0.9  # 或者多個連續IP      

清理叢集

#注意clean不加任何參數會清理整個叢集,等同于sealos clean --all
sealos clean --all      

備份叢集

# 檢視備份幫助
sealos etcd save -h


##本地備份

#本地備份, 預設儲存在/opt/sealos/ectd-backup這個目錄, 預設名稱為sanpshot
sealos etcd save

#本地備份并複制到各master節點。增加--docker參數, 預設在生成的檔案下添加目前的uinx時間戳
#然後複制到各master節點

sealos etcd save --docker

####備份上傳到阿裡雲oss

備份上傳至oss,首次執行帶指令行或者編輯~/.sealos/config.yaml

sealos etcd save --docker \
    --aliId youraliyunkeyid \
    --aliKey youraliyunkeysecrets \
    --ep oss-cn-hangzhou.aliyuncs.com  \
    --bucket etcdbackup  \
    --objectPath /sealos/       

更新k8s版本

參考: https://www.sealyun.com/instructions/5

#更新前注意事項:
#確定叢集是健康狀态

kubectl get nodes -owid

#確定kube-system下的pod運作正常

kubectl get pod -n kube-system -owide


#執行更新
#版本必須要大于等于1.18.0,才可更新
#執行更新前提前下載下傳好新版本的離線安裝包

# 更新到1.19.2版本
sealos upgrade --version v1.19.2 --pkg-url /root/kube1.19.2.tar.gz -f | tee -a upgrade.1183-1192.log       

containerd鏡像和容器管理

nerdctl用法參考: https://mdnice.com/writing/c57c45c557bf46b0835958134892abc4官方工具是crictl,但是更推薦使用nerdctl.和docker官方文法幾乎完全一緻.
也可以使用alias将nerdctl設别名為docker.

# nerdctl要加上-n=k8s.io
nerdctl -n=k8s.io images

# 配置nerdctl自動補全
source <(nerdctl completion bash)
echo 'source <(nerdctl completion bash)' >>~/.bashrc

# 設定alias别名為docker
echo "alias docker='nerdctl -n=k8s.io'" >>~/.bashrc
source .bashrc


使用nerdctl打包docker鏡像
參考: https://mp.weixin.qq.com/s/Bjn0s5qRh2H9I__mAYh4jg


nerdctl使用方法
參考: https://mp.weixin.qq.com/s/vs_XIn-cpEXtWoF8Yb9vRw


containerd配置代理
老是替換源太麻煩了,直接上代理


# 建立/etc/systemd/system/containerd.service.d目錄
mkdir /etc/systemd/system/containerd.service.d

# 配置代理
cat > /etc/systemd/system/containerd.service.d/proxy.conf << EOF
> [Service] 
> Environment="HTTP_PROXY=socks5://127.0.0.1:1080" 
> Environment="HTTPS_PROXY=socks5://127.0.0.1:1080"  "NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8,docker-registry.somecorporation.com,isdp30x2.mirror.aliyuncs.com,hub-mirror.c.163.com,mirror.baidubce.com"'
> EOF

# 重新開機containerd服務
systemctl daemon-reload
systemctl restart containerd

# 檢視配置的代理
systemctl show --property=Environment containerd.service       

containerd配置代理ansible劇本

---
- hosts: all
  tasks:
    - name: 建立containerd.service.d目錄
      file:
        path: /etc/systemd/system/containerd.service.d
        state: directory

    - name: 建立proxy.conf檔案
      file:
        path: /etc/systemd/system/containerd.service.d/proxy.conf
        state: touch

    - name: 為http_proxy.conf檔案添加配置資訊
      copy:
        content: |
          [Service]
          Environment="HTTP_PROXY=socks5://127.0.0.1:1080" 
          Environment="HTTPS_PROXY=socks5://127.0.0.1:1080"  "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com,isdp30x2.mirror.aliyuncs.com,hub-mirror.c.163.com,mirror.baidubce.com"
        dest: /etc/systemd/system/containerd.service.d/proxy.conf
      notify: 重新開機containerd服務

  handlers:
    - name: 重新開機containerd服務
      systemd:
        state: restarted
        daemon_reload: yes
        name: containerd      

格式整理:IT運維技術圈