最近更新时间:2024-04-23 16:43:55
金山云容器实例服务(Kingsoft Cloud Container Instance,简称KCI)提供Serverless化的容器服务。您无需预购和管理底层服务器,即可在云端运行容器,而无需关心这些容器如何被调度部署到底层的物理服务器资源中。
虚拟节点Virtual Node由一个开源的Kubernetes kubelet实现,支持在集群中使用KCI作为Pod的资源,即KCI负责底层Pod容器资源的调度和管理工作,Kubernetes在KCI之上作为业务的编排平台层管理业务负载。
KCI在接管Pod容器底层基础设施的管理工作后,Kubernetes不再需要直接负责单个Pod的创建、启动等工作,也不再需要关心底层VM的资源情况,通过KCI确保Pod需要的资源随时可用。
下面将介绍如何借助虚拟节点将金山云的容器实例服务接入到Kubernetes集群中。
您已经在金山云提前创建好一个Kubernetes集群,操作步骤详见创建集群 。
您已经开通容器实例服务。
支持在金山云容器服务Kubernetes集群和用户在金山云自建的Kubernetes集群使用虚拟节点。
部署virtual-kubelet准备工作,需要提前准备以下信息。
环境变量 | 含义 | 是否必填 |
---|---|---|
KCI_ACCESS_KEY | 用户AccessKey,如何获取AccessKey,请参考为IAM子用户创建访问密钥 | 否,若未提供TEMP_AKSK_CM则必填 |
KCI_SECRET_KEY | 用户SecretKey,如何获取SecretKey,请参考为IAM子用户创建访问密钥 | 否,若未提供TEMP_AKSK_CM则必填 |
TEMP_AKSK_CM | KCE集群中临时AK/SK configmap name,见kube-system命名空间下,原始名称为user-temp-aksk | 否,若未提供KCI_ACCESS_KEY和KCI_SECRET_KEY则必填 |
KCI_CLUSTER_ID | 集群ID,若该集群是金山云容器服务的集群,则为ClusterId; | 是 |
KCI_REGION | 地域名称,查询容器实例支持的地域,请参考支持地域 | 是 |
KCI_SUBNET_ID | 容器实例部署的子网 | 否,若此处没有配置子网id,则需要在创建容器实例资源时,指定子网 |
KCI_SECURITY_GROUP_IDS | 容器实例所属的安全组,支持设置多个,请以","分割,最多允许设置3个 | 否,若此处没有配置安全组,则需要在创建容器实例资源时,指定安全组 |
以下以自建集群中部署虚拟节点为例,部署的YAML文件如下,您可以按需替换示例中的对应参数值。
vk-sa-rb.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
name: virtual-kubelet-sa
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: virtual-kubelet-rb
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- apiGroup: ""
kind: ServiceAccount
name: virtual-kubelet-sa
namespace: kube-system
vk.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: virtual-kubelet
namespace: kube-system
labels:
k8s-app: virtual-kubelet
spec:
replicas: 1
selector:
matchLabels:
k8s-app: virtual-kubelet
template:
metadata:
name: virtual-kubelet
labels:
k8s-app: virtual-kubelet
spec:
serviceAccountName: virtual-kubelet-sa
containers:
- name: virtual-kubelet
image: hub.kce.ksyun.com/ksyun/rbkci-virtual-kubelet:v1.3.1
args:
- --provider=kingsoftcloud
# 自定义虚拟节点名称,遵循Kubernetes资源命名规则,注意不要与已有节点重名
- --nodename=${nodename_string}
# 对于dnsPolicy=ClusterFirst的实例:用于指定集群的DNS配置,多个地址用“,”分隔
- --cluster-dns=${cluster-dns_string}
# 对于dnsPolicy=Default的实例:用于指定虚拟节点的DNS配置,多个地址用“,”分隔
- --cluster-dns=${cluster-dns_string}
# 自定义集群域名,默认为‘cluster.local’
- --cluster-domain=${cluster-domain_string}
# 取消虚拟节点创建时默认存在的污点,可接受新建pod调度到此节点上
- --disable-taint
# kubernetes版本大于等于1.13建议启用lease资源用于节点心跳
- --enable-node-lease
imagePullPolicy: IfNotPresent
env:
- name: VKUBELET_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: KCI_ACCESS_KEY
value: ${access_key}
- name: KCI_SECRET_KEY
value: ${secret_key}
- name: KCI_REGION
value: ${kci_region}
- name: KCI_CLUSTER_ID
value: ${cluster_id}
- name: KCI_SUBNET_ID
value: ${subnet_id}
- name: KCI_SECURITY_GROUP_IDS
value: ${security_group_ids}
# 虚拟节点维度使能Kube-proxy,表示调度到此虚拟节点上的容器实例开启/关闭访问ClusterIP类型服务的能力
- name: KCI_KUBE_PROXY
value: ${true/false}
# 自建集群使能kube-proxy时,需配置所在集群的apiserver地址(ip:port)
- name: KCI_CLUSTER_SERVER
value: ${cluster_server}
# 值为空,集群无公网访问能力时配置该环境变量通过内网请求金山云api
- name: KCI_REQUEST_INTERNAL
执行部署,部署完毕后,查看虚拟节点的状态:
# kubectl apply -f vk-sa-rb.yaml
# kubectl apply -f vk.yaml
# kubectl get node
NAME STATUS ROLES AGE VERSION
10.0.11.220 Ready node 3d18h v1.17.6
10.0.11.27 Ready node 3d18h v1.17.6
virtual-kubelet01 Ready agent 55m v1.17.6-vk-v1.6.0
virtual kubelet部署中支持参数汇总如下:
运行参数 | 含义 | 是否必填 |
---|---|---|
nodename | 支持自定义节点名称,默认名称为virtual-kubelet | 否 |
cluster-dns | 对于dnsPolicy=ClusterFirst的实例:用于指定集群的DNS配置,多个地址用“,”分隔 | 否 |
virtual-node-dns | 对于dnsPolicy=Default的实例:用于指定虚拟节点的DNS配置,多个地址用“,”分隔 | 否 |
cluster-domain | 自定义集群域名,默认为‘cluster.local’ | 否 |
disable-taint | 取消虚拟节点创建时默认存在的污点,可接受新建pod调度到此节点上 | 否 |
enable-node-lease | kubernetes版本大于等于1.13建议启用lease资源用于节点心跳 | 否 |
注:KCI支持
dnsConfig
字段,用户也可以通过dnsPolicy
和dnsConfig
来为容器实例自定义DNS配置。若DNS服务为ClusterIP类型,注意为pod开启Kube-proxy以支持ClusterIP类型访问。
通过YAML创建 Kubernetes集群通过虚拟节点创建Pod到KCI时,可以通过在 yaml 中定义 template annotation
的方式,实现为 Pod 绑定安全组、分配资源等能力。 KCI目前支持的Annotation列表如下:
Annotation Key | Annotation Value示例 | 是否必填 | 描述 |
---|---|---|---|
k8s.ksyun.com/kci-instance-cpu | 4 | 否 | 指定容器实例CPU核数,单位:核,此参数需要满足容器实例规定的规格 |
k8s.ksyun.com/kci-instance-memory | 8 | 否 | 指定容器实例内存,单位:GiB,此参数需要满足容器实例规定的规格,请参考目前支持的资源规格 填写 |
k8s.ksyun.com/kci-security-group-id | xxxxxxxx,xxxxxxxxx | 否 | 支持填写多个,virtual-kubelet启动时,通过配置参数设置默认安全组,所有创建在虚拟节点上的Pod默认使用virtual-kubelet配置的安全组创建KCI实例,如果用户希望使用同VPC下其他安全组创建KCI实例,需要通过注解方式显示指定安全组 |
k8s.ksyun.com/kci-subnet-id | xxxxxxx | 否 | virtual-kubelet启动时,通过配置参数设置默认的子网,所有创建在虚拟节点上的Pod默认在virtual-kubelet配置的子网下创建KCI实例,如果用户希望在同VPC下其他子网创建KCI实例,需要通过注解方式显示指定子网 |
k8s.ksyun.com/kci-kube-proxy-enabled | 'true' / 'false' | 否 | 默认值:‘false’。当为true时,为该pod开启kube-proxy,使该pod具备访问集群内clusterIP类型服务的能力;否则不开启。 |
kubernetes.io/ingress-bandwidth | 100M | 否 | 指定容器实例入方向带宽限速值。单位支持:G、M、k。如果未填写单位,则默认对应的单位为bit。 |
kubernetes.io/egress-bandwidth | 100M | 否 | 指定容器实例出方向带宽限速值。单位支持:G、M、k。如果未填写单位,则默认对应的单位为bit。 |
备注:
若指定KCI Pod的规格,需要同时设置
k8s.ksyun.com/kci-instance-cpu
和k8s.ksyun.com/kci-instance-memory
参数,并且需要满足容器实例支持的资源规格。若不指定KCI Pod的规格,则金山云容器服务会自动规整KCI Pod的规格,详细计算方法请参考指定KCI Pod规格。
虚拟节点创建时默认存在污点
virtual-kubelet.io/provider:kingsoftcloud
,若要将容器实例调度到虚拟节点,可通过为pod配置容忍度或指定节点调度实现。
创建的工作负载YAML示例(指定节点调度)如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-kci
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
annotations:
"k8s.ksyun.com/kci-instance-cpu" : "4"
"k8s.ksyun.com/kci-instance-memory" : "8"
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
tolerations:
- key: rbkci-virtual-kubelet.io/provider
value: kingsoftcloud
effect: NoSchedule
创建的工作负载YAML示例(配置容忍度)如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-kci
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
annotations:
"k8s.ksyun.com/kci-instance-cpu" : "4"
"k8s.ksyun.com/kci-instance-memory" : "8"
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
tolerations:
- key: "virtual-kubelet.io/provider"
operator: "Equal"
value: "kingsoftcloud"
effect: "NoSchedule"
注意: Annotation需要配置在PodSpec中,而不是DeploymentSpec中。
登录容器服务控制台,点击工作负载>Deployment,查询资源的创建状态。
Deployment状态:
Pod状态:
登录容器实例控制台,查看KCI的创建情况。
KCI对接Kubernetes,由于KCI运行在一个虚拟节点,不是一个真实的Node,部分依赖 Node、Kubelet、Kube-proxy 的原生功能暂不支持:
不支持在虚拟节点上运行DaemonSet Pod
不支持hostPath存储
不支持容器开启privileged权限
不支持liveness/readiness probe
不支持init container
不支持type=NodePort的Service
不支持Pod设置为 HostNetwork
纯净模式