Kubernetes环境搭建
Rancher简介
Rancher是一个开源的企业级容器管理平台。通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台。Rancher提供了在生产环境中使用的管理Docker和Kubernetes的全栈化容器部署与管理平台。
Rancher由以下四个部分组成:
- 基础设施编排
- 容器编排与调度
- 应用商店
- 企业及权限管理
下图展示了Rancher的主要组件和功能:
详情可见Rancher文档
Docker安装
修改Docker安装时的.json文件
vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://dev.aliyun.com/search.html"]
}
重启docker
systemctl daemon-reload
systemctl restart docker
安装Rancher
Docker安装并更新之后,就可以在Docker的Linux服务器上安装Rancher,并指定开放端口等信息,进行基础配置
docker run -d --name rancher-server -p 8080:8080 --restart=unless-stopped rancher/server:v1.6.14 && docker logs -f rancher-server
Kunbernetes安装
Kubernetes(常简称为K8s)是用于自动部署、扩展和管理“容器化(containerized)应用程序”的开源系统。[3]该系统由Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用。
它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。[4] 它支持一系列容器工具, 包括Docker等
环境配置
创建Kubernetes环境并添加主机
gRPC
gRPC 简介
gRPC 是一个现代化高性能开源远程过程调用(RPC)框架。CoreOS 的分布式键值存储 etcd 就使用了 gRPC 进行点对点通讯,Docker 的便携式容器运行时 containerd 也通过 gRPC 暴露其功能,同时 containerd 本身也被捐献给了 CNCF。在 gRPC 中可以使用 Protocol Buffers 来定义服务的接口,Protocol Buffers 是一个强大的二进制序列化工具和语言。gRPC 也和诸多语言进行了集成,并可以自动生成特定语言的客户端和服务端接口。
环境配置安装
安装protobuf
安装autoconf
wget http://mirrors.kernel.org/gnu/autoconf/autoconf-2.65.tar.gz \
&& tar -xzvf autoconf-2.65.tar.gz \
&& cd autoconf-2.65 \
&& ./configure –prefix=/usr/local
make && make install
安装Protocol Buffers v3.11.2
执行下面的操作:
./configure --prefix=your_pb_install_path
make
make install
设置环境变量
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
安装gRPC-go
git clone https://github.com/grpc/grpc-go.git $GOPATH/src/google.golang.org/grpc
git clone https://github.com/golang/net.git $GOPATH/src/golang.org/x/net
git clone https://github.com/golang/text.git $GOPATH/src/golang.org/x/text
git clone https://github.com/google/go-genproto.git $GOPATH/src/google.golang.org/genproto
cd $GOPATH/src/
go install google.golang.org/grpc
helloworld
运行测试
使用examples给出的helloworld,使用protoc命令生成相关文件
protoc --go_out=plugins=grpc:. helloworld.proto
这里生成了对应的pb.go文件,使用plugins选项提供对grpc的支持、生成service的接口
分别打开两个终端运行服务器和客户端
go run greeter_server/main.go
go run greeter_client/main.go
服务器端运行结果
2019/12/26 19:02:26 Received: world
客户端运行结果
2019/12/26 19:02:26 Greeting: Hello world
代码
helloworld.proto
syntax = "proto3";
option java_multiple_files = true;
option java_package = "io.grpc.examples.helloworld";
option java_outer_classname = "HelloWorldProto";
package helloworld;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply) {}
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
// The response message containing the greetings
message HelloReply {
string message = 1;
}
声明了服务SayHello,请求的参数信息HelloRequest,返回的信息HelloReply。利用.proto文件定义gRPC服务,通过 protoc 编译器生成 .pb.go 文件。
服务器端
package main
import (
"context"
"log"
"net"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
"google.golang.org/grpc/reflection"
)
const (
port = ":50051"
)
// server is used to implement helloworld.GreeterServer.
type server struct{}
// SayHello implements helloworld.GreeterServer
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
log.Printf("Received: %v", in.Name)
return &pb.HelloReply{Message: "Hello " + in.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
// Register reflection service on gRPC server.
reflection.Register(s)
if err := s.Serve(lis); err != nil {
log.Fatalf("failed to serve: %v", err)
}
}
客户端
package main
import (
"context"
"log"
"os"
"time"
"google.golang.org/grpc"
pb "google.golang.org/grpc/examples/helloworld/helloworld"
)
const (
address = "localhost:50051"
defaultName = "world"
)
func main() {
// Set up a connection to the server.
conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
log.Fatalf("did not connect: %v", err)
}
defer conn.Close()
c := pb.NewGreeterClient(conn)
// Contact the server and print out its response.
name := defaultName
if len(os.Args) > 1 {
name = os.Args[1]
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
r, err := c.SayHello(ctx, &pb.HelloRequest{Name: name})
if err != nil {
log.Fatalf("could not greet: %v", err)
}
log.Printf("Greeting: %s", r.Message)
}