环境准备:k8s环境>=1.18

一、使用镜像suggest123/k8s-hub:0.0.11 此镜像使用jwt验证登录

之后可以教大家如何自定义一个jupyterhub镜像。

二.存储选择

1. localpath(本地存储):

提供文件 local-path-storage.yaml。

apiVersion: v1
kind: Namespace
metadata:name: local-path-storage---
apiVersion: v1
kind: ServiceAccount
metadata:name: local-path-provisioner-service-accountnamespace: local-path-storage---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:name: local-path-provisioner-role
rules:- apiGroups: [ "" ]resources: [ "nodes", "persistentvolumeclaims", "configmaps" ]verbs: [ "get", "list", "watch" ]- apiGroups: [ "" ]resources: [ "endpoints", "persistentvolumes", "pods" ]verbs: [ "*" ]- apiGroups: [ "" ]resources: [ "events" ]verbs: [ "create", "patch" ]- apiGroups: [ "storage.k8s.io" ]resources: [ "storageclasses" ]verbs: [ "get", "list", "watch" ]---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: local-path-provisioner-bind
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: local-path-provisioner-role
subjects:- kind: ServiceAccountname: local-path-provisioner-service-accountnamespace: local-path-storage---
apiVersion: apps/v1
kind: Deployment
metadata:name: local-path-provisionernamespace: local-path-storage
spec:replicas: 1selector:matchLabels:app: local-path-provisionertemplate:metadata:labels:app: local-path-provisionerspec:serviceAccountName: local-path-provisioner-service-accountcontainers:- name: local-path-provisionerimage: rancher/local-path-provisioner:v0.0.20imagePullPolicy: IfNotPresentcommand:- local-path-provisioner- --debug- start- --config- /etc/config/config.jsonvolumeMounts:- name: config-volumemountPath: /etc/config/env:- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespacevolumes:- name: config-volumeconfigMap:name: local-path-config---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: local-path
provisioner: rancher.io/local-path
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete---
kind: ConfigMap
apiVersion: v1
metadata:name: local-path-confignamespace: local-path-storage
data:config.json: |-{"nodePathMap":[{"node":"DEFAULT_PATH_FOR_NON_LISTED_NODES","paths":["/opt/local-path-provisioner"]}]}setup: |-#!/bin/shwhile getopts "m:s:p:" optdocase $opt inp)absolutePath=$OPTARG;;s)sizeInBytes=$OPTARG;;m)volMode=$OPTARG;;esacdonemkdir -m 0777 -p ${absolutePath}teardown: |-#!/bin/shwhile getopts "m:s:p:" optdocase $opt inp)absolutePath=$OPTARG;;s)sizeInBytes=$OPTARG;;m)volMode=$OPTARG;;esacdonerm -rf ${absolutePath}helperPod.yaml: |-apiVersion: v1kind: Podmetadata:name: helper-podspec:containers:- name: helper-podimage: busyboximagePullPolicy: IfNotPresent

修改对应路径,具体想要了解的话可以去看下k8s的volumeMounts介绍。挂载卷

设置本地存储运行命令 kubectl apply -f .

2.nfs (网络存储): 提供文件 rbac.yaml

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-provisioner-runner
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]- apiGroups: [""]resources: ["services", "endpoints"]verbs: ["get"]- apiGroups: ["extensions"]resources: ["podsecuritypolicies"]resourceNames: ["nfs-provisioner"]verbs: ["use"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-provisioner
subjects:- kind: ServiceAccountname: nfs-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: ClusterRolename: nfs-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-provisioner
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-provisioner
subjects:- kind: ServiceAccountname: nfs-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-provisionerapiGroup: rbac.authorization.k8s.io

storageclass.yaml

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: newlandedu-nfs
provisioner: example.com/nfs
mountOptions:- vers=4.1

deployment.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-provisioner
---
kind: Service
apiVersion: v1
metadata:name: nfs-provisionerlabels:app: nfs-provisioner
spec:ports:- name: nfsport: 2049- name: nfs-udpport: 2049protocol: UDP- name: nlockmgrport: 32803- name: nlockmgr-udpport: 32803protocol: UDP- name: mountdport: 20048- name: mountd-udpport: 20048protocol: UDP- name: rquotadport: 875- name: rquotad-udpport: 875protocol: UDP- name: rpcbindport: 111- name: rpcbind-udpport: 111protocol: UDP- name: statdport: 662- name: statd-udpport: 662protocol: UDPselector:app: nfs-provisioner
---
kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-provisioner
spec:selector:matchLabels:app: nfs-provisionerreplicas: 1strategy:type: Recreate template:metadata:labels:app: nfs-provisionerspec:serviceAccount: nfs-provisionercontainers:- name: nfs-provisionerimage: suggest123/nfs-provisioner:v3.0.0ports:- name: nfscontainerPort: 2049- name: nfs-udpcontainerPort: 2049protocol: UDP- name: nlockmgrcontainerPort: 32803- name: nlockmgr-udpcontainerPort: 32803protocol: UDP- name: mountdcontainerPort: 20048- name: mountd-udpcontainerPort: 20048protocol: UDP- name: rquotadcontainerPort: 875- name: rquotad-udpcontainerPort: 875protocol: UDP- name: rpcbindcontainerPort: 111- name: rpcbind-udpcontainerPort: 111protocol: UDP- name: statdcontainerPort: 662- name: statd-udpcontainerPort: 662protocol: UDPsecurityContext:capabilities:add:- DAC_READ_SEARCH- SYS_RESOURCEargs:- "-provisioner=example.com/nfs"env:- name: POD_IPvalueFrom:fieldRef:fieldPath: status.podIP- name: SERVICE_NAMEvalue: nfs-provisioner- name: POD_NAMESPACEvalueFrom:fieldRef:fieldPath: metadata.namespaceimagePullPolicy: "IfNotPresent"volumeMounts:- name: export-volumemountPath: /exportvolumes:- name: export-volumehostPath:path: /data

修改对应路径

设置网络存储运行命令kubectl apply -f .

三.部署jupyterhub

对应压缩包 jupyterhub.zip。 修改相应的jupyterhub-config.yaml文件(存储、资源、调度、自定义参数) jupyterhub_config.py为jupyterhub 程序运行参数。可以自定义设置。 部署命令,使用helm命令部署jupyterhub,helm版本>=v3.5.3


使用命令部署:helm upgrade --cleanup-on-fail \ --install jupyterhub ./jupyterhub-1.1.3.tgz \ --namespace jhub \ --create-namespace \ --values jupyterhub-config.yaml \ --set-file hub.extraFiles.my_config.stringData=jupyterhub_config.py

最后的效果

大家需要安装包、或者有其他问题可以私信我,或者扫描关注我的公众号。

JupyterHub on K8S私有化部署相关推荐

  1. SaaS服务的私有化部署,这样做最高效|云效工程师指北

    简介:为了能够有效且高效地同时管理SaaS版本和私有化版本的发布过程,云效团队也结合云原生的基础设施和标准化工具(比如helm)进行了一系列的探索和实践,并将其中一些通能的能力进行了产品化.本文从问题 ...

  2. 为什么Mendix重视私有化部署

    私有化部署的诉求 现在很多企业在考察基础设施的时候,都会考虑许多因素.诚然云计算在目前和未来,因为它的灵活性.从节省时间到金钱.从提高敏捷性到更好的伸缩性,因此越来越受欢迎.但另一方面,如果上升到企业 ...

  3. 神策数据张铎:一文读懂神策私有化部署的架构演进

    在神策 2021 数据驱动大会北京场技术论坛上,神策数据首席架构师张铎发表了主题为<神策私有化部署的架构演进>的演讲,本文为精选内容.主要包括: 私有化部署的意义 神策私有化部署的演进及技 ...

  4. k8s aws 部署_如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署

    k8s aws 部署 by Adam Watt 通过亚当·瓦特 如何在短短30分钟内使用CircleCI设置到AWS S3的持续部署 (How to setup Continuous Deployme ...

  5. centos7 如何安装部署k8s_五步教你如何使用k8s快速部署ES

    前言 今天小编打算用五步教大家如何使用k8s快速部署ES,有兴趣的小伙伴可以了解一下~ 由于是使用本地存储,所以需要先创建pv 1.创建存储类 local-elasticsearch.yaml kin ...

  6. k8s pod部署到不同node_部署Dotnet Core应用到Kubernetes(一) - 老王Plus

    最近闲了点,写个大活:部署Dotnet应用到K8s. 写在前边的话 一直想完成这个主题.但这个主题实在太大了,各种拖延症的小宇宙不时爆发一下,结果就拖到了现在. 这个主题,会是一个系列.在这个系列中, ...

  7. 小时级部署,客户数上千,神策数据的私有化部署靠什么取胜?

    秉承着"做正确的事情,而不做简单的事情"的理念,神策数据自创立之初,就采用"私有化部署 + SaaS "的企业服务模式,这无疑是一条更难的路,但通过在这一方向上 ...

  8. 策小编脑中的“私有化部署”

    大家好,上个策小编被开除了, 换王富贵儿来给大家讲故事, 哈哈逗你们的-- 王小明辛苦搬砖在五环, 后厂村路互联网做运营, 老板引进数据驱动理念, 不懂技术咋分析求产品. 二表哥根正苗红在北京, 通州 ...

  9. 三家逐鹿,私有化部署能帮神策数据杀出重围么?| 公司调研

    2015年5月,桑文锋离开百度,创建神策数据. 桑文锋从浙大毕业后去了百度,在百度工作的九年间,大部分时间都在与数据打交道.从日志统计分析到百度数仓,再到搭建数据平台.建立神策数据后,尽管做的事情不同 ...

最新文章

  1. Vivado下几条 Verilog 综合规则
  2. 下载服务器 linux系统,如何搭建Linux服务器
  3. matplotlib 第二次执行报错在 django web服务中
  4. 大一计算机应用基础答案李小艳,13级幼师班期末考试计算机试题A卷
  5. 博士的浪漫,就是把你写进论文致谢,保存一辈子
  6. ORM框架之Mybatis(四)MyBatis生成器,逆向工程生成实体类和SQL
  7. Windows API数据类型表
  8. 利用python将图片版PDF转文字版PDF
  9. xcode ios 模拟器下载安装
  10. DynamipsGUI 2.3中文版
  11. windows必备的驱动软件推荐
  12. Excel学习日记:L4-资料排序
  13. Unity3D 实现阴阳师 画符
  14. 不安全!!!都2020年了,你的网站还没上HTPPS说得过去吗?
  15. Linux常用快捷键、文件管理和查询
  16. 省市县地址联动插件distpicker 代码及示例
  17. 软件公司如何才能接到项目
  18. IO密集型线程和CPU密集型线程
  19. 日入上万,Jack 年入百万?
  20. Pycharm工具栏等菜单设置

热门文章

  1. 斗牛太危险,来斗HEXA吧
  2. 高级Android研发面试必问:Android屏幕适配全方位解析
  3. 使用Unity3D提取王者荣耀英雄模型 VR资源
  4. Wsl与Windows互相访问
  5. 【Vegas原创】wordpress 从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。此响应不是合法的JSON响应。解决方法。...
  6. Easy Binding(DataContext,TwoWay)
  7. 准大学生必看!这10个建议,真希望计算机专业的学生早点知道
  8. linux中如何查看某个端口是否被占用
  9. 华为防火墙查看日志命令_华为USG防火墙运维命令大全word精品
  10. [转]Bram和Dram的区别