最近更新时间:2024-08-20 19:29:50
虚拟节点支持在用户自建的Kubernetes集群中接入,下面将介绍如何在自建Kuberentes集群中部署虚拟节点,以及如何通过虚拟节点创建容器实例。
您已经部署好Kubernetes集群,且Kubernetes版本小于等于v1.27;
您的Kubernetes集群已经通过专线或VPN和金山云的VPC网络打通。
将集群Kubeconfig文件导入node节点,创建为secret保存到集群里(以路径为“/root/.kube/config”为例),供后续virtual-kubelet挂载使用。
kubectl create secret generic --from-file=config=/root/.kube/config rbkci-kubeconfig-secret -n kube-system # /root/.kube/config 可替换为实际保存路径
通过ConfigMap配置文件的方式部署virtual-kubelet组件来创建虚拟节点,virtual-kubelet版本需要大于等于v1.6.0,部署前需准备ConfigMap配置参数,详见VK配置参数说明。
按照如下示例部署virtual-kubelet组件,替换示例中的对应参数值。
1.创建virtual-kubelet-config配置文件:
apiVersion: v1
data:
config.yaml: |
# 用于连接Kubernetes API server (默认:"~/.kube/config")
kubeconfig: "/root/.kube/config"
# (必填)虚拟节点名称,集群内需唯一性校验
nodename: rbkci-virtual-kubelet
# kubernetes版本大于等于1.13建议启用lease资源用于节点心跳
enableNodeLease: true
openapi:
# KCE集群中临时AK/SK configmap,若未提供用户AccessKey和用户SecretKey则必填
akskConfigMap:
name: "user-temp-aksk"
namespace: "kube-system"
# (必填)地区名称
region: "xxxxxx"
# 用户AccessKey,若已配置akskConfigMap此处不用填写
accessKey: ""
# 用户SecretKey,若已配置akskConfigMap此处不用填写
secretKey: ""
# (必填)集群 ID
clusterId: "xxxxxx"
# 用于实例内部组件连接到Kubernetes APIServer的kubecconfig的路径
kciletKubeconfigPath: "/root/.kube/config"
# (必填)kubernetes集群DNS,若为KCE集群则为集群内coreDNS服务的IP地址
clusterDNS:
- xx.xx.xx.xx
#(必填)kubernetes cluster-domain
clusterDomain: cluster.local
# vk上配置默认值,实例可通过pod annotation特例声明
instanceSettings:
# (必填)容器实例所属的安全组,支持1-3个
k8s.ksyun.com/kci-security-group-id: "xxxxxx"
# (必填)容器实例部署的子网id,支持1-5个
k8s.ksyun.com/kci-subnet-id: "xxxxxx"
kind: ConfigMap
metadata:
name: virtual-kubelet-config
namespace: kube-system
2.部署rbkci-virtual-kubelet.yaml,部署资源配置请参考VK容量性能与配置建议。
apiVersion: apps/v1
kind: Deployment
metadata:
name: rbkci-virtual-kubelet
namespace: kube-system
labels:
k8s-app: rbkci-virtual-kubelet
spec:
replicas: 1
selector:
matchLabels:
k8s-app: rbkci-virtual-kubelet
template:
metadata:
name: rbkci-virtual-kubelet
labels:
k8s-app: rbkci-virtual-kubelet
spec:
containers:
- name: virtual-kubelet
image: hub.kce.ksyun.com/ksyun/rbkci-virtual-kubelet:v1.6.7
args:
- --kciVirtualKubeletConfigFile=/root/virtual-kubelet/config.yaml
- --internal-server-prefix=kci
imagePullPolicy: Always
env:
- name: VKUBELET_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
volumeMounts:
- mountPath: /root/.kube
name: kubeconfig
- mountPath: /root/virtual-kubelet
name: virtual-kubelet-config
volumes:
- name: kubeconfig
secret:
secretName: rbkci-kubeconfig-secret
- name: virtual-kubelet-config
configMap:
name: virtual-kubelet-config
部署并验证:
# kubectl apply -f rbkci-virtual-kubelet.yaml
# kubectl get deployment -n kube-system | grep rbkci
rbkci-virtual-kubelet 1/1 1 1 35s
# kubectl get node
NAME STATUS ROLES AGE VERSION
192.168.1.106 Ready master 127d v1.21.3
192.168.1.141 Ready master 127d v1.21.3
192.168.1.149 Ready master 127d v1.21.3
192.168.3.212 Ready node 51d v1.21.3
192.168.3.73 Ready node 51d v1.21.3
rbkci-virtual-kubelet Ready agent 40s v1.19.3-vk-v1.5.0
Kubernetes集群通过虚拟节点创建Pod到KCI时,可以通过在 yaml 中定义 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-instance-type | 如 ‘S6.4B’ | 否 | 指定云服务器资源套餐类型,仅支持单个套餐类型 |
k8s.ksyun.com/kci-security-group-id | xxxxxxxx,xxxxxxxxx | 否 | 支持填写多个,virtual-kubelet启动时,通过配置参数设置默认安全组,所有创建在虚拟节点上的Pod默认使用virtual-kubelet配置的安全组创建KCI实例,如果用户希望使用同VPC下其他安全组创建KCI实例,需要通过注解方式显示指定安全组 |
k8s.ksyun.com/kci-subnet-id | xxxxxxx | 否 | 持填写1-5个,virtual-kubelet启动时,通过配置参数设置默认的子网,所有创建在虚拟节点上的Pod默认在virtual-kubelet配置的子网下创建KCI实例,如果用户希望在同VPC下其他子网创建KCI实例,需要通过注解方式显示指定子网 |
k8s.ksyun.com/kci-kube-proxy-enabled | ‘true’/ ‘false’ | 否 | 默认值:‘false’。当为true时,为该pod开启kube-proxy,使该pod具备访问集群内ClusterIP类型服务的能力;否则不开启。 |
k8s.ksyun.com/kci-dns-config |
| 否 | 使用自建镜像仓库时,若未在vk维度配置,可在实例维度配置dnsconfig,生效于实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Pod’s DNS Config) |
k8s.ksyun.com/kci-host-aliases |
| 否 | 使用自建镜像仓库时,若未在vk维度配置,可在实例维度配置hostAliases,生效于实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Adding additional entries with hostAliases) |
k8s.ksyun.com/kci-base-system-disk-size | “50” | 否 | 设置实例基础系统盘大小,单位GB,默认20GB,范围20-500GB,Local_SSD最⼤100GB,其他类型最⼤500GB |
k8s.ksyun.com/kci-base-system-disk-type | Local_SSD/SSD3.0/EHDD | 否 | 设置实例基础系统盘类型,⽀持三种类型:Local_SSD/SSD3.0/EHDD,该值为空时系统会⾃动适配 |
k8s.ksyun.com/kci-base-image | xxxxxxx | 否 | 指定容器实例的基础镜像ID |
k8s.ksyun.com/kci-charge-type | HourlyInstantSettlement/Spot | 否 | 容器实例的计费方式,支持按小时实时结算和竞价型实例。不指定计费方式时,默认为按小时实时结算 |
k8s.ksyun.com/kci-spot-strategy | SpotAsPriceGo | 否,若k8s.ksyun.com/kci-charge-type设置为Spot则必填 | 竞价实例的抢占策略。 |
k8s.ksyun.com/kci-retain-ip | ‘true’/ ‘false’ | 否 | 默认值:‘false’。当为true时,为该Pod开启固定IP功能。开启此功能的Pod,当Pod被销毁后默认会保留这个Pod的IP 24小时。24小时内重建同名的Pod,还能使用该IP。24小时以后,该IP有可能被其他Pod抢占。仅对statefulset、rawpod生效 |
k8s.ksyun.com/kci-retain-ip-hours | “48” | 否 | 修改Pod固定IP的保留时长,单位是小时。如Pod 销毁之后超过这个时长没有创建回来,IP将被释放。默认是24小时,最大可支持保留一年。仅对statefulset、rawpod生效 |
k8s.ksyun.com/kci-eip-allocation-id | xxxxxxx | 否 | 指定容器实例绑定的EIP实例ID |
k8s.ksyun.com/kci-core-pattern | “/tmp/cores/core.%h.%e.%p.%t” | 否 | 设置容器实例的Core dump文件保存目录 |
k8s.ksyun.com/kci-http-registry | 192.168.xx.xx:5000 | 否 | 使用HTTP协议的自建镜像仓库中的镜像创建容器实例时,需配置该Annotation使得容器实例使用HTTP协议拉取镜像,避免因协议不同而导致镜像拉取失败。支持配置多个仓库域名或IP,以逗号隔开 |
k8s.ksyun.com/kci-insecure-registry | harbor.example.com | 否 | 使用自签发证书的自建镜像仓库中的镜像创建容器实例时,需配置该Annotation来跳过证书认证,避免因证书认证失败而导致镜像拉取失败。支持配置多个仓库域名或IP,以逗号隔开 |
k8s.ksyun.com/kci-project-id | “1700” | 否 | 指定容器实例的项目ID |
k8s.ksyun.com/kci-image-cache-id | xxxxxxx | 否 | 指定镜像缓存ID。 |
k8s.ksyun.com/kci-auto-image-cache | ‘true’/ ‘false’ | 否 | 默认值:‘false’,当为true时,为该Pod开启自动匹配镜像缓存的功能 |
注:
若指定KCI Pod的规格,需要同时设置
k8s.ksyun.com/kci-instance-cpu
和k8s.ksyun.com/kci-instance-memory
参数。除了通过指定CPU和内存的方式创建KCI实例,在对实例规格有特殊需求的场景(如:网络吞吐量、网卡队列数等),您也可以指定KCI实例底层所使用的云服务器套餐规格来创建实例,套餐规格可参考支持的云服务器类型。
在不指定KCI规格或套餐时,金山云容器服务会自动规整KCI Pod的规格,详细计算方法请参考指定KCI Pod规格。
虚拟节点创建时默认存在污点
rbkci-virtual-kubelet.io/provider:kingsoftcloud
,若要将容器实例调度到虚拟节点,可通过为pod配置容忍度或指定节点调度实现。如您从私有镜像仓库拉取镜像,需配置镜像访问凭证。
您可以通过节点亲和性配合节点容忍调度pod到虚拟节点上运行,yaml示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-rbkci
namespace: default
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
annotations:
k8s.ksyun.com/kci-instance-type: N3.2B #指定N3机型,2核4G的云服务器为容器实例底层资源
labels:
app: nginx
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: type
operator: In
values:
- virtual-kubelet
containers:
- name: nginx
image: nginx:latest
tolerations:
- key: rbkci-virtual-kubelet.io/provider
value: kingsoftcloud
effect: NoSchedule
登录容器实例控制台,查看KCI的创建情况。
随容器实例功能迭代,Virtual Kubelet版本会相应进行更新,目前您可通过手动修改VK镜像版本的方式进行升级。具体操作步骤如下:
# kubectl cordon rbkci-virtual-kubelet
node/rbkci-virtual-kubelet cordoned
# kubectl edit deployments.apps -n kube-system rbkci-virtual-kubelet
示例如下:
...
spec:
containers:
- args:
- --nodename=rbkci-virtual-kubelet
- --cluster-dns=xx.xx.xx.xx
- --cluster-domain=cluster.local
- --kcilet-kubeconfig-path=/root/.kube/config
env:
- name: VKUBELET_POD_IP
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: status.podIP
- name: TEMP_AKSK_CM
value: user-temp-aksk
- name: KCI_CLUSTER_ID
value: xxxxxx
- name: KCI_SUBNET_ID
value: xxxxxx
- name: KCI_SECURITY_GROUP_IDS
value: xxxxxx
image: hub.kce.ksyun.com/ksyun/rbkci-virtual-kubelet:v1.6.7 #将镜像tag改为最新版本
imagePullPolicy: Always
name: virtual-kubelet
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
volumeMounts:
- mountPath: /root/.kube/config
name: kubeconfig
...
在rbkci-virtual-kubelet Deployment滚动更新完成后,将对应节点恢复为可调度状态。
# kubectl uncordon rbkci-virtual-kubelet
node/rbkci-virtual-kubelet uncordoned
纯净模式