English | 中文
polaris-controller 用于北极星和 K8s 生态的对接,提供两个可选功能:
- K8s Service 同步到北极星:将 K8s Service 同步到北极星,使用北极星进行服务发现和治理
- polaris-sidecar 自动注入:在应用 Pod 中注入 polaris-sidecar
polaris-controller 注入的sidecar的运行模式提供两个可选功能:
- 本地DNS(dns):注入 polaris-sidecar,通过拦截DNS请求的方式实现服务发现和治理
- 服务网格(mesh):注入 polaris-sidecar 以及 envoy ,通过劫持流量的方式实现服务发现和治理,开发侵入性低
本文档介绍如何在 K8s 集群中安装和使用 polaris-controller。
- 当前仅支持 kubernetes 的版本为 (, 1.21]
前提条件
在安装 polaris-controller 前,请先安装北极星服务端,安装方式请参考北极星服务端安装文档。
下载安装包
从 Releases 下载最新版本的安装包。
修改配置文件
修改配置文件 configmap.yaml,配置 K8s Service 同步模式和北极星服务端地址,配置示例如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: injector-mesh
namespace: polaris-system
data:
mesh: |-
# k8s cluster name
clusterName: "default"
# polaris-sidecar inject run mode
sidecarInject:
mode: "mesh"
# service sync
serviceSync:
mode: "all"
# 请确保北极星 server 监听的 http 端口为8090以及用于服务注册&治理的grpc端口为8091
serverAddress: "{{ 北极星 Server 的 IP 或者域名 }}"
# 当北极星开启了服务鉴权之后,这里需要配置对应用户/用户组的token
accessToken: ""
defaultConfig:
proxyMetadata:
# 请确保北极星 server 监听的 http 端口为8090以及用于服务注册&治理的grpc端口为8091
serverAddress: "{{ 北极星 Server 的 IP 或者域名 }}"
支持两种 K8s Service 同步模式:
- all:全量同步服务。将 K8s Service 全部同步到北极星。
- demand:按需同步服务。默认不会将 K8s Service 同步到北极星,需要在 Namespace 或者 Service 上添加北极星的 annotation。
北极星支持跨 K8s 集群的服务发现和治理,多个 K8s 集群的 Service 可以同步到一个北极星集群,同步规则如下:
- K8s Namespace 和 Service 名称作为北极星的命名空间名称
- 如果多个 K8s 集群存在相同的 Namespace 和 Service,全部 Pod 同步到一个北极星服务中
- polaris-controller 在北极星服务实例上添加 clusterName 标签,用于区分来自不同 K8s 集群的服务实例
- 如果存在多个 K8s Service 同步到一个北极星服务的情况,每个 K8s 集群的 polaris-controller 需要配置不同的 clusterName
运行安装脚本
在安装 kubectl 的机器上运行安装脚本:
bash ./install.sh
查看 polaris-controller 是否正常运行:
kubectl get pod -n polaris-system
NAME READY STATUS RESTARTS AGE
polaris-controller-545df9775c-48cqt 1/1 Running 0 2d9h
注解名称 | 注解描述 |
---|---|
polarismesh.cn/sync | 是否同步这个服务到 polarismesh。true 同步,false 不同步,默认不同步 |
polarismesh.cn/aliasService | 把 k8s service 同步到 polarismesh 时,同时创建的服务别名的名字 |
polarismesh.cn/aliasNamespace | 创建的别名所在的命名空间,配合 polarismesh.cn/aliasService 使用 |
以全量同步服务的模式启动 polaris-controller,将 K8s Service 全部同步到北极星,启动配置如下:
apiVersion: v1
kind: ConfigMap
data:
mesh: |-
serviceSync
mode: "all"
以按需同步服务的模式启动 polaris-controller,默认不会将 K8s Service 同步到北极星,启动配置如下:
apiVersion: v1
kind: ConfigMap
data:
mesh: |-
serviceSync
mode: "demand"
如果需要将某个 Namespace 中的全部 Service 同步到北极星,请在 Namespace 上添加北极星的 annotation,配置方式如下:
apiVersion: v1
kind: Namespace
metadata:
name: default
annotations:
polarismesh.cn/sync: "true"
如果需要将某个 Service 同步到北极星,请在 Service 上添加北极星的 annotation,配置方式如下:
apiVersion: v1
kind: Service
metadata:
namespace: default
name: test
annotations:
polarismesh.cn/sync: "true"
如果需要将某个 Namespace 中的 Service同步到北极星并且排除某个 Service,配置方式如下:
apiVersion: v1
kind: Namespace
metadata:
name: default
annotations:
polarismesh.cn/sync: "true"
---
apiVersion: v1
kind: Service
metadata:
namespace: default
name: test
annotations:
polarismesh.cn/sync: "false"
北极星支持服务别名的功能,允许为一个服务设置一个或者多个服务别名,使用服务别名进行服务发现的效果等同使用服务名称进行服务发现的效果。
polaris-controller 将 K8s Service 同步到北极星的名称映射规则如下:
- K8s Namespace作为北极星的命名空间名称
- K8s Service作为北极星的服务名称
如果需要在 Service 同步到北极星时,为其创建一个服务别名,配置方式如下:
apiVersion: v1
kind: Service
metadata:
namespace: default
name: test
annotations:
polarismesh.cn/aliasNamespace: aliasDefault
polarismesh.cn/aliasService: aliasTest
如果需要使用 polaris-sidecar,可以在应用 Pod 中自动注入,配置方式如下:
kubectl label namespace default polaris-injection=enabled
# polaris-sidecar-mode 的取值为 mesh or dns
kubectl label namespace default polaris-sidecar-mode=mesh
查看 K8s Namespace 是否支持 polaris-sidecar 自动注入:
kubectl get namespace -L polaris-injection
NAME STATUS AGE POLARIS-INJECTION
default Active 3d2h enabled
查看 K8s Namespace 对应的 polaris-sidecar 注入之后的运行模式:
kubectl get namespace -L polaris-sidecar-mode
NAME STATUS AGE POLARIS-SIDECAR-MODE
default Active 10d mesh
在开启自动注入后,新建的 Pod 会自动注入,存量的 Pod 不会自动注入 polaris-sidecar。如果希望存量的 Pod 也能体验 polaris-sidecar, 则对于由 Deployment、DaemonSet 或 StatefulSet 控制器管理的 pod,可以运行以下命令
# Deployment
kubectl rollout restart deployment/DEPLOYMENT_NAME --namespace NAMESPACE
# DaemonSet
kubectl rollout restart daemonset/DAEMONSET_NAME --namespace NAMESPACE
# StatefulSet
kubectl rollout restart statefulset/STATEFULSET_NAME --namespace NAMESPACE