为了减少您对业务YAML的改动,ACS支持acs-profile功能,可以提供集群维度的资源视图。本文介绍如何配置acs-profile。
功能介绍
acs-profile支持Pod配置自动注入,其中包含了交换机、安全组、域名解析模式等集群维度的配置,您可以根据需要进行更新:
更新配置时无需重启acs-virtual-node组件。
对于新创建的ACS Pod,可以即时生效更新后的配置;对于存量ACS Pod,需要滚动发布后才能生效更新后的配置。
配置说明
创建Pod时,系统会读取kube-system命名空间下的acs-profile配置文件(名为acs-profile的ConfigMap),并按照文件中的配置来创建Pod。您可以通过以下命令查看acs-profile的YAML。
kubectl get cm -n kube-system acs-profile -o yaml
YAML内容如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: acs-profile
namespace: kube-system
data:
enablePrivateZone: "false"
securityGroupId: sg-2zeeyaaxlkq9sppl****
vSwitchIds: vsw-2ze23nqzig8inprou****,vsw-2ze94pjtfuj9vaymf****
vpcId: vpc-2zeghwzptn5zii0w7****
selectors: ""
修改acs-profile的方式如下:
通过kubectl edit命令
kubectl edit configmap acs-profile -n kube-system
通过容器服务管理控制台
登录容器计算服务控制台。
在集群页面,找到目标集群,单击集群名称。
在集群管理页的左侧导航栏,选择配置管理>配置项。
选择命名空间为kube-system。
找到acs-profile,单击YAML编辑。
如果修改acs-profile中的某项配置后,文件存在格式错误,修改的配置将不会生效,具体的错误信息会保存到event中,您可以通过以下kubectl命令查看
kubectl -n kube-system get event --field-selector involvedObject.namespace=kube-system,involvedObject.name=acs-profile
更新集群配置项
acs-profile中包含了vpcId、vSwitchIds等集群配置项对应VPC、交换机等信息,您可以根据需要进行更新,更新后的配置可以即时生效(热更新)。支持更新的配置项如下:
配置项 | 示例值 | 说明 |
|
| ACS Pod所属安全组。 |
|
| ACS Pod所属交换机。可配置多个,用半角逗号间隔。 |
|
| ACS Pod所属VPC。 |
|
| 是否使用PrivateZone进行域名解析。 |
上述配置项均为集群级别的默认配置项,如果在创建ACS Pod时没有特别修改和覆盖某些参数,系统将会采用acs-profile中预先设定的默认配置。
配置Selectors
创建Pod时,系统会按照Selectors去匹配Pod,对于Label能够匹配上的Pod,会自动追加Annotation和Label,以便生效ACS Pod的功能特性。
Selectors中可以包含多个Selector,在每个Selector中,您必须声明Selector的name,配置格式如下:
配置项 | 说明 |
| Selector名称,必填不能为空。 |
| 通过Namespace Label筛选Pod。 |
| 通过 |
| 通过选择运算符列表描述匹配规则。 有效的运算符包括 |
| 通过Pod Label筛选。 |
| 通过 |
| 通过选择运算符列表描述匹配规则。 有效的运算符包括 |
| 要动态追加的Annotation和Label。 |
Selectors的配置模板如下:
apiVersion: v1
kind: ConfigMap
metadata:
name: acs-profile
namespace: kube-system
data:
selectors: |
[
{
"name": "selector-demo1",
"namespaceSelector": {
"matchLabels": {
"kubernetes.io/metadata.name": "dev-ns"
}
},
"objectSelector": {
"matchLabels": {
"acs": "true"
},
"matchExpressions": [
{
"key": "usage",
"operator": "In",
"values": ["testing"]
}
]
},
"effect": {
"annotations": {
"network.alibabacloud.com/custom-dnsconfig": "{\"servers\":[\"114.114.114.114\",\"8.8.8.8\"],\"searches\":[\"xx.com\",\"yy.com\"],\"options\":[\"ndots:2\",\"edns0\"]}"
},
"labels": {
"created-by-acs": "true"
}
}
}
]
上述模板中,名为selector-demo1的Selector可以实现以下功能:
如果Pod所属命名空间为dev-ns
,并且Pod本身含有acs=true
和usage=testing
Label,则该Pod会自动增加network.alibabacloud.com/custom-dnsconfig="{\"servers\":[\"114.114.114.114\",\"8.8.8.8\"],\"searches\":[\"xx.com\",\"yy.com\"],\"options\":[\"ndots:2\",\"edns0\"]}"
的Annotation,以及created-by-acs=true
的Label。
为了确保精确匹配,建议您在一个Selector中至少配置namespaceSelector
或objectSelector
中的一个。如果两者同时配置,则Pod需要同时满足两种条件才可以成功匹配;如果两者都不配置,则该effect
将作用于集群内所有的ACS Pod,可能会导致不必要的影响。
如果同时配置了多个Selector,ACS将按照顺序匹配。成功匹配某个Selector后,会自动将该Selector中effect
声明的Annotation和Label追加到Pod中,不会覆盖Pod原有的值。如存在重复的Annotation和Label,作用的优先级如下:
Pod原有的声明值。
最先被匹配上的Selector中effect
声明的值。
后续匹配的Selector中effect
声明的值。
演示示例
使用以下内容,创建一个符合selector-demo1条件的Deployment。具体步骤,请参见使用YAML模板创建。
apiVersion: v1 kind: Pod metadata: name: nginx namespace: dev-ns labels: acs: "true" usage: "testing" spec: containers: - name: nginx image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 command: ["sleep", "infinity"] ports: - containerPort: 80
Deployment创建完成后,查看Pod信息如下图所示。