16 changed files with 334 additions and 133 deletions
@ -0,0 +1,121 @@
|
||||
apiVersion: v1 |
||||
kind: ConfigMap |
||||
metadata: |
||||
name: prometheus-map |
||||
namespace: sopod |
||||
labels: |
||||
app: prometheus-map |
||||
data: |
||||
prometheus.yml: |- |
||||
global: |
||||
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute. |
||||
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute. |
||||
# scrape_timeout is set to the global default (10s). |
||||
|
||||
scrape_configs: |
||||
- job_name: "prometheus" |
||||
static_configs: |
||||
- targets: ["localhost:9090"] |
||||
# - job_name: "gateway-http-svc" |
||||
# static_configs: |
||||
# - targets: ["gateway-http-svc:9100"] |
||||
# - job_name: "svr-gateway-ws1-svc" |
||||
# static_configs: |
||||
# - targets: ["svr-gateway-ws1-svc:9100"] |
||||
# - job_name: "svr-gateway-ws2-svc" |
||||
# static_configs: |
||||
# - targets: ["svr-gateway-ws2-svc:9100"] |
||||
|
||||
--- |
||||
|
||||
apiVersion: v1 |
||||
kind: PersistentVolume |
||||
metadata: |
||||
namespace: sopod |
||||
name: prometheus-pv |
||||
labels: |
||||
pv: prometheus-pv |
||||
spec: |
||||
capacity: |
||||
storage: 20Gi |
||||
accessModes: |
||||
- ReadWriteMany |
||||
persistentVolumeReclaimPolicy: Retain |
||||
storageClassName: local-storage |
||||
local: |
||||
path: /data/k8s_data/prometheus/data |
||||
nodeAffinity: |
||||
required: |
||||
nodeSelectorTerms: |
||||
- matchExpressions: |
||||
- key: node-role.kubernetes.io/master |
||||
operator: In |
||||
values: |
||||
- "true" |
||||
--- |
||||
apiVersion: v1 |
||||
kind: PersistentVolumeClaim |
||||
metadata: |
||||
name: prometheus-pvc |
||||
namespace: sopod |
||||
spec: |
||||
storageClassName: local-storage |
||||
accessModes: |
||||
- ReadWriteMany |
||||
resources: |
||||
requests: |
||||
storage: 20Gi |
||||
selector: |
||||
matchLabels: |
||||
pv: prometheus-pv |
||||
|
||||
--- |
||||
apiVersion: v1 |
||||
kind: Pod |
||||
metadata: |
||||
name: prometheus |
||||
namespace: sopod |
||||
labels: |
||||
app: prometheus |
||||
spec: |
||||
containers: |
||||
- name: prometheus |
||||
securityContext: |
||||
runAsUser: 0 # open /opt/bitnami/prometheus/data/queries.active: permission denied |
||||
image: bitnami/prometheus:2.47.0 |
||||
imagePullPolicy: IfNotPresent |
||||
args: |
||||
- "--config.file=/opt/bitnami/prometheus/conf/prometheus.yml" |
||||
- "--web.listen-address=:9090" |
||||
- "--storage.tsdb.path=/opt/bitnami/prometheus/data/" |
||||
ports: |
||||
- containerPort: 9090 |
||||
volumeMounts: |
||||
- name: prometheus-data |
||||
mountPath: /opt/bitnami/prometheus/data/ |
||||
- name: prometheus-map-vol |
||||
mountPath: /opt/bitnami/prometheus/conf/ |
||||
volumes: |
||||
- name: prometheus-data |
||||
persistentVolumeClaim: |
||||
claimName: prometheus-pvc |
||||
- name: prometheus-map-vol |
||||
configMap: |
||||
name: prometheus-map |
||||
|
||||
--- |
||||
apiVersion: v1 |
||||
kind: Service |
||||
metadata: |
||||
namespace: sopod |
||||
name: prometheus-svc |
||||
labels: |
||||
app: prometheus-svc |
||||
spec: |
||||
type: NodePort |
||||
ports: |
||||
- name: prometheus |
||||
port: 9090 |
||||
nodePort: 30090 |
||||
selector: |
||||
app: prometheus |
||||
@ -1,33 +0,0 @@
|
||||
package discovery |
||||
|
||||
import ( |
||||
"context" |
||||
"fmt" |
||||
clientv3 "go.etcd.io/etcd/client/v3" |
||||
"go.etcd.io/etcd/client/v3/naming/endpoints" |
||||
) |
||||
|
||||
func EtcdDialUrl(serviceName string) string { |
||||
return fmt.Sprintf("etcd:///%s", serviceName) |
||||
} |
||||
|
||||
func EtcdRegistry(client *clientv3.Client, serviceName, addr string, attrs map[string]string) (err error) { |
||||
em, err := endpoints.NewManager(client, "Hello") |
||||
if err != nil { |
||||
return |
||||
} |
||||
ip, port, err := RegisterIpPort(addr) |
||||
if err != nil { |
||||
return |
||||
} |
||||
fmt.Println() |
||||
|
||||
err = em.AddEndpoint(context.Background(), |
||||
fmt.Sprintf("%s/%s", serviceName, ip), |
||||
endpoints.Endpoint{ |
||||
Addr: fmt.Sprintf("%s:%d", ip, port), |
||||
Metadata: attrs, |
||||
}, |
||||
) |
||||
return |
||||
} |
||||
@ -0,0 +1,80 @@
|
||||
package discovery |
||||
|
||||
import ( |
||||
"context" |
||||
"encoding/json" |
||||
"fmt" |
||||
clientv3 "go.etcd.io/etcd/client/v3" |
||||
"go.etcd.io/etcd/client/v3/naming/endpoints" |
||||
"sonet/pkg/utils/logger" |
||||
"sonet/pkg/utils/shutdown" |
||||
"time" |
||||
) |
||||
|
||||
func EtcdDialUrl(serviceName string) string { |
||||
return fmt.Sprintf("etcd:///%s", serviceName) |
||||
} |
||||
|
||||
func EtcdRegistry(client *clientv3.Client, server *Server) (err error) { |
||||
em, err := endpoints.NewManager(client, server.Name) |
||||
if err != nil { |
||||
return |
||||
} |
||||
ip, port, err := RegisterIpPort(server.Addr) |
||||
if err != nil { |
||||
return |
||||
} |
||||
|
||||
server.Addr = fmt.Sprintf("%s:%d", ip, port) |
||||
// 序列化 metadata 信息
|
||||
meta := "{}" |
||||
if server.Attrs != nil { |
||||
bytes, e := json.Marshal(server.Attrs) |
||||
if e != nil { |
||||
err = e |
||||
return |
||||
} |
||||
meta = string(bytes) |
||||
} |
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) |
||||
defer cancel() |
||||
|
||||
lease, err := client.Grant(ctx, DefaultRegisterTTL) // 使用租约注册端点确保如果主机无法维持保活心跳, 从服务中删除
|
||||
if err != nil { |
||||
return |
||||
} |
||||
endpointKey := fmt.Sprintf("%s/%s", server.Name, ip) |
||||
err = em.AddEndpoint(ctx, |
||||
endpointKey, |
||||
endpoints.Endpoint{ |
||||
Addr: server.Addr, |
||||
Metadata: meta, |
||||
}, |
||||
clientv3.WithLease(lease.ID), |
||||
) |
||||
|
||||
// keepalive lease
|
||||
keepAliveCh, err := client.KeepAlive(context.Background(), lease.ID) |
||||
doneCh := make(chan bool) |
||||
c := func() { |
||||
doneCh <- true |
||||
<-doneCh |
||||
} |
||||
shutdown.AddShutdownHook(c) |
||||
go func() { |
||||
for { |
||||
select { |
||||
case <-doneCh: // async... not done
|
||||
logger.Info("keepalive done") |
||||
ctx, c := context.WithTimeout(context.Background(), time.Second*5) |
||||
_, _ = client.Revoke(ctx, lease.ID) |
||||
c() |
||||
doneCh <- true |
||||
return |
||||
case _ = <-keepAliveCh: |
||||
} |
||||
} |
||||
}() |
||||
return |
||||
} |
||||
Loading…
Reference in new issue