Move and rename
This commit is contained in:
parent
361fdfba04
commit
14c9c412cd
@ -1,3 +1,4 @@
|
|||||||
|
// Package client provides an implementation of a restricted subset of kubernetes API client
|
||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -10,6 +11,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/micro/go-micro/util/kubernetes/api"
|
"github.com/micro/go-micro/util/kubernetes/api"
|
||||||
"github.com/micro/go-micro/util/log"
|
"github.com/micro/go-micro/util/log"
|
||||||
@ -20,6 +22,8 @@ var (
|
|||||||
serviceAccountPath = "/var/run/secrets/kubernetes.io/serviceaccount"
|
serviceAccountPath = "/var/run/secrets/kubernetes.io/serviceaccount"
|
||||||
// ErrReadNamespace is returned when the names could not be read from service account
|
// ErrReadNamespace is returned when the names could not be read from service account
|
||||||
ErrReadNamespace = errors.New("Could not read namespace from service account secret")
|
ErrReadNamespace = errors.New("Could not read namespace from service account secret")
|
||||||
|
// DefaultImage is default micro image
|
||||||
|
DefaultImage = "micro/go-micro"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Client ...
|
// Client ...
|
||||||
@ -27,71 +31,20 @@ type client struct {
|
|||||||
opts *api.Options
|
opts *api.Options
|
||||||
}
|
}
|
||||||
|
|
||||||
// NewLocalDevClient returns a client that can be used with `kubectl proxy` on an optional port
|
// Kubernetes client
|
||||||
func NewLocalDevClient(port ...int) *client {
|
type Client interface {
|
||||||
var p int
|
// Create creates new API resource
|
||||||
if len(port) > 1 {
|
Create(*Resource) error
|
||||||
log.Fatal("Expected 0 or 1 port parameters")
|
// Get queries API resrouces
|
||||||
}
|
Get(*Resource, map[string]string) error
|
||||||
if len(port) == 0 {
|
// Update patches existing API object
|
||||||
p = 8001
|
Update(*Resource) error
|
||||||
} else {
|
// Delete deletes API resource
|
||||||
p = port[0]
|
Delete(*Resource) error
|
||||||
}
|
// List lists API resources
|
||||||
return &client{
|
List(*Resource) error
|
||||||
opts: &api.Options{
|
// Log gets log for a pod
|
||||||
Client: http.DefaultClient,
|
Log(*Resource, ...LogOption) (io.ReadCloser, error)
|
||||||
Host: "http://localhost:" + strconv.Itoa(p),
|
|
||||||
Namespace: "default",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClientInCluster creates a Kubernetes client for use from within a k8s pod.
|
|
||||||
func NewClientInCluster() *client {
|
|
||||||
host := "https://" + os.Getenv("KUBERNETES_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_SERVICE_PORT")
|
|
||||||
|
|
||||||
s, err := os.Stat(serviceAccountPath)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
if s == nil || !s.IsDir() {
|
|
||||||
log.Fatal(errors.New("service account not found"))
|
|
||||||
}
|
|
||||||
|
|
||||||
token, err := ioutil.ReadFile(path.Join(serviceAccountPath, "token"))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
t := string(token)
|
|
||||||
|
|
||||||
ns, err := detectNamespace()
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
crt, err := CertPoolFromFile(path.Join(serviceAccountPath, "ca.crt"))
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
c := &http.Client{
|
|
||||||
Transport: &http.Transport{
|
|
||||||
TLSClientConfig: &tls.Config{
|
|
||||||
RootCAs: crt,
|
|
||||||
},
|
|
||||||
DisableCompression: true,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return &client{
|
|
||||||
opts: &api.Options{
|
|
||||||
Client: c,
|
|
||||||
Host: host,
|
|
||||||
Namespace: ns,
|
|
||||||
BearerToken: &t,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func detectNamespace() (string, error) {
|
func detectNamespace() (string, error) {
|
||||||
@ -203,3 +156,165 @@ func (c *client) List(r *Resource) error {
|
|||||||
}
|
}
|
||||||
return c.Get(r, labels)
|
return c.Get(r, labels)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NewService returns default micro kubernetes service definition
|
||||||
|
func NewService(name, version, typ string) *Service {
|
||||||
|
log.Tracef("kubernetes default service: name: %s, version: %s", name, version)
|
||||||
|
|
||||||
|
Labels := map[string]string{
|
||||||
|
"name": name,
|
||||||
|
"version": version,
|
||||||
|
"micro": typ,
|
||||||
|
}
|
||||||
|
|
||||||
|
svcName := name
|
||||||
|
if len(version) > 0 {
|
||||||
|
// API service object name joins name and version over "-"
|
||||||
|
svcName = strings.Join([]string{name, version}, "-")
|
||||||
|
}
|
||||||
|
|
||||||
|
Metadata := &Metadata{
|
||||||
|
Name: svcName,
|
||||||
|
Namespace: "default",
|
||||||
|
Version: version,
|
||||||
|
Labels: Labels,
|
||||||
|
}
|
||||||
|
|
||||||
|
Spec := &ServiceSpec{
|
||||||
|
Type: "ClusterIP",
|
||||||
|
Selector: Labels,
|
||||||
|
Ports: []ServicePort{{
|
||||||
|
"service-port", 9090, "",
|
||||||
|
}},
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Service{
|
||||||
|
Metadata: Metadata,
|
||||||
|
Spec: Spec,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewService returns default micro kubernetes deployment definition
|
||||||
|
func NewDeployment(name, version, typ string) *Deployment {
|
||||||
|
log.Tracef("kubernetes default deployment: name: %s, version: %s", name, version)
|
||||||
|
|
||||||
|
Labels := map[string]string{
|
||||||
|
"name": name,
|
||||||
|
"version": version,
|
||||||
|
"micro": typ,
|
||||||
|
}
|
||||||
|
|
||||||
|
depName := name
|
||||||
|
if len(version) > 0 {
|
||||||
|
// API deployment object name joins name and version over "-"
|
||||||
|
depName = strings.Join([]string{name, version}, "-")
|
||||||
|
}
|
||||||
|
|
||||||
|
Metadata := &Metadata{
|
||||||
|
Name: depName,
|
||||||
|
Namespace: "default",
|
||||||
|
Version: version,
|
||||||
|
Labels: Labels,
|
||||||
|
Annotations: map[string]string{},
|
||||||
|
}
|
||||||
|
|
||||||
|
// enable go modules by default
|
||||||
|
env := EnvVar{
|
||||||
|
Name: "GO111MODULE",
|
||||||
|
Value: "on",
|
||||||
|
}
|
||||||
|
|
||||||
|
Spec := &DeploymentSpec{
|
||||||
|
Replicas: 1,
|
||||||
|
Selector: &LabelSelector{
|
||||||
|
MatchLabels: Labels,
|
||||||
|
},
|
||||||
|
Template: &Template{
|
||||||
|
Metadata: Metadata,
|
||||||
|
PodSpec: &PodSpec{
|
||||||
|
Containers: []Container{{
|
||||||
|
Name: name,
|
||||||
|
Image: DefaultImage,
|
||||||
|
Env: []EnvVar{env},
|
||||||
|
Command: []string{"go", "run", "main.go"},
|
||||||
|
Ports: []ContainerPort{{
|
||||||
|
Name: "service-port",
|
||||||
|
ContainerPort: 8080,
|
||||||
|
}},
|
||||||
|
}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return &Deployment{
|
||||||
|
Metadata: Metadata,
|
||||||
|
Spec: Spec,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewLocalDevClient returns a client that can be used with `kubectl proxy` on an optional port
|
||||||
|
func NewLocalDevClient(port ...int) *client {
|
||||||
|
var p int
|
||||||
|
if len(port) > 1 {
|
||||||
|
log.Fatal("Expected 0 or 1 port parameters")
|
||||||
|
}
|
||||||
|
if len(port) == 0 {
|
||||||
|
p = 8001
|
||||||
|
} else {
|
||||||
|
p = port[0]
|
||||||
|
}
|
||||||
|
return &client{
|
||||||
|
opts: &api.Options{
|
||||||
|
Client: http.DefaultClient,
|
||||||
|
Host: "http://localhost:" + strconv.Itoa(p),
|
||||||
|
Namespace: "default",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewClientInCluster creates a Kubernetes client for use from within a k8s pod.
|
||||||
|
func NewClientInCluster() *client {
|
||||||
|
host := "https://" + os.Getenv("KUBERNETES_SERVICE_HOST") + ":" + os.Getenv("KUBERNETES_SERVICE_PORT")
|
||||||
|
|
||||||
|
s, err := os.Stat(serviceAccountPath)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
if s == nil || !s.IsDir() {
|
||||||
|
log.Fatal(errors.New("service account not found"))
|
||||||
|
}
|
||||||
|
|
||||||
|
token, err := ioutil.ReadFile(path.Join(serviceAccountPath, "token"))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
t := string(token)
|
||||||
|
|
||||||
|
ns, err := detectNamespace()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
crt, err := CertPoolFromFile(path.Join(serviceAccountPath, "ca.crt"))
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
c := &http.Client{
|
||||||
|
Transport: &http.Transport{
|
||||||
|
TLSClientConfig: &tls.Config{
|
||||||
|
RootCAs: crt,
|
||||||
|
},
|
||||||
|
DisableCompression: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
return &client{
|
||||||
|
opts: &api.Options{
|
||||||
|
Client: c,
|
||||||
|
Host: host,
|
||||||
|
Namespace: ns,
|
||||||
|
BearerToken: &t,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,125 +0,0 @@
|
|||||||
// Package client provides an implementation of a restricted subset of kubernetes API client
|
|
||||||
package client
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"github.com/micro/go-micro/util/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// DefaultImage is default micro image
|
|
||||||
DefaultImage = "micro/go-micro"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Kubernetes client
|
|
||||||
type Kubernetes interface {
|
|
||||||
// Create creates new API resource
|
|
||||||
Create(*Resource) error
|
|
||||||
// Get queries API resrouces
|
|
||||||
Get(*Resource, map[string]string) error
|
|
||||||
// Update patches existing API object
|
|
||||||
Update(*Resource) error
|
|
||||||
// Delete deletes API resource
|
|
||||||
Delete(*Resource) error
|
|
||||||
// List lists API resources
|
|
||||||
List(*Resource) error
|
|
||||||
// Log gets log for a pod
|
|
||||||
Log(*Resource, ...LogOption) (io.ReadCloser, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewService returns default micro kubernetes service definition
|
|
||||||
func NewService(name, version, typ string) *Service {
|
|
||||||
log.Tracef("kubernetes default service: name: %s, version: %s", name, version)
|
|
||||||
|
|
||||||
Labels := map[string]string{
|
|
||||||
"name": name,
|
|
||||||
"version": version,
|
|
||||||
"micro": typ,
|
|
||||||
}
|
|
||||||
|
|
||||||
svcName := name
|
|
||||||
if len(version) > 0 {
|
|
||||||
// API service object name joins name and version over "-"
|
|
||||||
svcName = strings.Join([]string{name, version}, "-")
|
|
||||||
}
|
|
||||||
|
|
||||||
Metadata := &Metadata{
|
|
||||||
Name: svcName,
|
|
||||||
Namespace: "default",
|
|
||||||
Version: version,
|
|
||||||
Labels: Labels,
|
|
||||||
}
|
|
||||||
|
|
||||||
Spec := &ServiceSpec{
|
|
||||||
Type: "ClusterIP",
|
|
||||||
Selector: Labels,
|
|
||||||
Ports: []ServicePort{{
|
|
||||||
"service-port", 9090, "",
|
|
||||||
}},
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Service{
|
|
||||||
Metadata: Metadata,
|
|
||||||
Spec: Spec,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewService returns default micro kubernetes deployment definition
|
|
||||||
func NewDeployment(name, version, typ string) *Deployment {
|
|
||||||
log.Tracef("kubernetes default deployment: name: %s, version: %s", name, version)
|
|
||||||
|
|
||||||
Labels := map[string]string{
|
|
||||||
"name": name,
|
|
||||||
"version": version,
|
|
||||||
"micro": typ,
|
|
||||||
}
|
|
||||||
|
|
||||||
depName := name
|
|
||||||
if len(version) > 0 {
|
|
||||||
// API deployment object name joins name and version over "-"
|
|
||||||
depName = strings.Join([]string{name, version}, "-")
|
|
||||||
}
|
|
||||||
|
|
||||||
Metadata := &Metadata{
|
|
||||||
Name: depName,
|
|
||||||
Namespace: "default",
|
|
||||||
Version: version,
|
|
||||||
Labels: Labels,
|
|
||||||
Annotations: map[string]string{},
|
|
||||||
}
|
|
||||||
|
|
||||||
// enable go modules by default
|
|
||||||
env := EnvVar{
|
|
||||||
Name: "GO111MODULE",
|
|
||||||
Value: "on",
|
|
||||||
}
|
|
||||||
|
|
||||||
Spec := &DeploymentSpec{
|
|
||||||
Replicas: 1,
|
|
||||||
Selector: &LabelSelector{
|
|
||||||
MatchLabels: Labels,
|
|
||||||
},
|
|
||||||
Template: &Template{
|
|
||||||
Metadata: Metadata,
|
|
||||||
PodSpec: &PodSpec{
|
|
||||||
Containers: []Container{{
|
|
||||||
Name: name,
|
|
||||||
Image: DefaultImage,
|
|
||||||
Env: []EnvVar{env},
|
|
||||||
Command: []string{"go", "run", "main.go"},
|
|
||||||
Ports: []ContainerPort{{
|
|
||||||
Name: "service-port",
|
|
||||||
ContainerPort: 8080,
|
|
||||||
}},
|
|
||||||
}},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
return &Deployment{
|
|
||||||
Metadata: Metadata,
|
|
||||||
Spec: Spec,
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user