{"id":35936,"date":"2023-07-25T19:18:59","date_gmt":"2023-09-11T21:09:47","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/"},"modified":"2024-04-30T15:19:18","modified_gmt":"2024-04-30T07:19:18","slug":"%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/","title":{"rendered":"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001"},"content":{"rendered":"<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Python\u306eslackbot\u3092Kubernetes\u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3066Pod\u306e\u72b6\u6cc1\u3092\u78ba\u8a8d\u3059\u308b<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Python\u306eslackbot\u306ePod\u304b\u3089kubectl\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3055\u305b\u308b<\/ul>\n<p>\u3068\u3044\u3046\u3053\u3068\u3092\u3084\u3063\u3066\u307f\u305f\u304c\u3001Python\u306eslackbot\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u306f\u306a\u304f\u3001Bot\u3068\u3057\u3066\u306f\u3088\u308a\u30e1\u30b8\u30e3\u30fc\u3067\u3042\u308b\u3089\u3057\u3044Hubot\u3092\u8a66\u3059\u3002<\/p>\n<h2>Slack\u306e\u6e96\u5099<\/h2>\n<p>\u5728\u4e0b\u9762\u6dfb\u52a0Hubut\u7684\u6574\u5408\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/slack.com\/apps\/A0F7XDU93-hubot<\/ul>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/5-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u8bf7\u786e\u4fdd\u4e4b\u540e\u80fd\u4f7f\u7528\u8be5\u4ee4\u724c\u3002<\/p>\n<p>\u9080\u8bf7\u673a\u5668\u4eba\u52a0\u5165\u9891\u9053\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/8-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u51c6\u5907\u672c\u5730\u6267\u884c<\/h2>\n<p>\u30ed\u30fc\u30ab\u30eb\u3067Hubot\u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306bNode.js\u306e\u74b0\u5883\u3092\u6574\u3048\u308b\u3002<\/p>\n<h3>nodenv\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb<\/h3>\n<p>\u6709\u5f88\u591a\u7528\u4e8e\u7ba1\u7406Node.js\u7248\u672c\u7684\u5de5\u5177\uff0c\u4f8b\u5982nvm\u3001nodebrew\u7b49\u3002\u6211\u539f\u672c\u60f3\u8981\u5b89\u88c5ndenv\uff0c\u4f46\u5b83\u5df2\u7ecf\u88ab\u6807\u6ce8\u4e3a[Deprecated]\uff0c\u6240\u4ee5\u6211\u51b3\u5b9a\u5b89\u88c5\u63a8\u8350\u7684nodenv\u6765\u66ff\u4ee3\u5b83\u3002<\/p>\n<pre class=\"post-pre\"><code>brew <span class=\"nb\">install <\/span>nodenv\r\n<\/code><\/pre>\n<p>\u5c06\u4ee5\u4e0b\u5185\u5bb9\u6dfb\u52a0\u5230.bash_profile\u6587\u4ef6\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">eval<\/span> <span class=\"s2\">\"<\/span><span class=\"si\">$(<\/span>nodenv init -<span class=\"si\">)<\/span><span class=\"s2\">\"<\/span>\r\n<\/code><\/pre>\n<p>\u91cd\u65b0\u542f\u52a8\u7ec8\u7aef\u3002<\/p>\n<h3>\u5b89\u88c5 Node.js<\/h3>\n<p>\u68c0\u67e5\u53ef\u5b89\u88c5\u7684Node.js\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code>nodenv <span class=\"nb\">install<\/span> <span class=\"nt\">-l<\/span>\r\n<\/code><\/pre>\n<p>\u5b89\u88c5LTS\u7248\u672c\u7684\u6700\u65b0\u53d1\u884c\u7248\u3002<\/p>\n<pre class=\"post-pre\"><code>nodenv <span class=\"nb\">install <\/span>10.15.0\r\n<\/code><\/pre>\n<p>\u6307\u5b9a\u8981\u5728\u5168\u7403\u4f7f\u7528\u7684\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code>nodenv global 10.15.0\r\n<\/code><\/pre>\n<p>\u8bf7\u786e\u4fdd\u66f4\u65b0npm\u3002<\/p>\n<pre class=\"post-pre\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> npm\r\n<\/code><\/pre>\n<p>\u67e5\u770b\u7248\u672c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> node <span class=\"nt\">-v<\/span>\r\n<span class=\"go\">v10.15.0\r\n<\/span><span class=\"gp\">$<\/span> npm <span class=\"nt\">-v<\/span>\r\n<span class=\"go\">6.7.0\r\n<\/span><\/code><\/pre>\n<h3>\u5b89\u88c5Hubot<\/h3>\n<p>\u4ee5\u4e0b\u306b\u5f93\u3044yo\u3068generator-hubot\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/hubot.github.com\/docs\/<\/ul>\n<pre class=\"post-pre\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> yo generator-hubot\r\n<\/code><\/pre>\n<p>\u91cd\u65b0\u542f\u52a8\u7ec8\u7aef\u3002<\/p>\n<h2>\u5728\u672c\u5730\u6d4b\u8bd5Hubot<\/h2>\n<p>\u9996\u5148\uff0c\u5728\u672c\u5730\u5c1d\u8bd5\u8fd0\u884cHubot\u3002<\/p>\n<h3>\u521b\u5efa\u804a\u5929\u673a\u5668\u4eba<\/h3>\n<p>\u521b\u5efa\u4e00\u4e2a\u76ee\u5f55\u5e76\u521b\u5efa\u6a21\u677f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">mkdir <\/span>myhubot-shell\r\n<span class=\"nb\">cd <\/span>myhubot-shell\r\nyo hubot\r\n<\/code><\/pre>\n<p>\u4e3a\u4e86\u5728\u672c\u5730\u8fd0\u884c\uff0c\u9996\u5148\u9700\u8981\u6307\u5b9a\u4e00\u4e2a\u7528\u4e8e\u9002\u914d\u7684shell\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/hubot.github.com\/docs\/adapters\/shell\/<\/ul>\n<p><script><\/script><\/p>\n<h3>\u5e73\u5747<\/h3>\n<p>\u307e\u305a\u306fHubot\u3092\u8d77\u52d5\u3057\u3066Ping\u3057\u3066\u307f\u308b\u3002\u8d77\u52d5\u6642\u306b\u8b66\u544a\u306a\u3069\u3067\u3066\u3044\u308b\u304c\u3068\u308a\u3042\u3048\u305a\u7121\u8996\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> bin\/hubot\r\n<span class=\"go\">audited 179 packages in 0.765s\r\nfound 0 vulnerabilities\r\n\r\nbody-parser deprecated undefined extended: provide extended option node_modules\/hubot\/src\/robot.js:446:21\r\nNo history available\r\n<\/span><span class=\"gp\">myhubot-shell&gt;<\/span> <span class=\"o\">[<\/span>Fri Feb 01 2019 11:31:01 GMT+0900 <span class=\"o\">(<\/span>GMT+09:00<span class=\"o\">)]<\/span> WARNING Loading scripts from hubot-scripts.json is deprecated and will be removed <span class=\"k\">in <\/span>3.0 <span class=\"o\">(<\/span>https:\/\/github.com\/github\/hubot-scripts\/issues\/1113<span class=\"o\">)<\/span> <span class=\"k\">in <\/span>favor of packages <span class=\"k\">for <\/span>each script.\r\n<span class=\"go\">\r\nYour hubot-scripts.json is empty, so you just need to remove it.\r\n[Fri Feb 01 2019 11:31:01 GMT+0900 (GMT+09:00)] INFO hubot-redis-brain: Using default redis on localhost:6379\r\n<\/span><span class=\"gp\">[Fri Feb 01 2019 11:31:01 GMT+0900 (GMT+09:00)] ERROR hubot-heroku-keepalive included, but missing HUBOT_HEROKU_KEEPALIVE_URL. `heroku config:set HUBOT_HEROKU_KEEPALIVE_URL=$<\/span><span class=\"o\">(<\/span>heroku apps:info <span class=\"nt\">-s<\/span> | <span class=\"nb\">grep <\/span>web.url | <span class=\"nb\">cut<\/span> <span class=\"nt\">-d<\/span><span class=\"o\">=<\/span> <span class=\"nt\">-f2<\/span><span class=\"o\">)<\/span><span class=\"sb\">`<\/span>\r\n\r\n<span class=\"gp\">myhubot-shell&gt;<\/span> myhubot-shell ping\r\n<span class=\"gp\">myhubot-shell&gt;<\/span> PONG\r\n\r\n<span class=\"gp\">myhubot-shell&gt;<\/span>\r\n<\/code><\/pre>\n<h3>\u30b9\u30af\u30ea\u30d7\u30c8\u306e\u4f5c\u6210<\/h3>\n<p>scripts\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u306b\u30b5\u30f3\u30d7\u30eb\u304c\u3042\u308b\u3002\u3068\u308a\u3042\u3048\u305a\u30b9\u30af\u30ea\u30d7\u30c8\u3092\u4f5c\u3063\u3066\u307f\u308b\u3002\u4ee5\u4e0b\u306eURL\u306b\u3082\u89e3\u8aac\u304c\u3042\u308b\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/hubot.github.com\/docs\/scripting\/<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"na\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">robot<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n\r\n  <span class=\"nx\">robot<\/span><span class=\"p\">.<\/span><span class=\"na\">hear<\/span> <span class=\"sr\">\/hello\/i<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"na\">send<\/span> <span class=\"s\">\"Hello World!\"<\/span>\r\n\r\n  <span class=\"nx\">robot<\/span><span class=\"p\">.<\/span><span class=\"na\">respond<\/span> <span class=\"sr\">\/how are you\/i<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"na\">reply<\/span> <span class=\"s\">\"I am fine!\"<\/span>\r\n<\/code><\/pre>\n<p>\u6295\u7a3f\u3092\u30a6\u30a9\u30c3\u30c1\u3059\u308bhear\u3068\u3001\u547c\u3073\u304b\u3051\u306b\u5fdc\u7b54\u3059\u308brespond\u304c\u3042\u308b\u3002Python\u306eslackbot\u3068\u3088\u304f\u4f3c\u3066\u3044\u308b\u3002<\/p>\n<p>myhubot-shell\u3068\u547c\u3073\u304b\u3051\u308b\u306e\u306f\u3084\u3084\u9577\u3044\u306e\u3067\u3001\u5f15\u6570\u3067\u540d\u524d\u3092hubot\u3068\u6307\u5b9a\u3057\u3066\u8d77\u52d5\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>bin\/hubot <span class=\"nt\">--name<\/span> hubot\r\n<\/code><\/pre>\n<p>\u5c1d\u8bd5\u63d0\u4ea4\u6295\u7a3f\u548c\u53d1\u8d77\u547c\u5401\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">hubot&gt;<\/span> hello\r\n<span class=\"gp\">hubot&gt;<\/span> Hello World!\r\n\r\n<span class=\"gp\">hubot&gt;<\/span> hubot How are you?\r\n<span class=\"gp\">hubot&gt;<\/span> Shell: I am fine!\r\n\r\n<span class=\"gp\">hubot&gt;<\/span>\r\n<\/code><\/pre>\n<h3>\u6211\u8981\u8a66\u8a66\u793e\u5340\u8173\u672c\u3002<\/h3>\n<p>Hubot\u306f\u30b3\u30df\u30e5\u30cb\u30c6\u30a3\u30fc\u30b9\u30af\u30ea\u30d7\u30c8\u304c\u305f\u304f\u3055\u3093\u3042\u308b\u3088\u3046\u306a\u306e\u3067\u3001Kubernetes\u95a2\u9023\u306e\u30d1\u30c3\u30b1\u30fc\u30b8\u3092\u63a2\u3057\u3066\u307f\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> npm search hubot-scripts kubernetes\r\n<span class=\"go\">NAME                      | DESCRIPTION          | AUTHOR          | DATE       | VERSION  | KEYWORDS\r\nrk295-hubot-kubernetes    | Hubot Kubernetes\u2026    | =rk295          | 2018-08-10 | 0.0.4    | hubot hubot-scripts kuberne\r\nhubot-k8s                 | A hubot script for\u2026  | =kevin_schmidt  | 2018-12-25 | 0.1.0    | hubot hubot-scripts k8s kub\r\nhubot-sbueringer-kubernet | Hubot Kubernetes\u2026    | =sbueringer     | 2017-06-02 | 0.4.2    | hubot hubot-scripts kuberne\r\nes                        |                      |                 |            |          |\r\nhubot-kubernetes          | Hubot Kubernetes\u2026    | =canthefason    | 2016-01-18 | 0.3.0    | hubot hubot-scripts kuberne\r\n<\/span><span class=\"gp\">$<\/span> npm home hubot-k8s\r\n<span class=\"gp\">$<\/span>\r\n<\/code><\/pre>\n<p>\u6709\u5f88\u591a\u9009\u9879\uff0c\u4f46\u6211\u60f3\u8bd5\u8bd5\u76f8\u5bf9\u7ef4\u62a4\u826f\u597d\u7684hubot-k8s\u3002<br \/>\n\u53ef\u4ee5\u4f7f\u7528npm home hubot-k8s\u547d\u4ee4\u6253\u5f00\u8be5\u8f6f\u4ef6\u5305\u7684\u4e3b\u9875\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/github.com\/kevinschmidt\/hubot-k8s<\/ul>\n<p>\u5b89\u88c5\u8f6f\u4ef6\u5305\u3002<\/p>\n<pre class=\"post-pre\"><code>npm <span class=\"nb\">install<\/span> <span class=\"nt\">--save<\/span> hubot-k8s\r\n<\/code><\/pre>\n<p>\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u305f\u30d1\u30c3\u30b1\u30fc\u30b8\u3092external-scripts.json\u306b\u8ffd\u8a18\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">[<\/span>\r\n  <span class=\"s2\">\"hubot-diagnostics\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-help\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-heroku-keepalive\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-google-images\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-google-translate\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-pugme\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-maps\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-redis-brain\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-rules\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-shipit\"<\/span><span class=\"p\">,<\/span>\r\n  <span class=\"s2\">\"hubot-k8s\"<\/span>\r\n<span class=\"p\">]<\/span>\r\n<\/code><\/pre>\n<p>hubot-k8s\u304b\u3089\u306e\u63a5\u7d9a\u3092\u8a66\u3059\u305f\u3081\u3001Minikube\u3092\u8d77\u52d5\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>minikube start\r\n<\/code><\/pre>\n<p>\u5728hubot-k8s\u4e2d\uff0c\u9700\u8981\u4f7f\u7528\u4e0b\u9762\u7684\u73af\u5883\u53d8\u91cf\u6765\u4f20\u9012\u4e0ekube-apiserver\u7684\u8fde\u63a5\u4fe1\u606f\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">HUBOT_K8S_CONTEXTS<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">HUBOT_K8S_DEFAULT_CONTEXT<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">HUBOT_K8S_DEFAULT_NAMESPACE<\/ul>\n<p>HUBOT_K8S_CONTEXTS \u7684json\u5982\u4e0b\u6240\u793a\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"prod\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"server\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"https:\/\/kubernetes.cluster.io\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"ca\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\".\/ca.crt\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"dashboardPrefix\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"https:\/\/kubernetes.cluster.io\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"token\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"&lt;kubernetes token&gt;\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u8fde\u63a5\u5230Minikube\u6240\u9700\u7684\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> kubectl config view\r\n<span class=\"go\">apiVersion: v1\r\nclusters:\r\n- cluster:\r\n    certificate-authority: \/Users\/sotoiwa\/.minikube\/ca.crt\r\n    server: https:\/\/192.168.99.104:8443\r\n  name: minikube\r\ncontexts:\r\n- context:\r\n    cluster: minikube\r\n    user: minikube\r\n  name: minikube\r\ncurrent-context: minikube\r\nkind: Config\r\npreferences: {}\r\nusers:\r\n- name: minikube\r\n  user:\r\n    client-certificate: \/Users\/sotoiwa\/.minikube\/client.crt\r\n    client-key: \/Users\/sotoiwa\/.minikube\/client.key\r\n<\/span><span class=\"gp\">$<\/span>\r\n<\/code><\/pre>\n<p>Minikube\u306f\u9375\u3067\u8a8d\u8a3c\u3057\u3066\u3044\u308b\u304c\u3001hubot-k8s\u3067\u306f\u9375\u306f\u6307\u5b9a\u3067\u304d\u305a\u3001\u30c8\u30fc\u30af\u30f3\u304c\u5fc5\u8981\u306a\u3088\u3046\u306a\u306e\u3067\u3001ServiceAccount\u3092\u4f5c\u6210\u3057\u3066\u305d\u306e\u30c8\u30fc\u30af\u30f3\u3092\u4f7f\u3046\u3053\u3068\u306b\u3059\u308b\u3002<\/p>\n<p>\u3042\u3068\u3067Hubot\u3092\u30b3\u30f3\u30c6\u30ca\u5316\u3057\u3066Pod\u3068\u3057\u3066Minikube\u306b\u30c7\u30d7\u30ed\u30a4\u3057\u305f\u3044\u306e\u3067\u3001\u305d\u306e\u3068\u304d\u306b\u3082ServiceAccount\u3092\u6d41\u7528\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u30c7\u30d7\u30ed\u30a4\u5148\u306eNamespace\u3092\u4f5c\u6210\u3057\u3001\u81ea\u52d5\u7684\u306b\u4f5c\u6210\u3055\u308c\u308b\u305d\u306eNamespace\u306edefault\u306eServiceAccount\u3092\u4f7f\u3046\u3002\u3053\u306eServiceAccount\u306b\u5f37\u3044\u6a29\u9650\u3092\u3082\u3064cluster-admin\u306eClusterRole\u3092\u30d0\u30a4\u30f3\u30c9\u3059\u308b\u3002<\/p>\n<pre class=\"post-pre\"><code>kubectl create ns hubot\r\nkubectl create clusterrolebinding hubot <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--clusterrole<\/span><span class=\"o\">=<\/span>cluster-admin <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--serviceaccount<\/span><span class=\"o\">=<\/span>hubot:default\r\n<\/code><\/pre>\n<p>\u83b7\u53d6\u6b64ServiceAccount\u7684\u4ee4\u724c\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nv\">SECRET_NAME<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span>kubectl get sa default <span class=\"nt\">-n<\/span> hubot <span class=\"nt\">-o<\/span> <span class=\"nv\">jsonpath<\/span><span class=\"o\">=<\/span><span class=\"s1\">'{.secrets[].name}'<\/span><span class=\"si\">)<\/span>\r\n<span class=\"nb\">echo<\/span> <span class=\"nv\">$SECRET_NAME<\/span>\r\n<span class=\"nv\">TOKEN<\/span><span class=\"o\">=<\/span><span class=\"si\">$(<\/span>kubectl get secret <span class=\"nv\">$SECRET_NAME<\/span> <span class=\"nt\">-n<\/span> hubot <span class=\"nt\">-o<\/span> <span class=\"nv\">jsonpath<\/span><span class=\"o\">={<\/span>.data.token<span class=\"o\">}<\/span> | <span class=\"nb\">base64<\/span> <span class=\"nt\">--decode<\/span><span class=\"si\">)<\/span>\r\n<span class=\"nb\">echo<\/span> <span class=\"nv\">$TOKEN<\/span>\r\n<\/code><\/pre>\n<p>HUBOT_K8S_CONTEXTS\u5c06\u4f1a\u662f\u4ee5\u4e0b\u7684json\u683c\u5f0f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n  <span class=\"nl\">\"minikube\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"server\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"https:\/\/192.168.99.104:8443\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"ca\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\/Users\/sotoiwa\/.minikube\/ca.crt\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"dashboardPrefix\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"https:\/\/kubernetes.cluster.io\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"token\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"$TOKEN\"<\/span>\r\n  <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u5176\u653e\u5728\u4e00\u884c\u5185\uff0c\u5bf9\u53cc\u5f15\u53f7\u8fdb\u884c\u8f6c\u4e49\uff0c\u5e76\u5c06\u5176\u4f5c\u4e3a\u73af\u5883\u53d8\u91cf\u5bfc\u51fa\uff0c\u7136\u540e\u542f\u52a8Hubot\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">HUBOT_K8S_CONTEXTS<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">minikube<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:{<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">server<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">https:\/\/192.168.99.104:8443<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">,<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">ca<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">\/Users\/sotoiwa\/.minikube\/ca.crt<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">,<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">dashboardPrefix<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">https:\/\/kubernetes.cluster.io<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">,<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">token<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">:<\/span><span class=\"se\">\\\"<\/span><span class=\"nv\">$TOKEN<\/span><span class=\"se\">\\\"<\/span><span class=\"s2\">}}\"<\/span>\r\n<span class=\"nb\">export <\/span><span class=\"nv\">HUBOT_K8S_DEFAULT_CONTEXT<\/span><span class=\"o\">=<\/span>minikube\r\n<span class=\"nb\">export <\/span><span class=\"nv\">HUBOT_K8S_DEFAULT_NAMESPACE<\/span><span class=\"o\">=<\/span>default\r\nbin\/hubot <span class=\"nt\">--name<\/span> hubot\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u5728hubot-k8s\u5305\u7684\u547d\u4ee4\u4e2d\u80fd\u591f\u83b7\u53d6\u5230Pod\u548cDeployment\u7684\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">hubot&gt;<\/span> hubot k8s ns\r\n<span class=\"gp\">hubot&gt;<\/span> Shell: Your current kubernetes namespace is: <span class=\"sb\">`<\/span>default<span class=\"sb\">`<\/span>\r\n\r\n<span class=\"gp\">hubot&gt;<\/span> hubot k8s ns kube-system\r\n<span class=\"gp\">hubot&gt;<\/span> Shell: Your current kubernetes namespace is changed to <span class=\"sb\">`<\/span>kube-system<span class=\"sb\">`<\/span>\r\n\r\n<span class=\"gp\">hubot&gt;<\/span> hubot k8s po\r\n<span class=\"gp\">hubot&gt;<\/span> Shell: Here is the list of <span class=\"k\">*<\/span>pods<span class=\"k\">*<\/span> running <span class=\"k\">in <\/span>namespace <span class=\"k\">*<\/span>kube-system<span class=\"k\">*<\/span> with context <span class=\"k\">*<\/span>minikube<span class=\"k\">*<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/coredns-86c58d9df4-htjgd?namespace<span class=\"o\">=<\/span>kube-system|coredns-86c58d9df4-htjgd&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/coredns-86c58d9df4-znckf?namespace<span class=\"o\">=<\/span>kube-system|coredns-86c58d9df4-znckf&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/etcd-minikube?namespace<span class=\"o\">=<\/span>kube-system|etcd-minikube&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/kube-addon-manager-minikube?namespace<span class=\"o\">=<\/span>kube-system|kube-addon-manager-minikube&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/kube-apiserver-minikube?namespace<span class=\"o\">=<\/span>kube-system|kube-apiserver-minikube&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/kube-controller-manager-minikube?namespace<span class=\"o\">=<\/span>kube-system|kube-controller-manager-minikube&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/kube-proxy-jrjsx?namespace<span class=\"o\">=<\/span>kube-system|kube-proxy-jrjsx&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/kube-scheduler-minikube?namespace<span class=\"o\">=<\/span>kube-system|kube-scheduler-minikube&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/kubernetes-dashboard-ccc79bfc9-vc6r9?namespace<span class=\"o\">=<\/span>kube-system|kubernetes-dashboard-ccc79bfc9-vc6r9&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/pod\/kube-system\/storage-provisioner?namespace<span class=\"o\">=<\/span>kube-system|storage-provisioner&gt;<span class=\"k\">*<\/span> - pods <span class=\"sb\">`<\/span>1\/1<span class=\"sb\">`<\/span> with status <span class=\"sb\">`<\/span>Running<span class=\"sb\">`<\/span> and restart count <span class=\"sb\">`<\/span>0<span class=\"sb\">`<\/span> since <span class=\"sb\">`<\/span>12 minutes ago<span class=\"sb\">`<\/span>\r\n\r\n\r\n<span class=\"gp\">hubot&gt;<\/span> hubot k8s deploy\r\n<span class=\"gp\">hubot&gt;<\/span> Shell: Here is the list of <span class=\"k\">*<\/span>deployments<span class=\"k\">*<\/span> running <span class=\"k\">in <\/span>namespace <span class=\"k\">*<\/span>kube-system<span class=\"k\">*<\/span> with context <span class=\"k\">*<\/span>minikube<span class=\"k\">*<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/deployment\/kube-system\/coredns?namespace<span class=\"o\">=<\/span>kube-system|coredns&gt;<span class=\"k\">*<\/span> - desired <span class=\"sb\">`<\/span>2<span class=\"sb\">`<\/span>, current <span class=\"sb\">`<\/span>2<span class=\"sb\">`<\/span>, updated <span class=\"sb\">`<\/span>2<span class=\"sb\">`<\/span>, available <span class=\"sb\">`<\/span>2<span class=\"sb\">`<\/span>\r\n<span class=\"gp\">&gt;<\/span><span class=\"k\">*<\/span>&lt;https:\/\/kubernetes.cluster.io\/api\/v1\/namespaces\/kube-system\/services\/kubernetes-dashboard\/proxy\/#!\/deployment\/kube-system\/kubernetes-dashboard?namespace<span class=\"o\">=<\/span>kube-system|kubernetes-dashboard&gt;<span class=\"k\">*<\/span> - desired <span class=\"sb\">`<\/span>1<span class=\"sb\">`<\/span>, current <span class=\"sb\">`<\/span>1<span class=\"sb\">`<\/span>, updated <span class=\"sb\">`<\/span>1<span class=\"sb\">`<\/span>, available <span class=\"sb\">`<\/span>1<span class=\"sb\">`<\/span>\r\n\r\n\r\n<span class=\"gp\">hubot&gt;<\/span>\r\n<\/code><\/pre>\n<h3>\u76f4\u63a5\u6267\u884c kubectl<\/h3>\n<p>hubot-k8s\u30d1\u30c3\u30b1\u30fc\u30b8\u3067\u306f\u3067\u304d\u308b\u3053\u3068\u304c\u9650\u3089\u308c\u3066\u3044\u308b\u306e\u3067\u3001kubectl\u30b3\u30de\u30f3\u30c9\u3092\u76f4\u63a5\u5b9f\u884c\u3067\u304d\u308b\u3088\u3046\u306b\u3057\u3066\u307f\u308b\u3002\u4ee5\u4e0b\u3092\u53c2\u8003\u306bmybot.coffee\u30b9\u30af\u30ea\u30d7\u30c8\u306bkubectl\u3068\u3044\u3046\u30e1\u30f3\u30b7\u30e7\u30f3\u3078\u306e\u53cd\u5fdc\u3092\u8ffd\u8a18\u3059\u308b\u3002kubectl\u4ee5\u4e0b\u3092\u5f15\u6570\u3068\u3057\u3066kubectl\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3059\u308b\u3002\u3053\u306e\u3068\u304dexec\u3060\u3068\u30b7\u30a7\u30eb\u3092\u4ecb\u3057\u3066\u4efb\u610f\u306e\u30b3\u30de\u30f3\u30c9\u3092\u5b9f\u884c\u3055\u308c\u3066\u3057\u307e\u3046\u30ea\u30b9\u30af\u304c\u3042\u308b\u306e\u3067\u3001execFile\u3092\u4f7f\u3046\u3088\u3046\u306b\u3057\u305f\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Slack\u304b\u3089Hubot\u7d4c\u7531\u3067\u3001\u30b5\u30fc\u30d0\u306e\u30b7\u30a7\u30eb\u3092\u5b9f\u884c\u3057\u3066\u307f\u3088\u3046\uff01<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Child Process<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">node.js\u306echild_process\u306eexec\u3068execFile\u3068spawn\u306e\u9055\u3044<\/ul>\n<pre class=\"post-pre\"><code><span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"na\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"p\">(<\/span><span class=\"nx\">robot<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n\r\n  <span class=\"nx\">robot<\/span><span class=\"p\">.<\/span><span class=\"na\">hear<\/span> <span class=\"sr\">\/hello\/i<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"na\">send<\/span> <span class=\"s\">\"Hello World!\"<\/span>\r\n\r\n  <span class=\"nx\">robot<\/span><span class=\"p\">.<\/span><span class=\"na\">respond<\/span> <span class=\"sr\">\/how are you\/i<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">res<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n    <span class=\"nx\">res<\/span><span class=\"p\">.<\/span><span class=\"na\">reply<\/span> <span class=\"s\">\"I am fine!\"<\/span>\r\n\r\n  <span class=\"nx\">robot<\/span><span class=\"p\">.<\/span><span class=\"na\">respond<\/span> <span class=\"sr\">\/kubectl (.*)\/<\/span><span class=\"p\">,<\/span> <span class=\"p\">(<\/span><span class=\"nx\">msg<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n    <span class=\"nx\">args<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">msg<\/span><span class=\"p\">.<\/span><span class=\"na\">match<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span>\r\n    <span class=\"vi\">@<\/span><span class=\"na\">exec<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"s\">\"child_process\"<\/span><span class=\"p\">).<\/span><span class=\"na\">execFile<\/span>\r\n    <span class=\"nx\">command<\/span> <span class=\"o\">=<\/span> <span class=\"s\">\"kubectl\"<\/span>\r\n    <span class=\"nx\">msg<\/span><span class=\"p\">.<\/span><span class=\"na\">send<\/span> <span class=\"s\">\"Command: <\/span><span class=\"si\">#{<\/span><span class=\"nx\">command<\/span><span class=\"si\">}<\/span> <span class=\"si\">#{<\/span><span class=\"nx\">args<\/span><span class=\"si\">}<\/span><span class=\"s\">\"<\/span>\r\n    <span class=\"vi\">@<\/span><span class=\"na\">exec<\/span> <span class=\"nx\">command<\/span><span class=\"p\">,<\/span> <span class=\"nx\">args<\/span><span class=\"p\">.<\/span><span class=\"na\">split<\/span><span class=\"p\">(<\/span><span class=\"s\">\" \"<\/span><span class=\"p\">),<\/span> <span class=\"p\">(<\/span><span class=\"nx\">error<\/span><span class=\"p\">,<\/span> <span class=\"nx\">stdout<\/span><span class=\"p\">,<\/span> <span class=\"nx\">stderr<\/span><span class=\"p\">)<\/span> <span class=\"o\">-&gt;<\/span>\r\n      <span class=\"nx\">msg<\/span><span class=\"p\">.<\/span><span class=\"na\">send<\/span> <span class=\"nx\">error<\/span> <span class=\"k\">if<\/span> <span class=\"nx\">error<\/span><span class=\"o\">?<\/span>\r\n      <span class=\"nx\">msg<\/span><span class=\"p\">.<\/span><span class=\"na\">send<\/span> <span class=\"nx\">stdout<\/span> <span class=\"k\">if<\/span> <span class=\"nx\">stdout<\/span><span class=\"o\">?<\/span>\r\n      <span class=\"nx\">msg<\/span><span class=\"p\">.<\/span><span class=\"na\">send<\/span> <span class=\"nx\">stderr<\/span> <span class=\"k\">if<\/span> <span class=\"nx\">stderr<\/span><span class=\"o\">?<\/span>\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u542f\u52a8Hubot\u5e76\u786e\u4fdd\u80fd\u591f\u6267\u884ckubectl\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">hubot&gt;<\/span> hubot kubectl get ns\r\n<span class=\"gp\">hubot&gt;<\/span> Command: kubectl get ns\r\n<span class=\"go\">NAME          STATUS   AGE\r\ndefault       Active   169m\r\nhubot         Active   165m\r\nkube-public   Active   169m\r\nkube-system   Active   169m\r\n\r\n\r\n\r\n<\/span><span class=\"gp\">hubot&gt;<\/span>\r\n<\/code><\/pre>\n<h2>\u5c07Slack\u8207\u5176\u4ed6\u7cfb\u7d71\u9032\u884c\u6574\u5408\u6216\u5354\u540c\u5de5\u4f5c<\/h2>\n<p>\u63a5\u4e0b\u6765\u5c1d\u8bd5Slack\u9002\u914d\u5668\u800c\u4e0d\u662fShell\u9002\u914d\u5668\u3002<\/p>\n<h3>\u521b\u5efaHubot<\/h3>\n<p>\u56e0\u4e3a\u4e0d\u77e5\u9053\u5982\u4f55\u66f4\u6539\u9002\u914d\u5668\uff0c\u6240\u4ee5\u6211\u51b3\u5b9a\u65b0\u5efa\u4e00\u4e2aBot\u6a21\u677f\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">mkdir <\/span>myhubot-slack\r\n<span class=\"nb\">cd <\/span>myhubot-slack\r\nyo hubot\r\n<\/code><\/pre>\n<p><script><\/script><\/p>\n<p>\u8bf7\u6309\u7167\u4e4b\u524d\u7684\u6b65\u9aa4\u5c06\u4e4b\u524d\u521b\u5efa\u7684mybot.coffee\u811a\u672c\u548chubot-k8s\u5305\u8fdb\u884c\u5b89\u88c5\uff08\u7565\uff09\u3002<\/p>\n<h3>\u786e\u8ba4\u8fd0\u4f5c<\/h3>\n<p>\u5bfc\u51faSlack\u7684\u4ee4\u724c\u5e76\u6307\u5b9a\u9002\u914d\u5668\u542f\u52a8\u673a\u5668\u4eba\uff08\u5982\u679c\u91cd\u65b0\u542f\u52a8\u7ec8\u7aef\uff0c\u9700\u8981\u5bfc\u51fa\u6240\u9700\u7684\u73af\u5883\u53d8\u91cf\u4ee5\u5c06hubot-k8s\u8fde\u63a5\u5230Minikube\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nb\">export <\/span><span class=\"nv\">HUBOT_SLACK_TOKEN<\/span><span class=\"o\">=<\/span>hogehoge\r\nbin\/hubot <span class=\"nt\">--name<\/span> hubot <span class=\"nt\">--adapter<\/span> slack\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u53ef\u4ee5\u901a\u8fc7hubot-k8s\u6765\u68c0\u67e5Pod\u7684\u72b6\u6001\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/98-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u786e\u8ba4\u80fd\u591f\u76f4\u63a5\u6267\u884ckubectl\u547d\u4ee4\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/100-0.png\" alt=\"image.png\" \/><\/div>\n<h2>\u90e8\u7f72\u5230 Kubernetes<\/h2>\n<p>\u4e00\u822c\u6765\u8bf4\uff0c\u901a\u5e38\u4f1a\u9009\u62e9\u5728Heroku\u4e0a\u8fd0\u884c\uff0c\u4f46\u6211\u4eec\u5c1d\u8bd5\u5c06\u5176\u5bb9\u5668\u5316\u5e76\u90e8\u7f72\u5230Minikube\u4e2d\u3002<\/p>\n<h3>\u6784\u5efa\u56fe\u50cf<\/h3>\n<p>\u8bf7\u6839\u636e\u4ee5\u4e0b\u5185\u5bb9\u521b\u5efaDockerfile\u3002<\/p>\n<ul class=\"post-ul\">https:\/\/nodejs.org\/en\/docs\/guides\/nodejs-docker-webapp\/<\/ul>\n<p>\u53ef\u4ee5\u67e5\u9605\u4ee5\u4e0b\u5185\u5bb9\u4ee5\u4e86\u89e3\u901a\u8fc7Pod\u6267\u884ckubectl\u7684\u65b9\u6cd5\u3002\u53ea\u9700\u5728\u5bb9\u5668\u5185\u90e8\u653e\u7f6ekubectl\u4e8c\u8fdb\u5236\u6587\u4ef6\uff0c\u5e76\u4e3a\u6267\u884cPod\u7684ServiceAccount\u6388\u4e88\u9002\u5f53\u7684\u6743\u9650\u3002<\/p>\n<ul class=\"post-ul\">Kubernetes\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306ePod\u304b\u3089kubectl\u3092\u5b9f\u884c\u3059\u308b<\/ul>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> node:10.15.0-alpine<\/span>\r\n\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/usr\/src\/app<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>wget https:\/\/storage.googleapis.com\/kubernetes-release\/release\/v1.13.0\/bin\/linux\/amd64\/kubectl <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">mv <\/span>kubectl \/usr\/local\/bin\/kubectl <span class=\"se\">\\\r\n<\/span>  <span class=\"o\">&amp;&amp;<\/span> <span class=\"nb\">chmod<\/span> +x \/usr\/local\/bin\/kubectl\r\n\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> bin\/ bin\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> scripts\/ scripts\/<\/span>\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> *.json .\/<\/span>\r\n\r\n<span class=\"k\">RUN <\/span>npm <span class=\"nb\">install<\/span>\r\n\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [ \".\/bin\/hubot\", \"--name\", \"hubot\", \"--adapter\", \"slack\" ]<\/span>\r\n<\/code><\/pre>\n<p>\u76ee\u5f55\u7ed3\u6784\u5982\u4e0b\u3002<\/p>\n<pre class=\"post-pre\"><code>myhubot-slack\r\n\u251c\u2500\u2500 Dockerfile\r\n\u251c\u2500\u2500 Procfile\r\n\u251c\u2500\u2500 README.md\r\n\u251c\u2500\u2500 bin\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 hubot\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 hubot.cmd\r\n\u251c\u2500\u2500 external-scripts.json\r\n\u251c\u2500\u2500 hubot-scripts.json\r\n\u251c\u2500\u2500 node_modules\r\n\u251c\u2500\u2500 package-lock.json\r\n\u251c\u2500\u2500 package.json\r\n\u2514\u2500\u2500 scripts\r\n    \u251c\u2500\u2500 example.coffee\r\n    \u2514\u2500\u2500 mybot.coffee\r\n<\/code><\/pre>\n<p>\u6784\u5efa\u5e76\u63a8\u9001\u955c\u50cf\u3002<\/p>\n<pre class=\"post-pre\"><code>docker build <span class=\"nt\">-t<\/span> sotoiwa540\/myhubot-slack:1.0 <span class=\"nb\">.<\/span>\r\ndocker push sotoiwa540\/myhubot-slack:1.0\r\n<\/code><\/pre>\n<h3>\u90e8\u7f72\u81f3Kubernetes<\/h3>\n<p>\u8981\u5728Pod\u4e2d\u8fd0\u884ckubectl\u547d\u4ee4\uff0c\u9700\u8981\u5c06\u9002\u5f53\u7684\u6743\u9650\u5206\u914d\u7ed9\u8fd0\u884cPod\u7684ServiceAccount\u3002\u7136\u800c\uff0c\u7531\u4e8e\u5728hubot\u547d\u540d\u7a7a\u95f4\u4e2d\u7684\u9ed8\u8ba4ServiceAccount\u5df2\u7ecf\u4e0ecluster-admin\u7684ClusterRole\u7ed1\u5b9a\uff0c\u56e0\u6b64\u53ea\u9700\u5728hubot\u547d\u540d\u7a7a\u95f4\u90e8\u7f72Pod\u5373\u53ef\u6267\u884ckubectl\u547d\u4ee4\u3002<\/p>\n<p>\u5bf9\u4e8ehubot-k8s\u5305\uff0c\u9700\u8981\u901a\u8fc7\u73af\u5883\u53d8\u91cfHUBOT_K8S_CONTEXTS\u4f20\u9012\u7ed9kube-apiserver\u7684\u8eab\u4efd\u9a8c\u8bc1\u4fe1\u606f\uff0c\u800c\u4e14\u9700\u8981\u4ee5JSON\u683c\u5f0f\u4f20\u9012\u3002<\/p>\n<p>\u5c06\u8fde\u63a5\u5230Slack\u6240\u9700\u7684\u4ee4\u724c\u4ee5\u53ca\u9664hubot-k8s\u7684HUBOT_K8S_CONTEXTS\u4e4b\u5916\u7684\u73af\u5883\u53d8\u91cf\u653e\u5165Secret\u4e2d\uff0c\u5e76\u4f20\u9012\u7ed9Pod\u3002<\/p>\n<pre class=\"post-pre\"><code>kubectl create secret generic hubot-secret <span class=\"nt\">-n<\/span> hubot <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--from-literal<\/span><span class=\"o\">=<\/span><span class=\"nv\">HUBOT_SLACK_TOKEN<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">HUBOT_SLACK_TOKEN<\/span><span class=\"k\">}<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--from-literal<\/span><span class=\"o\">=<\/span><span class=\"nv\">HUBOT_K8S_DEFAULT_CONTEXT<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">HUBOT_K8S_DEFAULT_CONTEXT<\/span><span class=\"k\">}<\/span> <span class=\"se\">\\<\/span>\r\n  <span class=\"nt\">--from-literal<\/span><span class=\"o\">=<\/span><span class=\"nv\">HUBOT_K8S_DEFAULT_NAMESPACE<\/span><span class=\"o\">=<\/span><span class=\"k\">${<\/span><span class=\"nv\">HUBOT_K8S_DEFAULT_NAMESPACE<\/span><span class=\"k\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5173\u4e8eHUBOT_K8S_CONTEXTS\uff0c\u53ef\u4ee5\u5229\u7528Kubernetes\u81ea\u52a8\u5c06\u8bc1\u4e66\u548cServiceAccount\u7684\u4ee4\u724c\u6302\u8f7d\u5230\u5bb9\u5668\u7684\/var\/run\/secrets\/kubernetes.io\/serviceaccount\u76ee\u5f55\u4e0b\u3002\u56e0\u6b64\uff0c\u5728\u542f\u52a8\u4e4b\u524d\uff0c\u9700\u8981\u5148\u5bfc\u51fa\u73af\u5883\u53d8\u91cf\uff0c\u7136\u540e\u518d\u542f\u52a8Hubot\u3002\u8fd9\u4e2a\u8fc7\u7a0b\u9700\u8981\u76f4\u63a5\u5728\u6e05\u5355\u6587\u4ef6\u4e2d\u7f16\u5199\u3002\u53e6\u5916\uff0c\u9700\u8981\u6ce8\u610f\u7684\u662f\uff0c\u5728\u4f7f\u7528hubot\u547d\u4ee4\u542f\u52a8Node.js\u8fdb\u7a0b\u65f6\uff0c\u5982\u679c\u4e0d\u4f7f\u7528exec\uff0c\u5c06\u5bfc\u81f4sh\u8fdb\u7a0b\u548c\u5176\u5b50\u8fdb\u7a0b\u7684node\u8fdb\u7a0b\u90fd\u4f1a\u589e\u52a0\u4e24\u4e2a\u3002<\/p>\n<p>\u90e8\u7f72\u7684\u6e05\u5355\u5e94\u8be5\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8fdb\u884c\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\">annotations<\/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\">hubot<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">hubot<\/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\">hubot<\/span>\r\n  <span class=\"na\">strategy<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">type<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Recreate<\/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\">hubot<\/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\">hubot<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">sotoiwa540\/myhubot-slack:1.0<\/span>\r\n        <span class=\"na\">imagePullPolicy<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Always<\/span>\r\n        <span class=\"na\">envFrom<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">secretRef<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">hubot-secret<\/span>\r\n        <span class=\"na\">command<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">sh<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">-c<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"pi\">|<\/span>\r\n          <span class=\"s\">export CA=$(cat \/var\/run\/secrets\/kubernetes.io\/serviceaccount\/ca.crt)<\/span>\r\n          <span class=\"s\">export TOKEN=$(cat \/var\/run\/secrets\/kubernetes.io\/serviceaccount\/token)<\/span>\r\n          <span class=\"s\">export HUBOT_K8S_CONTEXTS=$(echo \"{\\\"minikube\\\":{\\\"server\\\":\\\"https:\/\/kubernetes.default:443\\\",\\\"ca\\\":\\\"\/var\/run\/secrets\/kubernetes.io\/serviceaccount\/ca.crt\\\",\\\"dashboardPrefix\\\":\\\"https:\/\/kubernetes.cluster.io\\\",\\\"token\\\":\\\"$TOKEN\\\"}}\")<\/span>\r\n          <span class=\"s\">exec \/usr\/src\/app\/bin\/hubot --name hubot --adapter slack<\/span>\r\n<\/code><\/pre>\n<p>\u90e8\u7f72Hubot\u3002<\/p>\n<pre class=\"post-pre\"><code>kubectl apply <span class=\"nt\">-f<\/span> hubot-deployment.yaml <span class=\"nt\">-n<\/span> hubot\r\n<\/code><\/pre>\n<p>\u67e5\u770bPod\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"gp\">$<\/span> kubectl get po\r\n<span class=\"go\">NAME                     READY   STATUS    RESTARTS   AGE\r\nhubot-68cc597477-8kt4n   1\/1     Running       0          22s\r\n<\/span><span class=\"gp\">$<\/span>\r\n<\/code><\/pre>\n<h3>\u786e\u8ba4\u8fd0\u884c<\/h3>\n<p>\u786e\u8ba4\u8fd0\u884c\u3002\u9996\u5148\u786e\u8ba4Hubot-k8s\u8f6f\u4ef6\u5305\u80fd\u591f\u8fd0\u884c\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/127-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u786e\u8ba4\u80fd\u591f\u76f4\u63a5\u6267\u884ckubectl\u547d\u4ee4\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/129-0.png\" alt=\"image.png\" \/><\/div>\n<p>\u4e0e\u4e4b\u76f8\u540c\u3002\u611f\u89c9\u4e0a\u4e0ePython\u7684slackbot\u6a21\u5757\u51e0\u4e4e\u4e00\u81f4\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Python\u306eslackbot\u3092Kubernetes\u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3066Pod\u306e\u72b6\u6cc1\u3092\u78ba\u8a8d\u3059\u308b &nbsp; Pyt [&hellip;]<\/p>\n","protected":false},"author":12,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-35936","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>\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001 - 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\/\u5c06hubot\u90e8\u7f72\u5230kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7slack\u68c0\u67e5pod\u7684\u72b6\u6001\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001\" \/>\n<meta property=\"og:description\" content=\"Python\u306eslackbot\u3092Kubernetes\u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3066Pod\u306e\u72b6\u6cc1\u3092\u78ba\u8a8d\u3059\u308b &nbsp; Pyt [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06hubot\u90e8\u7f72\u5230kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7slack\u68c0\u67e5pod\u7684\u72b6\u6001\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-09-11T21:09:47+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T07:19:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/5-0.png\" \/>\n<meta name=\"author\" content=\"\u9038, \u79d1\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u9038, \u79d1\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 \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\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/\",\"name\":\"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-09-11T21:09:47+00:00\",\"dateModified\":\"2024-04-30T07:19:18+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001\"}]},{\"@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\/85c1dae56e6ea1e695c73d33c684d487\",\"name\":\"\u9038, \u79d1\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g\",\"caption\":\"\u9038, \u79d1\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001 - 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\/\u5c06hubot\u90e8\u7f72\u5230kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7slack\u68c0\u67e5pod\u7684\u72b6\u6001\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001","og_description":"Python\u306eslackbot\u3092Kubernetes\u306b\u30c7\u30d7\u30ed\u30a4\u3057\u3066Pod\u306e\u72b6\u6cc1\u3092\u78ba\u8a8d\u3059\u308b &nbsp; Pyt [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u5c06hubot\u90e8\u7f72\u5230kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7slack\u68c0\u67e5pod\u7684\u72b6\u6001\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-09-11T21:09:47+00:00","article_modified_time":"2024-04-30T07:19:18+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d263e37434c4406c36cdf\/5-0.png"}],"author":"\u9038, \u79d1","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u9038, \u79d1","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"8 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/","name":"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-09-11T21:09:47+00:00","dateModified":"2024-04-30T07:19:18+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/85c1dae56e6ea1e695c73d33c684d487"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u5c06Hubot\u90e8\u7f72\u5230Kubernetes\u4e0a\uff0c\u5e76\u901a\u8fc7Slack\u68c0\u67e5Pod\u7684\u72b6\u6001"}]},{"@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\/85c1dae56e6ea1e695c73d33c684d487","name":"\u9038, \u79d1","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c94f6d9cbbfbca863fab309840bd690c153c95f8490c290ad2ed54dd693dad16?s=96&d=mm&r=g","caption":"\u9038, \u79d1"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keyi\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%b0%86hubot%e9%83%a8%e7%bd%b2%e5%88%b0kubernetes%e4%b8%8a%ef%bc%8c%e5%b9%b6%e9%80%9a%e8%bf%87slack%e6%a3%80%e6%9f%a5pod%e7%9a%84%e7%8a%b6%e6%80%81%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/35936","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\/12"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=35936"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/35936\/revisions"}],"predecessor-version":[{"id":92692,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/35936\/revisions\/92692"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=35936"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=35936"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=35936"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}