Istio Pilot与Envoy的交互机制解读
在基于Istio+Envoy实现的服务网格中,Istio的角色是控制平面,它是实现了Envoy的发现协议集xDS的管理服务器端。Envoy本身则作为网格的数据平面,和Istio通信,获得各种资源的配置并更新自身的代理规则。
除了实现xDS协议,Istio…
阅读全文通过自定义资源扩展Kubernetes
Kubernetes是高度可配置、可扩展的,通常你不需要Fork其主项目代码或者打补丁。
对K8S的定制基本上可以分为两种方式:
- 配置,例如修改命令行参数、本地配置、API资源
- 扩展,在集群内外运行额外的程序或服务
本文主要讨论如何扩展K8S
扩展…
阅读全文Kuberentes客户端编程
1 2 3 4 5 6 7 8 9 |
import ( "k8s.io/client-go/tools/clientcmd" "k8s.io/client-go/kubernetes" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/watch" "k8s.io/apimachinery/pkg/api/errors" ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
var ( masterURL string kubeConfig string ) func main() { flag.StringVar(&masterURL, "master-url", "", "URL of kubernetes master") flag.StringVar(&kubeConfig, "kube-config", "", "Kubernetes configuration file location") flag.Parse() // 构建配置信息 cfg, err := clientcmd.BuildConfigFromFlags(masterURL, kubeConfig) if err != nil { log.Fatalf("Invalid arguments: %s", err.Error()) } // 创建API集 clientset, err := kubernetes.NewForConfig(cfg) if err != nil { log.Fatalf("Failed to connect to api server: %s", err.Error()) } } |
在Pod中访问API Server,可以使用集群授予的ServiceAccount作为凭证。参考如下代码:
通过标签选择器列出:
可以持续监控目标资源的变化:
下面是修改Deployment环境变量定义的例子:
下面代码片断示意了如何创建一个完整的Deployment对象:
动态客户端的CRU…
阅读全文Go语言中的模板引擎
包text/template实现了一个数据驱动的模板引擎,类似的还有html/template包,两者接口一样,但是后者针对HTML进行处理,可以防止某些注入式攻击。
模板的源码是一段UTF-8文本,其中会有一些 {{ }}包围的动作(Action)。模板执行时,动作中的内容 —— pipeline —— 被计算、替换…
阅读全文Protocol Buffers初探
ProtoBuf是Google提出的语言中立、平台无关、可扩展的数据序列化协议。比起XML、JSON等格式它更小、更简单、更快。
使用ProtoBuf,你只需要定义消息结构一次,就可以自动生成各种语言的代码来读写消息结构。
你需要ProtoBuf编译…
阅读全文Goland知识集锦
这是因为Goland默认每次Debug都强制重新编译所有依赖包,执行以下设置:
Settings ⇨ Build, Execution, Deployment ⇨ Debugger,取消勾选Rebuild transitive …
阅读全文Gorilla学习笔记
Gorilla是一个Web工具箱,包括以下包:
包 | 说明 |
gorilla/context | 存储请求变量 |
gorilla/mux | URL路由和分发器 |
gorilla/reverse | 支持基于正则式的路由 |
gorilla/rpc | 实现RPC over HTTP |
gorilla/… |
Go语言数据库编程
该包提供了对SQL或者类SQL数据库提供通用访问接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import "database/sql" import ( // 引入驱动包 _ "github.com/go-sql-driver/mysql" "log" ) func main() { // 打开数据库连接 db, _ := sql.Open(driver, dataSourceName) // 直到发起第一个查询,并不会真正打开连接 // 下面的命令可以验证连接是否正常 if err := db.Ping(); err != nil { log.Fatal(err) } // 执行SQL插入 result, _ := db.Exec( "INSERT INTO users (name, age) VALUES (?, ?)", "Alex", 31, ) // 上一次插入的ID、影响的行数 id, _ := result.LastInsertId() rowCount, _ := result.RowsAffected() // 执行SQL查询 rows, _ := db.Query("SELECT name FROM users WHERE age = ?", 31) // 遍历结果集 for rows.Next() { var name string rows.Scan(&name) } // 执行SQL单行查询 var age int row := db.QueryRow("SELECT age FROM users WHERE name = ?", "Alex") row.Scan(&age) // 预编译语句 stmt, err := db.Prepare("SELECT name FROM users WHERE age = ?") if err != nil { log.Fatal(err) } rows, _ := stmt.Query(31) // 事务支持 tx, _ := db.Begin() tx.Commit() tx.Rollback() // Context支持,可以进行查询取消或者超时 db.QueryContext(ctx,sql,arg0,arg1) } |
如果数据库的列可空,则你必须使用支持空值的Go类型来接收它。sql包中实现的类型包括NullBool、NullFloat64、NullInt64、NullString。示例代码:
1 2 3 4 5 6 7 |
var name NullString db.QueryRow("SELECT name FROM names WHERE id = ?", id).Scan(&name) if name.Valid { } else { // 数据库空值 } |
标准库内置了数据库连接池:
该包对Go标准库database/sql进行了扩展,支持:
- 将结果集行反序列化为结构(支…