为了保持大家环境一致,这里采用sealos进行一键部署k8s
且sealos支持k8s环境的保存和离线交付。
-
配置服务器的静态ip,我这里的是
k8s-master 192.168.139.141
k8s-node01 192.168.139.142
k8s-node02 192.168.139.143
-
如果没有ssh,配置ssh
-
保证所有节点的密码一致,不要有特殊符号,我这里密码都是1234567890(或者可配置ssh免密登录)
-
修改
/etc/hosts
文件,添加以下内容,ip和域名替换为自己对应的
192.168.139.141 k8s-master
192.168.139.142 k8s-node01
192.168.139.143 k8s-node02
各版本对应情况,可去官网自行选择
amd64
wget https://github.com/labring/sealos/releases/download/v4.3.7/sealos_4.3.7_linux_amd64.tar.gz \
&& tar zxvf sealos_4.3.7_linux_amd64.tar.gz sealos && chmod +x sealos && mv sealos /usr/bin
下载速度慢的话,下面有百度网盘(版本太低,不建议,暂未更新)
我这里选择的是使用docker作为容器运行时(CRI)的
labring/kubernetes-docker:v1.25.0
镜像安装
labring/helm:v3.8.2
包管理工具并选择了
labring/calico:v3.24.1
作为网络解决方案
由于网络原因,可能无法下载镜像,这里提供三种方案(推荐方案三):
方案一:设置代理
我这里临时设置一下代理
[root@k8s-master ~]# export HTTP_PROXY=http://192.168.137.1:7890/ [root@k8s-master ~]# export HTTPS_PROXY=http://192.168.137.1:7890/然后拉取镜像
[root@k8s-master ~]# sealos pull labring/kubernetes-docker:v1.25.0 [root@k8s-master ~]# sealos pull labring/helm:v3.8.2 [root@k8s-master ~]# sealos pull labring/calico:v3.24.1
方案二:离线镜像
我通过
sealos save -o kubernetes-docker1.25.0.tar labring/kubernetes-docker:v1.25.0 sealos save -o helm3.8.2.tar labring/helm:v3.8.2 sealos save -o calico3.24.1.tar labring/calico:v3.24.1将镜像打包上传到了百度云
提取码:5ook
只需要下载之后,通过以下命令导入镜像
sealos load -i kubernetes-docker1.25.0.tar sealos load -i helm3.8.2.tar sealos load -i calico3.24.1.tar导入成功后执行(imageID替换成对应的id)
sealos tag [imageID] docker.io/labring/kubernetes-docker:v1.25.0 sealos tag [imageID] docker.io/labring/helm:v3.8.2 sealos tag [imageID] docker.io/labring/calico:v3.24.1
方案三:使用阿里云镜像
我已经将这两个镜像传到了我的阿里云镜像仓库,只需要执行
sealos pull registry.cn-shanghai.aliyuncs.com/fanb/kubernetes-docker:v1.25.0 sealos pull registry.cn-shanghai.aliyuncs.com/fanb/helm:v3.8.2 sealos pull registry.cn-shanghai.aliyuncs.com/fanb/calico:v3.24.1拉取成功后执行(imageID替换成对应的id)
sealos tag registry.cn-shanghai.aliyuncs.com/fanb/kubernetes-docker:v1.25.0 docker.io/labring/kubernetes-docker:v1.25.0 sealos tag registry.cn-shanghai.aliyuncs.com/fanb/helm:v3.8.2 docker.io/labring/helm:v3.8.2 sealos tag registry.cn-shanghai.aliyuncs.com/fanb/calico:v3.24.1 docker.io/labring/calico:v3.24.1
最后执行以下命令一键部署k8s集群
(对应ip地址替换成自己的)
sealos run labring/kubernetes-docker:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \
--masters 192.168.139.141 \
--nodes 192.168.139.142,192.168.139.143 -p 1234567890
如果是配置的ssh免密登录,可使用以下命令
sealos run labring/kubernetes-docker:v1.25.0 labring/helm:v3.8.2 labring/calico:v3.24.1 \
--masters 192.168.139.141 \
--nodes 192.168.139.142,192.168.139.143 --pk='/root/.ssh/id_rsa'
参数说明
参数名 | 参数值示例 | 参数说明 |
---|---|---|
--masters | 192.168.0.2 | kubernetes master 节点地址列表 |
--nodes | 192.168.0.3 | kubernetes node 节点地址列表 |
-p | 1234567890(你的密码) | ssh 登录密码 |
kubernetes | labring/kubernetes:v1.25.0 | kubernetes 镜像 |
--pk | '/root/.ssh/id_rsa' | 选择从其中读取公钥认证身份的私钥文件。 |
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane 2m57s v1.25.0
k8s-node01 Ready <none> 2m19s v1.25.0
k8s-node02 Ready <none> 2m21s v1.25.0
[root@k8s-master ~]# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
calico-apiserver calico-apiserver-54fbb6b584-4wkxv 1/1 Running 0 24s
calico-apiserver calico-apiserver-54fbb6b584-tzz8n 1/1 Running 0 24s
calico-system calico-kube-api-85666c5b94-4xvzz 1/1 Running 0 78s
calico-system calico-node-drsqw 1/1 Running 0 78s
calico-system calico-node-mfzhm 1/1 Running 0 78s
calico-system calico-node-mnm6p 1/1 Running 0 78s
calico-system calico-typha-7ffb774947-dkt2m 1/1 Running 0 78s
calico-system calico-typha-7ffb774947-fr2w2 1/1 Running 0 70s
calico-system csi-node-driver-dlpj4 2/2 Running 0 39s
calico-system csi-node-driver-nxrbs 2/2 Running 0 39s
calico-system csi-node-driver-r6cx8 2/2 Running 0 47s
kube-system coredns-565d847f94-qqlsx 1/1 Running 0 118s
kube-system coredns-565d847f94-t68zn 1/1 Running 0 118s
kube-system etcd-k8s-master 1/1 Running 0 2m11s
kube-system kube-apiserver-k8s-master 1/1 Running 0 2m11s
kube-system kube-controller-manager-k8s-master 1/1 Running 0 2m11s
kube-system kube-proxy-7mzw6 1/1 Running 0 118s
kube-system kube-proxy-cmfbg 1/1 Running 0 98s
kube-system kube-proxy-lszz5 1/1 Running 0 100s
kube-system kube-scheduler-k8s-master 1/1 Running 0 2m11s
kube-system kube-sealos-lvscare-k8s-node01 1/1 Running 0 91s
kube-system kube-sealos-lvscare-k8s-node02 1/1 Running 0 93s
tigera-operator tigera-operator-6675dc47f4-wntv5 1/1 Running 0 91s
- 修改
/etc/systemd/system/docker.service
文件
注释原来的ExecStart,添加一行新的如下:
#ExecStart=/usr/bin/dockerd
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
第一个 -H tcp://0.0.0.0:2375是远程调用
第二个 -H unix:///var/run/docker.sock是本地调用
- 重新启动docker
[root@k8s-master ~]# systemctl daemon-reload
[root@k8s-master ~]# systemctl restart docker.service
- 查看结果
[root@k8s-master ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
……
tcp6 0 0 :::2375 :::* LISTEN 1030/dockerd
……
- 修改防火墙策略
[root@k8s-master ~]# iptables -P INPUT ACCEPT
[root@k8s-master ~]# iptables -I INPUT -p tcp --dport 2375 -j DROP
[root@k8s-master ~]# iptables -I INPUT -p tcp --dport 2375 -s 10.10.87.18 -j ACCEPT
这里采用的是阿里开源的gpushare
配置nvidia 源
curl -s -L https://nvidia.github.io/nvidia-container-runtime/gpgkey | \
sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-container-runtime/$distribution/nvidia-container-runtime.list | \
sudo tee /etc/apt/sources.list.d/nvidia-container-runtime.list
sudo apt-get update
sudo apt-get install nvidia-container-runtime
将以下内容添加到 /etc/docker/daemon.json
{
"default-runtime": "nvidia",
"runtimes": {
"nvidia": {
"path": "/usr/bin/nvidia-container-runtime",
"runtimeArgs": []
}
}
}
重启docker并输入以下命令验证
systemctl restart docker
docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
踩坑点:由于我使用selos部署的k8s,master节点的role默认为control-plane,而gpushare的scheduler采用的node selector为master 解决方法: 将gpushare-schd-extender.yaml中的tolerations和nodeSelector部分的master改为自己对应的
我仓库里的yaml部署文件都是已经改好了的
由于使用gpushare需要自己手动给gpu节点进行label,这里使用nfd,修改其配置文件,使其自动发现gpu节点,并标记gpushare=true
- OpenEBS 是一款使用 Go 语言编写的基于容器的块存储开源软件。
- OpenEBS 使得在容器中运行关键性任务和需要数据持久化的负载变得更可靠。
# 在需要作为存储的机器
yum install iscsi-initiator-utils -y
cat /etc/iscsi/initiatorname.iscsi
sudo systemctl enable --now iscsid
systemctl status iscsid
#ubuntu
sudo apt-get update
sudo apt-get install open-iscsi -y
cat /etc/iscsi/initiatorname.iscsi
sudo systemctl enable --now iscsid
systemctl status iscsid
- 由于官方openebs的镜像在国外(下载速度慢),且会用到k8s.gcr.io的镜像(无法下载)
- 我已经将安装的yaml文件内的镜像改为了我的阿里云(替换openebs)和lank8s.cn(替换k8s.gcr.io),对应的yaml文件在daoc目录
- openebs官网可自行选择安装类型,并根据所选类型进行安装
我这里选择的是cstor
kubectl apply -f openebs-operator.yaml
kubectl apply -f cstor-operator.yaml
# 在node01和node02检测到两个blockdevice
[root@k8s-master yaml]# kubectl get bd -n openebs
NAME NODENAME SIZE CLAIMSTATE STATUS AGE
blockdevice-04f302ffe61688e8c529923714c791ef k8s-node02 10736352768 Unclaimed Active 14s
blockdevice-c797122b11695c427d6ef7793d270ff7 k8s-node01 21473771008 Unclaimed Active 19m
# Creating cStor storage pools
# 根据刚才的两个bd创建storage pools
# Stripe(条带化)提供了高性能,但没有数据冗余和故障恢复能力。
# Mirror(镜像)提供了数据冗余和故障恢复能力,但需要更多的存储空间。
kubectl apply -f cstor-pool.yaml
[root@k8s-master yaml]# kubectl get cspc -n openebs
NAME HEALTHYINSTANCES PROVISIONEDINSTANCES DESIREDINSTANCES AGE
cstor-disk-pool 2 2 4m51s
[root@k8s-master yaml]# kubectl get cspi -n openebs
NAME HOSTNAME FREE CAPACITY READONLY PROVISIONEDREPLICAS HEALTHYREPLICAS STATUS AGE
cstor-disk-pool-bsr2 k8s-node02 9630M 9630262k false 1 1 ONLINE 50m
cstor-disk-pool-qzxn k8s-node01 19300M 19300096500 false 1 0 ONLINE 50m
如果证书问题报错的话,issues地址
[root@k8s-master yaml]# kubectl get ValidatingWebhookConfiguration -A NAME WEBHOOKS AGE openebs-cstor-validation-webhook 1 86m [root@k8s-master yaml]# kubectl delete ValidatingWebhookConfiguration openebs-cstor-validation-webhook
[root@k8s-master yaml]# kubectl apply -f cstor-sc.yaml
storageclass.storage.k8s.io/cstor-csi-disk created
[root@k8s-master yaml]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
cstor-csi-disk cstor.csi.openebs.io Delete Immediate true 3s
openebs-device openebs.io/local Delete WaitForFirstConsumer false 31m
openebs-hostpath openebs.io/local Delete WaitForFirstConsumer false 31m
- 由于openebs时块存储,不支持ReadWriteOnce(RWX),无法满足同一个deploy的多个pod(不在同一个node)共享一个pvc
- 官方提供了一种方案,即在openebs之上配置NFS
# 所有节点
sudo yum install nfs-utils -y
#ubuntu
apt-get install nfs-common nfs-kernel-server -y
kubectl apply -f nfs-operator.yaml
项目的监控与告警系统架构:Prometheus通过Kubernetes API采集资源对象的数据,Grafana用于将数据可视化,告警系统使用Prometheus的插件Alertmanager配置。
-
下载系统源码到集群的主节点
git clone https://github.com/whale-G/kube-prometheus.git -b release-0.12
【注意拉取的分支是release-0.12】
-
通过源码进行部署操作。进入
/kube-prometheus/
目录执行下面三条命令:kubectl apply --server-side -f manifests/setup kubectl wait --for condition=Established --all CustomResourceDefinition --namespace=monitoring kubectl apply -f manifests/
通过以下命令可以查看部署情况:
kubectl get pod -n monitoring # 查看命名空间monitoring运行的Pod
此处支持Pod运行的镜像我已经全部放到了我的阿里云镜像仓库
registry.cn-chengdu.aliyuncs.com/kubernetes-monitoring
,如果存在有Pod无法运行,拉取不到镜像的情况。手动修改对应yaml文件进行拉取。kubectl get svc -n monitoring # 查看命名空间monitoring运行的service
此处的Alertmanager、Grafana、Prometheus三个的服务已经设置为NodePort类型,可以通过浏览器输入
物理节点ip:对应端口
查看内容。