惊奇发现,[个性网址]变成只接受4~20位的了,那我现在3位的岂不是得好好珍惜

回复

站点反馈Thomas 发起了问题 • 1 人关注 • 0 个回复 • 608 次浏览 • 2017-04-17 12:01 • 来自相关话题

Go GC打印出来的这些信息都是什么含义?

有问必答DefNed 回复了问题 • 10 人关注 • 4 个回复 • 1788 次浏览 • 2017-04-15 15:26 • 来自相关话题

出gopher大会早鸟票

Golanggo、go、go 回复了问题 • 6 人关注 • 7 个回复 • 713 次浏览 • 2017-04-14 10:04 • 来自相关话题

和我一步步部署 kubernetes 集群

文章分享opsnull 发表了文章 • 4 个评论 • 1322 次浏览 • 2017-04-13 18:42 • 来自相关话题

...查看全部

dashboard-home


本系列文档介绍使用二进制部署 kubernetes 集群的所有步骤,而不是使用 kubeadm 等自动化方式来部署集群;


在部署的过程中,将详细列出各组件的启动参数,它们的含义和可能遇到的问题。


部署完成后,你将理解系统各组件的交互原理,进而能快速解决实际问题。


所以本文档主要适合于那些有一定 kubernetes 基础,想通过一步步部署的方式来学习和了解系统配置、运行原理的人。


集群详情



  • Kubernetes 1.6.1

  • Docker 17.04.0-ce

  • Etcd 3.1.5

  • Flanneld 0.7 vxlan 网络

  • TLS 认证通信 (所有组件,如 etcd、kubernetes master 和 node)

  • RBAC 授权

  • kublet TLS BootStrapping

  • kubedns、dashboard、heapster (influxdb、grafana)、EFK (elasticsearch、fluentd、kibana) 插件

  • 私有 docker registry,使用 ceph rgw 后端存储,TLS + HTTP Basic 认证


步骤介绍



  1. 创建 TLS 证书和秘钥

  2. 下载和配置 Kubectl 命令行工具

  3. 部署高可用 Etcd 集群

  4. 部署 Master 节点

  5. 配置 Node Kubeconfig 文件

  6. 部署 Node 节点

  7. 部署 DNS 插件

  8. 部署 Dashboard 插件

  9. 部署 Heapster 插件

  10. 部署 EFK 插件

  11. 部署 Docker Registry

  12. 清理集群


注意



  1. 由于启用了 TLS 双向认证、RBAC 授权等严格的安全机制,建议从头开始部署,而不要从中间开始,否则可能会认证、授权等失败!

  2. 本文档将随着各组件的更新而更新,有任何问题欢迎提 issue!


版权


Copyright 2017 zhangjun(geekard@qq.com)


Apache License 2.0,详情见 LICENSE 文件。


希望对你有帮助!


点我到 github 查看文档

这要怎么写才不报错 docker client api

回复

有问必答喻星星 回复了问题 • 3 人关注 • 2 个回复 • 958 次浏览 • 2017-04-13 14:47 • 来自相关话题

beego orm.insertMulti插入后,对象id没有像insert那样给对象加上

回复

有问必答luischan 发起了问题 • 1 人关注 • 0 个回复 • 956 次浏览 • 2017-04-12 12:09 • 来自相关话题

用beego写入log到elasticsearch失败

有问必答我很酷 回复了问题 • 3 人关注 • 7 个回复 • 1613 次浏览 • 2017-04-10 15:04 • 来自相关话题

GopherChina大会门票多了一张, 转手, 要的联系

回复

线下活动FancyGo 回复了问题 • 1 人关注 • 1 个回复 • 814 次浏览 • 2017-04-10 11:49 • 来自相关话题

Go之旅-for循环

文章分享frankphper 发表了文章 • 0 个评论 • 491 次浏览 • 2017-04-09 22:51 • 来自相关话题

Go语言仅有for一种循环语句,但常用方式都能支持。其中初始化表达式支持函数调用或定义局部变量,需要注意的是初始化语句中的函数仅执行一次,条件表达式中的函数重复执行,规避方式就是在初始化表达式中定义局部变量保存函数返回结果。Go语言中也有goto语句,使... 查看全部

Go语言仅有for一种循环语句,但常用方式都能支持。其中初始化表达式支持函数调用或定义局部变量,需要注意的是初始化语句中的函数仅执行一次,条件表达式中的函数重复执行,规避方式就是在初始化表达式中定义局部变量保存函数返回结果。Go语言中也有goto语句,使用goto语句前,必须先定义标签,标签区分大小写,并且未使用的标签会引发编译错误。和goto定点跳转不同,break、continue用于中断代码块执行。break用于switch、for、select语句,终止整个语句块执行,continue仅用于for循环,终止后续逻辑,立即进入下一轮循环。break和continue配合标签使用,可以在多层嵌套中指定目标层级。



package main

import (
"fmt"
)

// count函数
func count() int {
fmt.Println("count.") // 打印字符串用来查看count函数执行次数
return 3
}

// main函数
func main() {
// for循环
// 初始化表达式,支持函数调用或定义局部变量
for i := 0; i < 10; i++ {
fmt.Println(i)
}
// 类似while循环
i := 0
for i < 10 {
fmt.Println(i)
i++
}
// 类似无限循环
for {
break
}
// 初始化语句中的count函数仅执行一次
for i, c := 0, count(); i < c; i++ {
fmt.Println("a", i)
}

c := 0
// 条件表达式中的count函数重复执行
for c < count() {
fmt.Println("b", c)
c++
}
// 规避条件表达式中的count函数重复执行,在初始化表达式中定义局部变量保存count函数返回结果
count := count()
d := 0
for d < count {
fmt.Println("c", d)
d++
}
// goto定点跳转
// 须先定义标签,并且未用到的标签会引发编译错误
// 不能跳转到其它函数,或内层代码块内
for i := 0; i < 10; i++ {
fmt.Println(i)
if i > 5 {
goto exit
}
}
exit:
fmt.Println("exit.")

// break 用户switch、for、select语句,终止整个语句块执行。continue 仅用于for循环,终止后续逻辑,立即进入下一轮循环
for i := 0; i < 10; i++ {
if i%2 == 0 {
continue // 立即进入下一轮循环
}
if i > 5 {
break // 立即终止整个for循环
}
fmt.Println(i)
}
// 配合标签,break和continue可在多层嵌套中指定目标层级
outer:
for i := 0; i < 5; i++ {
for j := 0; j < 10; j++ {
if j > 2 {
fmt.Println()
continue outer
}

if i > 2 {
break outer
}
fmt.Print(i, ":", j, " ")
}
}

}

关于字典和数组的疑问

有问必答moss 回复了问题 • 5 人关注 • 4 个回复 • 788 次浏览 • 2017-04-08 16:21 • 来自相关话题

golang swith case

技术讨论moss 回复了问题 • 2 人关注 • 1 个回复 • 553 次浏览 • 2017-04-08 16:14 • 来自相关话题

go env 的默认值问题

Golangasdfsx 回复了问题 • 5 人关注 • 4 个回复 • 851 次浏览 • 2017-04-07 17:53 • 来自相关话题

在终端显示进度是怎么搞得?

有问必答CodyGuo 回复了问题 • 5 人关注 • 1 个回复 • 626 次浏览 • 2017-04-07 17:30 • 来自相关话题

在 Go 語言用一行程式碼自動化安裝且更新 Let’s Encrypt 憑證

文章分享appleboy 发表了文章 • 2 个评论 • 542 次浏览 • 2017-04-07 15:07 • 来自相关话题

原文轉錄自: 在 Go 語言用一行程式碼自動化安裝且更新 Let’s Encrypt 憑證


在去年寫了一篇『申請 Let’s Encrypt 免費憑證讓網站支援 HTTP2』教學,如果您是用 Nginx,就可以參考該篇教學讓您的伺服器支援 HTTPS,而 Google Security Blog 也宣布在 56 版本以後將會提示 non-secure 網站,讓使用者可以選擇性瀏覽網站。Let’s Encrypt 官方也公布去年 2016 發了多少張憑證,相當驚人,想必大家對 HTTPS 已經有相當程度的瞭解。底下這張圖說明 2016 年 Let’s Encrypt 發憑證總量的狀況


Screen Shot 2017-04-07 at 9.52.40 AM


此篇會介紹在 Go 語言如何跟 Let’s Encrypt 串接,底下有兩種方式。


使用 Caddy 伺服器


大家可以把 Caddy 想成跟 Nginx 同等關係,不同的是 Caddy 是一套完全用 Go 語言打造的伺服器,這邊就會介紹 Caddy 怎麼設定 HTTPS 憑證。先假設 domain 為 example.com,底下就是讓此 domain 自動掛上憑證的 Caddyfile 設定檔


example.com {
proxy / localhost:3000
}

上面設定會自動將 http 轉換成 https,也就是在瀏覽器鍵入 http://example.com Caddy 會自動換成 https://example.com。如果是 Nginx 呢?看看底下設定


server {
listen 0.0.0.0:80;
server_name example.com;

location /.well-known/acme-challenge/ {
alias /var/www/dehydrated/;
}

return 301 https://example.com$request_uri;
}

server {
# listen 80 deferred; # for Linux
# listen 80 accept_filter=httpready; # for FreeBSD
listen 0.0.0.0:443 ssl http2;

ssl_certificate /etc/dehydrated/certs/example.com/fullchain.pem;
ssl_certificate_key /etc/dehydrated/certs/example.com/privkey.pem;

# The host name to respond to
server_name codeigniter.org.tw;
}

很明顯可以看出,用 Caddy 大勝 Nginx 設定檔簡易程度。另外 Let’s Encrypt 憑證會在三個月後過期,如果是使用 Caddy,可以不用擔心過期問題,Caddy 會自動在三個月內幫忙更新憑證有效日期,如果是 Nginx,請寫 Script 並且放到 Crontab 內。結論就是 Caddy 自動幫忙處理申請+更新憑證,而 Nginx 都必須手動打造。


使用 Go 語言 autocert package


相信很多 Go 開發者不希望前面有 Proxy Server 像是 Caddy 或 Nginx,而是希望 Go Binary 可以直接 Listen 443 port,這樣好處就是 Performance 會是最好,缺點就是一台機器只能使用一個 application。而 Go 語言要實現整合 Let’s Encrypt 相當容易,只需要引入 autocert 套件,底下是範例程式碼: (使用 Gin framework)


程式碼範例


package main

import (
"crypto/tls"
"net/http"

"github.com/gin-gonic/gin"
"golang.org/x/crypto/acme/autocert"
)

func main() {
r := gin.Default()

// Ping handler
r.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})

m := autocert.Manager{
Prompt: autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example1.com", "example2.com"),
Cache: autocert.DirCache("/var/www/.cache"),
}

s := &http.Server{
Addr: ":https",
TLSConfig: &tls.Config{GetCertificate: m.GetCertificate},
Handler: r,
}
s.ListenAndServeTLS("", "")
}

程式碼內有兩個地方需要注意,一個是 HostWhitelist 這是綁定特定 Domain,請務必填寫,當然你也可以填空,但是這樣任意 Domain 指向你的機器,就可以直接對 Let’s Encrypt 請求憑證,所以請務必填上自己的 Domain,另一個是 DirCache 這是憑證存放的目錄,你可以任意指定到其他目錄,第一次請求會比較久,原因是憑證還沒下來。上面範例你會發現,哪是一行,看起來就是好幾行才完成此功能,在不久之前(本週) @bradfitz (Go 語言 HTTP 核心開發者) 開發了 Listener 函示 (相關 Commit),讓開發者可以用一行取代上面冗長的程式碼:


程式碼範例


package main

import (
"log"
"net/http"

"github.com/gin-gonic/gin"
"golang.org/x/crypto/acme/autocert"
)

func main() {
r := gin.Default()

// Ping handler
r.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})

log.Fatal(http.Serve(autocert.NewListener("example1.com", "example2.com"), r))
}

現在只要填入您的 Domain 就可以綁定憑證及自動更新 (不必擔心三個月會過期),這邊你會問,那憑證是放在哪裡呢?



  • MacOS 放在 /Users/xxxx/Library/Caches/golang-autocert

  • Windows ${HOMEDRIVE}/${HOMEPATH} 加上依序先找 APPDATA, CSIDL_APPDATA, TEMP, TMP 全域變數的目錄

  • Linux 放在家目錄內 .cache/golang-autocert 目錄


如果是搭配 Docker,你可以指定 XDG_CACHE_HOME 變數來轉換您想要的目錄。請在 Dockerfile 內放入


ENV XDG_CACHE_HOME /var/lib/.cache

這樣 docker 會把憑證放在 /var/lib/.cache/golang-autocert 內,使用者不用管憑證放哪裡,因為就算消失了,下次重新啟動,自然會在產生一次。最後要講的是,如何用 Go 語言實現 http 轉到 https 呢?非常簡單,請參考底下程式碼


程式碼範例


var g errgroup.Group

g.Go(func() error {
return http.ListenAndServe(":http", http.RedirectHandler("https://example.com", 303))
})
g.Go(func() error {
return http.Serve(autocert.NewListener("example.com"), handler)
})

if err := g.Wait(); err != nil {
log.Fatal(err)
}

總結


不管是用 Caddy 或者是 Go 語言 autocert 套件都是非常簡單,如果寫 Open Source 專案,基本上就是用 Go 語言內建的 autocert 來實現 Let’s Encrypt 串接,方便大家下載 Binary 直接 Listen 443 Port。不熟 Go 語言,就試試看 Caddy 伺服器吧。相信跑過一陣子你會發現 Caddy 的好處。

web后端动态匹配模型查询

有问必答fanyang 回复了问题 • 4 人关注 • 2 个回复 • 719 次浏览 • 2017-04-06 17:46 • 来自相关话题