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