consul icon indicating copy to clipboard operation
consul copied to clipboard

Go Client: Connect must be enabled in order to use this endpoint

Open RickoNoNo3 opened this issue 1 year ago • 6 comments

Overview of the Issue

Error when use Golang client. It seems like the CA certification is opened by default? But I don't have any configuration for it.

Reproduction Steps

Create a cluster with at least 3 server nodes as Docker container, and use these configs:

version: '2'

services:
  consul-server1:
    image: hashicorp/consul:1.11.2
    container_name: consul-server1
    restart: always
    volumes:
     - /root/consul/server1.json:/consul/config/server1.json:ro
    networks:
      - consul
    ports:
      - "8500:8500"
      - "8600:8600/tcp"
      - "8600:8600/udp"
    command: "agent -bootstrap-expect=3"

  consul-server2:
    image: hashicorp/consul:1.11.2
    container_name: consul-server2
    restart: always
    volumes:
     - /root/consul/server2.json:/consul/config/server2.json:ro
    networks:
      - consul
    ports:
      - "8501:8500"
      - "8601:8600/tcp"
      - "8601:8600/udp"
    command: "agent -bootstrap-expect=3"

  consul-server3:
    image: hashicorp/consul:1.11.2
    container_name: consul-server3
    restart: always
    volumes:
     - /root/consul/server3.json:/consul/config/server3.json:ro
    networks:
      - consul
    ports:
      - "8502:8500"
      - "8602:8600/tcp"
      - "8602:8600/udp"
    command: "agent -bootstrap-expect=3"

  consul-client:
    image: hashicorp/consul:1.11.2
    container_name: consul-client
    restart: always
    volumes:
     - /root/consul/client.json:/consul/config/client.json:ro
    networks:
      - consul
    command: "agent"

networks:
  consul:
    driver: bridge

Takes server1.json as an example:

{
    "node_name": "consul-server1",
    "server": true,
    "ui_config": {
        "enabled" : true
    },
    "data_dir": "/consul/data",
    "addresses": {
        "http" : "0.0.0.0"
    },
    "retry_join":[
        "consul-server2",
        "consul-server3"
    ]
}

Write a Go program on the same machine as server1, build and run:

import (
	"fmt"
	"net/http"

	"github.com/hashicorp/consul/api"
	"github.com/hashicorp/consul/connect"
)

func main() {
	client, _ := api.NewClient(api.DefaultConfig())
	svc, _ := connect.NewService("MyService", client)
	defer svc.Close()

	if err := http.ListenAndServe(":8890", nil); err != nil {
		fmt.Println("HTTP serving error: ",err)
	}
}

View error in Go console:

2022-08-30T15:01:44.550+0800 [ERROR] connect.watch: Watch errored: service=MyService type=connect_roots error="Unexpected response code: 500 (rpc error making call: Connect must be enabled in order to use this endpoint)" retry=3m0s
2022-08-30T15:01:44.551+0800 [ERROR] connect.watch: Watch errored: service=MyService type=connect_leaf error="Unexpected response code: 500 (rpc error making call: Connect must be enabled in order to use this endpoint)" retry=3m0s
2022-08-30T15:04:44.650+0800 [ERROR] connect.watch: Watch errored: service=MyService type=connect_roots error="Unexpected response code: 500 (rpc error making call: Connect must be enabled in order to use this endpoint)" retry=3m0s
2022-08-30T15:04:44.650+0800 [ERROR] connect.watch: Watch errored: service=MyService type=connect_leaf error="Unexpected response code: 500 (rpc error making call: Connect must be enabled in order to use this endpoint)" retry=3m0s

View error in Server1:

2022-08-30T06:40:12.239Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/leaf/MyService from=172.24.0.1:35240 error="rpc error making call: Connect must be enabled in order to use this endpoint"
2022-08-30T06:40:12.239Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/roots from=172.24.0.1:35242 error="rpc error making call: Connect must be enabled in order to use this endpoint"
2022-08-30T06:41:32.295Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/roots from=172.24.0.1:35242 error="rpc error making call: Connect must be enabled in order to use this endpoint"
2022-08-30T06:41:32.295Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/leaf/MyService from=172.24.0.1:35240 error="rpc error making call: Connect must be enabled in order to use this endpoint"
2022-08-30T06:43:37.326Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/leaf/MyService from=172.24.0.1:37488 error="rpc error making call: Connect must be enabled in order to use this endpoint"
2022-08-30T06:43:37.326Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/roots from=172.24.0.1:37490 error="rpc error making call: Connect must be enabled in order to use this endpoint"
2022-08-30T06:46:37.410Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/leaf/MyService from=172.24.0.1:38972 error="rpc error making call: Connect must be enabled in order to use this endpoint"
2022-08-30T06:46:37.410Z [ERROR] agent.http: Request error: method=GET url=/v1/agent/connect/ca/roots from=172.24.0.1:38974 error="rpc error making call: Connect must be enabled in order to use this endpoint"

Consul info

Server info
agent:
        check_monitors = 0
        check_ttls = 1
        checks = 3
        services = 2
build:
        prerelease =
        revision = 37c7d06b
        version = 1.11.2
consul:
        acl = disabled
        bootstrap = false
        known_datacenters = 1
        leader = false
        leader_addr = 172.24.0.2:8300
        server = true
raft:
        applied_index = 21093
        commit_index = 21093
        fsm_pending = 0
        last_contact = 4.067366ms
        last_log_index = 21093
        last_log_term = 2
        last_snapshot_index = 16387
        last_snapshot_term = 2
        latest_configuration = [{Suffrage:Voter ID:13ca4bb5-02c1-6352-194f-acf2c8d69554 Address:172.24.0.2:8300} {Suffrage:Voter ID:b1232bfd-2eb5-a462-ad29-5477a522e739 Address:172.24.0.5:8300} {Suffrage:Voter ID:f5e1271d-0c5f-a264-59c1-0f4680a4a83e Address:172.24.0.7:8300}]
        latest_configuration_index = 0
        num_peers = 2
        protocol_version = 3
        protocol_version_max = 3
        protocol_version_min = 0
        snapshot_version_max = 1
        snapshot_version_min = 0
        state = Follower
        term = 2
runtime:
        arch = amd64
        cpu_count = 4
        goroutines = 165
        max_procs = 4
        os = linux
        version = go1.17.5
serf_lan:
        coordinate_resets = 0
        encrypted = false
        event_queue = 0
        event_time = 2
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 4
        members = 4
        query_queue = 0
        query_time = 1
serf_wan:
        coordinate_resets = 0
        encrypted = false
        event_queue = 0
        event_time = 1
        failed = 0
        health_score = 0
        intent_queue = 0
        left = 0
        member_time = 4
        members = 3
        query_queue = 0
        query_time = 1

Operating system and Environment details

Ubuntu 18.04 amd64

RickoNoNo3 avatar Aug 30 '22 07:08 RickoNoNo3

Hi @RickoNoNo3,

Welcome to the Consul community! Thank you for reaching out about this.

Can you clarify what you wanted to accomplish with the command below? IsMyService intended to be a service in Consul's service mesh?

svc, _ := connect.NewService("MyService", client)

jkirschner-hashicorp avatar Aug 30 '22 12:08 jkirschner-hashicorp

Yes, I want to register my own program as a service of Consul.

RickoNoNo3 avatar Aug 30 '22 13:08 RickoNoNo3

Are you looking to deploy "MyService" with a sidecar proxy in a service mesh? Or just register "MyService" with Consul to make it discoverable to other programs ("service discovery")?

Are there any guides or documentation you were following?

I ask because there may be an opportunity to make Consul's documentation and/or log messages clearer.

"connect" is the subsystem in Consul that provides its service mesh capabilities. Therefore, connect.newService can't be used without enabling the connect subsystem in the Consul server agent configuration JSON. For example:

{
    "node_name": "consul-server1",
    "server": true,
    "ui_config": {
        "enabled" : true
    },
    "data_dir": "/consul/data",
    "addresses": {
        "http" : "0.0.0.0"
    },
    "retry_join":[
        "consul-server2",
        "consul-server3"
    ],
    "connect":{
      "enabled": true
    }
}

jkirschner-hashicorp avatar Aug 30 '22 13:08 jkirschner-hashicorp

I am sorry that I didn’t fully understand the concept of Connect and Mesh. I just looked for a method to register a consul service (that is called, now I know, service discovery) in Go, Then I accidentally entered https://www.consul.io/docs/connect/native/go by mistake so I did above things.

Now it seems that client.Agent().ServiceRegister() is more suitable for me, rather than connect.NewService(). Is it right?

RickoNoNo3 avatar Aug 30 '22 14:08 RickoNoNo3

It's the role of our documentation to ensure concepts like Connect and Mesh are clear for our users :) Your experience points out there may be things we can do to make it clearer.

That Go integration page you found does show connect.NewService() without anything indicating it requires service mesh (connect enabled), or indicating that an alternative should be used for service discovery. Maybe we can make a small docs change there.

Yes, client.Agent().ServiceRegister() sounds right to me.

jkirschner-hashicorp avatar Aug 30 '22 14:08 jkirschner-hashicorp

Thank you!

RickoNoNo3 avatar Aug 30 '22 15:08 RickoNoNo3