KubeEdge集群搭建

KubeEdge集群搭建

1. 前言

上一篇文章我把整个KubeEdge的宏观架构设计讲了一遍,今天的内容是实操实践,手把手教你搭建KubeEdge集群。

2. 准备工作

需要两台机器,不管是笔记本也好还是树莓派都可以,单是有一个前提,作为Master节点的机器的配置至少要达到2C4G,不然跑不了k8s。还要就是OS要是Linux的,别的系统不行。负载节点就无所谓啦,比如说树莓派3B 或者是树莓派4B 都可以。现在的树莓派配置也是相当的高了,arm的小板子也能做到4C 8G。

3. 搭建K8s

搭建K8s我已经在之前的文章中写了,不会的直接回去看 传送门

4. 安装Cloudcore

安装有两种方式,一种源码编译手动安装,还有一种是使用ke提供的工具-keadm。手动安装比较繁琐,对于新手而言是一种很大的心智负担,最好大家还是都用keadm这个工具去安装,但是,这种方式安装最大的问题就是国内的墙的问题会导致很多某些资源无法下载,比如说 CRD的yaml,cloudcore启动的service,所以我会结合两者,采用半手动半工具的安装方式去帮助大家顺利的完成ke的集群搭建。

1 下载keadm

wget https://github.com/kubeedge/kubeedge/releases/download/v1.5.0/keadm-v1.5.0-linux-amd64.tar.gz 

我写这篇文章的时候,ke的版本还是v1.5.0,所以我就以安装1.5.0版本的作为一个例子。

下载下来之后执行

tar -zxvf keadm-v1.5.0-linux-amd64.tar.gz # 解压keadm的tar.gz的包
cd keadm-v1.5.0-linux-amd64/keadm && chmod  x keadm && mv keadm /usr/local/bin

验证keadm是否安装成功

$ keadm versionversion: version.Info{Major:"1", Minor:"5", GitVersion:"v1.5.0", GitCommit:"8b0913e04ef4ef826af6715d336e23a66e3774df", GitTreeState:"clean", BuildDate:"2020-11-13T08:04:56Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}

2 使用keadm安装cloudcore

keadm init --advertise-address=xxx.xx.xx.xx --kubeedge-version=1.5.0Kubernetes version verification passed, KubeEdge installation will start...--2021-02-11 13:20:41--  https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_device.yamlResolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.76.133Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.76.133|:443... connected.Unable to establish SSL connection.Converted links in 0 files in 0 seconds.Error: failed to run 'sh -c cd /etc/kubeedge/crds/devices && wget -k --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_device.yaml' because of error : exit status 4Usage:  keadm init [flags]Examples:keadm init- This command will download and install the default version of KubeEdge cloud componentkeadm init --kubeedge-version=1.5.0  --kube-config=/root/.kube/config  - kube-config is the absolute path of kubeconfig which used to secure connectivity between cloudcore and kube-apiserverFlags:      --advertise-address string   Use this key to set IPs in cloudcore's certificate SubAltNames field. eg: 10.10.102.78,10.10.102.79      --domainname string          Use this key to set domain names in cloudcore's certificate SubAltNames field. eg: www.cloudcore.cn,www.kubeedge.cn  -h, --help                       help for init      --kube-config string         Use this key to set kube-config path, eg: $HOME/.kube/config (default "/root/.kube/config")      --kubeedge-version string    Use this key to download and use the required KubeEdge version      --master string              Use this key to set K8s master address, eg: http://127.0.0.1:8080      --tarballpath string         Use this key to set the temp directory path for KubeEdge tarball, if not exist, download itF0211 13:20:41.433946   15198 keadm.go:27] failed to run 'sh -c cd /etc/kubeedge/crds/devices && wget -k --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_device.yaml' because of error : exit status 4goroutine 1 [running]:k8s.io/klog.stacks(0xc0000d3e00, 0xc000026480, 0x122, 0x176)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:883  0xb9k8s.io/klog.(*loggingT).output(0x2cb3c80, 0xc000000003, 0xc0000b4b60, 0x29d13f1, 0x8, 0x1b, 0x0)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:834  0x35fk8s.io/klog.(*loggingT).printDepth(0x2cb3c80, 0xc000000003, 0x1, 0xc000843f68, 0x1, 0x1)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:706  0x12dk8s.io/klog.(*loggingT).print(...)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:697k8s.io/klog.Fatal(...)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:1264main.main()/root/codes/src/github.com/kubeedge/kubeedge/keadm/cmd/keadm/keadm.go:27  0x8a

--advertise-address=xxx.xx.xx.xx 这里的xxx.xx.xx.xx换成你master机器的ip,可以是内网地址,也可以是公网ip地址,--kubeedge-version=1.5.0 意思是指定安装的ke的版本,如果你默认不指定那么keadm会自动去下载最新的版本。很遗憾,我在执行

keadm init --advertise-address=xxx.xx.xx.xx --kubeedge-version=1.5.0

命令的时候出错了,这个错的问题在于网络被墙了,特别是在公有云的虚拟机上,出现这种问题的概率特别大,这种问题咋解决,一种是翻墙翻出去,另外一种是在/etc/hosts下添加如下内容

# GitHub Start52.74.223.119 github.com192.30.253.119 gist.github.com54.169.195.247 api.github.com185.199.111.153 assets-cdn.github.com151.101.76.133 raw.githubusercontent.com151.101.108.133 user-images.githubusercontent.com151.101.76.133 gist.githubusercontent.com151.101.76.133 cloud.githubusercontent.com151.101.76.133 camo.githubusercontent.com151.101.76.133 avatars0.githubusercontent.com151.101.76.133 avatars1.githubusercontent.com151.101.76.133 avatars2.githubusercontent.com151.101.76.133 avatars3.githubusercontent.com151.101.76.133 avatars4.githubusercontent.com151.101.76.133 avatars5.githubusercontent.com151.101.76.133 avatars6.githubusercontent.com151.101.76.133 avatars7.githubusercontent.com151.101.76.133 avatars8.githubusercontent.com# GitHub End

添加这个的目的就是我们遇到的错误其实就是keadm初始化过程中可能无法解析raw.githubusercontent.com。

如果试了上述方法还是不行,那我只能用杀手锏了,我们回过头看错误

F0211 13:20:41.433946   15198 keadm.go:27] failed to run 'sh -c cd /etc/kubeedge/crds/devices && wget -k --no-check-certificate --progress=bar:force https://raw.githubusercontent.com/kubeedge/kubeedge/master/build/crds/devices/devices_v1alpha2_device.yaml' 

这是下载devices_v1alpha2_device.yaml这个crd的yaml下载不了啊。熟悉源码的朋友一定知道这不就是用于设备接入的CRD嘛。一个叫Devicle,一个叫DeviceModel。其实我的做法就是从源码里把这两个crd搞下来不就好了嘛。

mkdir -p /etc/kubeedge/crds/devices && mkdir -p /etc/kubeedge/crds/reliablesyncs 

按照这个路径创建文件夹 devices和reliablesyncs都是keadm去下载的

cd /etc/kubeedge/crds/devices && vim devices_v1alpha2_devicemodel.yaml ## 创建 evices_v1alpha2_devicemodel.yamlapiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  name: devicemodels.devices.kubeedge.iospec:  group: devices.kubeedge.io  names:    kind: DeviceModel    plural: devicemodels  scope: Namespaced  validation:    openAPIV3Schema:      properties:        apiVersion:          description: 'APIVersion defines the versioned schema of this representation            of an object. Servers should convert recognized schemas to the latest            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'          type: string        kind:          description: 'Kind is a string value representing the REST resource this            object represents. Servers may infer this from the endpoint the client            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'          type: string        metadata:          type: object        spec:          properties:            properties:              description: 'Required: List of device properties.'              items:                properties:                  description:                    description: The device property description.                    type: string                  name:                    description: 'Required: The device property name.'                    type: string                  type:                    description: 'Required: PropertyType represents the type and data                      validation of the property.'                    properties:                      int:                        properties:                          accessMode:                            description: 'Required: Access mode of property, ReadWrite                              or ReadOnly.'                            type: string                            enum:                              - ReadOnly                              - ReadWrite                          defaultValue:                            format: int64                            type: integer                          maximum:                            format: int64                            type: integer                          minimum:                            format: int64                            type: integer                          unit:                            description: The unit of the property                            type: string                        required:                          - accessMode                        type: object                      string:                        properties:                          accessMode:                            description: 'Required: Access mode of property, ReadWrite                              or ReadOnly.'                            type: string                            enum:                              - ReadOnly                              - ReadWrite                          defaultValue:                            type: string                        required:                          - accessMode                        type: object                      double:                        properties:                          accessMode:                            description: 'Required: Access mode of property, ReadWrite                              or ReadOnly.'                            type: string                            enum:                              - ReadOnly                              - ReadWrite                          defaultValue:                            format: double                            type: number                          maximum:                            format: double                            type: number                          minimum:                            format: double                            type: number                          unit:                            description: The unit of the property                            type: string                        required:                          - accessMode                        type: object                      float:                        properties:                          accessMode:                            description: 'Required: Access mode of property, ReadWrite                              or ReadOnly.'                            type: string                            enum:                              - ReadOnly                              - ReadWrite                          defaultValue:                            format: float                            type: number                          maximum:                            format: float                            type: number                          minimum:                            format: float                            type: number                          unit:                            description: The unit of the property                            type: string                        required:                          - accessMode                        type: object                      boolean:                        properties:                          accessMode:                            description: 'Required: Access mode of property, ReadWrite                              or ReadOnly.'                            type: string                            enum:                              - ReadOnly                              - ReadWrite                          defaultValue:                            type: boolean                        required:                          - accessMode                        type: object                      bytes:                        properties:                          accessMode:                            description: 'Required: Access mode of property, ReadWrite                              or ReadOnly.'                            type: string                            enum:                              - ReadOnly                              - ReadWrite                        required:                          - accessMode                        type: object                    type: object                required:                  - name                  - type                type: object              type: array          type: object  version: v1alpha2
cd /etc/kubeedge/crds/devices && vim devices_v1alpha2_device.yamlapiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  labels:    controller-tools.k8s.io: "1.0"  name: devices.devices.kubeedge.iospec:  group: devices.kubeedge.io  names:    kind: Device    plural: devices  scope: Namespaced  validation:    openAPIV3Schema:      properties:        apiVersion:          description: 'APIVersion defines the versioned schema of this representation            of an object. Servers should convert recognized schemas to the latest            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'          type: string        kind:          description: 'Kind is a string value representing the REST resource this            object represents. Servers may infer this from the endpoint the client            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'          type: string        metadata:          type: object        spec:          properties:            deviceModelRef:              description: 'Required: DeviceModelRef is reference to the device model                used as a template to create the device instance.'              type: object            nodeSelector:              description: NodeSelector indicates the binding preferences between                devices and nodes. Refer to k8s.io/kubernetes/pkg/apis/core NodeSelector                for more details              type: object            protocol:              description: 'Required: The protocol configuration used to connect to                the device.'              properties:                bluetooth:                  description: Protocol configuration for bluetooth                  properties:                    macAddress:                      description: Unique identifier assigned to the device.                      type: string                  type: object                modbus:                  description: Protocol configuration for modbus                  properties:                    slaveID:                      description: Required. 0-255                      format: int64                      type: integer                      minimum: 0                      maximum: 255                  required:                    - slaveID                  type: object                opcua:                  description: Protocol configuration for opc-ua                  properties:                    certificate:                      description: Certificate for access opc server.                      type: string                    password:                      description: Password for access opc server.                      type: string                    privateKey:                      description: PrivateKey for access opc server.                      type: string                    securityMode:                      description: Defaults to "none".                      type: string                    securityPolicy:                      description: Defaults to "none".                      type: string                    timeout:                      description: Timeout seconds for the opc server connection.???                      format: int64                      type: integer                    url:                      description: 'Required: The URL for opc server endpoint.'                      type: string                    userName:                      description: Username for access opc server.                      type: string                  required:                    - url                  type: object                common:                  description: Common part of protocol configuration                  properties:                    com:                      properties:                        baudRate:                          description: Required. BaudRate 115200|57600|38400|19200|9600|4800|2400|1800|1200|600|300|200|150|134|110|75|50                          format: int64                          type: integer                          enum:                            - 115200                            - 57600                            - 38400                            - 19200                            - 9600                            - 4800                            - 2400                            - 1800                            - 1200                            - 600                            - 300                            - 200                            - 150                            - 134                            - 110                            - 75                            - 50                        dataBits:                          description: Required. Valid values are 8, 7, 6, 5.                          format: int64                          type: integer                          enum:                            - 8                            - 7                            - 6                            - 5                        parity:                          description: Required. Valid options are "none", "even",                            "odd". Defaults to "none".                          type: string                          enum:                            - none                            - even                            - odd                        serialPort:                          description: Required.                          type: string                        stopBits:                          description: Required. Bit that stops 1|2                          format: int64                          type: integer                          enum:                            - 1                            - 2                      required:                        - baudRate                        - dataBits                        - parity                        - serialPort                        - stopBits                      type: object                    tcp:                      properties:                        ip:                          description: Required.                          type: string                        port:                          description: Required.                          format: int64                          type: integer                      required:                        - ip                        - port                      type: object                    commType:                      description: Communication type, like tcp client, tcp server or COM                      type: string                    reconnTimeout:                      description: Reconnection timeout                      type: integer                    reconnRetryTimes:                      description: Reconnecting retry times                      type: integer                    collectTimeout:                      description: 'Define timeout of mapper collect from device.'                      format: int64                      type: integer                    collectRetryTimes:                      description: 'Define retry times of mapper will collect from device.'                      format: int64                      type: integer                    collectType:                      description: 'Define collect type, sync or async.'                      type: string                      enum:                        - sync                        - async                    customizedValues:                      description: Customized values for provided protocol                      type: object                  type: object                customizedProtocol:                  description: Protocol configuration for customized Protocol                  properties:                    protocolName:                      description: The name of protocol                      type: string                    configData:                      description: customized config data                      type: object                  required:                    - protocolName                  type: object              type: object            propertyVisitors:              description: 'Required: List of property visitors which describe how                to access the device properties. PropertyVisitors must unique by propertyVisitor.propertyName.'              items:                properties:                  bluetooth:                    description: Bluetooth represents a set of additional visitor                      config fields of bluetooth protocol.                    properties:                      characteristicUUID:                        description: 'Required: Unique ID of the corresponding operation'                        type: string                      dataConverter:                        description: Responsible for converting the data being read                          from the bluetooth device into a form that is understandable                          by the platform                        properties:                          endIndex:                            description: 'Required: Specifies the end index of incoming                              byte stream to be considered to convert the data the                              value specified should be inclusive for example if 3                              is specified it includes the third index'                            format: int64                            type: integer                          orderOfOperations:                            description: Specifies in what order the operations(which                              are required to be performed to convert incoming data                              into understandable form) are performed                            items:                              properties:                                operationType:                                  description: 'Required: Specifies the operation                                    to be performed to convert incoming data'                                  type: string                                  enum:                                    - Add                                    - Subtract                                    - Multiply                                    - Divide                                operationValue:                                  description: 'Required: Specifies with what value                                    the operation is to be performed'                                  format: double                                  type: number                              type: object                            type: array                          shiftLeft:                            description: Refers to the number of bits to shift left,                              if left-shift operation is necessary for conversion                            format: int64                            type: integer                          shiftRight:                            description: Refers to the number of bits to shift right,                              if right-shift operation is necessary for conversion                            format: int64                            type: integer                          startIndex:                            description: 'Required: Specifies the start index of the                              incoming byte stream to be considered to convert the                              data. For example: start-index:2, end-index:3 concatenates                              the value present at second and third index of the incoming                              byte stream. If we want to reverse the order we can                              give it as start-index:3, end-index:2'                            format: int64                            type: integer                        required:                          - endIndex                          - startIndex                        type: object                      dataWrite:                        description: 'Responsible for converting the data coming from                          the platform into a form that is understood by the bluetooth                          device For example: "ON":[1], "OFF":[0]'                        type: object                    required:                      - characteristicUUID                    type: object                  modbus:                    description: Modbus represents a set of additional visitor config                      fields of modbus protocol.                    properties:                      isRegisterSwap:                        description: Indicates whether the high and low register swapped.                          Defaults to false.                        type: boolean                      isSwap:                        description: Indicates whether the high and low byte swapped.                          Defaults to false.                        type: boolean                      limit:                        description: 'Required: Limit number of registers to read/write.'                        format: int64                        type: integer                      offset:                        description: 'Required: Offset indicates the starting register                          number to read/write data.'                        format: int64                        type: integer                      register:                        description: 'Required: Type of register'                        type: string                        enum:                          - CoilRegister                          - DiscreteInputRegister                          - InputRegister                          - HoldingRegister                      scale:                        description: The scale to convert raw property data into final                          units. Defaults to 1.0                        format: double                        type: number                    required:                      - limit                      - offset                      - register                    type: object                  opcua:                    description: Opcua represents a set of additional visitor config                      fields of opc-ua protocol.                    properties:                      browseName:                        description: The name of opc-ua node                        type: string                      nodeID:                        description: 'Required: The ID of opc-ua node, e.g. "ns=1,i=1005"'                        type: string                    required:                      - nodeID                    type: object                  customizedProtocol:                    description: customized protocol                    properties:                      protocolName:                        description: The name of protocol                        type: string                      configData:                        description: customized config data                        type: object                    required:                      - protocolName                      - configData                    type: object                  propertyName:                    description: 'Required: The device property name to be accessed.                      This should refer to one of the device properties defined in                      the device model.'                    type: string                  reportCycle:                    description: 'Define how frequent mapper will report the value.'                    format: int64                    type: integer                  collectCycle:                    description: 'Define how frequent mapper will collect from device.'                    format: int64                    type: integer                  customizedValues:                    description: Customized values for visitor of provided protocols                    type: object                required:                  - propertyName                type: object              type: array            data:              properties:                dataTopic:                  description: 'Topic used by mapper, all data collected from dataProperties                    should be published to this topic,                    the default value is $ke/events/device/ /data/update'                  type: string                dataProperties:                  description: A list of data properties, which are not required to be processed by edgecore                  items:                    properties:                      propertyName:                        description: 'Required: The property name for which the desired/reported                          values are specified. This property should be present in the                          device model.'                        type: string                      metadata:                        description: Additional metadata like filter policy, should be k-v format                        type: object                    required:                      - propertyName                    type: object                  type: array              type: object          required:            - deviceModelRef            - nodeSelector          type: object        status:          properties:            twins:              description: A list of device twins containing desired/reported desired/reported                values of twin properties. A passive device won't have twin properties                and this list could be empty.              items:                properties:                  desired:                    description: 'Required: the desired property value.'                    properties:                      metadata:                        description: Additional metadata like timestamp when the value                          was reported etc.                        type: object                      value:                        description: 'Required: The value for this property.'                        type: string                    required:                      - value                    type: object                  propertyName:                    description: 'Required: The property name for which the desired/reported                      values are specified. This property should be present in the                      device model.'                    type: string                  reported:                    description: 'Required: the reported property value.'                    properties:                      metadata:                        description: Additional metadata like timestamp when the value                          was reported etc.                        type: object                      value:                        description: 'Required: The value for this property.'                        type: string                    required:                      - value                    type: object                required:                  - propertyName                type: object              type: array          type: object  version: v1alpha2

device的crd好了,现在去弄reliablesyncs的crd还是一样

cd /etc/kubeedge/crds/reliablesyncs && vim cluster_objectsync_v1alpha1.yamlapiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  labels:    controller-tools.k8s.io: "1.0"  name: clusterobjectsyncs.reliablesyncs.kubeedge.iospec:  group: reliablesyncs.kubeedge.io  names:    kind: ClusterObjectSync    plural: clusterobjectsyncs  scope: Cluster  subresources:    status: {}  validation:    openAPIV3Schema:      properties:        apiVersion:          description: 'APIVersion defines the versioned schema of this representation            of an object. Servers should convert recognized schemas to the latest            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'          type: string        kind:          description: 'Kind is a string value representing the REST resource this            object represents. Servers may infer this from the endpoint the client            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'          type: string        metadata:          type: object        spec:          properties:            objectType:              description: NodeSelector indicates the binding preferences between                devices and nodes. Refer to k8s.io/kubernetes/pkg/apis/core NodeSelector                for more details              type: string            objectName:              description: 'Required: The protocol configuration used to connect to                the device.'              type: string        status:          properties:            objectResourceVersion:              description: 'Required: DeviceModelRef is reference to the device model                            used as a template to create the device instance.'              type: string  version: v1alpha
cd /etc/kubeedge/crds/reliablesyncs && vim objectsync_v1alpha1.yamlapiVersion: apiextensions.k8s.io/v1beta1kind: CustomResourceDefinitionmetadata:  labels:    controller-tools.k8s.io: "1.0"  name: objectsyncs.reliablesyncs.kubeedge.iospec:  group: reliablesyncs.kubeedge.io  names:    kind: ObjectSync    plural: objectsyncs  scope: Namespaced  subresources:    status: {}  validation:    openAPIV3Schema:      properties:        apiVersion:          description: 'APIVersion defines the versioned schema of this representation            of an object. Servers should convert recognized schemas to the latest            internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'          type: string        kind:          description: 'Kind is a string value representing the REST resource this            object represents. Servers may infer this from the endpoint the client            submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'          type: string        metadata:          type: object        spec:          properties:            objectType:              description: NodeSelector indicates the binding preferences between                devices and nodes. Refer to k8s.io/kubernetes/pkg/apis/core NodeSelector                for more details              type: string            objectName:              description: 'Required: The protocol configuration used to connect to                the device.'              type: string        status:          properties:            objectResourceVersion:              description: 'Required: DeviceModelRef is reference to the device model                           used as a template to create the device instance.'              type: string  version: v1alpha1#

还有一个事情要提前说下,这些crd都准备好了之后,keadm会去下载kubedge的资源。我们实现准备好的话是不是就可以啦,主要还是怕你网络不行,网络ok的话就没有这个问题。

在 /etc/kubeedge下面执行

wget https://github.com/kubeedge/kubeedge/releases/download/v1.5.0/kubeedge-v1.5.0-linux-amd64.tar.gz## 因为的机器是x86架构的处理器,所以是amd64,如果你是别的那就改下这个就行了。

这些都创建完了之后再次执行

keadm init --advertise-address=xxx.xx.xx.xx --kubeedge-version=1.5.0Kubernetes version verification passed, KubeEdge installation will start...W0211 13:58:27.853894   23320 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionW0211 13:58:27.862976   23320 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionW0211 13:58:27.870072   23320 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionW0211 13:58:27.876587   23320 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionExpected or Default KubeEdge version 1.5.0 is already downloaded and will checksum for it.kubeedge-v1.5.0-linux-amd64.tar.gz checksum:checksum_kubeedge-v1.5.0-linux-amd64.tar.gz.txt content:[Run as service] start to download service file for cloudcoreOutput failed:  exit status 4Error: fail to download service file,error:{failed to run command(cd /etc/kubeedge/ && sudo -E wget -t 5 -k --no-check-certificate https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.5/build/tools/cloudcore.service), err:exit status 4}Usage:  keadm init [flags]Examples:keadm init- This command will download and install the default version of KubeEdge cloud componentkeadm init --kubeedge-version=1.5.0  --kube-config=/root/.kube/config  - kube-config is the absolute path of kubeconfig which used to secure connectivity between cloudcore and kube-apiserverFlags:      --advertise-address string   Use this key to set IPs in cloudcore's certificate SubAltNames field. eg: 10.10.102.78,10.10.102.79      --domainname string          Use this key to set domain names in cloudcore's certificate SubAltNames field. eg: www.cloudcore.cn,www.kubeedge.cn  -h, --help                       help for init      --kube-config string         Use this key to set kube-config path, eg: $HOME/.kube/config (default "/root/.kube/config")      --kubeedge-version string    Use this key to download and use the required KubeEdge version      --master string              Use this key to set K8s master address, eg: http://127.0.0.1:8080      --tarballpath string         Use this key to set the temp directory path for KubeEdge tarball, if not exist, download itF0211 13:58:30.352570   23320 keadm.go:27] fail to download service file,error:{failed to run command(cd /etc/kubeedge/ && sudo -E wget -t 5 -k --no-check-certificate https://raw.githubusercontent.com/kubeedge/kubeedge/release-1.5/build/tools/cloudcore.service), err:exit status 4}goroutine 1 [running]:k8s.io/klog.stacks(0xc000599300, 0xc0008ce2c0, 0x11a, 0x2a4)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:883  0xb9k8s.io/klog.(*loggingT).output(0x2cb3c80, 0xc000000003, 0xc0002f2850, 0x29d13f1, 0x8, 0x1b, 0x0)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:834  0x35fk8s.io/klog.(*loggingT).printDepth(0x2cb3c80, 0xc000000003, 0x1, 0xc00089ff68, 0x1, 0x1)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:706  0x12dk8s.io/klog.(*loggingT).print(...)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:697k8s.io/klog.Fatal(...)/root/codes/src/github.com/kubeedge/kubeedge/vendor/k8s.io/klog/klog.go:1264main.main()/root/codes/src/github.com/kubeedge/kubeedge/keadm/cmd/keadm/keadm.go:27  0x8a

到了最后还是出了一个问题,还是网络的问题啊,意思是cloudcore的service文件下载不了,那没办法了,手动创建咯。

vim cloudcore.service[Unit]Description=cloudcore.service[Service]Type=simpleExecStart=/etc/kubeedge/kubeedge-v1.5.0-linux-amd64/cloud/cloudcore/cloudcore --logtostderr=false --log-file=/var/log/kubeedge/cloudcore.log -v=3Restart=alwaysRestartSec=10[Install]WantedBy=multi-user.target

然后我们再执行

$ keadm init --advertise-address=106.13.177.82 --kubeedge-version=1.5.0Kubernetes version verification passed, KubeEdge installation will start...W0211 14:04:38.942389   29815 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionW0211 14:04:38.950811   29815 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionW0211 14:04:38.966118   29815 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionW0211 14:04:38.975750   29815 warnings.go:67] apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16 , unavailable in v1.22 ; use apiextensions.k8s.io/v1 CustomResourceDefinitionExpected or Default KubeEdge version 1.5.0 is already downloaded and will checksum for it.kubeedge-v1.5.0-linux-amd64.tar.gz checksum:checksum_kubeedge-v1.5.0-linux-amd64.tar.gz.txt content:[Run as service] service file already exisits in /etc/kubeedge//cloudcore.service, skip downloadkubeedge-v1.5.0-linux-amd64/kubeedge-v1.5.0-linux-amd64/edge/kubeedge-v1.5.0-linux-amd64/edge/edgecorekubeedge-v1.5.0-linux-amd64/cloud/kubeedge-v1.5.0-linux-amd64/cloud/csidriver/kubeedge-v1.5.0-linux-amd64/cloud/csidriver/csidriverkubeedge-v1.5.0-linux-amd64/cloud/admission/kubeedge-v1.5.0-linux-amd64/cloud/admission/admissionkubeedge-v1.5.0-linux-amd64/cloud/cloudcore/kubeedge-v1.5.0-linux-amd64/cloud/cloudcore/cloudcorekubeedge-v1.5.0-linux-amd64/versionKubeEdge cloudcore is running, For logs visit:  /var/log/kubeedge/cloudcore.logCloudCore started

这就表示cloudcore已经安装完成了

3. 校验cloudcore安装情况

1. 检查进程的运行情况

$ ps aux | grep cloudcoreroot       599  0.0  0.0  16188  1012 pts/0    S    14:07   0:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox cloudcoreroot     32150  0.8  1.2 1269852 51632 ?       Ssl  14:06   0:00 /etc/kubeedge/kubeedge-v1.5.0-linux-amd64/cloud/cloudcore/cloudcore --logtostderr=false --log-file=/var/log/kubeedge/cloudcore.log -v=3

如果你想把cloudcore交给systemed托管的话切记把cloudcore.service移到/etc/systemed/system下面然后再执行下systemctl daemon-reload

2. 查看k8s

正常的情况下cloudcore运行起来之后会在k8s器群创建一个叫kubeedge的namespace,这个ns下面有secret,存的就是ke集群的token cert啥的

$ k get secret -nkubeedgeNAME                  TYPE                                  DATA   AGEcasecret              Opaque                                2      21hcloudcoresecret       Opaque                                2      21hdefault-token-bt26c   kubernetes.io/service-account-token   3      21htokensecret           Opaque                                1      21h

如果你的结果和我的一样,恭喜你,你的ke的cloudcore已经顺利安装完成了。

5. 安装edgecore

edgecore的安装相比cloudcore而言简单很多,不过我们还是要靠keadm这个工具,先在边缘节点上安装keadm,安装方式和上面cloudcore的一样,这里就不重复说了。如果你的边缘节点的网络不是很好的话还是建议提早下载好ke的资源文件,和安装cloudcore的时候一样

mkdir -p /etc/kubeedge && wget https://github.com/kubeedge/kubeedge/releases/download/v1.5.0/kubeedge-v1.5.0-linux-arm.tar.gz## 我用树莓派作为边缘节点的,所以下载的是arm架构的

直接执行

keadm join --cloudcore-ipport=xx.xx.xx.xx:10000 --kubeedge-version=1.5.0 --token=<token>

-cloudcore-ipport表示的是cloudcore的对外暴露的ip就是公网ip了,记得打开安全组的端口如果你是在公有云服务器上的

--kubeedge-version就是ke的版本

--token= 这个token从master机器上来,执行

$ keadm gettokenb75afee838d35d8208a6880381ceca1aa1a1d72e289d307723da210a87cc6bf0.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MTMxMTAwMTJ9.jtrC0EBjuq3VpwIGQ21a5aPq5dr3wJniH6XGVnu_rKE

下面的这一大串就是token,这个token就是用于去拿ca证书的。

6. 检查ke集群是否安装完成

在master机器上执行

$ k get noNAME          STATUS   ROLES        AGE     VERSIONdidi-cloud    Ready    <none>       3d15h   v1.19.7k8s-master    Ready    master       4d      v1.19.7raspberrypi   Ready    agent,edge   16h     v1.19.3-kubeedge-v1.5.0

树莓派就是ke的边缘节点,并且已经是ready,如果你的结果和我一样,那么恭喜你,你的ke的集群已经搭建完成了。

来源:https://www.icode9.com/content-4-854301.html

(0)

相关推荐