更新部署文档说明

This commit is contained in:
data-infra 2023-12-16 20:47:04 +08:00
parent 21d699dff5
commit 340e19b911
16 changed files with 83 additions and 209 deletions

View File

@ -37,79 +37,6 @@ from flask_login import login_user, logout_user
from flask_appbuilder.security.forms import LoginForm_db
import pysnooper
portal_url = 'https://portal.dito.ph/portal-web/#'
portal_url = 'https://10.26.4.136/portal-web/#'
# 自定义远程用户视图
# @pysnooper.snoop()
class MyCustomRemoteUserView(AuthRemoteUserView):
@expose('/dito/ai/explorer/login')
@pysnooper.snoop(watch_explode=('request_data',))
def login(self):
request_data = request.args.to_dict()
username = request_data.get('staffCode','').lower().replace('_','-').replace('.','')
if not username:
print('no find user')
return redirect(portal_url)
# 处理特殊符号
email = ''
if '@' in username:
email = username
username = username[:username.index('@')]
# 先查询用户是否存在
if email:
user = self.appbuilder.sm.find_user(email=email)
else:
user = self.appbuilder.sm.find_user(username=username)
if user and (not user.is_active):
logging.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(username))
print('用户未激活,联系管理员激活')
flash('user not active',category='warning')
return redirect(portal_url)
if not user:
# 没有用户的时候自动注册用户
user = self.appbuilder.sm.auth_user_remote_org_user(
username=username,
org_name='',
password='123456',
email=email,
first_name=username.split('.')[0] if '.' in username else username,
last_name=username.split('.')[1] if '.' in username else username
)
flash('发现用户%s不存在,已自动注册' % username, "success")
login_user(user, remember=True)
# 添加到public项目组
from myapp.security import MyUserRemoteUserModelView_Base
user_view = MyUserRemoteUserModelView_Base()
user_view.post_add(user)
return redirect(self.appbuilder.get_url_for_index)
@expose('/login/')
def _login(self):
if 'rtx' in request.args:
if request.args.get('rtx'):
username = request.args.get('rtx')
user = self.appbuilder.sm.find_user(username)
if user:
login_user(user, remember=True)
return redirect(self.appbuilder.get_url_for_index)
return redirect(portal_url)
@expose('/logout')
# @pysnooper.snoop()
def logout(self):
session.pop('user', None)
logout_user()
return redirect(portal_url)
# 账号密码登录方式的登录界面
class Myauthdbview(AuthDBView):
@ -145,7 +72,6 @@ class Myauthdbview(AuthDBView):
})
@expose("/login/", methods=["GET", "POST"])
@pysnooper.snoop(watch_explode=('form',))
def login(self):
request_data = request.args.to_dict()
comed_url = request_data.get('login_url', '')

View File

@ -64,7 +64,7 @@ cube_studio = [
'ccr.ccs.tencentyun.com/cube-studio/notebook:jupyter-ubuntu-machinelearning',
'ccr.ccs.tencentyun.com/cube-studio/notebook:jupyter-ubuntu-deeplearning',
# 超参搜索的镜像
'ccr.ccs.tencentyun.com/cube-studio/nni:20211003',
'ccr.ccs.tencentyun.com/cube-studio/nni:20230601',
# 内部服务镜像
"ccr.ccs.tencentyun.com/cube-studio/phpmyadmin",
# "ccr.ccs.tencentyun.com/cube-studio/patrikx3:latest",

View File

@ -89,7 +89,7 @@ AUTH_TYPE = AUTH_DB
# AUTH_ROLE_ADMIN = 'Admin'
# Uncomment to setup Public role name, no authentication needed
# AUTH_ROLE_PUBLIC = 'Gamma'
# AUTH_ROLE_PUBLIC = 'Public'
# 是否允许用户注册
AUTH_USER_REGISTRATION = False
@ -740,8 +740,6 @@ HUBSECRET_NAMESPACE=[PIPELINE_NAMESPACE,AUTOML_NAMESPACE,NOTEBOOK_NAMESPACE,SERV
NOTEBOOK_IMAGES=[
['ccr.ccs.tencentyun.com/cube-studio/notebook:vscode-ubuntu-cpu-base', 'vscodecpu'],
['ccr.ccs.tencentyun.com/cube-studio/notebook:vscode-ubuntu-gpu-base', 'vscodegpu'],
['ccr.ccs.tencentyun.com/cube-studio/notebook:jupyter-ubuntu-cpu-base', 'jupytercpu'],
['ccr.ccs.tencentyun.com/cube-studio/notebook:jupyter-ubuntu-gpu-base','jupytergpu'],
['ccr.ccs.tencentyun.com/cube-studio/notebook:jupyter-ubuntu22.04', 'jupytergpu'],
['ccr.ccs.tencentyun.com/cube-studio/notebook:jupyter-ubuntu22.04-cuda11.8.0-cudnn8','jupytergpu'],
['ccr.ccs.tencentyun.com/cube-studio/notebook:jupyter-ubuntu-bigdata', 'jupyterbigdata'],

View File

@ -37,78 +37,6 @@ from flask_login import login_user, logout_user
from flask_appbuilder.security.forms import LoginForm_db
import pysnooper
portal_url = 'http://127.0.0.1/xxxx/login?staffCode=admin'
# 自定义远程用户视图
# @pysnooper.snoop()
class MyCustomRemoteUserView(AuthRemoteUserView):
@expose('/xx/xx/login')
@pysnooper.snoop(watch_explode=('request_data',))
def login(self):
request_data = request.args.to_dict()
username = request_data.get('staffCode','').lower().replace('_','-').replace('.','')
if not username:
print('no find user')
return redirect(portal_url)
# 处理特殊符号
email = ''
if '@' in username:
email = username
username = username[:username.index('@')]
# 先查询用户是否存在
if email:
user = self.appbuilder.sm.find_user(email=email)
else:
user = self.appbuilder.sm.find_user(username=username)
if user and (not user.is_active):
logging.info(LOGMSG_WAR_SEC_LOGIN_FAILED.format(username))
print('用户未激活,联系管理员激活')
flash('user not active',category='warning')
return redirect(portal_url)
if not user:
# 没有用户的时候自动注册用户
user = self.appbuilder.sm.auth_user_remote_org_user(
username=username,
org_name='',
password='123456',
email=email,
first_name=username.split('.')[0] if '.' in username else username,
last_name=username.split('.')[1] if '.' in username else username
)
flash('发现用户%s不存在,已自动注册' % username, "success")
login_user(user, remember=True)
# 添加到public项目组
from myapp.security import MyUserRemoteUserModelView_Base
user_view = MyUserRemoteUserModelView_Base()
user_view.post_add(user)
return redirect(self.appbuilder.get_url_for_index)
@expose('/login/')
def _login(self):
if 'rtx' in request.args:
if request.args.get('rtx'):
username = request.args.get('rtx')
user = self.appbuilder.sm.find_user(username)
if user:
login_user(user, remember=True)
return redirect(self.appbuilder.get_url_for_index)
return redirect(portal_url)
@expose('/logout')
# @pysnooper.snoop()
def logout(self):
session.pop('user', None)
logout_user()
return redirect(portal_url)
# 账号密码登录方式的登录界面
class Myauthdbview(AuthDBView):
@ -144,17 +72,18 @@ class Myauthdbview(AuthDBView):
})
@expose("/login/", methods=["GET", "POST"])
# @pysnooper.snoop(watch_explode=('form',))
def login(self):
request_data = request.args.to_dict()
comed_url = request_data.get('login_url', '')
if 'rtx' in request.args:
if request.args.get('rtx'):
username = request.args.get('rtx')
if 'rtx' in request_data:
if request_data.get('rtx'):
username = request_data.get('rtx')
user = self.appbuilder.sm.find_user(username)
if user:
login_user(user, remember=True)
if comed_url:
return redirect(comed_url)
return redirect(self.appbuilder.get_url_for_index)
if g.user is not None and g.user.is_authenticated:

View File

@ -27,9 +27,12 @@ data_volume: /data #这个路径是宿主机的路径,根据实际情况修
```
# 执行安装程序只安装harbor
安装harbor前需要先安装docker和docker-compose并且启动docker和docker-compose。
```bash
apt install -y docker
apt install -y docker-compose
./install.sh (前提条件docker需要启动)
./install.sh
```
# 除了安装harbor外还可以安装公正服务 notary 以及漏洞扫描器 trivy

View File

@ -61,8 +61,12 @@ mkdir -p /data/nfs/k8s
ln -s /data/nfs/k8s /data/
```
如果只是单机部署nfs那么到这里就部署结束了如果是多机部署则还需要部署客户端就在客户端机器上接着往下部署。
### nfs client配置
客户端的配置依据以下的步骤,需要注意的是客户端和服务端的挂载不能在同一台机器上,否则挂载会出现问题。
```shell
export server=10.101.135.101
@ -74,7 +78,7 @@ showmount -e $server
Export list for xx.xx.xx.xx:
/data/nfs *
# 系统层面添加挂载添加一行,重启自动添加
# 系统层面添加挂载添加一行,重启自动添加,将服务端上的/data/nfs挂载到客户端上的/data/nfs
mkdir -p /data/nfs
echo "${server}:/data/nfs /data/nfs nfs defaults 0 0" >> /etc/fstab

View File

@ -1092,4 +1092,4 @@
"uid": "all-node",
"version": 1,
"weekStart": ""
}
}

View File

@ -918,7 +918,7 @@
]
},
"timezone": "browser",
"title": "集群资源使用率",
"title": "Cluster Resource Utilization",
"uid": "cluster-used-util",
"version": 1
}

View File

@ -670,4 +670,4 @@
"uid": "dcgm",
"version": 2,
"weekStart": ""
}
}

View File

@ -1153,4 +1153,4 @@
"uid": "istio-service",
"version": 2,
"weekStart": ""
}
}

View File

@ -1376,4 +1376,4 @@
"uid": "node",
"version": 2,
"weekStart": ""
}
}

View File

@ -867,4 +867,4 @@
"uid": "pod-info",
"version": 1,
"weekStart": ""
}
}

View File

@ -29,10 +29,11 @@ sudo apt-get update
# 搜索可用版本
apt-cache madison docker-ce
# 安装最新版(最好使用指定版本)
# sudo apt install -y docker-ce docker-compose
# 安装指定版本,使用安装指定版本
apt install -y docker-ce=5:20.10.24~3-0~ubuntu-focal
# 安装最新版(最好使用指定版本)
# sudo apt install -y docker-ce docker-compose
apt install -y docker-compose
```

View File

@ -1,29 +1,29 @@
# 内网使用rancher自建k8s集群
# 1、内网使用rancher自建k8s集群
如果可以使用公有云k8s可以直接构建公有云厂商的容器服务。这里介绍如何在内网使用k8s自建k8s集群
# 建设前准备
# 2、建设前准备
如果内网无法连接到互联网的话需要在内网申请一个docker仓库如果内网没有docker仓库则可以使用Harbor自建一个内网仓库。比如申请一个地址是docker.oa.com的内网仓库
# 将基础组件推送到内网仓库并在idc机器拉取
# 3、将基础组件推送到内网仓库并在idc机器拉取
大多数情况下,内网是无法连接外网的,需要我们提前拉好镜像。如果你的机器可以连接外网,则可以忽略这一部分的操作。
关于镜像的版本这与rancher和k8s的版本有关。你可以在这里选择一个能够部署k8s 1.18的rancher版本https://github.com/rancher/rancher/releases
关于镜像的版本这与rancher和k8s的版本有关。你可以在这里选择一个能够部署k8s 1.21的rancher版本https://github.com/rancher/rancher/releases
比如我这里使用的是rancher_version=v2.6.2即2.6.2版本那么这个版本依赖的镜像可以在https://github.com/rancher/rancher/releases/tag/$rancher_version 中找到其所依赖的镜像txt文件也就是 https://github.com/rancher/rancher/releases/download/$rancher_version/rancher-images.txt
之后将依赖的镜像在开发网中拉取下来然后重新tag成内网仓库镜像例如docker.oa.com域名下的镜像推送到docker.oa.com上接着需要在idc中的每个机器上拉取下来再tag成原始镜像名。
参考命令:
## 可以连接外网的机器上
## 3.1、可以连接外网的机器上
```bash
docker pull rancher/rancher-agent:$rancher_version
docker tag rancher/rancher-agent:$rancher_version docker.oa.com:8080/public/rancher/rancher-agent:$rancher_version
```
## 内网idc机器
## 3.2、内网idc机器
```bash
docker pull docker.oa.com/public/rancher/rancher-agent:$rancher_version
docker tag docker.oa.com/public/rancher/rancher-agent:$rancher_version rancher/rancher-agent:$rancher_version
@ -31,7 +31,7 @@ docker tag docker.oa.com/public/rancher/rancher-agent:$rancher_version rancher/r
由于依赖的镜像比较多我们可以写一个脚本批量的去拉取和tag。
# 初始化节点
# 4、初始化节点
想要初始化节点我们可以批量下发init_node.sh和reset_docker.sh这两个脚本。
@ -43,7 +43,7 @@ init_node.sh 是为了初始化机器,可以把自己要做的初始化任务
reset_docker.sh 是为了在机器从rancher集群中踢出以后把rancher环境清理干净。
# centos8 初始化
# 5、centos8 初始化
```bash
#修改/etc/firewalld/firewalld.conf
@ -110,7 +110,7 @@ reboot
```
# ubuntu 22.04
# 6、ubuntu 22.04
```bash
vi /etc/default/grub
@ -130,15 +130,16 @@ net.bridge.bridge-nf-call-iptables=1
```
# 部署rancher server
# 7、部署rancher server
单节点部署rancher server
```bash
# 清理历史部署痕迹
cd cube-studio/install/kubernetes/rancher/
sh reset_docker.sh
# 需要拉取镜像(这里以2.6.2版本为例)
# 需要拉取镜像(非2.6.2版本需要执行wget2.6.2版本已拉取过了)
wget https://github.com/rancher/rancher/releases/download/v2.6.2/rancher-images.txt
sh pull_rancher_images.sh
@ -150,19 +151,39 @@ sudo docker run -d --privileged --restart=unless-stopped -p 443:443 --name=myran
docker logs myrancher 2>&1 | grep "Bootstrap Password:"
```
# rancher server 启动可能问题
# 8、rancher server 启动可能问题
permission denied
mount 查看所属盘是否有noexec 限制
# 部署k8s集群
# 9、部署k8s集群
部署完rancher server后进去rancher server的https://xx.xx.xx.xx/ 的web界面这里的xx取决于你服务器的IP地址之后选择添加集群->选择自定义集群->填写集群名称
部署完rancher server后进去rancher server的https://xx.xx.xx.xx/ 的web界面这里的xx取决于你服务器的IP地址。
选择“Set a specific password to use”来配置rancher的密码不选择"Allow collection of anonymous statistics ......",选择"I agree to the terms and conditions ......"。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/bf9eb26c1ee14ef4b18b02fbf3c17f7a.png)
之后选择添加集群->选择自定义集群->填写集群名称
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/235de769236b4643b2c9a2eb1b109100.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/7693842628df47a7b5aefdd36a000f82.png)
然后选择kubernetes的版本注意这个版本在第一次打开选择页面时可能刷新不出来需要等待1~2分钟再刷新才能显示
之后选择编辑yaml文件。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f67444489647471494fa2d3ed062ee6d.png)
修改Advanced option主要是禁用nginx ingress修改端口范围使用docker info检查服务器上的docker根目录是否和默认的一致不一致则需要更改。
之后选择编辑yaml文件。 添加kubelet的挂载参数需要把分布式存储的位置都加入挂载。可以添加一个非根目录的父目录。
```bash
kube-api:
...
kubelet:
extra_binds:
- '/data:/data'
```
这个yaml文件中控制着k8s基础组件的启动方式。比如kubelet的启动参数api-server的启动参数等等。
@ -192,25 +213,25 @@ services部分的示例注意缩进对齐
pod_security_policy: false
# 服务node port范围
service_node_port_range: 10-32767
# 服务的ip范围
# 服务的ip范围如果公司ip网段与k8s网段有冲突则需要改这里
service_cluster_ip_range: 172.16.0.0/16
# 证书 https版本isito需要
# 证书 https版本isito需要k8s在1.21版本以下的需要加extra_args
extra_args:
service-account-issuer: kubernetes.default.svc
service-account-signing-key-file: /etc/kubernetes/ssl/kube-service-account-token-key.pem
kube-controller:
# 集群pod的ip范围
# 集群pod的ip范围如果公司ip网段与k8s网段有冲突则需要改这里
cluster_cidr: 172.17.0.0/16
# 集群服务的 ip 范围
# 集群服务的 ip 范围如果公司ip网段与k8s网段有冲突则需要改这里
service_cluster_ip_range: 172.16.0.0/16
kubelet:
# dns服务的ip
# dns服务的ip如果公司ip网段与k8s网段有冲突则需要改这里
cluster_dns_server: 172.16.0.10
# 主机镜像回收触发门槛
# 主机镜像回收触发门槛,如果机器空间小,可以把这两个参数调高
extra_args:
image-gc-high-threshold: 90
image-gc-low-threshold: 85
# kubelet挂载主机目录这样才能使用subpath
# kubelet挂载主机目录这样才能使用subpath,所有情况下部署都必加,且仅此处是必须要加的
extra_binds:
- '/data:/data'
kubeproxy: {}
@ -230,11 +251,11 @@ services部分的示例注意缩进对齐
部署完成后,集群的状态会变为"Active"之后就可以继续其他的操作了比如执行sh start.sh xx.xx.xx.xx等等
# rancher server 高可用
# 10、rancher server 高可用
rancher server 有高可用部署方案可以参考官网https://rancher.com/docs/rancher/v2.x/en/installation/how-ha-works/
## 单节点的配置高可用
## 10.1、单节点的配置高可用
由于官方提供的几种高可用方案要么需要ssh互联要么需要跳板机账号密码这些都无法在idc环境实现。
并且使用单容器模式部署的时候如果docker service或者机器重启了rancher server就会报异常。一般会报wait k3s start的错误。
@ -265,7 +286,7 @@ docker rm $RANCHER_CONTAINER_NAME
然后就可以把原有容器删除掉了。
这个新启动的容器在docker service重启后是可以继续正常工作的。
## 配置认证过期
## 10.2、配置认证过期
因为rancher server的证书有效期是一年在一年后rancher server会报证书过期。因此可以通过下面的方式创建新的证书。
@ -284,7 +305,7 @@ docker stop $RANCHER_CONTAINER_NAME
docker start $RANCHER_CONTAINER_NAME
```
# 部署完成后需要部分修正
# 11、部署完成后需要部分修正
1、因为metric-server默认镜像拉取是Always所以要修改成imagePullPolicy: IfNotPresent
2、nginx如果不想使用或者因为端口占用只在部分机器上使用可以添加亲密度不启动或者在部分机器上启动。
@ -300,7 +321,7 @@ affinity:
- "true"
3、由于coredns在资源limits太小了因此可以取消coredns的limits限制不然dns会非常慢整个集群都会缓慢
# 机器扩容
# 12、机器扩容
现在k8s集群已经有了一个master节点但还没有worker节点或者想添加更多的master/worker节点就需要机器扩容了。
在集群主机界面,点击编辑集群
@ -309,10 +330,10 @@ affinity:
之后复制命令到目标主机上运行,等待完成就可以了。
# rancher/k8s 多用户
# 13、rancher/k8s 多用户
如果集群部署好了需要添加多种权限类型的用户来管理则可以使用rancher来实现k8s的rbac的多用户。
# 客户端kubectl
# 14、客户端kubectl
如果你不会使用rancher界面或者不习惯使用rancher界面可以使用kubectl或者kubernetes-dashboard。
点击Kubeconfig文件可以看到config的内容通过内容可以看到kube-apiserver可以使用rancher-server端口443的api接口或者kube-apiserver端口6443的接口控制k8s集群。
@ -321,13 +342,13 @@ affinity:
下载安装不同系统办公电脑对应的kubectl然后复制config到~/.kube/config文件夹就可以通过命令访问k8s集群了。
# kubernetes-dashboard
# 15、kubernetes-dashboard
如果你喜欢用k8s-dashboard可以自己安装dashboard。
可以参考这个https://kuboard.cn/install/install-k8s-dashboard.html
这样我们就完成了k8s的部署。
# 节点清理
# 16、节点清理
当安装失败需要重新安装或者需要彻底清理节点。由于清理过程比较麻烦我们可以在rancher界面上把node删除然后再去机器上执行reset_docker.sh这样机器就恢复了部署前的状态。
如果web界面上删除不掉我们也可以通过kubectl的命令
@ -336,7 +357,7 @@ affinity:
kubectl delete node node12
```
# rancher server 节点迁移
# 17、rancher server 节点迁移
我们可以实现将rancher server 节点迁移到另一台机器,以防止机器废弃后无法使用的情况。
首先先在原机器上把数据压缩不要关闭源集群rancher server 因为后面还要执行kubectl这里的.tar.gz的文件名称以实际为准
@ -374,7 +395,7 @@ curl --insecure -sfL https://100.108.176.29/v3/import/d9jzxfz7tmbsnbhf22jbknzlbj
至此完成
# 总结
# 18、总结
rancher使用**全部容器化**的形式来部署k8s集群能大幅度降低k8s集群扩部署/缩容的门槛。
你可以使用rancher来扩缩容 etcdk8s-masterk8s-worker。

View File

@ -91,14 +91,6 @@ if [[ "$answer" == "yes" ]]; then
kubectl delete -f gpu/nvidia-device-plugin.yml
kubectl delete -f gpu/dcgm-exporter.yaml
kubectl delete serviceaccount frameworkbarrier --namespace pipeline
kubectl delete serviceaccount frameworkbarrier --namespace automl
kubectl delete serviceaccount frameworkbarrier --namespace kubeflow
kubectl delete clusterrole frameworkbarrier --verb=get,list,watch --resource=frameworks
kubectl delete clusterrolebinding frameworkbarrier-pipeline --clusterrole=frameworkbarrier --user=system:serviceaccount:pipeline:frameworkbarrier
kubectl delete clusterrolebinding frameworkbarrier-automl --clusterrole=frameworkbarrier --user=system:serviceaccount:automl:frameworkbarrier
kubectl delete clusterrolebinding frameworkbarrier-kubeflow --clusterrole=frameworkbarrier --user=system:serviceaccount:kubeflow:frameworkbarrier
# 部署volcano
kubectl delete -f volcano/volcano-development.yaml
kubectl delete secret volcano-admission-secret -n kubeflow

View File

@ -7624,10 +7624,10 @@ roleRef:
apiVersion: v1
kind: Service
metadata:
annotations:
prometheus.io/path: /metrics
prometheus.io/port: "8080"
prometheus.io/scrape: "true"
# annotations:
# prometheus.io/path: /metrics
# prometheus.io/port: "8080"
# prometheus.io/scrape: "true"
name: volcano-scheduler-service
namespace: kubeflow
spec: