{"id":45967,"date":"2023-11-19T17:31:33","date_gmt":"2023-09-24T05:17:07","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/"},"modified":"2024-05-04T09:51:44","modified_gmt":"2024-05-04T01:51:44","slug":"45967-2","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/","title":{"rendered":""},"content":{"rendered":"<p>\u6700\u8fd1\u6d41\u884c\u308a\u306eJupyter Notebook( http:\/\/jupyter.org\/ )\u3067kubectl\u30b3\u30de\u30f3\u30c9\u3092\u547c\u3073\u51fa\u3059\u3053\u3068\u3067\u3001\u751f\u304d\u3066\u3044\u308b\u624b\u9806\u66f8\u304c\u4f5c\u308c\u308b\u306e\u3067\u306f\uff1f\u3068\u601d\u3063\u305f\u306e\u3067\u3001\u8a66\u3057\u3066\u307f\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u3053\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3067\u306fKubernetes\u30af\u30e9\u30b9\u30bf\u306e\u4e2d\u306bJupyter Notebook\u3092\u30c7\u30d7\u30ed\u30a4\u3057\u3001\u305d\u3053\u304b\u3089\u81ea\u8eab\u304c\u30c7\u30d7\u30ed\u30a4\u3055\u308c\u3066\u3044\u308b\u3001Kubernetes\u30af\u30e9\u30b9\u30bf\u3092\u64cd\u4f5c\u3059\u308b\u65b9\u6cd5\u3092\u7d39\u4ecb\u3057\u307e\u3059\u3002<\/p>\n<h1>\u524d\u63d0\u6761\u4ef6<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">minkube<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">kubectl<\/ul>\n<p>\u306f\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u6e08\u307f\u3068\u3057\u307e\u3059\u3002<\/p>\n<h1>minikube\u306b\u3088\u308bKubernetes\u30af\u30e9\u30b9\u30bf\u306e\u4f5c\u6210<\/h1>\n<pre class=\"post-pre\"><code>$ minikube start\r\nStarting local Kubernetes v1.10.0 cluster...\r\nStarting VM...\r\nGetting VM IP address...\r\nMoving files into cluster...\r\nSetting up certs...\r\nConnecting to cluster...\r\nSetting up kubeconfig...\r\nStarting cluster components...\r\nKubectl is now configured to use the cluster.\r\nLoading cached images from config file.\r\n<\/code><\/pre>\n<h1>python kernel\u3092\u3064\u304b\u3063\u3066\u307f\u308b<\/h1>\n<p>\u307e\u305a\u306f\u30b7\u30f3\u30d7\u30eb\u306a\u666e\u901a\u306e\u6a5f\u80fd\u3092\u8a66\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<h2>Jupyter Notebook\u306e\u30c7\u30d7\u30ed\u30a4<\/h2>\n<p>\u307e\u305a\u306f\u516c\u5f0f\u3067\u7528\u610f\u3057\u3066\u3044\u308bminimal-notebook\u306e\u30b3\u30f3\u30c6\u30ca\u30a4\u30e1\u30fc\u30b8\u3092\u4f7f\u3063\u3066\u307f\u308b\u3053\u3068\u306b\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apps\/v1<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deployment<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n  <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"m\">1<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">matchLabels<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n    <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">containers<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minimal-notebook<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter\/minimal-notebook:latest<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">8888<\/span>\r\n        <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">start-notebook.sh\"<\/span><span class=\"pi\">]<\/span>\r\n        <span class=\"na\">args<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">--NotebookApp.token=''\"<\/span><span class=\"pi\">]<\/span>\r\n<span class=\"nn\">---<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Service<\/span>\r\n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">NodePort<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n  <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">protocol<\/span><span class=\"pi\">:<\/span> <span class=\"s\">TCP<\/span>\r\n    <span class=\"na\">nodePort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30040<\/span>\r\n    <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"m\">8888<\/span>\r\n    <span class=\"na\">targetPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">8888<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>$ kubectl apply -f jupyter.yaml\r\n<\/code><\/pre>\n<h2>\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u30b5\u30fc\u30d3\u30b9\u306e\u78ba\u8a8d<\/h2>\n<pre class=\"post-pre\"><code>$ kubectl get svc\r\nNAME               TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE\r\njupyter-notebook   NodePort    10.100.161.148   &lt;none&gt;        8888:30040\/TCP   5m\r\nkubernetes         ClusterIP   10.96.0.1        &lt;none&gt;        443\/TCP          25d\r\n<\/code><\/pre>\n<h2>\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u30a2\u30af\u30bb\u30b9<\/h2>\n<p>\u307e\u305aminikube\u306eIP\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>$ minikube ip\r\n192.168.99.100\r\n<\/code><\/pre>\n<p>\u30b5\u30fc\u30d3\u30b9\u306eNodePort\u306f30040\u306a\u306e\u3067\u3053\u306e\u5834\u5408\u306f\u4e0b\u8a18\u306e\u30a2\u30c9\u30ec\u30b9\u3092\u30d6\u30e9\u30a6\u30b6\u3067\u958b\u304d\u307e\u3059\u3002<\/p>\n<h2>notebook\u306e\u4f5c\u6210<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/21-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u8a66\u3057\u306b\u66f8\u3044\u3066\u307f\u308b<\/h2>\n<p>Jupyter Notebook\u306f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092Cell\u3068\u3044\u3046\u5358\u4f4d\u3067\u8a18\u8ff0\u3057\u307e\u3059\u3002Cell\u306b\u306fMarkDown\u306e\u30e2\u30fc\u30c9\u3068\u30b3\u30fc\u30c9\u306e\u30e2\u30fc\u30c9\u306a\u3069\u304c\u3042\u308a\u307e\u3059\u3002<br \/>\n\u30b3\u30fc\u30c9\u306e\u30e2\u30fc\u30c9\u306e\u6642\u306b\u666e\u901a\u306b\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u66f8\u304f\u3068Python\u3068\u3057\u3066\u89e3\u91c8\u3055\u308c\u3001!\u3092\u524d\u7f6e\u3059\u308b\u3068\u30b7\u30a7\u30eb\u30b9\u30af\u30ea\u30d7\u30c8\u3068\u3057\u3066\u89e3\u91c8\u3055\u308c\u307e\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/24-0.png\" alt=\"image.png\" \/><\/div>\n<h2>kubectl\u3092\u547c\u3073\u51fa\u3059<\/h2>\n<p>!\u3092\u524d\u7f6e\u3059\u308b\u3053\u3068\u3067\u30b7\u30a7\u30eb\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u52d5\u304f\u306e\u3067wget\u30b3\u30de\u30f3\u30c9\u3067kubectl\u306e\u30d0\u30a4\u30ca\u30ea\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3001\u5b9f\u884c\u3057\u3066\u307f\u307e\u3059\u3002<\/p>\n<p>\u5b9f\u884c\u3057\u305f\u30b3\u30de\u30f3\u30c9\u306f\u4e0b\u8a18\u3067\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>!wget https:\/\/storage.googleapis.com\/kubernetes-release\/release\/v1.12.0\/bin\/linux\/amd64\/kubectl\r\n!chmod 755 kubectl\r\n!.\/kubectl get pod\r\n<\/code><\/pre>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/29-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u6a29\u9650\u306f\u7121\u3044\u304c\u3001\u4e00\u5fdc\u52d5\u3044\u3066\u3044\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3059\u3002<br \/>\n\u3053\u306e\u30b7\u30a7\u30eb\u30b9\u30af\u30ea\u30d7\u30c8\u306fKubernetes\u306b\u30c7\u30d7\u30ed\u30a4\u3055\u308c\u305fPod\u306e\u4e2d\u3067\u52d5\u4f5c\u3057\u3066\u304a\u308a\u3001\u6a29\u9650\u3068\u3057\u3066\u306f\u30c7\u30d5\u30a9\u30eb\u30c8\u3067\u4f5c\u6210\u3055\u308c\u308bdefault\u3068\u3044\u3046\u540d\u524d\u306eServiceAccount\u306e\u6a29\u9650\u3067\u52d5\u4f5c\u3057\u307e\u3059\u3002\uff08\u3053\u308c\u3089\u306f\u74b0\u5883\u5909\u6570\u306b\u3088\u3063\u3066\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u6c17\u306b\u306a\u308b\u65b9\u306f!env\u3092Notebook\u3067\u5b9f\u884c\u3059\u308b\u3068\u308f\u304b\u308a\u307e\u3059\uff09<\/p>\n<h2>\u6a29\u9650\u3092\u4ed8\u4e0e\u3059\u308b<\/h2>\n<p>default\u306eServiceAccount\u306b\u6a29\u9650\u3092\u4e0e\u3048\u307e\u3059\u3002\u4e0b\u8a18\u30b3\u30de\u30f3\u30c9\u306fview\u3068\u3044\u3046\u6a19\u6e96\u3067\u7528\u610f\u3055\u308c\u3066\u3044\u308bRole\u3092default\u3068\u3044\u3046ServiceAccount\u306b\u7d10\u3065\u3051\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl create rolebinding default-sa --clusterrole=view --serviceaccount=default:default\r\nrolebinding.rbac.authorization.k8s.io\/default-sa created\r\n<\/code><\/pre>\n<p>\u518d\u5ea6\u5b9f\u884c\u3059\u308b\u3068\u3001\u5b9f\u884c\u3067\u304d\u307e\u3057\u305f\uff01<br \/>\n\u3053\u308c\u304c\u3084\u308a\u305f\u304b\u3063\u305f\u3053\u3068\u3067\u3059\uff01<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/35-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u4e00\u5ea6\u5168\u3066\u524a\u9664\u3059\u308b<\/h2>\n<p>\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u306b\u884c\u304f\u524d\u306b\u4e00\u5ea6\u30c7\u30d7\u30ed\u30a4\u3057\u305fjupyter notebook\u3092\u524a\u9664\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl delete -f jupyter.yaml\r\ndeployment.apps \"jupyter-notebook\" deleted\r\nservice \"jupyter-notebook\" deleted\r\n<\/code><\/pre>\n<h1>bash kernel\u3092\u3064\u304b\u3063\u3066\u307f\u308b<\/h1>\n<p>\u3053\u3053\u307e\u3067\u3067\u3001Jupyter Notebook\u3067kubectl\u304c\u5b9f\u884c\u3067\u304d\u308b\u3053\u3068\u304c\u308f\u304b\u308a\u307e\u3057\u305f\u304c\u3001\u5b9f\u884c\u3059\u308b\u6642\u306b\u5148\u982d\u306b!\u3092\u3064\u3051\u308b\u306e\u304c\u3069\u3046\u306b\u3082\u7169\u308f\u3057\u3044\u3067\u3059\u3002<\/p>\n<p>\u3053\u308c\u306fPython kernel\u3092\u4f7f\u3063\u3066\u3044\u308b\u305f\u3081\u30c7\u30d5\u30a9\u30eb\u30c8\u3068\u3057\u3066Python\u306e\u30b3\u30fc\u30c9\u3068\u3057\u3066\u52d5\u4f5c\u3057\u3066\u3044\u308b\u304b\u3089\u3067\u3059\u3002<br \/>\n\u305d\u3053\u3067\u3001Bash kernel\u3092\u4f7f\u3046\u3053\u3068\u3067\u3082\u3063\u3068\u7d20\u76f4\u306b\u30b7\u30a7\u30eb\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u5b9f\u884c\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u307e\u3057\u3087\u3046\u3002<\/p>\n<h2>Docker\u30a4\u30e1\u30fc\u30b8\u306e\u4f5c\u6210<\/h2>\n<p>bash kernel\u306e\u5165\u3063\u305fDocker\u30a4\u30e1\u30fc\u30b8\u304c\u898b\u5f53\u305f\u3089\u306a\u304b\u3063\u305f\u306e\u3067\u81ea\u5206\u3067\u4f5c\u308a\u307e\u3059\u3002<br \/>\n\u307e\u305f\u51fa\u529b\u3092\u7b49\u5e45\u30d5\u30a9\u30f3\u30c8\u306b\u3059\u308b\u3053\u3068\u3067\u3001\u51fa\u529b\u7d50\u679c\u304c\u7dba\u9e97\u306b\u8868\u793a\u3055\u308c\u308b\u3088\u3046\u306b\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> jupyter\/minimal-notebook<\/span>\r\n\r\n<span class=\"k\">USER<\/span><span class=\"s\"> jovyan<\/span>\r\n\r\n<span class=\"c\"># Make sure not to create a cache dir else NB_UID switching<\/span>\r\n<span class=\"c\"># will hit issues.<\/span>\r\n<span class=\"k\">RUN <\/span>\/opt\/conda\/bin\/pip <span class=\"nb\">install<\/span> <span class=\"nt\">--no-cache-dir<\/span> bash_kernel\r\n<span class=\"k\">RUN <\/span>\/opt\/conda\/bin\/python <span class=\"nt\">-m<\/span> bash_kernel.install\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">mkdir<\/span> <span class=\"nt\">-p<\/span> ~\/.jupyter\/custom <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">echo<\/span> <span class=\"s1\">'.CodeMirror pre, .output pre { font-family: Monaco, monospace; }'<\/span> <span class=\"o\">&gt;<\/span> ~\/.jupyter\/custom\/custom.css\r\n\r\n<span class=\"k\">USER<\/span><span class=\"s\"> root<\/span>\r\n<\/code><\/pre>\n<p>minikube\u306eDocker\u3092\u4f7f\u3063\u3066\u30d3\u30eb\u30c9\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>$ eval $(minikube docker-env)\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>$ docker build -t bash-notebook:v1.0 .\r\nSending build context to Docker daemon  3.584kB\r\nStep 1\/6 : FROM jupyter\/minimal-notebook\r\n ---&gt; 400c44c4a7a7\r\nStep 2\/6 : USER jovyan\r\n ---&gt; 858a23692f3d\r\nStep 3\/6 : RUN \/opt\/conda\/bin\/pip install --no-cache-dir bash_kernel\r\n ---&gt; 33313772919f\r\nStep 4\/6 : RUN \/opt\/conda\/bin\/python -m bash_kernel.install\r\n ---&gt; 6ce76d215977\r\nStep 5\/6 : RUN mkdir -p ~\/.jupyter\/custom &amp;&amp; echo '.CodeMirror pre, .output pre { font-family: Monaco, monospace; }' &gt; ~\/.jupyter\/custom\/custom.css\r\n ---&gt; ebbcec57eea2\r\nStep 6\/6 : USER root\r\n ---&gt; feb1400abc10\r\nSuccessfully built feb1400abc10\r\nSuccessfully tagged bash-notebook:v1.0\r\n<\/code><\/pre>\n<h2>\u30c7\u30d7\u30ed\u30a4<\/h2>\n<p>\u4e0b\u8a18\u306e\u3088\u3046\u306b\u30de\u30cb\u30d5\u30a7\u30b9\u30c8\u3092\u5909\u66f4\u3057\u3066\u30c7\u30d7\u30ed\u30a4\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apps\/v1<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deployment<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n  <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"m\">1<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">matchLabels<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n    <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">containers<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minimal-notebook<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">bash-notebook:v1.0<\/span>  <span class=\"c1\"># \u30a4\u30e1\u30fc\u30b8\u540d\u3092\u5909\u66f4<\/span>\r\n        <span class=\"na\">imagePullPolicy<\/span><span class=\"pi\">:<\/span> <span class=\"s\">IfNotPresent<\/span> <span class=\"c1\"># minikube\u5185\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u4f7f\u3046<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">8888<\/span>\r\n        <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">start-notebook.sh\"<\/span><span class=\"pi\">]<\/span>\r\n        <span class=\"na\">args<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">--NotebookApp.token=''\"<\/span><span class=\"pi\">]<\/span>\r\n<span class=\"nn\">---<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Service<\/span>\r\n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">NodePort<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">jupyter-notebook<\/span>\r\n  <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">protocol<\/span><span class=\"pi\">:<\/span> <span class=\"s\">TCP<\/span>\r\n    <span class=\"na\">nodePort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">30040<\/span>\r\n    <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"m\">8888<\/span>\r\n    <span class=\"na\">targetPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">8888<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code> $ kubectl apply -f jupyter-bash.yaml\r\ndeployment.apps\/jupyter-notebook created\r\nservice\/jupyter-notebook created\r\n<\/code><\/pre>\n<h2>\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u30a2\u30af\u30bb\u30b9<\/h2>\n<p>\u30a2\u30c9\u30ec\u30b9\u306f\u524d\u3068\u540c\u3058\u3067\u3059\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/54-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u904a\u3093\u3067\u307f\u308b<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/56-0.png\" alt=\"image.png\" \/><\/div>\n<h1>\u611f\u60f3<\/h1>\n<p>kubernetes\u306e\u30c1\u30e5\u30fc\u30c8\u30ea\u30a2\u30eb\u306a\u3069\u3092\u4f5c\u308b\u306e\u306b\u826f\u3055\u305d\u3046\u3068\u611f\u3058\u307e\u3057\u305f\u3002<\/p>\n<h1>\u53c2\u8003<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Kubernetes\u4e0a\u306bjupyter notebook\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>https:\/\/cwienczek.com\/2018\/05\/jupyter-on-kubernetes&#8212;the-easy-way\/<\/p>\n<p>jupyer notebook\u306ebash-kernel\u304c\u4fbf\u5229\u3068\u3044\u3046\u8a18\u4e8b<\/p>\n<p>https:\/\/raintrees.net\/news\/76<\/p>\n<p>bash-kernel\u5165\u308a\u306eDockerfile\u306e\u4f5c\u308a\u65b9<\/p>\n<p>https:\/\/github.com\/jupyter\/docker-stacks\/issues\/25#issuecomment-139444841<\/p>\n<p>jupyter notebook\u306e\u30d5\u30a9\u30f3\u30c8\u3092\u7b49\u5e45\u306b\u3059\u308b<\/p>\n<p><iframe class=\"wp-embedded-content\" sandbox=\"allow-scripts\" security=\"restricted\" title=\"Jupyter notebook\u3092\u7b49\u5e45\u30d5\u30a9\u30f3\u30c8\u306b\u3059\u308b - \u6587\u7cfb\u30c7\u30fc\u30bf\u30b5\u30a4\u30a8\u30f3\u30c6\u30a3\u30b9\u30c8\u306e\u5099\u5fd8\u9332\" src=\"https:\/\/hatenablog-parts.com\/embed?url=http%3A%2F%2Fshu87.hateblo.jp%2Fentry%2F2017%2F08%2F30%2F003224#?secret=BMWqCk1oue\" data-secret=\"BMWqCk1oue\" scrolling=\"no\" frameborder=\"0\"><\/iframe><\/p>\n<p>minikube\u3067\u30ed\u30fc\u30ab\u30eb\u306edocker image\u3092\u4f7f\u3046<\/p>\n<p>https:\/\/qiita.com\/ocadaruma\/items\/efe720e46ae7ecb9ec25<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u6700\u8fd1\u6d41\u884c\u308a\u306eJupyter Notebook( http:\/\/jupyter.org\/ )\u3067kubectl\u30b3\u30de [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-45967","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>- Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:description\" content=\"\u6700\u8fd1\u6d41\u884c\u308a\u306eJupyter Notebook( http:\/\/jupyter.org\/ )\u3067kubectl\u30b3\u30de [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-24T05:17:07+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-04T01:51:44+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/21-0.png\" \/>\n<meta name=\"author\" content=\"\u6587, \u7fd4\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6587, \u7fd4\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/\",\"name\":\"- Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-09-24T05:17:07+00:00\",\"dateModified\":\"2024-05-04T01:51:44+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\",\"name\":\"\u6587, \u7fd4\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"caption\":\"\u6587, \u7fd4\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"- Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/","og_locale":"zh_CN","og_type":"article","og_description":"\u6700\u8fd1\u6d41\u884c\u308a\u306eJupyter Notebook( http:\/\/jupyter.org\/ )\u3067kubectl\u30b3\u30de [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-09-24T05:17:07+00:00","article_modified_time":"2024-05-04T01:51:44+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d621c37434c4406cff168\/21-0.png"}],"author":"\u6587, \u7fd4","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6587, \u7fd4","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"3 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/","name":"- Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-09-24T05:17:07+00:00","dateModified":"2024-05-04T01:51:44+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/"]}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c","name":"\u6587, \u7fd4","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","caption":"\u6587, \u7fd4"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/45967-2\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45967","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=45967"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45967\/revisions"}],"predecessor-version":[{"id":97611,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/45967\/revisions\/97611"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=45967"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=45967"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=45967"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}