虽迟但到,k8s硬核技术,了解下?

前言

最近一周,一直在捣鼓基于wsl2搭建k8s集群的问题,试了好久才终于把集群环境搞好,然后又花了两天时间,才搞清楚服务如何访问,感觉这应该是我工作以来,摸索问题最久的一次了,这两天更是肝到一点(忙起来。感觉时间过的好快),这执着的精神是值得肯定,但是也说明我确实对k8s还处在初学阶段,未来可能还有好多坑要踩,不过能走出这第一步,我觉得未来的困难也会被我踩在脚下的。

不过,通过昨天晚上和今天集群的创建,我发现k8s集群创建这块的经验和思路已经很成熟了,所以就想趁着这股热劲,把自己的经验分享下,供大家参考,为了搞清楚k8s,连ubuntu我都安装了好几个:

今天我们演示内容是基于ubuntu 20.04展开的,内容有点多,我们直接开始正文吧。

正文

启用wsl

关于wsl的启用,我们上次(前天)已经分享过了,不清楚的小伙伴爬楼看下,后期考虑把这一块的内容再细化下。暂时可以参考微软官方文档:

https://docs.microsoft.com/zh-cn/windows/wsl/

启用成功后,打开我们的wsl

后期,我们分享如何美化这里的终端窗口。

配置系统

修改系统更新源

经常使用Linux的小伙伴应该知道,我们在安装完Linux第一步都是修改更新源。所以wsl安装完成后,我们首先也是要修改系统更新源的地址,官方默认地址国内更新比较慢,我们改成阿里巴巴的镜像地址,就快多了。

我们要把如下地址添加到/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,默认已经安装好了:

sudo vim /etc/apt/sources.list

这里用sudo是因为当前用户不是root账户,如果登录的是root账户,就不需要加sudo,不过加了也不影响,下面的命令也是一样的,后面就不再说明了,#表示注释该行数据。

修改完镜像后,我们通过如下命令更新下系统:

sudo apt update & sudo apt upgrade

前面的命令是更新软件列表,后面的命令是安装更新,也可以分开执行(感觉我说的好细呀),然后静静等待更新完成:

daemonize安装配置

安装daemonize是为了让我们的wsl支持systemctl命令,然后激活Systemd ,这些命令在后面启动docker服务、创建集群的时候都要用到。

安装命令也很简单(我一直觉得linux安装软件比windows方便,一行命令就完成安装,它不香吗):

sudo apt install daemonize #第二种方式执行
sudo apt install -yqq fontconfig daemonize # 第一种方式需要执行

因为我已经安装过了,显示得可能和你不一样:

这里有两种方式。需要注意的是第一种方式需要多安装一个软件包:fontconfig

第一种方式

第一种方式需要创建一个脚本,我们直接通过vim创建:

sudo vim /etc/profile.d/00-wsl2-systemd.sh

然后将如下内容写入,保存

# 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

然后关闭当前Terminal,重新打开。

第二种方式

下面是第二种方式,这行命令是为了激活我们的systemd命令

sudo daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
注意

我推荐第一种,第二种虽然第一次是ok的,但是在实际使用中发现,wsl重启后(或者电脑重启),第二种方式执行dockerk8s命令的时候,会报下面的错,而且我还没找到解决方案:

具体情况,各位小伙伴可以自己试验下。

安装Docker

这里安装的是Linux原生的docker,并非是基于windows环境的,安装完成后,你就可以在wsl使用原生的docker

安装依赖

安装软件包以允许 apt 通过 HTTPS 使用存储库

# 安装 Docker CE
## 设置仓库
### 安装软件包以允许 apt 通过 HTTPS 使用存储库
sudo apt-get update && sudo apt-get install apt-transport-https ca-certificates curl software-properties-common

这里是安装多个软件的方式,上面总共安装了四个软件包,软件包直接用空格分割。

添加docker官方发密钥
### 新增 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"

这里会把它添加进/etc/apt/sources.list文件中。

安装docker

和上面一样,安装多个软件。

## 安装 Docker CE
sudo apt-get update && sudo apt-get install containerd.io   docker-ce   docker-ce-cli -y
配置docker

这里主要是设置docker的镜像仓库的镜像地址(有点绕,主要是国内下载镜像慢,所以需要改成网易等国内的镜像地址)

sudo vim /etc/docker/daemon.json

前面忘记说了,加sudo就是以管理员运行,因为/etc文件夹权限比较高,普通用户是没法修改的。然后加入如下内容:

{
  "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"
}
启动docker

如果前面安装daemonize采用的第一种方式,就通过下面的方式启动docker

# 启动
service docker start
# 重启
service docker restart
# 停止
service docker stop

否则下面的命令,如果上面这种方式无法启动,也可以通过下面的命令试下(万一好了呢,病急乱投医呗):

mkdir -p /etc/systemd/system/docker.service.d

# 重启 docker.
systemctl daemon-reload
# 重启
systemctl restart docker
# 启动
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

第一次打开应该是空的,因为这个文件是我们刚创建的:

deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main

添加完成后,我们更新下软件列表数据:

sudo apt-get update

更新完成后,安装k8s软件包:

sudo apt-get install -y kubelet kubeadm kubectl

因为我已经安装过了,所以提示已经安装过了,根据提示信息我们发现安装的版本应该是1.21.1,应该是最新版本了。

创建k8s集群

创建集群的方式有多种,目前我了解到的有两种,一种是用kubeadm ,一种是用kind,经过多次尝试,我发现第一种方式在wsl下始终无法成功,刚开始是不支持swap交换分区,忽略这个错误后,又有其他错误,一直没跑通,所以本文我们采用后一种,即kind

下载安装kind

首先,我们要下载kind,直接按照官网给的教程开始:

# 下载kind
curl -Lo ./kind https://kind.sigs.k8s.io/dl/v0.11.1/kind-linux-amd64
# 添加执行权限
chmod +x ./kind
# 移动到
sudo mv ./kind /usr/local/kind

然后kind就安装完成了,详细官方文档地址如下

https://kind.sigs.k8s.io/
创建k8s集群

k8s的常用命令,今天就不讲了,后面梳理下再分享,今天只分享流程。

到这里,创建集群就很简单了,直接执行下面的命令即可:

kind create cluster --name wslk8s

然后就是漫长的等待,如果不出意外,最后会显示创建成功:

我们通过下面的命令看下节点信息:

kubectl cluster-info --context kind-wslk8s

显示信息如下:

然后我们访问如下地址看下

https://127.0.0.1:45187/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

虽然显示结果有点问题,但是也说明集群创建成功,下面我们安装k8s控制台。

安装图形化控制面板

执行如下命令创建Dashboard节点

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.1/aio/deploy/recommended.yaml

上面的命令就是根据yaml构建我们的k8s节点

然后通过kubectl describe pod -n kubernetes-dashboard查看创建日志:

如上显示表明,我们的节点创建成功,然后运行如下命令:

kubectl proxy

再访问如下地址:

http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/error?namespace=kuboard

如果是这样的,表面我们控制面板安装成功:

但是真正要访问,还需要配置个用户信息,生成一个token

创建管理用户配置

创建yaml文件

vim adminuser.yaml

添加文件内容,下面内容就是我们要创建的节点信息

---
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中创建:

kubectl apply -f adminuser.yaml

正常情况下,会提示创建成功

然后获取授权token

 kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep admin-user | awk '{print $1}')

下面显示的就是token信息,直接复制即可:

然后我们把token填入页面,即可访问:

然后,我们就可以通过kubernetes-dashboard管理我们的k8s了,可以看日志,管理服务节点等,具体各位小伙伴自己摸索吧。

总结

今天的内容长度已经完全超出我的预期了,本来想着把主要流程梳理下就可以,但是实际总结过程发现,需要注意的点还是挺多的,而且有好多原计划的内容也没有加上,后面有时间梳理下再来分享。

总的来说,k8s相关知识点确实还是挺多的,除了基础命令,还有网关相关配置,Linux相关知识点,但只要你掌握了今天的大部分知识点,我相信对你使用k8s部署应用应该是有帮助的。好了,今天就到这里吧!

本文参考内容:

  1. https://blog.csdn.net/weixin_32364911/article/details/112238229
  2. https://www.cnblogs.com/xxred/p/13258347.html
原文地址:https://www.cnblogs.com/caoleiCoding/p/14938967.html