将 istio 集成到 k8s 集群中。我正在尝试从同一命名空间中的 ubuntu pod(该 pod 也有 envoy)卷曲到无头服务(三个 pod 之一)后面的 etcd pod。
当我卷曲到无头服务 etcd pod 时,我看到 404 页面未找到。
我尝试创建虚拟服务和目标规则
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: etcd-route-rule
namespace: aks-istio-system
spec:
hosts:
- "*"
http:
- route:
- destination:
host: <etcd-pod>.<headless-svc-name>.ns.svc.cluster.local
port:
number: 2380
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: etcd-mtls-dstrule
namespace: aks-istio-system
spec:
host: <etcd-pod>.<headless-svc-name>.ns.svc.cluster.local
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
我开始收到 503 错误。我在这里做错了什么?
要正确设置您的环境并避免 Istio 和 etcd 服务遇到的错误,请按照以下步骤操作:
使用无头服务部署 etcd 集群
部署 etcd Pod:确保您的 etcd Pod 部署在 Kubernetes 中。您可能为此使用 StatefulSet,这对于 etcd 集群来说是典型的。
创建无头服务:在 Kubernetes 中为您的 etcd 集群定义无头服务。这是一个服务定义示例:
apiVersion: v1
kind: Service
metadata:
name: etcd-headless
namespace: aks-istio-system
spec:
ports:
- port: 2380
name: peer
- port: 2379
name: client
clusterIP: None # This makes the service headless
selector:
app: etcd # Adjust this selector to match your etcd pods
安装并配置 Istio 以启用自动 sidecar 注入
kubectl label namespace aks-istio-system istio-injection=enabled
确保您的 etcd pod 已注入 Istio sidecar。如果它们在启用 Istio 之前运行,您可能需要重新创建 Pod。
接下来,通过创建 VirtualService 来管理 etcd 无头服务的流量和 DestinationRule 来指定流量策略(例如 TLS 设置)来配置 Istio Networking。
virtualService.yaml
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: etcd-route-rule
namespace: aks-istio-system
spec:
hosts:
- "etcd-headless.aks-istio-system.svc.cluster.local"
http:
- route:
- destination:
host: "etcd-headless.aks-istio-system.svc.cluster.local"
port:
number: 2379 # or 2380 depending on the port you want to access
DestinationRule.yaml
apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
name: etcd-destination-rule
namespace: aks-istio-system
spec:
host: "etcd-headless.aks-istio-system.svc.cluster.local"
trafficPolicy:
tls:
mode: DISABLE # Use ISTIO_MUTUAL if you want mTLS
现在 Istio 网络对象已就位,您可以测试连接性。由于
etcd
pod 可能是 etcd 集群本身的一部分,并且可能没有安装 curl
,因此您需要在 aks-istio-system
命名空间内有一个可用 curl
的单独 pod。如果您还没有合适的 pod,您可以创建一个临时 pod 来进行测试。以下是如何部署一个简单的 Ubuntu pod,然后使用它来测试连接。创建一个名为 ubuntu-pod.yaml
的文件,其中包含以下内容:
apiVersion: v1
kind: Pod
metadata:
name: ubuntu-test
namespace: aks-istio-system
spec:
containers:
- name: ubuntu
image: ubuntu
command: ["/bin/sleep", "infinity"]
部署 Pod
kubectl apply -f ubuntu-pod.yaml
pod 启动后,执行它。
kubectl exec -it ubuntu-test -n aks-istio-system -- bash
并安装curl
apt-get update && apt-get install curl -y
最后
curl http://etcd-headless.aks-istio-system.svc.cluster.local:2379/health