kubernetes的service有个CNAME的用法,如下:
apiVersion: v1
kind: Service
metadata:
name: 服务名
namespace: 命名空间
spec:
type: ExternalName
# CNAME功能:externalName
# 本命名空间的service CNAME到其它命名空间的(同名)service
externalName: 服务名.其它命名空间.svc.cluster.local
#也可以这样用
#externalName: 集群外的域名
场景一:通过service访问集群外的域名,集群外的域名调整时直接修改service文件即可
场景二:本命名空间的service CNAME到其它命名空间的(同名)service
场景二的一个例子:某各业务有dev/sit/uat/prd四套环境,两套k8s集群dev,sit,uat共用一个k8s集群,生产单独一套。每套环境有三各命名空间,举例为:test-dev test-broker-dev test-dmzout-dev。
痛点:不同环境test命名空间访问broker和dmzout的service时要带上命名空间,如app1.test-broker-dev.svc.cluster.local
,这样dev,sit,uat,prd访问同一个服务的url就不同了,非常不方便。
解决办法:利用k8s-service-CNAME的功能
如下脚本可批量把各个环境所有broker和dmzout的service映射为app区同名service的CNAME
#!/bin/bash
#获取环境信息
while :
do
echo -n "请选择(dev/sit/uat/prd):"
read environment
if [ ${environment} = "dev" -o ${environment} = "sit" -o ${environment} = "uat" -o ${environment} = "prd" ];then
echo $environment
break
else
echo "输入错误,请重新输入"
fi
done
# 如dmzout和broker命名空间
other_short_namespace_list=(
dmzout
broker
)
# 拼接目的地真实的命名空间值
goal_namespace=test-${environment}
for short_namespace in ${other_short_namespace_list[@]};do
tmp_namespace=test-${short_namespace}-${environment}
echo -e "\033[31m$tmp_namespace \033[0m"
# 获取svc清单
tmp_svc=`kubectl get svc -n ${tmp_namespace} 2>/dev/null | grep -v NAME | grep -v netshoot | grep -v python | awk '{print $1}' `
if [ ${#tmp_svc} -ne 0 ];then #对有svc的进行按行遍历svc
echo "${tmp_svc}" | while read line
do
echo -----
# yaml模板(注意下面几行前面的空格不要动,yaml语法格式有要求)
# 下面svc.cluster.local是service的后缀按实际情况来修改
svc_yaml="apiVersion: v1
kind: Service
metadata:
name: ${line}
namespace: ${goal_namespace}
spec:
type: ExternalName
externalName: ${line}.${tmp_namespace}.svc.cluster.local"
# 执行kubectl
echo "$svc_yaml" | kubectl apply -f -
done
fi
echo
done