阿里云K8s实践笔记

记录使用阿里云ACK容器服务以及阿里云的各服务的总结笔记

1. 配置阿里云SLB到集群的Ingress

1.1 同时使用私网SLB与公网SLB配合

对于一些特殊场景,您期望容器集群内的服务既能允许公网访问,同时又希望能被同一个VPC下的其他服务直接访问(不经过公网)。您只需额外部署一个kube-system/nginx-ingress-lb-intranet服务。

使用阿里云创建的容器集群默认已经创建了一个绑定到公网的SLB,位于kube-system下。创建一个符合期望配置的内网SLB实例,新增一个Service描述,使集群自动绑定监听到SLB。

配置模版

# intranet nginx ingress slb service
apiVersion: v1
kind: Service
metadata:
 # 这里服务取名为nginx-ingress-lb-intranet
 name: nginx-ingress-lb-intranet
 namespace: kube-system
 labels:
   app: nginx-ingress-lb-intranet
 annotations:
   # 指明SLB实例地址类型为私网类型
   service.beta.kubernetes.io/alicloud-loadbalancer-address-type: intranet
   # 修改为您的私网SLB实例ID
   service.beta.kubernetes.io/alicloud-loadbalancer-id: <YOUR_INTRANET_SLB_ID>
   # 是否自动创建SLB端口监听(会覆写已有端口监听),也可手动创建端口监听
   service.beta.kubernetes.io/alicloud-loadbalancer-force-override-listeners: 'true'
spec:
 type: LoadBalancer
 # route traffic to other nodes
 externalTrafficPolicy: "Cluster"
 ports:
 - port: 80
   name: http
   targetPort: 80
 - port: 443
   name: https
   targetPort: 443
 selector:
   # select app=ingress-nginx pods
   app: ingress-nginx

创建服务之后通过如下命令,查看svc状态

 kubectl -n kube-system get svc | grep nginx-ingress-lb

2. CoreDNS的特殊用法

2.1 CoreDNS拦截域名解析

在内网多个集群的场景下,有些域名需要解析到内网避免出现公网流量,之前处理方案有如下几种:

  • 在VPC内网内自建一个DNS服务器,将所有服务器的DNS指向自建的DNS服务器
    • 问题: 需要考虑到DNS的高可用以及故障容灾难
    • 优势: 集中化,便于统一维护管理更新
  • 在主机配置Hosts文件
    • 问题: 主机较多,维护成本上涨
    • 优势: 操作简单,技术成本较低
  • K8s容器集群内CoreDNS

Kubernetes本身具有集群DNS组件,此处使用的为CoreDNS,工作负载的DNS默认策略为ClusterFirst,此时Pods内程序解析DNS会优先查询集群的DNS组件,所以此时可以在集群DNS层面进行解析拦截覆盖。

CoreDNS的配置使用的ConfigMap,而ConfigMap支持热更新,修改ConfigMap后CoreDNS自动生效。配置如下:

.:5353 {
cache 30
errors
health
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
upstream /etc/resolv.conf
fallthrough in-addr.arpa ip6.arpa
}
loadbalance round_robin
hosts {
122.212.222.111 aaa.bbb.com
fallthrough
}
prometheus 0.0.0.0:9153
proxy . /etc/resolv.conf
reload
}

把需要的DNS规格写入Hosts节点下,即可进行集群层面的解析配置。