全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

Kubernetes集群对接KCI

最近更新时间: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需要的资源随时可用。

k8s集群接入KCI图.PNG

下面将介绍如何借助虚拟节点将金山云的容器实例服务接入到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;
若集群是自建集群,则用户自定义一个唯一标识作为集群ID,建议使用uuid格式

KCI_REGION

地域名称,查询容器实例支持的地域,请参考支持地域

KCI_SUBNET_ID

容器实例部署的子网

否,若此处没有配置子网id,则需要在创建容器实例资源时,指定子网

KCI_SECURITY_GROUP_IDS

容器实例所属的安全组,支持设置多个,请以","分割,最多允许设置3个

否,若此处没有配置安全组,则需要在创建容器实例资源时,指定安全组

YAML示例

以下以自建集群中部署虚拟节点为例,部署的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参数配置

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字段,用户也可以通过dnsPolicydnsConfig来为容器实例自定义DNS配置。若DNS服务为ClusterIP类型,注意为pod开启Kube-proxy以支持ClusterIP类型访问。

调度KCI容器实例到虚拟节点

通过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。
限速值支持范围1-1024Mbps,默认值为1024Mbps。

kubernetes.io/egress-bandwidth

100M

指定容器实例出方向带宽限速值。单位支持:G、M、k。如果未填写单位,则默认对应的单位为bit。
限速值支持范围1-1024Mbps,默认值为1024Mbps。

备注:

  1. 若指定KCI Pod的规格,需要同时设置k8s.ksyun.com/kci-instance-cpuk8s.ksyun.com/kci-instance-memory参数,并且需要满足容器实例支持的资源规格

  2. 若不指定KCI Pod的规格,则金山云容器服务会自动规整KCI Pod的规格,详细计算方法请参考指定KCI Pod规格

  3. 虚拟节点创建时默认存在污点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状态

image.png

Pod状态

image.png

登录容器实例控制台,查看KCI的创建情况。

image.png

Kubernetes应用限制

KCI对接Kubernetes,由于KCI运行在一个虚拟节点,不是一个真实的Node,部分依赖 Node、Kubelet、Kube-proxy 的原生功能暂不支持:

  • 不支持在虚拟节点上运行DaemonSet Pod

  • 不支持hostPath存储

  • 不支持容器开启privileged权限

  • 不支持liveness/readiness probe

  • 不支持init container

  • 不支持type=NodePort的Service

  • 不支持Pod设置为 HostNetwork

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈