雖遲但到,k8s硬核技術(shù),了解下?

前言
最近一周,一直在搗鼓基于wsl2搭建k8s集群的問題,試了好久才終于把集群環(huán)境搞好,然后又花了兩天時(shí)間,才搞清楚服務(wù)如何訪問,感覺這應(yīng)該是我工作以來,摸索問題最久的一次了,這兩天更是肝到一點(diǎn)(忙起來,感覺時(shí)間過的好快),這執(zhí)著的精神是值得肯定,但是也說明我確實(shí)對(duì)k8s的認(rèn)知還處在初學(xué)階段,未來可能還有好多坑要踩,不過能走出這第一步,我覺得未來的困難也會(huì)被我踩在腳下的。
通過昨天晚上和今天集群的創(chuàng)建,我發(fā)現(xiàn)k8s集群創(chuàng)建這塊的經(jīng)驗(yàn)和思路已經(jīng)很成熟了,所以就想趁著這股熱勁,把自己的經(jīng)驗(yàn)分享下,供大家參考,為了搞清楚k8s,連ubuntu我都安裝了好幾個(gè):

今天我們演示內(nèi)容是基于ubuntu 20.04展開的,內(nèi)容有點(diǎn)多,我們直接開始正文吧。
正文
啟用wsl
關(guān)于wsl的啟用,我們上次(前天)已經(jīng)分享過了,不清楚的小伙伴爬樓看下,后期考慮把這一塊的內(nèi)容再細(xì)化下。暫時(shí)可以參考微軟官方文檔:
https://docs.microsoft.com/zh-cn/windows/wsl/
啟用成功后,打開我們的wsl:

后期,我們分享如何美化這里的終端窗口。
配置系統(tǒng)
修改系統(tǒng)更新源
經(jīng)常使用Linux的小伙伴應(yīng)該知道,我們?cè)诎惭b完Linux第一步都是修改更新源。所以wsl安裝完成后,我們首先也是要修改系統(tǒng)更新源的地址,官方默認(rèn)地址國內(nèi)更新比較慢,我們改成阿里巴巴的鏡像地址,就快多了。
我們要把如下地址添加到/etc/apt/sources.list文件中,并將原來的地址注釋掉:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
編輯命令我們直接用vim,默認(rèn)已經(jīng)安裝好了:
sudo vim /etc/apt/sources.list
這里用sudo是因?yàn)楫?dāng)前用戶不是root賬戶,如果登錄的是root賬戶,就不需要加sudo,不過加了也不影響,下面的命令也是一樣的,后面就不再說明了,#表示注釋該行數(shù)據(jù)。

修改完鏡像后,我們通過如下命令更新下系統(tǒng):
sudo apt update & sudo apt upgrade
前面的命令是更新軟件列表,后面的命令是安裝更新,也可以分開執(zhí)行(感覺我說的好細(xì)呀),然后靜靜等待更新完成:


daemonize安裝配置
安裝daemonize是為了讓我們的wsl支持systemctl命令,然后激活Systemd,這些命令在后面啟動(dòng)docker服務(wù)、創(chuàng)建集群的時(shí)候都要用到。
安裝命令也很簡單(我一直覺得linux安裝軟件比windows方便,一行命令就完成安裝,它不香嗎):
sudo apt install daemonize #第二種方式執(zhí)行
sudo apt install -yqq fontconfig daemonize # 第一種方式需要執(zhí)行
因?yàn)槲乙呀?jīng)安裝過了,顯示得可能和你不一樣:

這里有兩種方式。需要注意的是第一種方式需要多安裝一個(gè)軟件包:fontconfig
第一種方式
第一種方式需要?jiǎng)?chuàng)建一個(gè)腳本,我們直接通過vim創(chuàng)建:
sudo vim /etc/profile.d/00-wsl2-systemd.sh
然后將如下內(nèi)容寫入,保存
# Create the starting script for SystemDvi /etc/profile.d/00-wsl2-systemd.sh
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
if [ -z "$SYSTEMD_PID" ]; then
sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi
if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
exec sudo /usr/bin/nsenter -t $SYSTEMD_PID -a su - $LOGNAME
fi
然后關(guān)閉當(dāng)前Terminal,重新打開。
第二種方式
下面是第二種方式,這行命令是為了激活我們的systemd命令
sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
注意
我推薦第一種,第二種雖然第一次是ok的,但是在實(shí)際使用中發(fā)現(xiàn),wsl重啟后(或者電腦重啟),第二種方式執(zhí)行docker和k8s命令的時(shí)候,會(huì)報(bào)下面的錯(cuò),而且我還沒找到解決方案:

具體情況,各位小伙伴可以自己試驗(yàn)下。
安裝Docker
這里安裝的是Linux原生的docker,并非是基于windows環(huán)境的,安裝完成后,你就可以在wsl使用原生的docker了
安裝依賴
安裝軟件包以允許 apt通過 HTTPS使用存儲(chǔ)庫
# 安裝 Docker CE
## 設(shè)置倉庫
### 安裝軟件包以允許 apt 通過 HTTPS 使用存儲(chǔ)庫
sudo apt-get update && sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
這里是安裝多個(gè)軟件的方式,上面總共安裝了四個(gè)軟件包,軟件包直接用空格分割。
添加docker官方發(fā)密鑰
### 新增 Docker 的 官方 GPG 秘鑰
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
添加docker鏡像地址
### 添加 Docker apt 倉庫
add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"
這里會(huì)把它添加進(jìn)/etc/apt/sources.list文件中。
安裝docker
和上面一樣,安裝多個(gè)軟件。
## 安裝 Docker CE
sudo apt-get update && sudo apt-get install containerd.io docker-ce docker-ce-cli -y
配置docker
這里主要是設(shè)置docker的鏡像倉庫的鏡像地址(有點(diǎn)繞,主要是國內(nèi)下載鏡像慢,所以需要改成網(wǎng)易等國內(nèi)的鏡像地址)
sudo vim /etc/docker/daemon.json
前面忘記說了,加sudo就是以管理員運(yùn)行,因?yàn)?code style="overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;background-color: rgba(27, 31, 35, 0.05);font-family: "Operator Mono", Consolas, Monaco, Menlo, monospace;word-break: break-all;color: rgb(255, 100, 65);">/etc文件夾權(quán)限比較高,普通用戶是沒法修改的。然后加入如下內(nèi)容:
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn/", "https://hub-mirror.c.163.com/", "https://reg-mirror.qiniu.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
啟動(dòng)docker
如果前面安裝daemonize采用的第一種方式,就通過下面的方式啟動(dòng)docker:
# 啟動(dòng)
service docker start
# 重啟
service docker restart
# 停止
service docker stop
否則下面的命令,如果上面這種方式無法啟動(dòng),也可以通過下面的命令試下(萬一好了呢,病急亂投醫(yī)唄):
mkdir -p /etc/systemd/system/docker.service.d
# 重啟 docker.
systemctl daemon-reload
# 重啟
systemctl restart docker
# 啟動(dòng)
systemctl start docker
安裝 kubelet、kubeadm、kubectl
添加官方 GPG 秘鑰
這里添加的是阿里巴巴的鏡像密鑰
sudo apt-get update && sudo apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
然后把下面的地址加到我們的軟件更新列表中:
sudo vim /etc/apt/sources.list.d/kubernetes.list
第一次打開應(yīng)該是空的,因?yàn)檫@個(gè)文件是我們剛創(chuàng)建的:
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
添加完成后,我們更新下軟件列表數(shù)據(jù):
sudo apt-get update
更新完成后,安裝k8s軟件包:
sudo apt-get install -y kubelet kubeadm kubectl
因?yàn)槲乙呀?jīng)安裝過了,所以提示已經(jīng)安裝過了,根據(jù)提示信息我們發(fā)現(xiàn)安裝的版本應(yīng)該是1.21.1,應(yīng)該是最新版本了。

創(chuàng)建k8s集群
創(chuàng)建集群的方式有多種,目前我了解到的有兩種,一種是用kubeadm,一種是用kind,經(jīng)過多次嘗試,我發(fā)現(xiàn)第一種方式在wsl下始終無法成功,剛開始是不支持swap交換分區(qū),忽略這個(gè)錯(cuò)誤后,又有其他錯(cuò)誤,一直沒跑通,所以本文我們采用后一種,即kind。

下載安裝kind
首先,我們要下載kind,直接按照官網(wǎng)給的教程開始:
# 下載kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
# 添加執(zhí)行權(quán)限
chmod +x ./kind
# 移動(dòng)到
sudo mv ./kind /usr/local/kind
然后kind就安裝完成了,詳細(xì)官方文檔地址如下
https://kind.sigs.k8s.io/
創(chuàng)建k8s集群
k8s的常用命令,今天就不講了,后面梳理下再分享,今天只分享流程。
到這里,創(chuàng)建集群就很簡單了,直接執(zhí)行下面的命令即可:
kind create cluster --name wslk8s
然后就是漫長的等待,如果不出意外,最后會(huì)顯示創(chuàng)建成功:

我們通過下面的命令看下節(jié)點(diǎn)信息:
kubectl cluster-info --context kind-wslk8s
顯示信息如下:
然后我們?cè)L問如下地址看下
https://127.0.0.1:45187/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy


雖然顯示結(jié)果有點(diǎn)問題,但是也說明集群創(chuàng)建成功,下面我們安裝k8s控制臺(tái)。
安裝圖形化控制面板
執(zhí)行如下命令創(chuàng)建Dashboard節(jié)點(diǎn)
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml
上面的命令就是根據(jù)yaml構(gòu)建我們的k8s節(jié)點(diǎn)

然后通過kubectl describe pod -n kubernetes-dashboard查看創(chuàng)建日志:

如上顯示表明,我們的節(jié)點(diǎn)創(chuàng)建成功,然后運(yùn)行如下命令:
kubectl proxy

再訪問如下地址:
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/error?namespace=kuboard
如果是這樣的,表面我們控制面板安裝成功:

但是真正要訪問,還需要配置個(gè)用戶信息,生成一個(gè)token。
創(chuàng)建管理用戶配置
創(chuàng)建yaml文件
vim adminuser.yaml
添加文件內(nèi)容,下面內(nèi)容就是我們要?jiǎng)?chuàng)建的節(jié)點(diǎn)信息
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kubernetes-dashboard
然后在k8s中創(chuàng)建:
kubectl apply -f adminuser.yaml
正常情況下,會(huì)提示創(chuàng)建成功

然后獲取授權(quán)token
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')
下面顯示的就是token信息,直接復(fù)制即可:

然后我們把token填入頁面,即可訪問:

然后,我們就可以通過kubernetes-dashboard管理我們的k8s了,可以看日志,管理服務(wù)節(jié)點(diǎn)等,具體各位小伙伴自己摸索吧。

總結(jié)
今天的內(nèi)容長度已經(jīng)完全超出我的預(yù)期了,本來想著把主要流程梳理下就可以,但是實(shí)際總結(jié)過程發(fā)現(xiàn),需要注意的點(diǎn)還是挺多的,而且有好多原計(jì)劃的內(nèi)容也沒有加上,后面有時(shí)間梳理下再來分享。
總的來說,k8s相關(guān)知識(shí)點(diǎn)確實(shí)還是挺多的,除了基礎(chǔ)命令,還有網(wǎng)關(guān)相關(guān)配置,Linux相關(guān)知識(shí)點(diǎn),但只要你掌握了今天的大部分知識(shí)點(diǎn),我相信對(duì)你使用k8s部署應(yīng)用應(yīng)該是有幫助的。好了,今天就到這里吧!
本文參考內(nèi)容:
https://blog.csdn.net/weixin_32364911/article/details/112238229 https://www.cnblogs.com/xxred/p/13258347.html
