Kubernetes

Kubernetes成本计量监控

OpenCost用于Kubernetes云基础设施和容器成本的计量,提供实时成本监控。本文介绍如何通过OpenCost计量和监控On-Premises平台成本。 OpenCost运行组件: Prometheus: OpenCost获取Prometheus抓取的CPU、RAM、Storage资源指标。 OpenCost: 成本计量组件,提供API数据查询和数据导出。 UI: 简单的WEB展示数据。 部署Prometheus git clone https://github.com/prometheus-operator/kube-prometheus.git kubectl apply --server-side -f manifests/setup kubectl wait \ --for condition=Established \ --all CustomResourceDefinition \ --namespace=monitoring // 删除NetworkPolicy YAML文件 -rw-r--r-- 1 root123 root123 977 Jan 17 02:15 alertmanager-networkPolicy.yaml -rw-r--r-- 1 root123 root123 722 Jan 17 02:15 blackboxExporter-networkPolicy.yaml -rw-r--r-- 1 root123 root123 652 Jan 17 02:15 grafana-networkPolicy.yaml -rw-r--r-- 1 root123 root123 724 Jan 17 02:15 kubeStateMetrics-networkPolicy.yaml -rw-r--r-- 1 root123 root123 671 Jan 17 02:15 nodeExporter-networkPolicy.

继续阅读

Kube-OVN网络VM无法访问外网问题

现象 Kubernetes集群新添加了一批物理机,成功添加集群后发现新建的虚拟机在新节点上无法访问Internet和集群主机节点,能够Ping通相同子网的虚拟机,能够Ping通Underlay逻辑网关。 排查 a. 新建一个Pod,现象一样 b. 将Underlay子网IP直接配置在主机节点上,网络一切正常 c. 排除了虚拟机网络环境问题和主机节点外网络问题,问题锁定在Kube-OVN网络内部。 比对虚拟机IP和MAC地址都正确 // 路由器列表 sukai@r1-m34:~$ kubectl ko nbctl lr-list 77b2eff6-ce75-4ab4-8476-df34d347a531 (ovn-cluster) // 交换机列表 sukai@r1-m34:~$ kubectl ko nbctl ls-list 4585d35c-3a3d-4dc1-bdb2-9544bf15bbd7 (join) 63abfd74-3513-4edb-83a3-bde609fe3585 (ovn-default) 88910c8a-08b3-49f0-98a0-b21eb21620f2 (vmnet) // 查看我的虚拟机交换机端口 sukai@r1-m34:~$ kubectl ko nbctl lsp-list vmnet f731988d-7cff-44f6-9835-eb8ccdb32216 (localnet.vmnet) 4ff718cb-c3bf-40f4-9fce-a3c141f4639f (sukai-db01.nanjing) 0a02f7b7-caa3-421c-b700-0ea41fd12990 (vmnet-ovn-cluster) sukai@r1-m34:~$ // 查看我的虚拟机交换机端口信息 sukai@r1-m34:~$ kubectl ko nbctl show vmnet switch 88910c8a-08b3-49f0-98a0-b21eb21620f2 (vmnet) port vmnet-ovn-cluster type: router router-port: ovn-cluster-vmnet port sukai-db01.nanjing addresses: ["d2:b9:8d:e6:61:4b 192.168.10.133"] port localnet.

继续阅读

Kubespray添加worker节点并部署OpenEBS lvm-localpv

inventory.ini添加新的主机节点 执行ansible playbook 新节点设置污点仅调度期望的资源 配置Rook Ceph在新节点上安装Ceph RBD CSI插件 部署OpenEBS lvm-localpv分配本地的存储 inventory.ini添加新的主机节点 sukai@r1-m54:~/kubespray-2.26.0/inventory/cluster$ more inventory.ini [all] r4-w58 ansible_host=19.18.136.68 ip=19.18.136.68 [kube_node] r4-w58 执行ansible playbook sukai@r1-m54:~/kubespray-2.26.0$ ansible-playbook -i inventory/cluster/inventory.ini --become playbooks/facts.yml PLAY RECAP ******************************************************************************************************************************************************************************************** r1-m54 : ok=12 changed=0 unreachable=0 failed=0 skipped=14 rescued=0 ignored=0 r4-w58 : ok=12 changed=2 unreachable=0 failed=0 skipped=11 rescued=0 ignored=0 sukai@r1-m54:~/kubespray-2.26.0$ ansible-playbook -i inventory/cluster/inventory.ini --become scale.yml --limit=r4-w58 PLAY RECAP ******************************************************************************************************************************************************************************************** r4-w58 : ok=372 changed=38 unreachable=0 failed=0 skipped=635 rescued=0 ignored=1 sukai@r1-m54:~$ kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME r1-m54 Ready control-plane 74d v1.

继续阅读

Kubernetes集群添加主机名解析

单个Pod添加主机别名 CoreDNS添加主机名解析 单个Pod添加主机名别名 dnsPolicy: ClusterFirst hostAliases: - hostnames: - jingxiang.oss-cn-lasa-xzns-d01-a.ops.ningsuan.com.cn - oss-cn-lasa-xzns-d01-a.ops.ningsuan.com.cn ip: 10.65.10.91 initContainers: NodeLocalDNS 169.254.25.10将DNS解析转发到CoreDNS 10.233.0.3 apiVersion: v1 kind: ConfigMap metadata: creationTimestamp: "2024-09-15T01:02:02Z" labels: addonmanager.kubernetes.io/mode: EnsureExists name: nodelocaldns namespace: kube-system resourceVersion: "55695455" uid: 8b2c7245-6563-4a5f-bb11-cbdc5bb9e17c data: Corefile: | cluster.local:53 { errors cache { success 9984 30 denial 9984 5 } reload loop bind 169.254.25.10 forward . 10.233.0.3 { force_tcp } prometheus :9253 health 169.254.25.10:9254 } in-addr.arpa:53 { errors cache 30 reload loop bind 169.

继续阅读

Velero备份Kubernetes资源到阿里云OSS

Velero阿里云OSS插件不再维护,并且只支持阿里云官方平台,不支持私有阿里云平台。Velero AWS插件能够备份Kubernetes资源,但由于阿里云OSS不兼容S3协议,不支持aws-chunked encoding,存储卷快照数据不能上传。本文记录使用AWS插件备份Kubernetes资源。 创建OSS访问密钥和Bucket Helm安装Velero 创建备份 安装ossutil工具,查看Bucket文件 sukai@rack1-master34:~/ossutil$ curl -O curl https://gosspublic.alicdn.com/ossutil/install.sh sukai@rack1-master34:~/ossutil$ sudo bash install.sh sukai@rack1-master34:~/ossutil$ more /home/sukai/.ossutilconfig [Credentials] language=CH accessKeyID=HoOY11111oVQd2 accessKeySecret=etwTS11111111111fUI endpoint=http://oss-cn-lasa-xzns-d01-a.ops.sukai.com.cn skipVerifyCert sukai@rack1-master34:~$ ossutil ls oss://jingxiang LastModifiedTime Size(B) StorageClass ETAG ObjectName 2024-11-20 11:36:31 +0000 UTC 3500 Standard 48CA775C38F20878964AA5088324F21C oss://jingxiang/backups/vms-202411201932/velero-backup.json 2024-11-20 11:35:52 +0000 UTC 471 Standard 7B61AF0F32290A5B39D5881F986D0957 oss://jingxiang/backups/vms-202411201932/vms-202411201932-csi-volumesnapshotclasses.json.gz 2024-11-20 11:35:52 +0000 UTC 6238 Standard 6ACC5E93B590EE6422D38F4A674FC18F oss://jingxiang/backups/vms-202411201932/vms-202411201932-csi-volumesnapshotcontents.json.gz 2024-11-20 11:35:52 +0000 UTC 5033 Standard 997FE590407EFA5E3C286E68066B1D87 oss://jingxiang/backups/vms-202411201932/vms-202411201932-csi-volumesnapshots.json.gz 2024-11-20 11:35:52 +0000 UTC 2373 Standard 6E0C20DB395F60DB5F45403E5B30A026 oss://jingxiang/backups/vms-202411201932/vms-202411201932-itemoperations.

继续阅读

Kubernetes容器存储接口CSI插件controller

前面文章介绍了CSI插件node-agent组件,node-agent主要实现了需要在主机节点上才能进行的操作功能,包含了LVMNode, LVMVolume, LVMSnapshot三个自定义资源控制器和NodeServer接口服务。那么LVMVolume,LVMSnapshot这些自定义资源又是由谁创建的呢?今天我们一起看一下OpenEBS LVM存储插件的Controller部分,了解Controller如何被编排调度系统Container Orchestration system(CO)侧Kubernetes调用,Controller又如何创建自定义资源给Node-Agent调谐的。 之前我们了解到CO侧Kubernetes开发了一系列组件如external-provisioner,external-attacher,external-snapshotter,external-resizer,这些组件通过Sidecar的方式和Plugin插件驱动侧一起运行,直接调用插件Controller的gRPC服务,实现存储卷的管理。下面我们来看一下Controller的接口服务。 Controller Interface包括以下方法 // ControllerServer is the server API for Controller service. type ControllerServer interface { // 创建存储卷,创建自定义资源LVMVolume实例 CreateVolume(context.Context, *CreateVolumeRequest) (*CreateVolumeResponse, error) // 删除存储卷,删除LVMVolume实例 DeleteVolume(context.Context, *DeleteVolumeRequest) (*DeleteVolumeResponse, error) // 挂接存储卷到指定节点,因为LVM是本地设备,末实现 ControllerPublishVolume(context.Context, *ControllerPublishVolumeRequest) (*ControllerPublishVolumeResponse, error) // 卸载存储卷,末实现 ControllerUnpublishVolume(context.Context, *ControllerUnpublishVolumeRequest) (*ControllerUnpublishVolumeResponse, error) // 验证是否支持存储卷访问模式,比如支持单/多机读写,Read-Write-Once ValidateVolumeCapabilities(context.Context, *ValidateVolumeCapabilitiesRequest) (*ValidateVolumeCapabilitiesResponse, error) // 列出所有的存储卷,末实现 ListVolumes(context.Context, *ListVolumesRequest) (*ListVolumesResponse, error) // 返回指定节点的容量信息,可用存储空间 GetCapacity(context.Context, *GetCapacityRequest) (*GetCapacityResponse, error) // 返回controller支持的功能,比如创建/删除存储卷,扩展存储卷,创建删除快照,获取容量 ControllerGetCapabilities(context.Context, *ControllerGetCapabilitiesRequest) (*ControllerGetCapabilitiesResponse, error) // 创建指定存储卷快照 CreateSnapshot(context.

继续阅读

Kubernetes容器存储接口CSI插件node-agent

Kubernetes CSI插件包含两部分:controller, node-agent。今天我们一起来看一下OpenEBS的LVM存储插件,了解OpenEBS如何实现Kubernetes使用LVM逻辑卷存储数据的。LVM逻辑卷管理(Logical Volume Manager),建立在硬盘和分区之上的一个逻辑层,提高磁盘分区管理的灵活性。Kubernetes可以利用LVM本地磁盘提高存储性能,LVM具备快照功能,为KubeVirt虚拟机提供了基于Copy-On-Write的精简配置存储,是一个非常不错的轻量级超融合解决方案。 本文将包含以下几个部分:LVM基本概念,node-agent包含组件,node-agent代码实现。 LVM基本概念 PV物理卷(physical volume),LVM的基本存储逻辑块,一个PV对应一个硬盘或者硬盘分区。VG卷组(Volume Group)由物理卷组成。LV逻辑卷(Logical Volume),建立在卷组之上,一个卷组可以创建多个逻辑卷,一个逻辑卷对应一个卷组。 LVM卷快照(snapshot)用于从文件系统的时间点视图创建备份。从快照备份文件系统,卷本身供用户使用,快照最初包含自身相关的一些元数据,不包含源逻辑卷的实际数据。快照使用写时复制技术Copy-On-Write(COW)在原始数据块的数据发生更改时,复制源块中数据进行更改。 LVM精简卷Thin Provisioned Logical Volumes,精简配置逻辑卷对存储资源进行按需动态分配,即对存储进行了虚拟化管理。在卷组上建立精简池Thin Pool,在精简池上创建精简卷Thin Volume。 node-agent组件 node-agent包含:三个自定义资源控制器,一个gRPC服务。 gRPC服务 Kubelet调用node-agent的gRPC服务接口,将存储卷挂载到本机目录,kubelet创建容器时将目录文件挂载到容器。 NodeServer接口如下: type NodeServer interface { // 挂载存储卷到临时目录 NodeStageVolume(context.Context, *NodeStageVolumeRequest) (*NodeStageVolumeResponse, error) // 从临时目录卸载存储卷 NodeUnstageVolume(context.Context, *NodeUnstageVolumeRequest) (*NodeUnstageVolumeResponse, error) // 发布存储卷,LVM逻辑卷挂载到对应主机指定目录。 NodePublishVolume(context.Context, *NodePublishVolumeRequest) (*NodePublishVolumeResponse, error) // 取消发布存储卷,卸载对应主机上的LVM逻辑卷。 NodeUnpublishVolume(context.Context, *NodeUnpublishVolumeRequest) (*NodeUnpublishVolumeResponse, error) // 返回存储卷统计信息,容量,inodes。 NodeGetVolumeStats(context.Context, *NodeGetVolumeStatsRequest) (*NodeGetVolumeStatsResponse, error) // 扩展存储卷容量。 NodeExpandVolume(context.Context, *NodeExpandVolumeRequest) (*NodeExpandVolumeResponse, error) // 返回主机节点支持的能力,比如支持存储卷扩展,存储卷数据统计。 NodeGetCapabilities(context.Context, *NodeGetCapabilitiesRequest) (*NodeGetCapabilitiesResponse, error) // 返回主机节点信息,主要是Label标签里的拓扑信息。 NodeGetInfo(context.

继续阅读

Kubernetes如何使用不同厂商存储

今天我们一起来看一下Kubernetes如何使用不同厂商存储的,了解一下CSI基本的概念。 基本概念 CSI 容器存储接口Container Storage Interface规范,定义了一个行业标准,使用存储厂商开发的插件可以在多个容器编排系统运行。 PV 持久卷PersistentVolume,Kubernetes集群中的一块存储卷,提供给Pod容器存储数据,通过卷插件(provisioner)来管理,拥有独立于Pod的生命周期。 PVC 持久卷声明PersistentVolumeClaim,用户对存储的资源请求声明。 StorageClass 存储类,集群中可以提供的存储类型。管理员可以创建不同的存储类来对应不同的存储资源,卷插件和策略。 Porvisioner 卷插件根据资料请求信息完成存储设备的卷资源操作。 dynamic provisioning 动态卷配置,基于StorageClass的自动化存储资源的生命周期管理,按用户需求自动动态创建和调整存储资源,用户无需过多关注存储的管理。 下面我们一起来看一下,如何使用动态卷配置。 动态卷配置流程 1,创建一个StorageClass,指定卷插件,回收策略,存储卷绑定模式。 2,用户创建一个PVC持久卷声明,指定卷使用的存储类,读写模式,资源大小,卷类型。 3,卷插件创建持久卷。 4,Kubernetes绑定持久卷和持久卷声明。 5,容器启动时,挂载到容器中使用。 使用示例 创建CSIDriver 创建一个CSI存储插件,当我们的插件注册时会使用相同的名称,Kubernetes的组件根据名称调用插件服务。 --- # Create the CSI Driver object apiVersion: storage.k8s.io/v1 kind: CSIDriver metadata: name: local.csi.sukai.io spec: # do not require volumeattachment attachRequired: false podInfoOnMount: true storageCapacity: true 创建StorageClass 指定provisioner为local.csi.sukai.io apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: openebs-lvmsc allowVolumeExpansion: true parameters: volgroup: "lvmvg" provisioner: local.csi.sukai.io 默认的回收策略为Delete删除策略,当与PV绑定的PVC被删除的时候,删除PV存储资源。另一种策略为Retain保留策略。持久卷绑定模式为Immediate即刻绑定,立即创建持久卷并将其绑定到持久卷声明。WaitForFirstConsumer为首次使用时绑定,第一次被容器组使用时,才创建持久卷,并将其绑定到持久卷声明。

继续阅读

KubeVirt通过Kube-OVN使用Underlay网络

之前文章介绍了如何通过Kube-OVN实现Kubernetes网络租户隔离,今天我们一起看一下KubeVirt通过Kube-OVN使用Underlay网络,使虚拟机接入物理网络。 实践操作 检查Kubernetes使用的Pod网络地址段和Service网络地址段。 sukai@ubuntuserver:/etc/kubernetes/manifests$ sudo grep cidr kube-controller-manager.yaml - --allocate-node-cidrs=true - --cluster-cidr=10.244.0.0/16 sukai@ubuntuserver:/etc/kubernetes/manifests$ sudo grep range kube-controller-manager.yaml - --service-cluster-ip-range=10.211.0.0/16 检查kube-ovn-controller配置项是否正确 kube-ovn在版本v1.11.0开始支持keep-vm-ip参数,虚拟机使用固定IP地址。 Containers: kube-ovn-controller: Container ID: containerd://0f8d53403c9821c7b535c64d2c98e1ca130a15e1b2b878270cd9388c36d0e48a Image: kubeovn/kube-ovn:v1.11.0 Image ID: docker.io/kubeovn/kube-ovn@sha256:fea623e68a2a81ef78102c6cfe95b96c16c054c57f4c8b9d168bd3ff620b6779 Port: <none> Host Port: <none> Args: /kube-ovn/start-controller.sh --default-cidr=10.244.0.0/16 --default-gateway=10.244.0.1 --default-gateway-check=true --default-logical-gateway=false --default-exclude-ips= --node-switch-cidr=100.64.0.0/16 --service-cluster-ip-range=10.211.0.0/16 --network-type=geneve --default-interface-name= --default-vlan-id=100 --pod-nic-type=veth-pair --enable-lb=true --enable-np=true --enable-eip-snat=true --enable-external-vpc=true --keep-vm-ip=true 创建服务网络 指定物理服务器上访问物理网络的网卡。 apiVersion: kubeovn.io/v1 kind: ProviderNetwork metadata: name: office spec: defaultInterface: eno1 创建VLAN 创建在指定服务网络上创建一个VLAN,这里VLAN ID为0表示不属于任何VLAN。 apiVersion: kubeovn.

继续阅读

kube-ovn实现Kubernetes多租户网络管理

Kubernetes容器平台正在成为越来越多的数据中心基础平台,我们希望Kubernetes能够满足虚拟化平台的一些基本要求,比如实现了多租户的灵活的软件定义网络SDN。工作中一个项目在使用Kubernetes平台,所以考虑通过KubeVirt来管理虚拟机,同时使用kube-ovn来实现多租户网络隔离。下面我们一起来看看如何使用kube-ovn来管理网络。 基本概念 Underlay/Overlay网络 Underlay网络是指传统IT基础设施网络,是由交换机、路由器、负载均衡等设备组成的底层物理网络。Overlay网络是通过网络虚拟化技术,在Underlay网络上构建出的虚拟的逻辑网络。 OVS/OVN Open vSwitch(OVS)是一个多层软件交换机,OVS只里一个单机软件,没有集群的信息。Open Virtual Nework(OVN)提供了一个集中式的OVS控制器,从集群的角度对整个网络设施进行编排。 使用Kubernetes后会发现,Kubernetes网络功能缺少软件定义网络SDN能力,缺少VPC, Subnet, Nat, Route, SecurityGroup等常用功能。Kube-OVN基于OVN为Kubernetes网络提供了网络编排能力。 CNI 容器网络接口(Container Network Interface),由CoreOS提出的一种容器网络规范,主要内容是容器创建时的网络分配,和容器被删除时释放网络资源。CNI让网络层变得可插拔,只要遵循CNI的协议规范,容器管理平台就可以调用CNI插件可执行文件提供网络功能。Kubernetes网络模型采用了CNI容器网络接口规范。 macvlan macvlan是一种Linux内核的网络虚拟化技术,从一个主机接口虚拟出多个虚拟网络接口。macvlan可以在物理网卡构成的父接口上添加子接口,每个子接口都拥有独立的MAC地址和IP地址。容器可以通过绑定子接口,拥有与物理网络通信的能力。这解决了容器接入物理网络需求,比如我们需要通过docker运行gitlab服务,gitlab服务需要用到80,443,22端口,这些常用端口经常会产生冲突,那么我们可以通过docker命令创建一个macvlan驱动类型的网络来拥有独立MAC和IP地址。Kubernetes内置CNI插件包含了macvlan,配置使用macvlan CNI,可以让Kubernetes的Pod使用Underlay网络 。 Kube-OVN Kube-OVN插件将Kubernetes容器网络接入ovs网络。提供了vpc, router, switch, subnet管理能力。 Multus Multus CNI插件提供了Kubernetes Pod添加多块网卡的能力。容器同时接入多个不同的网络,解决了类似Ceph这种区分多个网络应用场景。 IPAM IP地址管理(IP Address Management),分配和维护IP地址,DNS,网关,路由等信息。CNI插件在执行过程中调用相应的IPAM插件,IPAM插件将IP相关信息返回到主CNI插件。IPAM插件减少了CNI插件重复编写相同代码管理IP的工作,而且解决了多个CNI插件统一集中IP管理的需求。 场景需求 1,通过VPC实现网络租户隔离 2,通过NAT网关SNAT访问外网 3,通过NAT网关DNAT暴露端口给外网访问 安装部署 安装Kube-OVN curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/crd.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/ovn.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/release-1.10/yamls/kube-ovn.yaml curl -O https://raw.githubusercontent.com/kubeovn/kube-ovn/master/charts/templates/kubeovn-crd.yaml sed -i 's/\$addresses/<Node IP>/g' ovn.yaml kubectl label node ubuntuserver1 kube-ovn/role=master kubectl apply -f crd.yaml kubectl apply -f kubeovn-crd.

继续阅读