# RKE2安裝 用RKE2安裝一台master、一台worker的k8s叢集。測試過兩種組合 * 兩台都是ubuntu 20.04.5-live-server版(minimal install)。 * 兩台都是RHEL 8.4版 - 已知issue - RHEL 8.4版需要將firewalld停掉 - 若將預設的資料目錄搬移,service rke似乎會起不來,懷疑跟selinux有關,下次安裝會測試關掉selinux看看 ## 準備事項 * 確定所有node的hostname都不同(也可以另外指定node在k8s中的名稱)。 * 若要用[Longhorn](https://staging--longhornio.netlify.app)作為叢集的儲存,相關的磁碟需為EXT4或是XFS格式(longhorn安裝時,可以指定使用的path)。 * 網路需求 https://docs.rke2.io/install/requirements/#networking * For RHEL 8.4: - 目前rke2預設的CNI canal跟Firewalld不合,需將firewalld停掉(`systemctl stop firewalld; systemctl disable firewalld`),參考[Known issues and limitations](https://docs.rke2.io/known_issues/#firewalld-conflicts-with-default-networking) - `vi /etc/selinux/config`: change to `SELINUX=disabled`, then reboot ## 安裝的版本 * Rancher 2.6.8 * K8S 1.22.x (2022 Oct時為v1.22.15) 參考 https://www.suse.com/suse-rancher/support-matrix/all-supported-versions/rancher-v2-6-7/ ## 主要參考 * https://docs.rke2.io/install/quickstart/ * https://docs.ranchermanager.rancher.io/how-to-guides/new-user-guides/kubernetes-cluster-setup/rke2-for-rancher ## 網路需求 若有firewall,需開放的ports (server指的是k8s master nodes, agent指的是k8s worker nodes) * server (port/protocol, source, description) * 9345/tcp, agent, kubernetes api * 6443/tcp, agent, kubernetes api * 10250/tcp, server and agent, kubelet * 2379/tcp, server, etcd client port * 2380/tcp, server, etcd peer port * 30000-32767/tcp, server and agent (or all?), nodeport port range * 8472/udp, server and agent, Canal CNI with VXLAN * 9099/tcp, server and agent, Canal CNI Health checks * client端不需再開port # Add master node 在master上操作。 1. config file 建立config檔範例 ``` mkdir -p /etc/rancher/rke2 cat <<EOF > /etc/rancher/rke2/config.yaml token: tsti-token tls-san: - api.test.com EOF ``` 建立config檔範例(開啟selinux、設定max-pods): ``` mkdir -p /etc/rancher/rke2 cat <<EOF > /etc/rancher/rke2/config.yaml token: tsti-token tls-san: - api.test.com selinux: false kubelet-arg: - "max-pods=220" EOF ``` * `token`:要自己取,等一下其他worker加入到此master時會用到。 * `tls-san`:要將server要聽的hostname(s)加入。 * `selinux`: 安裝rke的script偵測到是RHEL/CentOS系統時,預設會將此選項設為true * `max-pods=220`:在每台node上,pods數量預設上限為110個,若機器資源夠,可將此上限調高 2. rke2 server ``` curl -sfL https://get.rke2.io | INSTALL_RKE2_CHANNEL=v1.22 sh - ``` 3. enable and start ``` systemctl enable rke2-server.service systemctl start rke2-server.service ``` start要等一陣子,可能要十分鐘以上。 4. cluster access 在`~/.bashrc`中增加以下幾行: ``` export PATH=$PATH:/var/lib/rancher/rke2/bin # for ubuntu export PATH=$PATH:/usr/local/bin:/var/lib/rancher/rke2/bin # for RHEL 8.4 export KUBECONFIG=/etc/rancher/rke2/rke2.yaml export CRI_CONFIG_FILE=/var/lib/rancher/rke2/agent/etc/crictl.yaml source <(kubectl completion bash) ``` 然後重新登入。 5. 用以下指令看安裝狀態 ``` tail -f /var/lib/rancher/rke2/agent/containerd/containerd.log crictl ps -a kubectl get node kubectl get pods -A ``` 第一個指令是去看containerd的log、第二個是看container的狀態,第三、第四是看k8s叢集內,node跟pod的狀態 然後等node跟pod都Ready。 > Note: 如果沒有設定bashrc,要打一大段如下: > /var/lib/rancher/rke2/bin/crictl --runtime-endpoint unix:///run/k3s/containerd/containerd.sock ps -a > /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get nodes > /var/lib/rancher/rke2/bin/kubectl --kubeconfig /etc/rancher/rke2/rke2.yaml get pods -A ## 改預設目錄(optional) > Note: 以下步驟在ubuntu測試時沒有問題,但是在RHEL 8.4測試就有問題(k8s可安裝完成,但是安裝cert-manager時會遇到問題),猜想跟開啟了selinux有關係 預設放到`/var/lib/rancher/rke2`,若該磁碟分區空間過小,可以等start好了之後這樣做(比如放到`/data`的掛載點) ``` systemctl stop rke2-server #sh /usr/local/bin/rke2-killall.sh # ubuntu 20.04 rke2-killall.sh # RHEL 8.4 mkdir -p /data/lib/rancher mv /var/lib/rancher/rke2 /data/lib/rancher ln -s /data/lib/rancher/rke2 /var/lib/rancher/rke2 systemctl start rke2-server ``` todo: 先建好目錄`/data/lib/rancher`,將`/var/lib/rancher` link過去,然後`systemctl start rke2-server`,這樣就不用停掉再啟動了,不過不知道安裝script會不會先把目錄清空,得要測試才知道。 # Add agent (worker) 以下在Worker機上操作。 1. config file ``` mkdir -p /etc/rancher/rke2 cat <<EOF > /etc/rancher/rke2/config.yaml token: tsti-token server: https://10.15.22.57:9345 tls-san: - api.test.com EOF ``` 這邊的`token`要跟master的一樣;`server`要設定成master的ip;`tls-san`跟master一樣。 2. rke2 ``` curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" INSTALL_RKE2_CHANNEL=v1.22 sh ``` 若安裝master時用了不同的版本的話,這邊也要改變。 3. enable and start ``` systemctl enable rke2-agent.service systemctl start rke2-agent.service ``` 4. wait and check nodes/pods are added 到master上,用`kubectl get node`確認新節點已經加入並且Ready。 # cluster access 剛剛在add master的過程中,已經在master機上面將kubectl設定好了。 若要在其他台安裝的話(比如bastion機),要在其他台也安裝kubectl(可以直接copy `/var/lib/rancher/rke2/bin/kubectl`到其他台上),然後copy kubeconfig過去(`/etc/rancher/rke2/rke2.yaml`)。要注意:該kubeconfig是cluster admin用的,有最高權限,使用者的可以另外從Rancher介面生出他可以用的kubeconfig。 另外,登入Rancher後也可以從介面上進入到console,在介面的右上角有個圖示是`Kubectl Shell` # Helm安裝 在master上面執行: ``` curl -LO https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz tar zxvf helm-v3.9.4-linux-amd64.tar.gz install linux-amd64/helm /usr/local/bin/helm rm -rf linux-amd64 ``` # Rancher安裝 在master上執行。先裝CertManager,[參考官網](https://docs.ranchermanager.rancher.io/pages-for-subheaders/install-upgrade-on-a-kubernetes-cluster#4-install-cert-manager) ``` kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.7.1/cert-manager.crds.yaml # Add the Jetstack Helm repository helm repo add jetstack https://charts.jetstack.io # Update your local Helm chart repository cache helm repo update # Install the cert-manager Helm chart helm install cert-manager jetstack/cert-manager \ --namespace cert-manager \ --create-namespace \ --version v1.7.1 ``` > Note: 前面步驟若有改預設的目錄的話,這邊用helm安裝cert-manager時會遇到`failed post-install: timed out waiting for the condition`,猜測是`SELinux`造成的,因為不去搬預設的RKE2目錄就可以了。用[kubectl的安裝方式](https://cert-manager.io/docs/installation/kubectl/)雖然可以安裝,但是應該是沒有解決問題。 Wait until pods are ready (`kubectl -n cert-manager get pods`). Install Rancher ``` helm repo add rancher-stable https://releases.rancher.com/server-charts/stable #helm fetch rancher-stable/rancher --version=2.6.8 helm install rancher rancher-stable/rancher \ --namespace cattle-system \ --set hostname=rancher.my.org \ --create-namespace \ --set bootstrapPassword=admin kubectl -n cattle-system rollout status deploy/rancher ``` `helm install`的`hostname`跟`bootstrapPassword`要自行設定。 > Note: 我用的vm所在的主機剛好loading比較重,要等半小時以上才會好,會看到一些`helm`開頭的pod一直沒有Ready,但是放著等一陣子就好了,那些pod會消失。 好了之後,設定dns或是hosts file連到該`hostname`,用瀏覽器連到 rancher.my.org (或其它自己設定的名稱): * Bootstrap Password在helm install時設定的(範例設為`admin`) * 設定password * 匿名資料收集不用勾 * Agree to terms and conditions打勾 # Longhorn 參考:https://staging--longhornio.netlify.app/docs/1.0.2/deploy/install/install-with-rancher/ ubuntu 20.04 server預設已經有需要的套件;RHEL 8.4少了`open-iscsi`,每一台都要安裝: ``` # ubuntu apt-get install open-iscsi # RHEL 8.4 yum install iscsi-initiator-utils ``` 官網有環境檢查的script,執行方法 ``` curl -sSfL https://raw.githubusercontent.com/longhorn/longhorn/master/scripts/environment_check.sh | bash ``` 進入rancher, 點local cluster,左邊選單選`Apps` -> `Charts`,找到`Longhorn`,點`Install` * 選`Default` project,點`Next` * 參數 - `Edit yaml`,在`DefaultSettings`下找到`default-data-path`,輸入適當的值,例如`/data/lib/longhorn` - note: 若之後再到longhorn的UI去改的話,似乎只有新的node可以套用設定 * 選`Install` 下面會出現console,等訊息中有`SUCCESS`字串,以及`kubectl -n longhorn-system get po`都`Ready`就安裝成功;接著可以從另一個console確定`StorageClass`已經有設定,例如: ``` # kubectl get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE longhorn (default) driver.longhorn.io Delete Immediate true 98s ``` 然後可以從Rancher進到longhorn的網頁介面 ![](https://i.imgur.com/Egcy9WR.png) > note: 若不想透過Rancher進入longhorn管理介面,需自行設定loadbalancer或nodeport。安裝時設定(也可以後來再update): > * `Service and Load Balancing`:選`Expose app using Layer 7 Load Balancer`,填入`Hostname`,如`longhorn.my.org`,然後將DNS或是hostfile中加入這個host > * 或是用nodeport,之後用`http://ip:port`的方式連 ## uninstall rke2 from a node 先在master上`kubectl drain nodename`,其中`nodename`是worker node的名字(`kubectl get node`),然後進到該節點上: ``` # ubuntu 20.04 install these scripts in /usr/local/bin # RHEL 8.4 install these scripts in /usr/bin rke2-killall.sh rke2-uninstall.sh ``` 如果叢集不保留的話,應該可以直接所有node上依序執行上面兩個指令。 * (optional)反安裝helm `rm /usr/local/bin/helm` * (optional)longhorn資料處理 * (optional)`.bashrc`裡面自行修改的部分可以刪除 # TODO 有些要測試的 * RHEL 8.4 - 改預設目錄的方法(比如直接mount disk到/var/lib/rancher或是SELinux另外設定?) - 用其他的CNI,然後啟用fireawlld * longhorn各種測試 - snapshot、備份、還原 - 加節點 - ... * etcd備份還原測試 * 啟用logging * 啟用auditing # 其他暫存筆記 ## logs ``` journalctl -f -u rke2-server journalctl -f -u rke2-agent /var/lib/rancher/rke2/agent/containerd/containerd.log /var/lib/rancher/rke2/agent/logs/kubelet.log ``` ## etcd etcdctl endpoint status ``` for etcdpod in $(kubectl -n kube-system get pod -l component=etcd --no-headers -o custom-columns=NAME:.metadata.name); do kubectl -n kube-system exec $etcdpod -- sh -c "ETCDCTL_ENDPOINTS='https://127.0.0.1:2379' ETCDCTL_CACERT='/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt' ETCDCTL_CERT='/var/lib/rancher/rke2/server/tls/etcd/server-client.crt' ETCDCTL_KEY='/var/lib/rancher/rke2/server/tls/etcd/server-client.key' ETCDCTL_API=3 etcdctl endpoint status"; done ``` ## 開啟audit log https://docs.rke2.io/security/hardening_guide/#api-server-audit-configuration 讓apiserver紀錄更多審核request的過程,若開啟audit,會讓apiserver耗費更多cpu、記憶體,而且log量可以到相當多,audit policy要好好設定 note: * 內部元件也會常常丟request到apiserver,這些log也占了很大一部份 * 在一個1.18版的k8s叢集中(非RKE/RKE2),總共三個node、100個pod、幾十個服務,兩天下來有1.1GB的audit log,約八成的verb是`GET`、`WATCH`、`LIST`,兩成是`CREATE`、`DELETE`、`PATCH`、`UPDATE`,不過不同叢集的audit log很難直接比對,跟太多因素相關,如選用了那些k8s元件、k8s元件的版本、啟用的元件(例如,更新服務時,ingress controller會自動去更新configmap將新的endpoint放進來)、服務更新頻率等等都有關