全部文档
当前文档

暂无内容

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

文档中心

自建集群命令行方式使用KCI

最近更新时间:2024-02-23 15:26:01

虚拟节点支持在用户自建的Kubernetes集群中接入,下面将介绍如何在自建Kuberentes集群中部署虚拟节点,以及如何通过虚拟节点创建容器实例。

前提

  • 您已经部署好Kubernetes集群,且Kubernetes版本小于等于v1.27;

  • 您的Kubernetes集群已经通过专线或VPN和金山云的VPC网络打通。

步骤1:配置Kubeconfig

将集群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 可替换为实际保存路径

步骤2:创建KCI相关的RBAC资源

登录自建集群,验证集群中有无system:kubelet-api-admin这个clusterrole,若没有需通过下述配置创建,若已有则跳过此步:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: system:kubelet-api-admin
rules:
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - get
  - list
  - watch
- apiGroups:
  - ""
  resources:
  - nodes
  verbs:
  - proxy
- apiGroups:
  - ""
  resources:
  - nodes/log
  - nodes/metrics
  - nodes/proxy
  - nodes/spec
  - nodes/stats
  verbs:
  - '*'

创建KCI相关的RBAC资源:

# kubectl apply -f rbkci-rbac.yaml
serviceaccount/kcilet-client created
clusterrolebinding.rbac.authorization.k8s.io/kcilet-rb created
serviceaccount/rbkci-virtual-kubelet-sa created
clusterrolebinding.rbac.authorization.k8s.io/rbkci-virtual-kubelet-rb created

rbkci-rbac.yaml详情如下:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: kcilet-client
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kcilet-rb
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:kubelet-api-admin
subjects:
  - apiGroup: ""
    kind: ServiceAccount
    name: kcilet-client
    namespace: kube-system
---
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

步骤3:基于virtual-kubelet组件创建虚拟节点

方式一:通过启动参数与环境变量方式创建VK

您需要通过部署virtual-kubelet组件来创建虚拟节点,部署前需准备环境变量与启动参数,详见VK配置参数说明

按照如下示例部署virtual-kubelet组件,替换示例中的对应参数值。rbkci-virtual-kubelet.yaml示例如下:

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:
      serviceAccountName: virtual-kubelet-sa
      containers:
        - name: virtual-kubelet
          image: hub.kce.ksyun.com/ksyun/rbkci-virtual-kubelet:v1.6.0
          args:
            # 自定义虚拟节点名称,默认值为rbkci-virtual-kubelet
            - --nodename=rbkci-virtual-kubelet
            # 指定虚拟节点的DNS配置,KCE集群为集群内coredns服务的IP地址
            - --cluster-dns=xx.xx.xx.xx
            # 指定集群域名,KCE集群默认为‘cluster.local’
            - --cluster-domain=cluster.local
            # 指定集群kubeconfig文件路径,值为kubeconfig volume对应的mountPath
            - --kcilet-kubeconfig-path=/root/.kube/config
            # kubernetes版本大于等于1.13建议启用lease资源用于节点心跳
            - --enable-node-lease
            # 虚拟节点管理的所有实例使能kube-proxy
            - --kube-proxy-enable
            # 节点管理的所有实例基础系统盘大小,单位GB,范围20-500GB,Local_SSD最大100GB,其他类型最大500GB。该值为空时CPU机型默认为20GB,GPU机型默认为50GB
            - --base-system-disk-size=50
          imagePullPolicy: Always
          env:
            - name: VKUBELET_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: TEMP_AKSK_CM
              value: user-temp-aksk 
            - name: KCI_CLUSTER_ID
              value: ${cluster_id} 
            - name: KCI_SUBNET_ID
              value: ${subnet_id}
            - name: KCI_SECURITY_GROUP_IDS
              value: ${security_group_ids} 
          volumeMounts:
            - mountPath: /root/.kube
              name: kubeconfig
            - mountPath: /var/log/kci-virtual-kubelet
              name: kci-provider-log
      volumes:
        - name: kubeconfig
          secret:
            secretName: rbkci-kubeconfig-secret
        - name: kci-provider-log
          hostPath:
            path: /var/log/kci-virtual-kubelet

方式二:通过ConfigMap配置文件方式创建VK

通过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
        k8s.ksyun.com/kci-subnet-id: "xxxxxx"
kind: ConfigMap
metadata:
  name: virtual-kubelet-config
  namespace: kube-system

2.部署rbkci-virtual-kubelet.yaml:

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:
      serviceAccountName: virtual-kubelet-sa
      containers:
        - name: virtual-kubelet
          image: hub.kce.ksyun.com/ksyun/rbkci-virtual-kubelet:v1.6.0
          args:
            - --kciVirtualKubeletConfigFile=/root/virtual-kubelet/config.yaml
          imagePullPolicy: Always
          env:
            - name: VKUBELET_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
          volumeMounts:
            - mountPath: /root/.kube
              name: kubeconfig
            - mountPath: /var/log/kci-virtual-kubelet
              name: kci-provider-log
            - mountPath: /root/virtual-kubelet
              name: virtual-kubelet-config
      volumes:
        - name: kubeconfig
          secret:
            secretName: rbkci-kubeconfig-secret
        - name: kci-provider-log
          hostPath:
            path: /var/log/kci-virtual-kubelet
        - name: virtual-kubelet-config
          configMap:
            name: virtual-kubelet-config
提示:推荐使用ConfigMap配置文件的方式创建VK来部署虚拟节点,但是如果rbkci-virtual-kubelet.yaml中同时使用了ConfigMap配置文件、环境变量、启动参数,那么他们之间的优先级关系为:
环境变量、启动参数 > 配置文件

部署并验证:

# 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

步骤4:调度KCI容器实例到虚拟节点

通过YAML创建

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

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

'{"nameservers":["1.1.1.1"],"options":[{"name":"ndots","value":"2"},{"name":"timeout","value":"3"}],"searches":["test1.com"]}'

使用自建镜像仓库时,若未在vk维度配置,可在实例维度配置dnsconfig,生效于实例底层系统内,用于解析镜像仓库地址,必须为json字符串格式(参考Pod’s DNS Config

k8s.ksyun.com/kci-host-aliases

'[{"ip":"1.2.3.4","hostnames":["www.privaterepo1.com"]},{"ip":"2.3.4.5","hostnames":["www.privaterepo2.com"]}]'

使用自建镜像仓库时,若未在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则必填

竞价实例的抢占策略。
SpotAsPriceGo:系统自动出价,出价为固定折扣乘以列表价

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。
如果指定了镜像缓存id同时开启了自动匹配镜像缓存,则仍以指定的镜像缓存id为准,自动匹配镜像缓存的功能不会生效

k8s.ksyun.com/kci-auto-image-cache

‘true’/ ‘false’

默认值:‘false’,当为true时,为该Pod开启自动匹配镜像缓存的功能

注:

  1. 若指定KCI Pod的规格,需要同时设置k8s.ksyun.com/kci-instance-cpuk8s.ksyun.com/kci-instance-memory参数。

  2. 除了通过指定CPU和内存的方式创建KCI实例,在对实例规格有特殊需求的场景(如:网络吞吐量、网卡队列数等),您也可以指定KCI实例底层所使用的云服务器套餐规格来创建实例,套餐规格可参考支持的云服务器类型

  3. 在不指定KCI规格或套餐时,金山云容器服务会自动规整KCI Pod的规格,详细计算方法请参考指定KCI Pod规格

  4. 虚拟节点创建时默认存在污点rbkci-virtual-kubelet.io/provider:kingsoftcloud,若要将容器实例调度到虚拟节点,可通过为pod配置容忍度或指定节点调度实现。

  5. 如您从私有镜像仓库拉取镜像,需配置镜像访问凭证,详细配置方法请参考此文档的镜像访问凭证章节。

您可以通过节点亲和性配合节点容忍调度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的创建情况。

image20211223145418021.png

后续操作

升级Virtual Kubelet

随容器实例功能迭代,Virtual Kubelet版本会相应进行更新,目前您可通过手动修改VK镜像版本的方式进行升级。具体操作步骤如下:

步骤1:将对应虚拟节点置为不可调度
# kubectl cordon rbkci-virtual-kubelet
node/rbkci-virtual-kubelet cordoned
步骤2:更新虚拟节点对应的Deployment镜像版本
# 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.0    #将镜像tag改为最新版本
        imagePullPolicy: Always
        name: virtual-kubelet
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
        volumeMounts:
        - mountPath: /root/.kube/config
          name: kubeconfig
        - mountPath: /var/log/kci-virtual-kubelet
          name: kci-provider-log
 ...  
步骤3:将对应节点恢复为可调度状态

在rbkci-virtual-kubelet Deployment滚动更新完成后,将对应节点恢复为可调度状态。

# kubectl uncordon rbkci-virtual-kubelet
node/rbkci-virtual-kubelet uncordoned

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

纯净模式

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